<!DOCTYPE html>
<meta charset="utf-8">
<title>Keygenerator</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="The current number of a key generator is always set to 1 when the object store for that key generator is first created.">
<link rel=assert title="When a key generator is used to generate a new key for a object store, the key generator's current number is used as the new key value and then the key generator's current number is increased by 1.">
<link rel=assert title="When a record is stored in a object store which uses a key generator, and an explicit key is defined, if the key's value is a float greater than or equal to the key generator's current number, then the key generator's current number is set to the smallest integer number larger than the explicit key. Only explicit keys which are float values affect the current number of the key generator.">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
    function keygenerator(objects, expected_keys, desc, func) {
        var db,
          t = async_test(document.title + " - " + desc);

        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
                    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_key_equals(actual_keys, expected_keys, "keygenerator array");
                    t.done();
                }
            });
        };
    }


    keygenerator([null, null, null, null],  [1, 2, 3, 4],
        "starts at one, and increments by one");

    keygenerator([2, null, 5, null, 6.66, 7],  [2, 3, 5, 6, 6.66, 7],
        "increments by one from last set key");

    keygenerator([-10, null, "6", 6.3, [10], -2, 4, null],   [-10, -2, 1, 4, 6.3, 7, "6", [10]],
        "don't increment when new key is not bigger than current");

</script>

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