<!DOCTYPE html>
<title>IDBObjectStore.openKeyCursor()</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function store_test(func, name) {
    async_test(function(t) {
        var del = indexedDB.deleteDatabase(name);
        del.onerror = t.unreached_func("deleteDatabase failed");
        var open = indexedDB.open(name);
        open.onupgradeneeded = t.step_func(function() {
            var db = open.result;
            var store = db.createObjectStore("store");
            for (var i = 0; i < 10; ++i) {
                store.put("value: " + i, i);
            }
        });

        open.onsuccess = t.step_func(function() {
            var db = open.result;
            var tx = db.transaction("store");
            var store = tx.objectStore("store");
            func(t, db, tx, store);
        });
    }, name);
}

store_test(function(t, db, tx, store) {
    var expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var actual = [];
    var request = store.openKeyCursor();
    request.onsuccess = t.step_func(function() {
        var cursor = request.result;
        if (!cursor)
            return;
        assert_equals(cursor.direction, "next");
        assert_false("value" in cursor);
        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0);
        actual.push(cursor.key);
        cursor.continue();
    });

    tx.onabort = t.unreached_func("transaction aborted");
    tx.oncomplete = t.step_func(function() {
        assert_array_equals(expected, actual, "keys should match");
        t.done();
    });

}, "IDBObjectStore.openKeyCursor() - forward iteration");

store_test(function(t, db, tx, store) {
    var expected = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
    var actual = [];
    var request = store.openKeyCursor(null, "prev");
    request.onsuccess = t.step_func(function() {
        var cursor = request.result;
        if (!cursor)
            return;
        assert_equals(cursor.direction, "prev");
        assert_false("value" in cursor);
        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0);
        actual.push(cursor.key);
        cursor.continue();
    });

    tx.onabort = t.unreached_func("transaction aborted");
    tx.oncomplete = t.step_func(function() {
        assert_array_equals(expected, actual, "keys should match");
        t.done();
    });

}, "IDBObjectStore.openKeyCursor() - reverse iteration");

store_test(function(t, db, tx, store) {
    var expected = [4, 5, 6];
    var actual = [];
    var request = store.openKeyCursor(IDBKeyRange.bound(4, 6));
    request.onsuccess = t.step_func(function() {
        var cursor = request.result;
        if (!cursor)
            return;
        assert_equals(cursor.direction, "next");
        assert_false("value" in cursor);
        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0);
        actual.push(cursor.key);
        cursor.continue();
    });

    tx.onabort = t.unreached_func("transaction aborted");
    tx.oncomplete = t.step_func(function() {
        assert_array_equals(expected, actual, "keys should match");
        t.done();
    });

}, "IDBObjectStore.openKeyCursor() - forward iteration with range");

store_test(function(t, db, tx, store) {
    var expected = [6, 5, 4];
    var actual = [];
    var request = store.openKeyCursor(IDBKeyRange.bound(4, 6), "prev");
    request.onsuccess = t.step_func(function() {
        var cursor = request.result;
        if (!cursor)
            return;
        assert_equals(cursor.direction, "prev");
        assert_false("value" in cursor);
        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0);
        actual.push(cursor.key);
        cursor.continue();
    });

    tx.onabort = t.unreached_func("transaction aborted");
    tx.oncomplete = t.step_func(function() {
        assert_array_equals(expected, actual, "keys should match");
        t.done();
    });

}, "IDBObjectStore.openKeyCursor() - reverse iteration with range");

store_test(function(t, db, tx, store) {
    assert_throws("DataError", function() { store.openKeyCursor(NaN); },
        "openKeyCursor should throw on invalid number key");
    assert_throws("DataError", function() { store.openKeyCursor(new Date(NaN)); },
        "openKeyCursor should throw on invalid date key");
    assert_throws("DataError", function() {
        var cycle = [];
        cycle.push(cycle);
        store.openKeyCursor(cycle);
    }, "openKeyCursor should throw on invalid array key");
    assert_throws("DataError", function() { store.openKeyCursor({}); },
        "openKeyCursor should throw on invalid key type");
    setTimeout(t.step_func(function() {
        assert_throws("TransactionInactiveError", function() { store.openKeyCursor(); },
            "openKeyCursor should throw if transaction is inactive");
        t.done();
    }), 0);

}, "IDBObjectStore.openKeyCursor() - invalid inputs");
</script>
