<!DOCTYPE html>
<meta charset="utf-8">
<title>Keygenerator overflow</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#key-generator-concept">
<link rel=assert title="When the current number of a key generator reaches above the value 2^53 (9007199254740992) any attempts to use the key generator to generate a new key will result in an error. It's still possible to insert records into the object store by specifying an explicit key, however the only way to use a key generator again for the object store is to delete the object store and create a new one.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var db,
      t = async_test(),
      overflow_error_fired = false,
      objects =  [9007199254740991, null, "error", 2, "error" ],
      expected_keys = [2, 9007199254740991, 9007199254740992];

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("store", { keyPath: "id", autoIncrement: true });

        for (var i = 0; i < objects.length; i++)
        {
            if (objects[i] === null)
            {
                objStore.add({});
            }
            else if (objects[i] === "error")
            {
                var rq = objStore.add({});
                rq.onsuccess = fail(t, 'When "current number" overflows, error event is expected');
                rq.onerror = t.step_func(function(e) {
                    overflow_error_fired = true;
                    assert_equals(e.target.error.name, "ConstraintError", "error name");
                    e.preventDefault();
                    e.stopPropagation();
                });
            }
            else
                objStore.add({ id: objects[i] });
        }
    };

    open_rq.onsuccess = function(e) {
        var actual_keys = [],
          rq = db.transaction("store")
                 .objectStore("store")
                 .openCursor();

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

            if (cursor) {
                actual_keys.push(cursor.key.valueOf());
                cursor.continue();
            }
            else {
                assert_true(overflow_error_fired, "error fired on 'current number' overflow");
                assert_array_equals(actual_keys, expected_keys, "keygenerator array");

                t.done();
            }
        });
    };

</script>

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