<!DOCTYPE html>
<title>IDBCursor.continue() - index - iterate using nextunique</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#cursor-iteration-operation">
<link rel=assert title='If direction is "nextunique", let found record be the first record in records which satisfy all of the following requirements:'>
<link rel=assert title="If position is defined, the record's key is greater than position.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var db,
      t = async_test(document.title, {timeout: 10000}),
      records = [ { pKey: "primaryKey_0",   iKey: "indexKey_0" },
                  { pKey: "primaryKey_1",   iKey: "indexKey_1" },
                  { pKey: "primaryKey_1-2", iKey: "indexKey_1" },
                  { pKey: "primaryKey_2",   iKey: "indexKey_2" } ],

      expected = [ { pKey: "primaryKey_0",   iKey: "indexKey_0" },
                 { pKey: "primaryKey_1",   iKey: "indexKey_1" },
                 { pKey: "primaryKey_2",   iKey: "indexKey_2" } ];

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("test", { keyPath: "pKey" });

        objStore.createIndex("index", "iKey");

        for (var i = 0; i < records.length; i++)
            objStore.add(records[i]);
    };

    open_rq.onsuccess = function(e) {
        var count = 0,
          cursor_rq = db.transaction("test")
                        .objectStore("test")
                        .index("index")
                        .openCursor(undefined, "nextunique");

        cursor_rq.onsuccess = t.step_func(function(e) {
            if (!e.target.result) {
                assert_equals(count, expected.length, 'count');
                t.done();
                return;
            }
            var cursor = e.target.result,
              record = cursor.value;

            assert_equals(record.pKey, expected[count].pKey, "pKey #" + count);
            assert_equals(record.iKey, expected[count].iKey, "iKey #" + count);

            assert_equals(cursor.key,  expected[count].iKey, "cursor.key #" + count);
            assert_equals(cursor.primaryKey, expected[count].pKey, "cursor.primaryKey #" + count);

            count++;
            cursor.continue(expected[count] ? expected[count].iKey : undefined);
        });
    };

</script>

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