keyorder.any.js (4010B)
1 // META: global=window,worker 2 // META: title=Key sort order 3 // META: script=resources/support.js 4 5 // Spec: https://w3c.github.io/IndexedDB/#key-construct 6 7 'use strict'; 8 9 const global_db = createdb_for_multiple_tests(); 10 11 const keysort = (desc, unsorted, expected) => { 12 async_test(t => { 13 const store_name = 'store-' + Date.now() + Math.random(); 14 15 // The database test 16 const open_rq = global_db.setTest(t); 17 open_rq.onupgradeneeded = t.step_func(e => { 18 const db = e.target.result; 19 const objStore = db.createObjectStore(store_name); 20 21 for (let i = 0; i < unsorted.length; i++) 22 objStore.add('value', unsorted[i]); 23 }); 24 25 open_rq.onsuccess = t.step_func(e => { 26 const db = e.target.result; 27 const actual_keys = []; 28 const rq = 29 db.transaction(store_name).objectStore(store_name).openCursor(); 30 31 rq.onsuccess = t.step_func(e => { 32 const cursor = e.target.result; 33 34 if (cursor) { 35 actual_keys.push(cursor.key); 36 cursor.continue(); 37 } else { 38 assert_key_equals(actual_keys, expected, 'keyorder array'); 39 assert_equals(actual_keys.length, expected.length, 'array length'); 40 41 t.done(); 42 } 43 }); 44 }); 45 }, `Database readback sort - ${desc}`); 46 47 // The IDBKey.cmp test 48 test(() => { 49 const sorted = unsorted.slice(0).sort((a, b) => indexedDB.cmp(a, b)); 50 assert_key_equals(sorted, expected, 'sorted array'); 51 }, `IDBKey.cmp sort - ${desc}`); 52 }; 53 54 const now = new Date(); 55 const one_sec_ago = new Date(now - 1000); 56 const one_min_future = new Date(now.getTime() + 1000 * 60); 57 58 keysort('String < Array', [[0], 'yo', '', []], ['', 'yo', [], [0]]); 59 60 keysort( 61 'float < String', [Infinity, 'yo', 0, '', 100], 62 [0, 100, Infinity, '', 'yo']); 63 64 keysort( 65 'float < Date', [now, 0, 9999999999999, -0.22], 66 [-0.22, 0, 9999999999999, now]); 67 68 keysort( 69 'float < Date < String < Array', [[], '', now, [0], '-1', 0, 9999999999999], 70 [0, 9999999999999, now, '', '-1', [], [0]]); 71 72 keysort( 73 'Date(1 sec ago) < Date(now) < Date(1 minute in future)', 74 [now, one_sec_ago, one_min_future], [one_sec_ago, now, one_min_future]); 75 76 keysort( 77 '-1.1 < 1 < 1.01337 < 1.013373 < 2', [1.013373, 2, 1.01337, -1.1, 1], 78 [-1.1, 1, 1.01337, 1.013373, 2]); 79 80 keysort( 81 '-Infinity < -0.01 < 0 < Infinity', [0, -0.01, -Infinity, Infinity], 82 [-Infinity, -0.01, 0, Infinity]); 83 84 keysort( 85 '"" < "a" < "ab" < "b" < "ba"', ['a', 'ba', '', 'b', 'ab'], 86 ['', 'a', 'ab', 'b', 'ba']); 87 88 keysort( 89 'Arrays', [[[0]], [0], [], [0, 0], [0, [0]]], 90 [[], [0], [0, 0], [0, [0]], [[0]]]); 91 92 const big_array = []; 93 const bigger_array = []; 94 for (let i = 0; i < 10000; i++) { 95 big_array.push(i); 96 bigger_array.push(i); 97 } 98 bigger_array.push(0); 99 100 keysort( 101 'Array.length: 10,000 < Array.length: 10,001', 102 [bigger_array, [0, 2, 3], [0], [9], big_array], 103 [[0], big_array, bigger_array, [0, 2, 3], [9]]); 104 105 keysort( 106 'Infinity inside arrays', 107 [ 108 [Infinity, 1], 109 [Infinity, Infinity], 110 [1, 1], 111 [1, Infinity], 112 [1, -Infinity], 113 [-Infinity, Infinity], 114 ], 115 [ 116 [-Infinity, Infinity], 117 [1, -Infinity], 118 [1, 1], 119 [1, Infinity], 120 [Infinity, 1], 121 [Infinity, Infinity], 122 ]); 123 124 keysort( 125 'Test different stuff at once', 126 [ 127 now, 128 [0, []], 129 'test', 130 1, 131 ['a', [1, [-1]]], 132 ['b', 'a'], 133 [0, 2, 'c'], 134 ['a', [1, 2]], 135 [], 136 [0, [], 3], 137 ['a', 'b'], 138 [1, 2], 139 ['a', 'b', 'c'], 140 one_sec_ago, 141 [0, 'b', 'c'], 142 Infinity, 143 -Infinity, 144 2.55, 145 [0, now], 146 [1], 147 ], 148 [ 149 -Infinity, 150 1, 151 2.55, 152 Infinity, 153 one_sec_ago, 154 now, 155 'test', 156 [], 157 [0, 2, 'c'], 158 [0, now], 159 [0, 'b', 'c'], 160 [0, []], 161 [0, [], 3], 162 [1], 163 [1, 2], 164 ['a', 'b'], 165 ['a', 'b', 'c'], 166 ['a', [1, 2]], 167 ['a', [1, [-1]]], 168 ['b', 'a'], 169 ]);