Chromium Code Reviews| Index: test/mjsunit/harmony/block-scoping.js |
| diff --git a/test/mjsunit/harmony/block-scoping.js b/test/mjsunit/harmony/block-scoping.js |
| index f974de82b5ce35b94dc58acb0ed651246014e1f9..46e3eb316f6636fd36c0357b0954e19d7b02e820 100644 |
| --- a/test/mjsunit/harmony/block-scoping.js |
| +++ b/test/mjsunit/harmony/block-scoping.js |
| @@ -39,20 +39,145 @@ function f1() { |
| } |
| f1(); |
| -// Dynamic lookup through block scopes. |
| + |
| +// Dynamic lookup in and through block contexts. |
| function f2(one) { |
| var x = one + 1; |
| - // TODO(keuchel): introduce let |
| - // let y = one + 2; |
| - if (one == 1) { |
| - // Parameter |
| + let y = one + 2; |
| + { |
| + let z = one + 3; |
| assertEquals(1, eval('one')); |
| - // Function local var variable |
| assertEquals(2, eval('x')); |
| - // Function local let variable |
| - // TODO(keuchel): introduce let |
| - // assertEquals(3, eval('y')); |
| + assertEquals(3, eval('y')); |
| + assertEquals(4, eval('z')); |
| } |
| } |
| f2(1); |
| + |
| +// Lookup in and through block contexts. |
| +function f3(one) { |
| + var x = one + 1; |
| + let y = one + 2; |
| + { |
| + let z = one + 3; |
| + assertEquals(1, one); |
| + assertEquals(2, x); |
| + assertEquals(3, y); |
| + assertEquals(4, z); |
| + } |
| +} |
| +f3(1); |
| + |
| + |
| +// Dynamic lookup from closure. |
| +function f4(one) { |
| + var x = one + 1; |
| + let y = one + 2; |
| + { |
| + let z = one + 3; |
| + function f() { |
| + assertEquals(1, eval('one')); |
| + assertEquals(2, eval('x')); |
| + assertEquals(3, eval('y')); |
| + assertEquals(4, eval('z')); |
| + }; |
| + } |
| +} |
| +f4(1); |
| + |
| + |
| +// Lookup from closure. |
| +function f5(one) { |
| + var x = one + 1; |
| + let y = one + 2; |
| + { |
| + let z = one + 3; |
| + function f() { |
| + assertEquals(1, one); |
| + assertEquals(2, x); |
| + assertEquals(3, y); |
| + assertEquals(4, z); |
| + }; |
| + } |
| +} |
| +f5(1); |
| + |
| + |
| +// Return from block. |
| +function f6() { |
| + let x = 1; |
| + { |
| + let y = 2; |
| + return x + y; |
| + } |
| +} |
| +assertEquals(3, f6(6)); |
| + |
| + |
| +// Variable shadowing. |
| +function f7(a) { |
| + let b = 1; |
| + { // let vars shadowing arg and let var |
| + let a = 2; |
| + let b = 2; |
| + } |
| + try { |
| + throw 'stuff1'; |
| + } catch (a) { |
| + // catch var shadowing arg |
| + a = 2; |
| + { |
| + // let var shadowing catch var |
| + let a = 3; |
| + try { |
| + throw 'stuff2'; |
| + } catch (a) { |
| + // catch var shadowing let var |
| + a = 4; |
| + } |
| + assertEquals(3,a); |
| + } |
| + assertEquals(2,a); |
| + } |
| + try { |
| + throw 'stuff3'; |
| + } catch (c) { |
| + try { |
| + throw 'stuff4'; |
| + } catch(c) { |
| + // catch var shadowing catch var |
| + c = 3; |
| + } |
| + (function(c) { |
| + // arg shadowing catch |
| + })(); |
| + assertEquals('stuff3', c); |
| + } |
| + (function(a,b) { |
| + // arg shadowing arg and let var |
| + a = 2; |
| + b = 2; |
| + })(1,1); |
| + assertEquals(1,a); |
| + assertEquals(1,b); |
| +} |
| +f7(1); |
| + |
| + |
| +// Ensure let variables are block local and var variables function local. |
| +function f8() { |
| + var let_accessors = []; |
| + var var_accessors = []; |
| + for (var i = 0; i < 10; i++) { |
| + let x = i; |
| + var y = i; |
| + let_accessors[i] = function() { return x; } |
| + var_accessors[i] = function() { return i; } |
| + } |
| + for (var i = 0; i < 10; i++) { |
| + y = j + 10; |
|
Lasse Reichstein
2011/08/16 11:00:46
Should y not just always be 10?
And I can't see "j
Steven
2011/08/16 15:06:08
Done.
|
| + assertEquals(i, let_accessors[i]()); |
| + assertEquals(y, var_accessors[i]()); |
| + } |
| +} |
|
Lasse Reichstein
2011/08/16 11:00:46
And you don't call f8 (which is why it could be bu
Steven
2011/08/16 15:06:08
Done.
|