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

description("Test IndexedDB key types");

indexedDBTest(prepareDatabase, testValidArrayKeys);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    objectStore = evalAndLog("db.createObjectStore('store');");
    debug("");
}

function testValidArrayKeys()
{
    evalAndLog("trans = db.transaction('store', 'readwrite')");
    evalAndLog("store = trans.objectStore('store')");
    debug("");

    evalAndLog("long_array = []; for (i = 0; i < 10; ++i) { long_array.push('abc', 123, new Date(0), []); }");
    debug("");

    debug("array that contains non-numeric self-reference");
    evalAndLog("self_referrential_array = []; self_referrential_array.self = self_referrential_array;");
    debug("");

    var n = 0, cases = [
        "[]",

        "[-Infinity]",
        "[-Number.MAX_VALUE]",
        "[-1]",
        "[-Number.MIN_VALUE]",
        "[0]",
        "[Number.MIN_VALUE]",
        "[1]",
        "[Number.MAX_VALUE]",
        "[Infinity]",

        "[1,2,3]",

        "[new Date(0)]",
        "[new Date('2525-01-01T00:00:00Z')]",

        "[new Date(0), new Date('2525-01-01T00:00:00Z')]",

        "['']",
        "['\x00']",
        "['abc123']",

        "['abc', 123]",

        "[[]]",

        "[[], []]",
        "[[], [], []]",

        "[[[]]]",
        "[[[[]]]]",

        "[123, 'abc', new Date(0), []]",
        "[[123, 'abc', new Date(0), []], [456, 'def', new Date(999), [[]]]]",

        "long_array",
        "self_referrential_array"
    ];

    function testArrayPutGet(value, key, callback)
    {
        debug("testing array key: " + key);
        putreq = evalAndLog("store.put('" + value + "', " + key + ");");
        putreq.onerror = unexpectedErrorCallback;
        putreq.onsuccess = function() {
            getreq = evalAndLog("store.get(" + key + ");");
            getreq.onerror = unexpectedErrorCallback;
            getreq.onsuccess = function() {
                shouldBeEqualToString("getreq.result", value);

                evalAndLog("store.delete(" + key + ");").onerror = unexpectedErrorCallback;

                debug("");
                callback();
            };
        };
    }

    function nextTest()
    {
        var testcase = cases.shift();
        if (testcase) {
            testArrayPutGet("value" + (++n), testcase, nextTest);
        }
    }

    nextTest();

    trans.oncomplete = testInvalidArrayKeys;
}

function testInvalidArrayKeys()
{
    evalAndLog("trans = db.transaction('store', 'readwrite')");
    evalAndLog("store = trans.objectStore('store')");
    debug("");

    debug("array that contains itself: array = [ array ]");
    evalAndLog("cyclic_array = []; cyclic_array.push(cyclic_array)");

    debug("array that contains itself, one level down: array = [ [ array ] ]");
    evalAndLog("cyclic_array2 = []; cyclic_array2.push([cyclic_array2])");

    debug("array that contains itself, not as first element: array = [1, 'b', [], array]");
    evalAndLog("cyclic_array3 = [1, 'b', []]; cyclic_array3.push(cyclic_array3)");

    debug("array that contains array that contains itself");
    evalAndLog("cyclic_array4 = [cyclic_array];");
    debug("");

    var invalidKeys = [
        "[ void 0 ]", // undefined
        "[ true ]",
        "[ false ]",
        "[ NaN ]",
        "[ null ]",
        "[ {} ]",
        "[ function () {} ]",
        "[ /regex/ ]",
        "[ self ]",
        "[ self.document ]",
        "[ self.document.body ]",
        "cyclic_array",
        "cyclic_array2",
        "cyclic_array3",
        "cyclic_array4",
        "Array(1000)" // sparse
    ];

    invalidKeys.forEach(function (key) {
        debug("testing invalid array key: " + key);
        evalAndExpectException("store.put('value', " + key + ");", "0", "'DataError'");
        debug("");
    });

    testDepthLimits();
}

function makeArrayOfDepth(n)
{
    var array = [];
    while (--n) {
        array = [array];
    }
    return array;
}

function testDepthLimits()
{
    shouldBe("indexedDB.cmp(makeArrayOfDepth(25), 0)", "1");
    shouldBe("indexedDB.cmp(makeArrayOfDepth(250), 0)", "1");
    evalAndExpectException("indexedDB.cmp(makeArrayOfDepth(2500), 0)", "0", "'DataError'");
    debug("");

    finishJSTest();
}
