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

description("Test lazy IndexedDB index population with various key types.");

function test()
{
    removeVendorPrefixes();
    setDBNameFromPath();

    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
    request.onerror = unexpectedErrorCallback;
    request.onblocked = unexpectedBlockedCallback;
    request.onsuccess = function() {
        request = evalAndLog("indexedDB.open(dbname, 1)");
        request.onerror = unexpectedErrorCallback;
        request.onblocked = unexpectedBlockedCallback;
        request.onupgradeneeded = onUpgradeNeeded;
        request.onsuccess = onSuccess;
    };
}

function onUpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("store = db.createObjectStore('store', {autoIncrement: true})");
    evalAndLog("index = store.createIndex('greedy-index', 'id')");

    [
        // Valid key types:
        "0",
        "new Date(0)",
        "'string'",
        "[]",

        // Types in arrays, for good measure:
        "[0]",
        "[new Date(0)]",
        "['string']",
        "[[]]",

        // Types which are cloneable but not valid keys:
        "undefined",
        "null",
        "true",
        "false",
        "{}",
        "/(?:)/"
    ].forEach(function(indexKey) {
        evalAndLog("store.put({id: " + indexKey + "})");
    });

    evalAndLog("index = store.createIndex('lazy-index', 'id')");
    evalAndLog("expectedIndexSize = 8");
}

function onSuccess(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("trans = db.transaction('store')");
    trans.onabort = unexpectedAbortCallback;
    evalAndLog("store = trans.objectStore('store')");

    evalAndLog("greedyIndex = store.index('greedy-index')");
    gotGreedyCount = false;
    evalAndLog("request = greedyIndex.count()");
    request.onsuccess = function countSuccess(evt) {
        preamble(evt);
        shouldBe("event.target.result", "expectedIndexSize");
        evalAndLog("gotGreedyCount = true");
    };

    evalAndLog("lazyIndex = store.index('lazy-index')");
    gotLazyCount = false;
    evalAndLog("request = lazyIndex.count()");
    request.onsuccess = function countSuccess(evt) {
        preamble(evt);
        shouldBe("event.target.result", "expectedIndexSize");
        evalAndLog("gotLazyCount = true");
    };

    trans.oncomplete = onComplete;
}

function onComplete(evt)
{
    preamble(evt);

    shouldBeTrue("gotGreedyCount");
    shouldBeTrue("gotLazyCount");
    finishJSTest();
}

test();
