<!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>
