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() {}');