<!DOCTYPE html>
<meta charset="utf-8">
<title>Keygenerator ConstraintError when using same id as already generated</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,
      t = async_test(document.title, {timeout: 10000}),
      objects = [1, null, {id: 2}, null, 2.00001, 5, null, {id: 6} ],
      expected = [1, 2, 2.00001, 3, 5, 6],
      errors = 0;

    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 (typeof objects[i] === "object")
            {
                var rq = objStore.add(objects[i])
                rq.yeh = objects[i];
                rq.onerror = t.step_func(function(e) {
                    errors++;

                    assert_equals(e.target.error.name, "ConstraintError");
                    assert_equals(e.type, "error");

                    e.stopPropagation();
                    e.preventDefault();
                });
                rq.onsuccess = t.step_func(function(e) {
                    assert_unreached("Got rq.success when adding duplicate id " + objects[i]);
                });
            }
            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_equals(errors, 2, "expected ConstraintError's");
                assert_array_equals(actual_keys, expected, "keygenerator array");
                t.done();
            }
        });
    };

</script>

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