<!--
Test converted from WebKit:
http://trac.webkit.org/browser/trunk/LayoutTests/storage/indexeddb/cursor-overloads.html
-->

<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<meta charset=utf-8>
<title>Validate the overloads of IDBObjectStore.openCursor(), IDBIndex.openCursor() and IDBIndex.openKeyCursor()</title>
<link rel=author href="mailto:romain.huet@gmail.com" title="Romain Huet">

<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js></script>

<script>

    var db, trans, store, index;
    var t = async_test();

    var request = createdb(t);
    request.onupgradeneeded = function(e) {
        db = request.result;
        store = db.createObjectStore('store');
        index = store.createIndex('index', 'value');
        store.put({value: 0}, 0);
        trans = request.transaction;
        trans.oncomplete = verifyOverloads;
    };

    function verifyOverloads() {
        trans = db.transaction('store');
        store = trans.objectStore('store');
        index = store.index('index');

        checkCursorDirection("store.openCursor()", "next");
        checkCursorDirection("store.openCursor(0)", "next");
        checkCursorDirection("store.openCursor(0, 'next')", "next");
        checkCursorDirection("store.openCursor(0, 'nextunique')", "nextunique");
        checkCursorDirection("store.openCursor(0, 'prev')", "prev");
        checkCursorDirection("store.openCursor(0, 'prevunique')", "prevunique");

        checkCursorDirection("store.openCursor(IDBKeyRange.only(0))", "next");
        checkCursorDirection("store.openCursor(IDBKeyRange.only(0), 'next')", "next");
        checkCursorDirection("store.openCursor(IDBKeyRange.only(0), 'nextunique')", "nextunique");
        checkCursorDirection("store.openCursor(IDBKeyRange.only(0), 'prev')", "prev");
        checkCursorDirection("store.openCursor(IDBKeyRange.only(0), 'prevunique')", "prevunique");

        checkCursorDirection("index.openCursor()", "next");
        checkCursorDirection("index.openCursor(0)", "next");
        checkCursorDirection("index.openCursor(0, 'next')", "next");
        checkCursorDirection("index.openCursor(0, 'nextunique')", "nextunique");
        checkCursorDirection("index.openCursor(0, 'prev')", "prev");
        checkCursorDirection("index.openCursor(0, 'prevunique')", "prevunique");

        checkCursorDirection("index.openCursor(IDBKeyRange.only(0))", "next");
        checkCursorDirection("index.openCursor(IDBKeyRange.only(0), 'next')", "next");
        checkCursorDirection("index.openCursor(IDBKeyRange.only(0), 'nextunique')", "nextunique");
        checkCursorDirection("index.openCursor(IDBKeyRange.only(0), 'prev')", "prev");
        checkCursorDirection("index.openCursor(IDBKeyRange.only(0), 'prevunique')", "prevunique");

        checkCursorDirection("index.openKeyCursor()", "next");
        checkCursorDirection("index.openKeyCursor(0)", "next");
        checkCursorDirection("index.openKeyCursor(0, 'next')", "next");
        checkCursorDirection("index.openKeyCursor(0, 'nextunique')", "nextunique");
        checkCursorDirection("index.openKeyCursor(0, 'prev')", "prev");
        checkCursorDirection("index.openKeyCursor(0, 'prevunique')", "prevunique");

        checkCursorDirection("index.openKeyCursor(IDBKeyRange.only(0))", "next");
        checkCursorDirection("index.openKeyCursor(IDBKeyRange.only(0), 'next')", "next");
        checkCursorDirection("index.openKeyCursor(IDBKeyRange.only(0), 'nextunique')", "nextunique");
        checkCursorDirection("index.openKeyCursor(IDBKeyRange.only(0), 'prev')", "prev");
        checkCursorDirection("index.openKeyCursor(IDBKeyRange.only(0), 'prevunique')", "prevunique");

        t.done();
    }

    function checkCursorDirection(statement, direction) {
        request = eval(statement);
        request.onsuccess = function(event) {
            assert_not_equals(event.target.result, null, "Check the result is not null")
            assert_equals(event.target.result.direction, direction, "Check the result direction");
        };
    }

</script>

<div id=log></div>
