tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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    ]);