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

description("Test IndexedDB keys ordering and readback from cursors.");

indexedDBTest(prepareDatabase, populateStore);
function prepareDatabase()
{
    db = event.target.result;
    store = evalAndLog("store = db.createObjectStore('store')");
    evalAndLog("store.createIndex('index', '')");
}

function populateStore()
{
    debug("");
    debug("populating store...");
    evalAndLog("trans = db.transaction('store', 'readwrite')");
    evalAndLog("store = trans.objectStore('store');");
    trans.onerror = unexpectedErrorCallback;
    trans.onabort = unexpectedAbortCallback;

    evalAndLog("store.put(1, 1)");
    evalAndLog("store.put(2, 2)");
    evalAndLog("store.put(3, 3)");
    trans.oncomplete = testCursor;
}

var tests = [
                {upperBound: 7, open: false, expected: 3},
                {upperBound: 7, open: true,  expected: 3},
                {upperBound: 3, open: false, expected: 3},
                {upperBound: 3, open: true,  expected: 2}
            ];

function testCursor()
{
    debug("testCursor()");

    if (tests.length === 0) {
        debug("No more tests.");
        finishJSTest();
        return;
    }

    test = tests.shift();

    evalAndLog("trans = db.transaction('store', 'readonly')");
    trans.onerror = unexpectedErrorCallback;
    trans.onabort = unexpectedAbortCallback;
    trans.oncomplete = testCursor;
    evalAndLog("store = trans.objectStore('store');");
    evalAndLog("index = store.index('index');");

    var testFunction = function() {
        evalAndLog("cursor = event.target.result");
        if (cursor === null) {
            debug("cursor should not be null");
            fail();
            return;
        }

        shouldBe("cursor.key", "test.expected");
        if ("value" in cursor)
            shouldBe("cursor.value", "test.expected");
        shouldBe("cursor.primaryKey", "test.expected");

        // Let the transaction finish.
    }

    debug("upperBound: " + test.upperBound + " open: " + test.open + " expected: " + test.expected);
    storeReq = evalAndLog("storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')");
    storeReq.onsuccess = testFunction;

    indexReq = evalAndLog("indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')");
    indexReq.onsuccess = testFunction;

    indexKeyReq = evalAndLog("indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')");
    indexKeyReq.onsuccess = testFunction;
}
