<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
<script src="../../../../resources/ui-helper.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script src="resources/hybrid-blob-util.js"></script>
<script>
description("Test for building blobs with multiple files combined by BlobBuilder and sending them via XMLHttpRequest.");

var testFilePaths = [
    "nonexistent",
    "empty.txt",
    "file-for-drag-to-send.txt",
    "file-for-drag-to-send2.txt",
    "abe.png"
];

var util = new HybridBlobTestUtil(runTests, testFilePaths, true /* use open panel */);
util.dragBaseDir = "../resources/";
util.urlPathBaseDir = "../local/resources/";

function runHybridBlobTest(fileIndexOrStrings, opt_range)
{
    var blob = util.appendAndCreateBlob(fileIndexOrStrings);
    var urlParameter = util.createUrlParameter(fileIndexOrStrings, opt_range);
    if (opt_range)
        blob = blob.slice(opt_range.start, opt_range.start + opt_range.length);
    util.uploadBlob(blob, urlParameter);
}

function runTests()
{
    // Syntax sugar.
    var F = function(path) { return util.FileItem(path); }
    var D = function(data) { return util.DataItem(data); }

    debug('* BlobBuilder.append(file) - single file');
    for (var i = 0; i < testFilePaths.length; i++)
        runHybridBlobTest(F(testFilePaths[i]));

    debug('* BlobBuilder.append(file) - multiple files');
    runHybridBlobTest([ F('nonexistent'),
                        F('empty.txt')]);
    runHybridBlobTest([ F('empty.txt'),
                        F('file-for-drag-to-send.txt') ]);
    runHybridBlobTest([ F('empty.txt'),
                        F('file-for-drag-to-send.txt'),
                        F('file-for-drag-to-send2.txt') ]);
    runHybridBlobTest([ F('file-for-drag-to-send2.txt'),
                        F('file-for-drag-to-send2.txt') ]);

    debug('* BlobBuilder.append(mixed)');
    runHybridBlobTest([ [ F('empty.txt') ] ]);
    runHybridBlobTest([ [ F('empty.txt'),
                          F('file-for-drag-to-send.txt') ],
                        F('file-for-drag-to-send2.txt') ]);
    runHybridBlobTest([ D('abcde'),
                        F('file-for-drag-to-send2.txt'),
                        D('|123|456|') ]);
    runHybridBlobTest([ F('empty.txt'),
                        D('13579'),
                       [ F('file-for-drag-to-send2.txt'),
                         F('file-for-drag-to-send.txt') ],
                        F('file-for-drag-to-send.txt'),
                        D('A_B_C_D_E')]);

    debug('* BlobBuilder.append(mixed) - with Blob.slice()');
    runHybridBlobTest([ F('file-for-drag-to-send.txt') ],
                      { 'start': 5, 'length': 10 });
    runHybridBlobTest([ [ F('file-for-drag-to-send2.txt') ] ],
                      { 'start': 3, 'length': 17 });
    runHybridBlobTest([ F('file-for-drag-to-send.txt'),
                        F('file-for-drag-to-send2.txt') ],
                      { 'start': 3, 'length': 17 });
    runHybridBlobTest([ F('file-for-drag-to-send2.txt'),
                        D('abcde'),
                        F('file-for-drag-to-send2.txt') ],
                      { 'start': 3, 'length': 17 });
    runHybridBlobTest([ F('file-for-drag-to-send2.txt'),
                        D('abcde'),
                        F('file-for-drag-to-send2.txt') ],
                      { 'start': 33, 'length': 90 });
    runHybridBlobTest([ F('file-for-drag-to-send2.txt'),
                        F('file-for-drag-to-send.txt'),
                        F('file-for-drag-to-send2.txt') ],
                      { 'start': 33, 'length': 42 });
    runHybridBlobTest([ F('empty.txt'),
                        F('file-for-drag-to-send.txt'),
                        F('file-for-drag-to-send2.txt'),
                        F('abe.png') ],
                      { 'start': 20, 'length': 3000 });

    finishJSTest();
}

if (window.testRunner) {
    jsTestIsAsync = true;
    util.runTests();
} else
    testFailed("This test is not interactive, please run using a test harness.");

var successfullyParsed = true;
</script>
<script src="../../../../resources/js-test-post.js"></script>
</body>
</html>
