<!DOCTYPE html>
<meta charset=utf-8>
<title>IDBObjectStore.createIndex() - AutoIncrement in Compound Index</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>
  indexeddb_test(
    function(t, db, txn) {
      // No auto-increment
      var store = db.createObjectStore("Store1", {keyPath: "id"});
      store.createIndex("CompoundKey", ["num", "id"]);

      // Add data
      store.put({id: 1, num: 100});
    },
    function(t, db) {
      var store = db.transaction("Store1", "readwrite").objectStore("Store1");

      store.openCursor().onsuccess = t.step_func(function(e) {
        var item = e.target.result.value;
        store.index("CompoundKey").get([item.num, item.id]).onsuccess = t.step_func(function(e) {
          assert_equals(e.target.result ? e.target.result.num : null, 100, 'Expected 100.');
          t.done();
        });
      });
    },
    "Explicit Primary Key"
  );

  indexeddb_test(
    function(t, db, txn) {
      // Auto-increment
      var store = db.createObjectStore("Store2", {keyPath: "id", autoIncrement: true});
      store.createIndex("CompoundKey", ["num", "id"]);

      // Add data
      store.put({num: 100});
    },
    function(t, db) {
      var store = db.transaction("Store2", "readwrite").objectStore("Store2");
      store.openCursor().onsuccess = t.step_func(function(e) {
        var item = e.target.result.value;
        store.index("CompoundKey").get([item.num, item.id]).onsuccess = t.step_func(function(e) {
          assert_equals(e.target.result ? e.target.result.num : null, 100, 'Expected 100.');
          t.done();
        });
      });
    },
    "Auto-Increment Primary Key"
  );

  indexeddb_test(
    function(t, db, txn) {
      // Auto-increment
      var store = db.createObjectStore("Store3", {keyPath: "id", autoIncrement: true});
      store.createIndex("CompoundKey", ["num", "id", "other"]);

      var num = 100;

      // Add data to Store3 - valid keys
      // Objects will be stored in Store3 and keys will get added
      // to the CompoundKeys index.
      store.put({num: num++, other: 0});
      store.put({num: num++, other: [0]});

      // Add data - missing key
      // Objects will be stored in Store3 but keys won't get added to
      // the CompoundKeys index because the 'other' keypath doesn't
      // resolve to a value.
      store.put({num: num++});

      // Add data to Store3 - invalid keys
      // Objects will be stored in Store3 but keys won't get added to
      // the CompoundKeys index because the 'other' property values
      // aren't valid keys.
      store.put({num: num++, other: null});
      store.put({num: num++, other: {}});
      store.put({num: num++, other: [null]});
      store.put({num: num++, other: [{}]});
    },
    function(t, db) {
      var store = db.transaction("Store3", "readwrite").objectStore("Store3");
      const keys = [];
      let count;
      store.count().onsuccess = t.step_func(e => { count = e.target.result; });
      store.index("CompoundKey").openCursor().onsuccess = t.step_func(function(e) {
        const cursor = e.target.result;
        if (cursor !== null) {
          keys.push(cursor.key);
          cursor.continue();
          return;
        }

        // Done iteration, check results.
        assert_equals(count, 7, 'Expected all 7 records to be stored.');
        assert_equals(keys.length, 2, 'Expected exactly two index entries.');
        assert_array_equals(keys[0], [100, 1, 0]);
        assert_object_equals(keys[1], [101, 2, [0]]);
        t.done();
      });
    },
    "Auto-Increment Primary Key - invalid key values elsewhere"
  );
</script>
