blob: 3aeb8553598692f6fd418cb729deb5bd4af1ac32 [file] [log] [blame]
// 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');