// META: title=Batch Get All // META: script=resources/support.js 'use strict'; const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split(''); function batchgetall_test(storeName, func, name) { indexeddb_test((t, connection, tx) => { var store; switch (storeName) { case 'generated': store = connection.createObjectStore( 'generated', {autoIncrement: true, keyPath: 'id'}); alphabet.forEach(letter => { store.put({ch: letter}); }); break; case 'out-of-line': store = connection.createObjectStore('out-of-line', null); alphabet.forEach(letter => { store.put(`value-${letter}`, letter); }); break; case 'empty': store = connection.createObjectStore('empty', null); break; default: t.fail(`Unsupported storeName: ${storeName}`); } }, func, name); } function createBatchGetAllRequest(t, storeName, connection, ranges, maxCount) { const transaction = connection.transaction(storeName, 'readonly'); const store = transaction.objectStore(storeName); const req = store.batchGetAll(ranges, maxCount); req.onerror = t.unreached_func('batchGetAll request should succeed'); return req; } function assertTwoDArrayEquals(result, expected) { assert_equals(JSON.stringify(result), JSON.stringify(expected)); } batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest(t, 'out-of-line', connection, ['c']); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [['value-c']]; assertTwoDArrayEquals(result, expected) t.done(); }); }, 'Single item get'); batchgetall_test('empty', (t, connection) => { const req = createBatchGetAllRequest(t, 'empty', connection); req.onsuccess = t.step_func(evt => { assert_array_equals( evt.target.result, [], 'getAll() on empty object store should return an empty array'); t.done(); }); }, 'batchGetAll on empty object store'); batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest( t, 'out-of-line', connection, ['c', 'dd', 'e', 'ff']); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [['value-c'], [], ['value-e'], []]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'batchGetAll with non-existing values'); batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest( t, 'out-of-line', connection, [IDBKeyRange.bound('a', 'z')], 5); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [['value-a', 'value-b', 'value-c', 'value-d', 'value-e']]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'Get bound range with maxCount'); batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest( t, 'out-of-line', connection, [IDBKeyRange.bound('a', 'e')]); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [['value-a', 'value-b', 'value-c', 'value-d', 'value-e']]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'Get bound range'); batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest(t, 'out-of-line', connection, [ IDBKeyRange.bound('g', 'k', false, true), IDBKeyRange.bound('g', 'k', true, false) ]); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [ ['value-g', 'value-h', 'value-i', 'value-j'], ['value-h', 'value-i', 'value-j', 'value-k'] ]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'Get upper/lower excluded'); batchgetall_test('generated', (t, connection) => { const req = createBatchGetAllRequest( t, 'generated', connection, [IDBKeyRange.bound(4, 15), IDBKeyRange.bound(5, 15)], 3); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [ [{ch: 'd', id: 4}, {ch: 'e', id: 5}, {ch: 'f', id: 6}], [{ch: 'e', id: 5}, {ch: 'f', id: 6}, {ch: 'g', id: 7}] ]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'Get bound range (generated) with maxCount'); batchgetall_test('out-of-line', (t, connection) => { const req = createBatchGetAllRequest( t, 'out-of-line', connection, [IDBKeyRange.bound('a', 'e')], 0); req.onsuccess = t.step_func(evt => { let result = evt.target.result; let expected = [['value-a', 'value-b', 'value-c', 'value-d', 'value-e']]; assertTwoDArrayEquals(result, expected); t.done(); }); }, 'zero maxCount');