<!doctype html>
<meta charset="utf8">
<title>IndexedDB: IDBCursor method continuePrimaryKey()</title>
<link rel="help"
      href="http://w3c.github.io/IndexedDB/#dom-idbcursor-continueprimarykey">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
'use strict';

indexeddb_test(
    (t, db, txn) => {
      const store = db.createObjectStore('store');
      const index = store.createIndex('index', 'indexKey', {multiEntry: true});

      store.put({indexKey: ['a', 'b']}, 1);
      store.put({indexKey: ['a', 'b']}, 2);
      store.put({indexKey: ['a', 'b']}, 3);
      store.put({indexKey: ['b']}, 4);

      const expectedIndexEntries = [
        {key: "a", primaryKey: 1},
        {key: "a", primaryKey: 2},
        {key: "a", primaryKey: 3},
        {key: "b", primaryKey: 1},
        {key: "b", primaryKey: 2},
        {key: "b", primaryKey: 3},
        {key: "b", primaryKey: 4},
      ];

      const request = index.openCursor();
      request.onerror = t.unreached_func('IDBIndex.openCursor should not fail');
      request.onsuccess = t.step_func(() => {
        const cursor = request.result;
        const expectedEntry = expectedIndexEntries.shift();
        if (expectedEntry) {
          assert_equals(cursor.key, expectedEntry.key,
              'The index entry keys should reflect the object store contents');
          assert_equals(cursor.primaryKey, expectedEntry.primaryKey,
              'The index entry primary keys should reflect the object store ' +
              'contents');
          cursor.continue();
        } else {
          assert_equals(cursor, null,
              'The index should not have entries that do not reflect the ' +
              'object store contents');
        }
      });
    },
    (t, db) => {
      const testCases = [
        // Continuing index key
        { call: cursor => { cursor.continue(); },
          result: { key: "a", primaryKey: 2 } },
        { call: cursor => { cursor.continue('a'); },
          exception: 'DataError' },
        { call: cursor => { cursor.continue('b'); },
          result: { key: "b", primaryKey: 1 } },
        { call: cursor => { cursor.continue('c'); }, result: null },

        // Called w/ index key and primary key:
        { call: cursor => { cursor.continuePrimaryKey('a', 3); },
          result: { key: 'a', primaryKey: 3 } },
        { call: cursor => { cursor.continuePrimaryKey('a', 4); },
          result: { key: 'b', primaryKey: 1 } },
        { call: cursor => { cursor.continuePrimaryKey('b', 1); },
          result: {key: 'b', primaryKey: 1} },
        { call: cursor => { cursor.continuePrimaryKey('b', 4); },
          result: {key: 'b', primaryKey: 4} },
        { call: cursor => { cursor.continuePrimaryKey('b', 5); },
          result: null },
        { call: cursor => { cursor.continuePrimaryKey('c', 1); },
          result: null },

        // Called w/ primary key but w/o index key
        { call: cursor => { cursor.continuePrimaryKey(null, 1); },
          exception: 'DataError' },
        { call: cursor => { cursor.continuePrimaryKey(null, 2); },
          exception: 'DataError' },
        { call: cursor => { cursor.continuePrimaryKey(null, 3); },
          exception: 'DataError' },
        { call: cursor => { cursor.continuePrimaryKey(null, 4); },
          exception: 'DataError' },
        { call: cursor => { cursor.continuePrimaryKey(null, 5); },
          exception: 'DataError' },

        // Called w/ index key but w/o primary key
        { call: cursor => { cursor.continuePrimaryKey('a', null); },
          exception: 'DataError' },
      ];

      const verifyContinueCalls = () => {
        if (!testCases.length) {
          t.done();
          return;
        }

        const testCase = testCases.shift();

        const txn = db.transaction('store');
        txn.oncomplete = t.step_func(verifyContinueCalls);

        const request = txn.objectStore('store').index('index').openCursor();
        let calledContinue = false;
        request.onerror =
            t.unreached_func('IDBIndex.openCursor should not fail');
        request.onsuccess = t.step_func(() => {
          const cursor = request.result;
          if (calledContinue) {
            if (testCase.result) {
              assert_equals(cursor.key, testCase.result.key,
                  `${testCase.call.toString()} - result key`);
              assert_equals(cursor.primaryKey, testCase.result.primaryKey,
                  `${testCase.call.toString()} - result primary key`);
            } else {
              assert_equals(cursor, null);
            }
          } else {
            calledContinue = true;
            if('exception' in testCase) {
              assert_throws(
                  testCase.exception, () => { testCase.call(cursor); },
                  testCase.call.toString());
            } else {
              testCase.call(cursor);
            }
          }
        });
      };
      verifyContinueCalls();
    });
</script>
