tor-browser

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

testLet.js (9282B)


      1 var otherGlobal = newGlobal();
      2 
      3 function test(str, arg, result)
      4 {
      5    arg = arg || 'ponies';
      6    if (arguments.length < 3)
      7        result = 'ponies';
      8 
      9    var fun = new Function('x', str);
     10 
     11    var got = `(${fun.toString()})`;
     12    var expect = '(function anonymous(x\n) {\n' + str + '\n})';
     13    if (got !== expect) {
     14        print("GOT:    " + got);
     15        print("EXPECT: " + expect);
     16        assertEq(got, expect);
     17    }
     18 
     19    // test reflection logic
     20    Reflect.parse(got);
     21 
     22    var got = fun(arg);
     23    var expect = result;
     24    if (got !== expect) {
     25        print("GOT:" + got);
     26        print("EXPECT: " + expect);
     27        assertEq(got, expect);
     28    }
     29 }
     30 
     31 function isParseError(str)
     32 {
     33    var caught = false;
     34    try {
     35        new Function(str);
     36    } catch(e) {
     37        assertEq(e instanceof TypeError || e instanceof SyntaxError, true);
     38        caught = true;
     39    }
     40    assertEq(caught, true);
     41 }
     42 
     43 function isRuntimeParseError(str, arg)
     44 {
     45    var caught = false;
     46    try {
     47        (new Function("x", str))(arg);
     48    } catch(e) {
     49        assertEq(e instanceof TypeError || e instanceof SyntaxError, true);
     50        caught = true;
     51    }
     52    assertEq(caught, true);
     53 }
     54 
     55 function isReferenceError(str)
     56 {
     57    var caught = false;
     58    try {
     59        (new Function(str))();
     60    } catch(e) {
     61        assertEq(e instanceof ReferenceError, true);
     62        caught = true;
     63    }
     64    assertEq(caught, true);
     65 }
     66 
     67 // var declarations
     68 test('var y;return x;');
     69 test('var y = x;return x;');
     70 test('var [] = x;return x;');
     71 test('var [, ] = x;return x;');
     72 test('var [, , , , ] = x;return x;');
     73 test('var x = x;return x;');
     74 test('var y = y;return "" + y;', 'unicorns', 'undefined');
     75 test('var x = eval("x");return x;');
     76 test('var X = x + 1, y = x;return y;');
     77 test('var X = x + 1, [] = X, [[, , ]] = X, y = x;return y;');
     78 test('var [{a: X}] = x, [, {b: y}] = x;var X = X + 1, y = y + 2;return X + y;', [{a:"p"},{b:"p"}], "p1p2");
     79 test('var [x] = [x];return x;');
     80 test('var [[a, [b, c]]] = [[x, []]];return a;');
     81 test('var [y] = [x];return y;');
     82 test('var [a] = (1, [x]);return a;');
     83 test('var [a] = (1, x, 1, x);return a;', ['ponies']);
     84 test('var [x, y] = [x, x + 1];return x + y;', 1, 3);
     85 test('var [x, y, z] = [x, x + 1, x + 2];return x + y + z;', 1, 6);
     86 test('var [[x]] = [[x]];return x;');
     87 test('var [x, y] = [x, x + 1];return x;');
     88 test('var [x, [y, z]] = [x, x + 1];return x;');
     89 test('var [{x: [x]}, {y1: y, z1: z}] = [x, x + 1];return x;',{x:['ponies']});
     90 test('if (x) {var y = x;return x;}');
     91 test('if (x) {y = x;var y = y;return y;}');
     92 test('if (x) {var z = y;var [y] = x;z += y;}return z;', ['-'], 'undefined-');
     93 
     94 // let declaration in context
     95 test('if (x) {let y;return x;}');
     96 test('if (x) {let x;return "" + x;}', 'unicorns', 'undefined');
     97 test('if (x) {let y = x;return x;}');
     98 test('if (x) {let y = x;return x;}');
     99 test('if (x) {let [] = x;return x;}');
    100 test('if (x) {let [, ] = x;return x;}');
    101 test('if (x) {let [, , , , ] = x;return x;}');
    102 test('if (x) {let X = x + 1, y = x;return y;}');
    103 test('if (x) {let X = x + 1, [] = X, [[, , ]] = X, y = x;return y;}');
    104 test('if (x) {let [{a: X}] = x, [, {b: Y}] = x;var XX = X + 1, YY = Y + 2;return XX + YY;}', [{a:"p"},{b:"p"}], "p1p2");
    105 test('if (x) {let [[a, [b, c]]] = [[x, []]];return a;}');
    106 test('if (x) {let [X] = [x];return X;}');
    107 test('if (x) {let [y] = [x];return y;}');
    108 test('if (x) {let [a] = (1, [x]);return a;}');
    109 test('if (x) {let [a] = (1, x, 1, x);return a;}', ['ponies']);
    110 test('if (x) {let [X, y] = [x, x + 1];return X + y;}', 1, 3);
    111 test('if (x) {let [X, y, z] = [x, x + 1, x + 2];return X + y + z;}', 1, 6);
    112 test('if (x) {let [[X]] = [[x]];return X;}');
    113 test('if (x) {let [X, y] = [x, x + 1];return X;}');
    114 test('if (x) {let [X, [y, z]] = [x, x + 1];return X;}');
    115 test('if (x) {let [{x: [X]}, {y1: y, z1: z}] = [x, x + 1];return X;}',{x:['ponies']});
    116 test('if (x) {let y = x;try {let x = 1;throw 2;} catch (e) {return y;}}');
    117 test('try {let x = 1;throw 2;} catch (e) {return x;}');
    118 test('x.foo;{let y = x;return y;}');
    119 test('x.foo;if (x) {x.bar;let y = x;return y;}');
    120 test('if (x) {let y = x;return function () {return eval("y");}();}');
    121 test('return eval("let y = x; y");');
    122 isRuntimeParseError('if (x) {let y = x;eval("var y = 2");return y;}', 'ponies');
    123 test('"use strict";if (x) {let y = x;eval("var y = 2");return y;}');
    124 test('"use strict";if (x) {let y = x;eval("let y = 2");return y;}');
    125 test('"use strict";if (x) {let y = 1;return eval("let y = x;y;");}');
    126 test('this.y = x;if (x) {let y = 1;return this.eval("y");}');
    127 
    128 // for(;;)
    129 test('for (;;) {return x;}');
    130 test('for (let y = 1;;) {return x;}');
    131 test('for (let y = 1;; ++y) {return x;}');
    132 test('for (let y = 1; ++y;) {return x;}');
    133 test('for (let [[a, [b, c]]] = [[x, []]];;) {return a;}');
    134 test('var sum = 0;for (let y = x; y < 4; ++y) {sum += y;}return sum;', 1, 6);
    135 test('var sum = 0;for (let x = 1; eval("x") < 4; ++x) {sum += eval("x");}return sum;', 1, 6);
    136 test('for (var y = 1;;) {return x;}');
    137 test('for (var y = 1;; ++y) {return x;}');
    138 test('for (var y = 1; ++y;) {return x;}');
    139 test('for (var X = 1, [y, z] = x, a = x; z < 4; ++z) {return X + y;}', [2,3], 3);
    140 test('var sum = 0;for (var y = x; y < 4; ++y) {sum += y;}return sum;', 1, 6);
    141 test('var sum = 0;for (var X = x, y = 10; X < 4; ++X) {sum += X;}return sum;', 1, 6);
    142 test('var sum = 0;for (var X = x; X < 4; ++X) {sum += X;}return x;', 1, 1);
    143 test('var sum = 0;for (var X = eval("x"); X < 4; ++X) {sum += X;}return sum;', 1, 6);
    144 test('var sum = 0;for (var X = x; eval("X") < 4; ++X) {sum += eval("X");}return sum;', 1, 6);
    145 test('var sum = 0;for (var X = eval("x"); eval("X") < 4; ++X) {sum += eval("X");}return sum;', 1, 6);
    146 test('for (let y = x;;) {let x;return y;}');
    147 test('for (let y = x;;) {let y;return x;}');
    148 test('for (let y;;) {let y;return x;}');
    149 test('for (let a = x;;) {let c = x, d = x;return c;}');
    150 test('for (let [a, b] = x;;) {let c = x, d = x;return c;}');
    151 test('for (let [a] = (1, [x]);;) {return a;}');
    152 test('for (let [a] = (1, x, 1, x);;) {return a;}', ['ponies']);
    153 isParseError('for (let x = 1, x = 2;;) {}');
    154 isParseError('for (let [x, y] = a, {a:x} = b;;) {}');
    155 isParseError('for (let [x, y, x] = a;;) {}');
    156 isParseError('for (let [x, [y, [x]]] = a;;) {}');
    157 
    158 // for(in)
    159 test('for (let i in x) {return x;}');
    160 test('for (let i in x) {let y;return x;}');
    161 test('for (let i in x) {let i = x;return i;}');
    162 test('var s = "";for (let a in x) {for (let b in x) {s += a + b;}}return s;', [1,2], '00011011');
    163 test('var res = "";for (let i in x) {res += x[i];}return res;');
    164 test('var res = "";for (var i in x) {res += x[i];}return res;');
    165 isParseError('for ((let (x = {y: true}) x).y in eval("x")) {return eval("x");}');
    166 test('for (let i in x) {break;}return x;');
    167 test('for (let i in x) {break;}return eval("x");');
    168 test('a:for (let i in x) {for (let j in x) {break a;}}return x;');
    169 test('a:for (let i in x) {for (let j in x) {break a;}}return eval("x");');
    170 test('var j;for (let i in x) {j = i;break;}return j;', {ponies:true});
    171 isParseError('for (let [x, x] in o) {}');
    172 isParseError('for (let [x, y, x] in o) {}');
    173 isParseError('for (let [x, [y, [x]]] in o) {}');
    174 
    175 // for(let ... in ...) scoping bugs (bug 1069480)
    176 isReferenceError('for (let x in eval("x")) {return x;}', {ponies:true}, undefined);
    177 isReferenceError('for (let x in x) {return eval("x");}', {ponies:true}, undefined);
    178 isReferenceError('for (let x in eval("x")) {return eval("x");}', {ponies:true}, undefined);
    179 isReferenceError('for (let x in x) {break;}return x;');
    180 isReferenceError('for (let x in x) {break;}return eval("x");');
    181 isReferenceError('for (let x in eval("throw x")) {}', undefined, undefined);
    182 
    183 // don't forget about switch craziness
    184 test('var y = 3;switch (function () {return eval("y");}()) {case 3:let y;return x;default:;}');
    185 test('switch (x) {case 3:let y;return 3;case 4:let z;return 4;default:return x;}');
    186 isParseError('switch (x) {case 3:let y;return 3;case 4:let y;return 4;default:;}');
    187 
    188 // TDZ checks
    189 isReferenceError('x + 1; let x = 42;');
    190 isReferenceError('x = 42; let x;');
    191 isReferenceError('inner(); function inner() { x++; } let x;');
    192 isReferenceError('inner(); let x; function inner() { x++; }');
    193 isReferenceError('inner(); let x; function inner() { function innerer() { x++; } innerer(); }');
    194 isReferenceError('let x; var inner = function () { y++; }; inner(); let y;');
    195 isReferenceError('let x = x;');
    196 isReferenceError('let [x] = [x];');
    197 isReferenceError('let {x} = {x:x};');
    198 isReferenceError('switch (x) {case 3:let x;break;default:if (x === undefined) {return "ponies";}}');
    199 isReferenceError('let x = function() {} ? x() : function() {}');
    200 isReferenceError('(function() { let x = (function() { return x }()); }())');
    201 isReferenceError('var sum = 0;for (let x = x, y = 10; x < 4; ++x) {sum += x;}return sum;');
    202 isReferenceError('var sum = 0;for (let x = x; x < 4; ++x) {sum += x;}return x;');
    203 isReferenceError('var sum = 0;for (let x = eval("x"); x < 4; ++x) {sum += x;}return sum;');
    204 isReferenceError('var sum = 0;for (let x = x; eval("x") < 4; ++x) {sum += eval("x");}return sum;');
    205 isReferenceError('var sum = 0;for (let x = eval("x"); eval("x") < 4; ++x) {sum += eval("x");}return sum;');
    206 isReferenceError('for (let x = eval("throw x");;) {}');
    207 isReferenceError('for (let x = x + "s"; eval("throw x");) {}');
    208 
    209 // redecl with function statements
    210 isParseError('let a; function a() {}');