1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
// 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');
|