169 lines
3.9 KiB
JavaScript
169 lines
3.9 KiB
JavaScript
// META: global=window,worker
|
|
// META: title=Key sort order
|
|
// META: script=resources/support.js
|
|
|
|
// Spec: https://w3c.github.io/IndexedDB/#key-construct
|
|
|
|
'use strict';
|
|
|
|
const global_db = createdb_for_multiple_tests();
|
|
|
|
const keysort = (desc, unsorted, expected) => {
|
|
async_test(t => {
|
|
const store_name = 'store-' + Date.now() + Math.random();
|
|
|
|
// The database test
|
|
const open_rq = global_db.setTest(t);
|
|
open_rq.onupgradeneeded = t.step_func(e => {
|
|
const db = e.target.result;
|
|
const objStore = db.createObjectStore(store_name);
|
|
|
|
for (let i = 0; i < unsorted.length; i++)
|
|
objStore.add('value', unsorted[i]);
|
|
});
|
|
|
|
open_rq.onsuccess = t.step_func(e => {
|
|
const db = e.target.result;
|
|
const actual_keys = [];
|
|
const rq =
|
|
db.transaction(store_name).objectStore(store_name).openCursor();
|
|
|
|
rq.onsuccess = t.step_func(e => {
|
|
const cursor = e.target.result;
|
|
|
|
if (cursor) {
|
|
actual_keys.push(cursor.key);
|
|
cursor.continue();
|
|
} else {
|
|
assert_key_equals(actual_keys, expected, 'keyorder array');
|
|
assert_equals(actual_keys.length, expected.length, 'array length');
|
|
|
|
t.done();
|
|
}
|
|
});
|
|
});
|
|
}, `Database readback sort - ${desc}`);
|
|
|
|
// The IDBKey.cmp test
|
|
test(() => {
|
|
const sorted = unsorted.slice(0).sort((a, b) => indexedDB.cmp(a, b));
|
|
assert_key_equals(sorted, expected, 'sorted array');
|
|
}, `IDBKey.cmp sort - ${desc}`);
|
|
};
|
|
|
|
const now = new Date();
|
|
const one_sec_ago = new Date(now - 1000);
|
|
const one_min_future = new Date(now.getTime() + 1000 * 60);
|
|
|
|
keysort('String < Array', [[0], 'yo', '', []], ['', 'yo', [], [0]]);
|
|
|
|
keysort(
|
|
'float < String', [Infinity, 'yo', 0, '', 100],
|
|
[0, 100, Infinity, '', 'yo']);
|
|
|
|
keysort(
|
|
'float < Date', [now, 0, 9999999999999, -0.22],
|
|
[-0.22, 0, 9999999999999, now]);
|
|
|
|
keysort(
|
|
'float < Date < String < Array', [[], '', now, [0], '-1', 0, 9999999999999],
|
|
[0, 9999999999999, now, '', '-1', [], [0]]);
|
|
|
|
keysort(
|
|
'Date(1 sec ago) < Date(now) < Date(1 minute in future)',
|
|
[now, one_sec_ago, one_min_future], [one_sec_ago, now, one_min_future]);
|
|
|
|
keysort(
|
|
'-1.1 < 1 < 1.01337 < 1.013373 < 2', [1.013373, 2, 1.01337, -1.1, 1],
|
|
[-1.1, 1, 1.01337, 1.013373, 2]);
|
|
|
|
keysort(
|
|
'-Infinity < -0.01 < 0 < Infinity', [0, -0.01, -Infinity, Infinity],
|
|
[-Infinity, -0.01, 0, Infinity]);
|
|
|
|
keysort(
|
|
'"" < "a" < "ab" < "b" < "ba"', ['a', 'ba', '', 'b', 'ab'],
|
|
['', 'a', 'ab', 'b', 'ba']);
|
|
|
|
keysort(
|
|
'Arrays', [[[0]], [0], [], [0, 0], [0, [0]]],
|
|
[[], [0], [0, 0], [0, [0]], [[0]]]);
|
|
|
|
const big_array = [];
|
|
const bigger_array = [];
|
|
for (let i = 0; i < 10000; i++) {
|
|
big_array.push(i);
|
|
bigger_array.push(i);
|
|
}
|
|
bigger_array.push(0);
|
|
|
|
keysort(
|
|
'Array.length: 10,000 < Array.length: 10,001',
|
|
[bigger_array, [0, 2, 3], [0], [9], big_array],
|
|
[[0], big_array, bigger_array, [0, 2, 3], [9]]);
|
|
|
|
keysort(
|
|
'Infinity inside arrays',
|
|
[
|
|
[Infinity, 1],
|
|
[Infinity, Infinity],
|
|
[1, 1],
|
|
[1, Infinity],
|
|
[1, -Infinity],
|
|
[-Infinity, Infinity],
|
|
],
|
|
[
|
|
[-Infinity, Infinity],
|
|
[1, -Infinity],
|
|
[1, 1],
|
|
[1, Infinity],
|
|
[Infinity, 1],
|
|
[Infinity, Infinity],
|
|
]);
|
|
|
|
keysort(
|
|
'Test different stuff at once',
|
|
[
|
|
now,
|
|
[0, []],
|
|
'test',
|
|
1,
|
|
['a', [1, [-1]]],
|
|
['b', 'a'],
|
|
[0, 2, 'c'],
|
|
['a', [1, 2]],
|
|
[],
|
|
[0, [], 3],
|
|
['a', 'b'],
|
|
[1, 2],
|
|
['a', 'b', 'c'],
|
|
one_sec_ago,
|
|
[0, 'b', 'c'],
|
|
Infinity,
|
|
-Infinity,
|
|
2.55,
|
|
[0, now],
|
|
[1],
|
|
],
|
|
[
|
|
-Infinity,
|
|
1,
|
|
2.55,
|
|
Infinity,
|
|
one_sec_ago,
|
|
now,
|
|
'test',
|
|
[],
|
|
[0, 2, 'c'],
|
|
[0, now],
|
|
[0, 'b', 'c'],
|
|
[0, []],
|
|
[0, [], 3],
|
|
[1],
|
|
[1, 2],
|
|
['a', 'b'],
|
|
['a', 'b', 'c'],
|
|
['a', [1, 2]],
|
|
['a', [1, [-1]]],
|
|
['b', 'a'],
|
|
]);
|