<!DOCTYPE html>
<title>IDBCursor.direction</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    function cursor_direction(constant, dir)
    {
        var db,
          t = async_test(document.title + " - " + dir),
          expected = dir ? dir : "next";

        var open_rq = createdb(t);

        open_rq.onupgradeneeded = function(e) {
            db = e.target.result;
            var objStore = db.createObjectStore("test");

            objStore.add("data", "key");
        };

        open_rq.onsuccess = t.step_func(function(e) {
            var cursor_rq, count = 0;
            var os = db.transaction("test")
                       .objectStore("test");
            if (dir)
                cursor_rq = os.openCursor(undefined, dir);
            else
                cursor_rq = os.openCursor();

            cursor_rq.onsuccess = t.step_func(function(e) {
                var cursor = e.target.result;

                assert_equals(cursor.direction, constant, 'direction constant');
                assert_equals(cursor.direction, expected, 'direction');
                assert_readonly(cursor, 'direction');

                count++;
                if (count >= 2)
                    t.done();
            });

            var cursor_rq2 = db.transaction("test")
                              .objectStore("test")
                              .openCursor(undefined, constant);

            cursor_rq2.onsuccess = t.step_func(function(e) {
                var cursor = e.target.result;

                assert_equals(cursor.direction, constant, 'direction constant (second try)');
                assert_equals(cursor.direction, expected, 'direction (second try)');
                assert_readonly(cursor, 'direction');

                count++;
                if (count >= 2)
                    t.done();
            });

        });
    }

    cursor_direction("next");
    cursor_direction("next",       "next");
    cursor_direction("prev",       "prev");
    cursor_direction("nextunique", "nextunique");
    cursor_direction("prevunique", "prevunique");

</script>

<div id="log"></div>
