| // 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'], |
| ]); |