if (this.importScripts) {
    importScripts('../../../resources/js-test.js');
    importScripts('shared.js');
}

description("Test IndexedDB's IDBObjectStore auto-increment feature.");

indexedDBTest(prepareDatabase, setVersionCompleted);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;

    debug("createObjectStore():");
    self.store = evalAndLog("store = db.createObjectStore('StoreWithKeyPath', {keyPath: 'id', autoIncrement: true})");
    evalAndLog("db.createObjectStore('StoreWithAutoIncrement', {autoIncrement: true})");
    evalAndLog("db.createObjectStore('PlainOldStore', {autoIncrement: false})");
    evalAndLog("db.createObjectStore('StoreWithLongKeyPathAndUTF8', {keyPath: 'a.b.c.køi', autoIncrement: true})");
    var storeNames = evalAndLog("storeNames = db.objectStoreNames");

    shouldBeEqualToString("store.name", "StoreWithKeyPath");
    shouldBeEqualToString("store.keyPath", "id");
    shouldBe("storeNames.contains('StoreWithKeyPath')", "true");
    shouldBe("storeNames.contains('StoreWithAutoIncrement')", "true");
    shouldBe("storeNames.contains('PlainOldStore')", "true");
    shouldBe("storeNames.length", "4");
}

function setVersionCompleted()
{
    debug("setVersionCompleted():");

    self.trans = evalAndLog("trans = db.transaction(['StoreWithKeyPath', 'StoreWithAutoIncrement', 'PlainOldStore'], 'readwrite')");
    trans.onabort = unexpectedAbortCallback;
    trans.oncomplete = testLongKeyPath;

    self.store = evalAndLog("store = trans.objectStore('StoreWithKeyPath')");

    debug("Insert into object store with auto increment and key path, with key in the object.");
    request = evalAndLog("store.add({name: 'Jeffersson', number: '7010', id: 3})");
    request.onsuccess = addJefferssonSuccess;
    request.onerror = unexpectedErrorCallback;
}

function addJefferssonSuccess()
{
    debug("addJefferssonSuccess():");
    shouldBe("event.target.result", "3");

    debug("Insert into object store with auto increment and key path, without key in the object.");
    request = evalAndLog("store.add({name: 'Lincoln', number: '7012'})");
    request.onsuccess = addLincolnWithInjectKeySuccess;
    request.onerror = unexpectedErrorCallback;
}

function addLincolnWithInjectKeySuccess()
{
    debug("addLincolnWithInjectKeySuccess():");
    shouldBe("event.target.result", "4");

    result = evalAndLog("store.get(4)");
    result.onsuccess = getLincolnAfterInjectedKeySuccess;
    result.onerror = unexpectedErrorCallback;
}

function getLincolnAfterInjectedKeySuccess()
{
    debug("getLincolnAfterInjectedKeySuccess():");
    shouldBeEqualToString("event.target.result.name", "Lincoln");
    shouldBeEqualToString("event.target.result.number", "7012");
    shouldBe("event.target.result.id", "4");

    request = evalAndLog("store.add({name: 'Bob', number: Uint8Array.from([100, 101])})");
    request.onsuccess = putBobSuccess;
    request.onerror = unexpectedErrorCallback;
}

function putBobSuccess()
{
    debug("putBobSuccess():");
    shouldBe("event.target.result", "5");

    request = evalAndLog("store.get(5)");
    request.onsuccess = getBobSuccess;
    request.onerror = unexpectedErrorCallback;
}

function getBobSuccess()
{
    debug("getBobSuccess():");
    shouldBeEqualToString("event.target.result.name", "Bob");
    shouldBe("event.target.result.number", "[100, 101]");

    self.store = evalAndLog("store = trans.objectStore('StoreWithAutoIncrement')");
    debug("Insert into object store with key gen using explicit key");
    request = evalAndLog("store.add({name: 'Lincoln', number: '7012'}, 6)");
    request.onsuccess = addLincolnWithExplicitKeySuccess;
    request.onerror = unexpectedErrorCallback;
}

function addLincolnWithExplicitKeySuccess()
{
    debug("addLincolnWithExplicitKeySuccess():");
    shouldBe("event.target.result", "6");

    request = evalAndLog("store.get(6)");
    request.onsuccess = getLincolnSuccess;
    request.onerror = unexpectedErrorCallback;
}

function getLincolnSuccess()
{
    debug("getLincolnSuccess():");
    shouldBeEqualToString("event.target.result.name", "Lincoln");
    shouldBeEqualToString("event.target.result.number", "7012");

    request = evalAndLog("store.put({name: 'Abraham', number: '2107'})");
    request.onsuccess = putAbrahamSuccess;
    request.onerror = unexpectedErrorCallback;
}

function putAbrahamSuccess()
{
    debug("putAbrahamSuccess():");
    shouldBe("event.target.result", "7");

    request = evalAndLog("store.get(7)");
    request.onsuccess = getAbrahamSuccess;
    request.onerror = unexpectedErrorCallback;
}

function getAbrahamSuccess()
{
    debug("getAbrahamSuccess():");
    shouldBeEqualToString("event.target.result.name", "Abraham");
    shouldBeEqualToString("event.target.result.number", "2107");

    self.store = evalAndLog("store = trans.objectStore('PlainOldStore')");
    debug("Try adding with no key to object store without auto increment.");
    evalAndExpectException("store.add({name: 'Adam'})", "0", "'DataError'");
    request = evalAndLog("store.add({name: 'Adam'}, 1)");
    request.onsuccess = addAdamSuccess;
    request.onerror = unexpectedErrorCallback;
}

function addAdamSuccess()
{
    debug("addAdamSuccess():");
    shouldBe("event.target.result", "1");
}

function testLongKeyPath()
{
    debug("testLongKeyPath():");
    trans = evalAndLog("trans = db.transaction('StoreWithLongKeyPathAndUTF8', 'readwrite')");
    trans.onabort = unexpectedAbortCallback;
    trans.oncomplete = finishJSTest;

    store = evalAndLog("store = trans.objectStore('StoreWithLongKeyPathAndUTF8')");
    request = evalAndLog("store.add({foo: 'bar'})");
    request.onerror = unexpectedErrorCallback;
    request = evalAndLog("store.add({foo: 'bar', a: {}})");
    request.onerror = unexpectedErrorCallback;
    request = evalAndLog("store.add({foo: 'bar', a: {b: {}}})");
    request.onerror = unexpectedErrorCallback;
    request = evalAndLog("store.add({foo: 'bar', a: {b: {c: {}}}})");
    request.onerror = unexpectedErrorCallback;
    cursorRequest = evalAndLog("store.openCursor()");
    cursorRequest.onerror = unexpectedErrorCallback;
    evalAndLog("expected = null");
    evalAndLog("count = 0");
    cursorRequest.onsuccess = function () {
        cursor = cursorRequest.result;
        if (!cursor) {
            shouldBe("count", "4");
            return;
        }
        if (expected === null) {
            evalAndLog("expected = cursor.value.a.b.c.køi + 1");
        } else {
            shouldBeEqualToString("cursor.value.foo", "bar");
            shouldBe("cursor.value.a.b.c.køi", "expected");
            evalAndLog("expected = cursor.value.a.b.c.køi + 1");
        }
        count++;
        cursor.continue();
    };
}
