tor-browser

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

bigint-binary.js (3130B)


      1 var xs = [
      2  // Definitely heap digits.
      3  -(2n ** 1000n),
      4 
      5  // -(2n**64n)
      6  -18446744073709551617n,
      7  -18446744073709551616n,
      8  -18446744073709551615n,
      9 
     10  // -(2n**63n)
     11  -9223372036854775809n,
     12  -9223372036854775808n,
     13  -9223372036854775807n,
     14 
     15  // -(2**32)
     16  -4294967297n,
     17  -4294967296n,
     18  -4294967295n,
     19 
     20  // -(2**31)
     21  -2147483649n,
     22  -2147483648n,
     23  -2147483647n,
     24 
     25  -1n,
     26  0n,
     27  1n,
     28 
     29  // 2**31
     30  2147483647n,
     31  2147483648n,
     32  2147483649n,
     33 
     34  // 2**32
     35  4294967295n,
     36  4294967296n,
     37  4294967297n,
     38 
     39  // 2n**63n
     40  9223372036854775807n,
     41  9223372036854775808n,
     42  9223372036854775809n,
     43 
     44  // 2n**64n
     45  18446744073709551615n,
     46  18446744073709551616n,
     47  18446744073709551617n,
     48 
     49  // Definitely heap digits.
     50  2n ** 1000n,
     51 ];
     52 
     53 function testAdd() {
     54  for (var i = 0; i < 100; ++i) {
     55    var j = i % xs.length;
     56    var x = xs[j];
     57    var y = xs[xs.length - 1 - j];
     58 
     59    assertEq(x + 0n, x);
     60    assertEq(x + y, 0n);
     61  }
     62 }
     63 testAdd();
     64 
     65 function testSub() {
     66  for (var i = 0; i < 100; ++i) {
     67    var j = i % xs.length;
     68    var x = xs[j];
     69    var y = xs[xs.length - 1 - j];
     70 
     71    assertEq(x - 0n, x);
     72    assertEq(x - (-y), 0n);
     73  }
     74 }
     75 testSub();
     76 
     77 function testMul() {
     78  for (var i = 0; i < 100; ++i) {
     79    var x = xs[i % xs.length];
     80 
     81    assertEq(x * 0n, 0n);
     82    assertEq(x * 1n, x);
     83    assertEq(x * (-1n), -x);
     84  }
     85 }
     86 testMul();
     87 
     88 function testDiv() {
     89  for (var i = 0; i < 100; ++i) {
     90    var j = i % xs.length;
     91    var x = xs[j];
     92 
     93    // Don't divide by zero.
     94    if (j === xs.length >> 1) {
     95      assertEq(x / 1n, 0n);
     96      continue;
     97    }
     98 
     99    assertEq(x / x, 1n);
    100    assertEq(x / 1n, x);
    101  }
    102 }
    103 testDiv();
    104 
    105 function testMod() {
    106  for (var i = 0; i < 100; ++i) {
    107    var j = i % xs.length;
    108    var x = xs[j];
    109 
    110    // Don't divide by zero.
    111    if (j === xs.length >> 1) {
    112      assertEq(x / 1n, 0n);
    113      continue;
    114    }
    115 
    116    assertEq(x % x, 0n);
    117    assertEq(x % 1n, 0n);
    118  }
    119 }
    120 testMod();
    121 
    122 function testPow() {
    123  for (var i = 0; i < 100; ++i) {
    124    var x = xs[i % xs.length];
    125 
    126    assertEq(x ** 0n, 1n);
    127    assertEq(x ** 1n, x);
    128  }
    129 }
    130 testPow();
    131 
    132 function testBitAnd() {
    133  for (var i = 0; i < 100; ++i) {
    134    var x = xs[i % xs.length];
    135 
    136    assertEq(x & x, x);
    137    assertEq(x & 0n, 0n);
    138  }
    139 }
    140 testBitAnd();
    141 
    142 function testBitOr() {
    143  for (var i = 0; i < 100; ++i) {
    144    var x = xs[i % xs.length];
    145 
    146    assertEq(x | x, x);
    147    assertEq(x | 0n, x);
    148  }
    149 }
    150 testBitOr();
    151 
    152 function testBitXor() {
    153  for (var i = 0; i < 100; ++i) {
    154    var x = xs[i % xs.length];
    155 
    156    assertEq(x ^ x, 0n);
    157    assertEq(x ^ 0n, x);
    158  }
    159 }
    160 testBitXor();
    161 
    162 function testLeftShift() {
    163  for (var i = 0; i < 100; ++i) {
    164    var x = xs[i % xs.length];
    165 
    166    assertEq(x << 0n, x);
    167    assertEq(x << 1n, x * 2n);
    168    if (x >= 0n || !(x & 1n)) {
    169      assertEq(x << -1n, x / 2n);
    170    } else {
    171      assertEq(x << -1n, (x / 2n) - 1n);
    172    }
    173  }
    174 }
    175 testLeftShift();
    176 
    177 function testRightShift() {
    178  for (var i = 0; i < 100; ++i) {
    179    var x = xs[i % xs.length];
    180 
    181    assertEq(x >> 0n, x);
    182    if (x >= 0n || !(x & 1n)) {
    183      assertEq(x >> 1n, x / 2n);
    184    } else {
    185      assertEq(x >> 1n, (x / 2n) - 1n);
    186    }
    187    assertEq(x >> -1n, x * 2n);
    188  }
    189 }
    190 testRightShift();