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

description("Test openCursor/openKeyCursor with raw IDBKeys.");

var objectStoreData = [
    { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } },
    { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } },
    { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } },
    { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
    { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
    { key: "237-23-7737", value: { name: "Pat", height: 65, weight: 100 } },
    { key: "237-23-7738", value: { name: "Leo", height: 65, weight: 180 } },
    { key: "237-23-7739", value: { name: "Jef", height: 65, weight: 120 } },
    { key: "237-23-7740", value: { name: "Sam", height: 71, weight: 110 } },
    { key: "237-23-7741", value: { name: "Bug", height: 63, weight: 100 } },
    { key: "237-23-7742", value: { name: "Tub", height: 69, weight: 180 } },
    { key: "237-23-7743", value: { name: "Rug", height: 77, weight: 120 } },
    { key: "237-23-7744", value: { name: "Pug", height: 66, weight: 110 } },
];

var indexData = [
    { name: "name", keyPath: "name", options: { unique: true } },
    { name: "height", keyPath: "height", options: { } },
    { name: "weight", keyPath: "weight", options: { unique: false } }
];

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

    objectStoreName = "People";
    objectStore = evalAndLog("objectStore = db.createObjectStore(objectStoreName);");
    trans = event.target.result;

    debug("First, add all our data to the object store.");
    addedData = 0;
    for (i in objectStoreData) {
        request = evalAndLog("request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);");
        request.onerror = unexpectedErrorCallback;
    }
    createIndexes();
}

function createIndexes()
{
    debug("Now create the indexes.");
    for (i in indexData) {
        evalAndLog("objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);");
    }
}

function testAll()
{
    testObjectStore();
}

function testObjectStore()
{
    debug("testObjectStore()");
    evalAndLog("trans = db.transaction(objectStoreName, 'readwrite')");
    trans.onabort = unexpectedAbortCallback;
    objectStore = evalAndLog("objectStore = trans.objectStore(objectStoreName)");

    evalAndLog("request = objectStore.openCursor('237-23-7739')");
    var count = 0;
    request.onsuccess = function() {
        cursor = event.target.result;

        if (count == 0) {
            shouldBeEqualToString("cursor.key", "237-23-7739");
            shouldBe("JSON.stringify(cursor.value)", "JSON.stringify(objectStoreData[7].value)");
            shouldBe("cursor.primaryKey", "cursor.key");
            evalAndLog("cursor.continue()");
        } else if (count == 1) {
            shouldBeNull("cursor");
        } else {
            testFailed("Too much iteration");
        }
        count++;
    };
    trans.oncomplete = testIndex;
    request.onerror = unexpectedErrorCallback;
}

function testIndex()
{
    evalAndLog("trans = db.transaction(objectStoreName, 'readwrite')");
    objectStore = evalAndLog("objectStore = trans.objectStore(objectStoreName)");
    index = evalAndLog("index = objectStore.index('weight')");

    evalAndLog("request = index.openCursor(180)");
    var count = 0;
    request.onsuccess = function() {
        cursor = event.target.result;

        if (count == 0) {
            shouldBe("cursor.key", '180');
            shouldBe("JSON.stringify(cursor.value)",
                     "JSON.stringify(objectStoreData[2].value)");
            shouldBeEqualToString("cursor.primaryKey", "237-23-7734");
            evalAndLog("cursor.continue()");
        } else if (count == 1) {
            shouldBe("cursor.key", '180');
            shouldBe("JSON.stringify(cursor.value)",
                     "JSON.stringify(objectStoreData[6].value)");
            shouldBeEqualToString("cursor.primaryKey", "237-23-7738");
            evalAndLog("cursor.continue()");
        } else if (count == 2) {
            shouldBe("cursor.key", '180');
            shouldBe("JSON.stringify(cursor.value)",
                     "JSON.stringify(objectStoreData[10].value)");
            shouldBeEqualToString("cursor.primaryKey", "237-23-7742");
            evalAndLog("cursor.continue()");
        } else if (count == 3) {
            shouldBeNull("cursor");
        } else {
            testFailed("Too much iteration");
        }
        count++;
    };
    trans.oncomplete = testIndexWithKey;
    request.onerror = unexpectedErrorCallback;
}

function testIndexWithKey()
{
    evalAndLog("trans = db.transaction(objectStoreName, 'readwrite')");
    objectStore = evalAndLog("objectStore = trans.objectStore(objectStoreName)");
    index = evalAndLog("index = objectStore.index('weight')");

    evalAndLog("request = index.openKeyCursor(180)");
    var count = 0;
    request.onsuccess = function() {
        cursor = event.target.result;

        if (count == 0) {
            shouldBe("cursor.key", '180');
            shouldBeEqualToString("cursor.primaryKey", "237-23-7734");
            evalAndLog("cursor.continue()");
        } else if (count == 1) {
            shouldBe("cursor.key", '180');
            shouldBeEqualToString("cursor.primaryKey", "237-23-7738");
            evalAndLog("cursor.continue()");
        } else if (count == 2) {
            shouldBe("cursor.key", '180');
            shouldBeEqualToString("cursor.primaryKey", "237-23-7742");
            evalAndLog("cursor.continue()");
        } else if (count == 3) {
            shouldBeNull("cursor");
        } else {
            testFailed("Too much iteration");
        }
        count++;
    };
    request.onerror = unexpectedErrorCallback;
    trans.oncomplete = finishJSTest;
}
