<!DOCTYPE html>
<title>IDBCursor.continue() - objectstore - delete next element, and iterate to it</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>
    var db,
      count = 0,
      t = async_test(document.title, {timeout: 10000});

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

        for (var i = 0; i < 500; i++)
            objStore.add({ key: i, val: "val_"+i });

        var rq = objStore.add({ key: 500, val: "val_500" });

        rq.onsuccess = t.step_func(function() {
            for (var i = 999; i > 500; i--)
                objStore.add({ key: i, val: "val_"+i });
        });

        objStore.createIndex('index', ['key', 'val']);
    };

    open_rq.onsuccess = function(e) {
        var cursor_rq = db.transaction("test", "readwrite")
                          .objectStore("test")
                          .openCursor();

        cursor_rq.onsuccess = t.step_func(function(e) {
            var cursor = e.target.result,
              store = e.target.source;
            if (!cursor) {
                assert_equals(count, 997, "cursor run count");

                var rq = e.target.source.count();
                rq.onsuccess = t.step_func(function(e) {
                    assert_equals(e.target.result, 995, "object count");
                    t.done();
                });
                return;
            }

            switch (cursor.key) {
                case 10:
                    assert_equals(count, cursor.key, "count");
                    store.delete(11);
                    break;

                case 12:
                case 499:
                case 500:
                case 501:
                    assert_equals(count, cursor.key - 1, "count");
                    break;

                // Delete the next key
                case 510:
                    store.delete(511);
                    break;

                // Delete randomly
                case 512:
                    store.delete(611);
                    store.delete(499);
                    store.delete(500);
                    break;

                // Delete and add a new key
                case 520:
                    store.delete(521);
                    store.add({ key: 521, val: "new"});
                    break;

                case 521:
                    assert_equals(cursor.value.val, "new");
                    break;

                // We should only be here once although we're basically making the index
                // "heavier" with its new key.
                case 530:
                    assert_equals(cursor.value.val, "val_530");
                    cursor.update({ key: 530, val: "val_531" })

                    store.get(530).onsuccess = t.step_func(function(e) {
                        assert_equals(e.target.result.val, "val_531");
                    });
                    break;

                // Shouldn't happen.
                case 11:
                case 511:
                case 611:
                    assert_unreached(cursor.key + " should be deleted and never run");
                    break;
            }

            cursor.continue();
            count++;
        });
    };
</script>

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