tor-browser

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

map-get-string.js (3627B)


      1 // Similar test as "cacheir/map-get-string.js", except that we now perform
      2 // duplicate lookups to ensure GVN works properly.
      3 
      4 // Return a new map, possibly filling some dummy entries to enforce creating
      5 // multiple hash buckets.
      6 function createMap(values, n) {
      7  var xs = [...values];
      8  for (var i = 0; i < n; ++i) {
      9    xs.push({});
     10  }
     11  return new Map(xs.map((x, i) => [x, i + 1]));
     12 }
     13 
     14 function runTest(fn) {
     15  fn(0);
     16  fn(100);
     17 }
     18 
     19 function testConstant_different_map(n) {
     20  var xs = ["a", "b"];
     21  var ys = ["c", "d"];
     22  var zs = [...xs, ...ys];
     23  var map = createMap(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    var v = map.get(z);
     30    if (v !== undefined) c += v;
     31    var w = map.get(z);
     32    if (w !== undefined) c += w;
     33  }
     34  assertEq(c, N + N / 2);
     35 }
     36 runTest(testConstant_different_map);
     37 
     38 function testComputed_different_map(n) {
     39  var xs = ["a", "b"];
     40  var ys = ["c", "d"];
     41  var zs = [...xs, ...ys];
     42  var map = createMap(xs, n);
     43 
     44  var N = 100;
     45  var c = 0;
     46  for (var i = 0; i < N; ++i) {
     47    var z = zs[i & 3];
     48    z = String.fromCharCode(z.charCodeAt(0));
     49    var v = map.get(z);
     50    if (v !== undefined) c += v;
     51    var w = map.get(z);
     52    if (w !== undefined) c += w;
     53  }
     54  assertEq(c, N + N / 2);
     55 }
     56 runTest(testComputed_different_map);
     57 
     58 function testRope_different_map(n) {
     59  var xs = ["a", "b"];
     60  var ys = ["c", "d"];
     61  var zs = [...xs, ...ys];
     62  var map = createMap(xs.map(x => x.repeat(100)), n);
     63 
     64  var N = 100;
     65  var c = 0;
     66  for (var i = 0; i < N; ++i) {
     67    var z = zs[i & 3].repeat(100);
     68    var v = map.get(z);
     69    if (v !== undefined) c += v;
     70    var w = map.get(z);
     71    if (w !== undefined) c += w;
     72  }
     73  assertEq(c, N + N / 2);
     74 }
     75 runTest(testRope_different_map);
     76 
     77 // Duplicate the above tests, but this time use a different map.
     78 
     79 function testConstant_different_map(n) {
     80  var xs = ["a", "b"];
     81  var ys = ["c", "d"];
     82  var zs = [...xs, ...ys];
     83  var map1 = createMap(xs, n);
     84  var map2 = createMap(xs, n);
     85 
     86  var N = 100;
     87  var c = 0;
     88  for (var i = 0; i < N; ++i) {
     89    var z = zs[i & 3];
     90    var v = map1.get(z);
     91    if (v !== undefined) c += v;
     92    var w = map2.get(z);
     93    if (w !== undefined) c += w;
     94  }
     95  assertEq(c, N + N / 2);
     96 }
     97 runTest(testConstant_different_map);
     98 
     99 function testComputed_different_map(n) {
    100  var xs = ["a", "b"];
    101  var ys = ["c", "d"];
    102  var zs = [...xs, ...ys];
    103  var map1 = createMap(xs, n);
    104  var map2 = createMap(xs, n);
    105 
    106  var N = 100;
    107  var c = 0;
    108  for (var i = 0; i < N; ++i) {
    109    var z = zs[i & 3];
    110    z = String.fromCharCode(z.charCodeAt(0));
    111    var v = map1.get(z);
    112    if (v !== undefined) c += v;
    113    var w = map2.get(z);
    114    if (w !== undefined) c += w;
    115  }
    116  assertEq(c, N + N / 2);
    117 }
    118 runTest(testComputed_different_map);
    119 
    120 function testRope_different_map(n) {
    121  var xs = ["a", "b"];
    122  var ys = ["c", "d"];
    123  var zs = [...xs, ...ys];
    124  var map1 = createMap(xs.map(x => x.repeat(100)), n);
    125  var map2 = createMap(xs.map(x => x.repeat(100)), n);
    126 
    127  var N = 100;
    128  var c = 0;
    129  for (var i = 0; i < N; ++i) {
    130    var z = zs[i & 3].repeat(100);
    131    var v = map1.get(z);
    132    if (v !== undefined) c += v;
    133    var w = map2.get(z);
    134    if (w !== undefined) c += w;
    135  }
    136  assertEq(c, N + N / 2);
    137 }
    138 runTest(testRope_different_map);
    139 
    140 // Test the alias information is correct.
    141 
    142 function test_alias(n) {
    143  var xs = ["a", "b"];
    144  var map = createMap([], n);
    145 
    146  var N = 100;
    147  var c = 0;
    148  for (var i = 0; i < N; ++i) {
    149    var x = xs[i & 1];
    150 
    151    map.set(x, 1);
    152    var v = map.get(x);
    153 
    154    map.delete(x);
    155    var w = map.get(x);
    156 
    157    c += v;
    158    assertEq(w, undefined);
    159  }
    160  assertEq(c, N);
    161 }
    162 runTest(test_alias);