tor-browser

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

set-has-nongcthing.js (6005B)


      1 // Similar test as "cacheir/set-has-nongcthing.js", except that we now perform
      2 // duplicate lookups to ensure GVN works properly.
      3 
      4 // Return a new set, possibly filling some dummy entries to enforce creating
      5 // multiple hash buckets.
      6 function createSet(values, n) {
      7  var xs = [...values];
      8  for (var i = 0; i < n; ++i) {
      9    xs.push({});
     10  }
     11  return new Set(xs);
     12 }
     13 
     14 function runTest(fn) {
     15  fn(0);
     16  fn(100);
     17 }
     18 
     19 function testInt32_same_set(n) {
     20  var xs = [1, 2];
     21  var ys = [3, 4];
     22  var zs = [...xs, ...ys];
     23  var set = createSet(xs, n);
     24 
     25  var N = 100;
     26  var c = 0;
     27  for (var i = 0; i < N; ++i) {
     28    var z = zs[i & 3];
     29    if (set.has(z)) c++;
     30    if (set.has(z)) c++;
     31  }
     32  assertEq(c, N);
     33 }
     34 runTest(testInt32_same_set);
     35 
     36 function testDouble_same_set(n) {
     37  var xs = [Math.PI, Infinity];
     38  var ys = [Math.E, -Infinity];
     39  var zs = [...xs, ...ys];
     40  var set = createSet(xs, n);
     41 
     42  var N = 100;
     43  var c = 0;
     44  for (var i = 0; i < N; ++i) {
     45    var z = zs[i & 3];
     46    if (set.has(z)) c++;
     47    if (set.has(z)) c++;
     48  }
     49  assertEq(c, N);
     50 }
     51 runTest(testDouble_same_set);
     52 
     53 function testZero_same_set(n) {
     54  var xs = [0, -0];
     55  var ys = [1, -1];
     56  var zs = [...xs, ...ys];
     57  var set = createSet([0], n);
     58 
     59  var N = 100;
     60  var c = 0;
     61  for (var i = 0; i < N; ++i) {
     62    var z = zs[i & 3];
     63    if (set.has(z)) c++;
     64    if (set.has(z)) c++;
     65  }
     66  assertEq(c, N);
     67 }
     68 runTest(testZero_same_set);
     69 
     70 function testNaN_same_set(n) {
     71  var xs = [NaN, -NaN];
     72  var ys = [1, -1];
     73  var zs = [...xs, ...ys];
     74  var set = createSet([NaN], n);
     75 
     76  var N = 100;
     77  var c = 0;
     78  for (var i = 0; i < N; ++i) {
     79    var z = zs[i & 3];
     80    if (set.has(z)) c++;
     81    if (set.has(z)) c++;
     82  }
     83  assertEq(c, N);
     84 }
     85 runTest(testNaN_same_set);
     86 
     87 function testUndefinedAndNull_same_set(n) {
     88  var xs = [undefined, null];
     89  var ys = [1, -1];
     90  var zs = [...xs, ...ys];
     91  var set = createSet(xs, n);
     92 
     93  var N = 100;
     94  var c = 0;
     95  for (var i = 0; i < N; ++i) {
     96    var z = zs[i & 3];
     97    if (set.has(z)) c++;
     98    if (set.has(z)) c++;
     99  }
    100  assertEq(c, N);
    101 }
    102 runTest(testUndefinedAndNull_same_set);
    103 
    104 function testBoolean_same_set(n) {
    105  var xs = [true, false];
    106  var ys = [1, -1];
    107  var zs = [...xs, ...ys];
    108  var set = createSet(xs, n);
    109 
    110  var N = 100;
    111  var c = 0;
    112  for (var i = 0; i < N; ++i) {
    113    var z = zs[i & 3];
    114    if (set.has(z)) c++;
    115    if (set.has(z)) c++;
    116  }
    117  assertEq(c, N);
    118 }
    119 runTest(testBoolean_same_set);
    120 
    121 // Duplicate the above tests, but this time use a different set.
    122 
    123 function testInt32_different_set(n) {
    124  var xs = [1, 2];
    125  var ys = [3, 4];
    126  var zs = [...xs, ...ys];
    127  var set1 = createSet(xs, n);
    128  var set2 = createSet(xs, n);
    129 
    130  var N = 100;
    131  var c = 0;
    132  for (var i = 0; i < N; ++i) {
    133    var z = zs[i & 3];
    134    if (set1.has(z)) c++;
    135    if (set2.has(z)) c++;
    136  }
    137  assertEq(c, N);
    138 }
    139 runTest(testInt32_different_set);
    140 
    141 function testDouble_different_set(n) {
    142  var xs = [Math.PI, Infinity];
    143  var ys = [Math.E, -Infinity];
    144  var zs = [...xs, ...ys];
    145  var set1 = createSet(xs, n);
    146  var set2 = createSet(xs, n);
    147 
    148  var N = 100;
    149  var c = 0;
    150  for (var i = 0; i < N; ++i) {
    151    var z = zs[i & 3];
    152    if (set1.has(z)) c++;
    153    if (set2.has(z)) c++;
    154  }
    155  assertEq(c, N);
    156 }
    157 runTest(testDouble_different_set);
    158 
    159 function testZero_different_set(n) {
    160  var xs = [0, -0];
    161  var ys = [1, -1];
    162  var zs = [...xs, ...ys];
    163  var set1 = createSet([0], n);
    164  var set2 = createSet([0], n);
    165 
    166  var N = 100;
    167  var c = 0;
    168  for (var i = 0; i < N; ++i) {
    169    var z = zs[i & 3];
    170    if (set1.has(z)) c++;
    171    if (set2.has(z)) c++;
    172  }
    173  assertEq(c, N);
    174 }
    175 runTest(testZero_different_set);
    176 
    177 function testNaN_different_set(n) {
    178  var xs = [NaN, -NaN];
    179  var ys = [1, -1];
    180  var zs = [...xs, ...ys];
    181  var set1 = createSet([NaN], n);
    182  var set2 = createSet([NaN], n);
    183 
    184  var N = 100;
    185  var c = 0;
    186  for (var i = 0; i < N; ++i) {
    187    var z = zs[i & 3];
    188    if (set1.has(z)) c++;
    189    if (set2.has(z)) c++;
    190  }
    191  assertEq(c, N);
    192 }
    193 runTest(testNaN_different_set);
    194 
    195 function testUndefinedAndNull_different_set(n) {
    196  var xs = [undefined, null];
    197  var ys = [1, -1];
    198  var zs = [...xs, ...ys];
    199  var set1 = createSet(xs, n);
    200  var set2 = createSet(xs, n);
    201 
    202  var N = 100;
    203  var c = 0;
    204  for (var i = 0; i < N; ++i) {
    205    var z = zs[i & 3];
    206    if (set1.has(z)) c++;
    207    if (set2.has(z)) c++;
    208  }
    209  assertEq(c, N);
    210 }
    211 runTest(testUndefinedAndNull_different_set);
    212 
    213 function testBoolean_different_set(n) {
    214  var xs = [true, false];
    215  var ys = [1, -1];
    216  var zs = [...xs, ...ys];
    217  var set1 = createSet(xs, n);
    218  var set2 = createSet(xs, n);
    219 
    220  var N = 100;
    221  var c = 0;
    222  for (var i = 0; i < N; ++i) {
    223    var z = zs[i & 3];
    224    if (set1.has(z)) c++;
    225    if (set2.has(z)) c++;
    226  }
    227  assertEq(c, N);
    228 }
    229 runTest(testBoolean_different_set);
    230 
    231 // Test the alias information is correct.
    232 
    233 function testInt32_alias(n) {
    234  var xs = [1, 2];
    235  var set = createSet([], n);
    236 
    237  var N = 100;
    238  var c = 0;
    239  for (var i = 0; i < N; ++i) {
    240    var x = xs[i & 1];
    241 
    242    set.add(x);
    243    if (set.has(x)) c++;
    244 
    245    set.delete(x);
    246    if (set.has(x)) c++;
    247  }
    248  assertEq(c, N);
    249 }
    250 runTest(testInt32_alias);
    251 
    252 function testDouble_alias(n) {
    253  var xs = [Math.PI, Infinity];
    254  var set = createSet([], n);
    255 
    256  var N = 100;
    257  var c = 0;
    258  for (var i = 0; i < N; ++i) {
    259    var x = xs[i & 1];
    260 
    261    set.add(x);
    262    if (set.has(x)) c++;
    263 
    264    set.delete(x);
    265    if (set.has(x)) c++;
    266  }
    267  assertEq(c, N);
    268 }
    269 runTest(testDouble_alias);
    270 
    271 function testUndefinedAndNull_alias(n) {
    272  var xs = [undefined, null];
    273  var set = createSet([], n);
    274 
    275  var N = 100;
    276  var c = 0;
    277  for (var i = 0; i < N; ++i) {
    278    var x = xs[i & 1];
    279 
    280    set.add(x);
    281    if (set.has(x)) c++;
    282 
    283    set.delete(x);
    284    if (set.has(x)) c++;
    285  }
    286  assertEq(c, N);
    287 }
    288 runTest(testUndefinedAndNull_alias);
    289 
    290 function testBoolean_alias(n) {
    291  var xs = [true, false];
    292  var set = createSet([], n);
    293 
    294  var N = 100;
    295  var c = 0;
    296  for (var i = 0; i < N; ++i) {
    297    var x = xs[i & 1];
    298 
    299    set.add(x);
    300    if (set.has(x)) c++;
    301 
    302    set.delete(x);
    303    if (set.has(x)) c++;
    304  }
    305  assertEq(c, N);
    306 }
    307 runTest(testBoolean_alias);