<!DOCTYPE html>
<title>IndexedDB: Test IDBObjectStore.getAll.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
setup({explicit_done: true});

var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');

function doSetup(dbName, dbVersion, onsuccess) {
  var delete_request = indexedDB.deleteDatabase(dbName);
  delete_request.onerror = function() {
    assert_unreached('deleteDatabase should not fail');
  };
  delete_request.onsuccess = function(e) {
    var req = indexedDB.open(dbName, dbVersion);
    req.onsuccess = onsuccess;
    req.onerror = function() {
      assert_unreached('open should not fail');
    };
    req.onupgradeneeded = function(evt) {
      var connection = evt.target.result;

      var store = connection.createObjectStore('generated',
            {autoIncrement: true, keyPath: 'id'});
      alphabet.forEach(function(letter) {
        store.put({ch: letter});
      });

      store = connection.createObjectStore('out-of-line', null);
      alphabet.forEach(function(letter) {
        store.put('value-' + letter, letter);
      });

      store = connection.createObjectStore('empty', null);
    };
  };
}

function createGetAllRequest(t, storeName, connection, range, maxCount) {
    var transaction = connection.transaction(storeName, 'readonly');
    var store = transaction.objectStore(storeName);
    var req = store.getAll(range, maxCount);
    req.onerror = t.unreached_func('getAll request should succeed');
    return req;
}

doSetup(location.pathname + '-IDBObjectStore.getAll', 1, function(evt) {
    var connection = evt.target.result;
    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, 'c');
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['value-c']);
          t.done();
      });
    }, 'Single item get');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'generated', connection, 3);
      req.onsuccess = t.step_func(function(evt) {
          var data = evt.target.result;
          assert_true(Array.isArray(data));
          assert_equals(data.length, 1);
          assert_equals(data[0].id, 3);
          assert_equals(data[0].ch, 'c');
          t.done();
      });
    }, 'Single item get (generated key)');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'empty', connection);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, [],
              'getAll() on empty object store should return an empty array');
          t.done();
      });
    }, 'getAll on empty object store');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              alphabet.map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get all values');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, undefined,
                                    10);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              'abcdefghij'.split('').map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Test maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'm'));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              'ghijklm'.split('').map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get bound range');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'm'), 3);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['g', 'h', 'i']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get bound range with maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'k', false, true));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['g', 'h', 'i', 'j']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get upper excluded');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'k', true, false));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['h', 'i', 'j', 'k']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get lower excluded');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'generated', connection,
                                    IDBKeyRange.bound(4, 15), 3);
      req.onsuccess = t.step_func(function(evt) {
          var data = evt.target.result;
          assert_true(Array.isArray(data));
          assert_array_equals(data.map(function(e) { return e.ch; }), ['d', 'e', 'f']);
          assert_array_equals(data.map(function(e) { return e.id; }), [4, 5, 6]);
          t.done();
      });
    }, 'Get bound range (generated) with maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    "Doesn't exist");
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, [],
              'getAll() using a nonexistent key should return an empty array');
          t.done();
      });
      req.onerror = t.unreached_func('getAll request should succeed');
    }, 'Non existent key');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, undefined, 0);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              alphabet.map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'zero maxCount');

    // Explicit done needed in case async_test body fails synchronously.
    done();
});

</script>
