if (this.importScripts) {
    importScripts('fs-worker-common.js');
    if (!('description' in self))  // Shared workers will already have imported this, and importing twice would break it.
        importScripts('../../../resources/js-test.js');
    importScripts('file-writer-utils.js');
}

description("Test that FileWriter produces proper progress events.");

var fileEntry;
var sawWriteStart;
var sawWrite;
var sawWriteEnd;
var sawProgress;
var writer;
var lastProgress = 0;
var toBeWritten;

function tenXBlob(blob) {
    var bb = [];
    for (var i = 0; i < 10; ++i) {
        bb.push(blob);
    }
    return new Blob(bb);
}

function onWriteStart(e) {
    assert(writer);
    assert(writer.readyState == writer.WRITING);
    assert(e.type == "writestart");
    assert(!sawWriteStart);
    assert(!sawProgress);
    assert(!sawWrite);
    assert(!sawWriteEnd);
    assert(!e.loaded);
    assert(e.total == toBeWritten);
    sawWriteStart = true;
}

function onProgress(e) {
    assert(writer.readyState == writer.WRITING);
    assert(sawWriteStart);
    assert(!sawWrite);
    assert(!sawWriteEnd);
    assert(e.type == "progress");
    assert(e.loaded <= e.total);
    assert(lastProgress < e.loaded);
    assert(e.total == toBeWritten);
    lastProgress = e.loaded;
    sawProgress = true;
}

function onWrite(e) {
    assert(writer.readyState == writer.DONE);
    assert(sawWriteStart);
    assert(sawProgress);
    assert(lastProgress == e.total);
    assert(!sawWrite);
    assert(!sawWriteEnd);
    assert(e.type == "write");
    assert(e.loaded == e.total);
    assert(e.total == toBeWritten);
    sawWrite = true;
}

function onWriteEnd(e) {
    assert(writer.readyState == writer.DONE);
    assert(sawWriteStart);
    assert(sawProgress);
    assert(sawWrite);
    assert(!sawWriteEnd);
    assert(e.type == "writeend");
    assert(e.loaded == e.total);
    assert(e.total == toBeWritten);
    sawWriteEnd = true;
    testPassed("Saw all the right events.");
    cleanUp();
}

function startWrite(fileWriter) {
    // Let's make it about a megabyte.
    var blob = tenXBlob(new Blob(["lorem ipsum"]));
    blob = tenXBlob(blob);
    blob = tenXBlob(blob);
    blob = tenXBlob(blob);
    blob = tenXBlob(blob);
    toBeWritten = blob.size;
    writer = fileWriter;
    fileWriter.onerror = function(e) {
      debug(fileWriter.error.name);
      debug(fileWriter.error.message);
      onError(e);
    };
    fileWriter.onwritestart = onWriteStart;
    fileWriter.onprogress = onProgress;
    fileWriter.onwrite = onWrite;
    fileWriter.onwriteend = onWriteEnd;
    fileWriter.write(blob);
}

function runTest(unusedFileEntry, fileWriter) {
    assert(typeof fileWriter.addEventListener === 'function');
    assert(typeof fileWriter.removeEventListener === 'function');
    assert(typeof fileWriter.dispatchEvent === 'function');
    startWrite(fileWriter);
}
var jsTestIsAsync = true;
setupAndRunTest(2*1024*1024, 'file-writer-events', runTest);
