Reviewers: adamk,

Description:
Class block scoping tests

Class bindings are mutable and lexically scoped, with TDZ semantics.
They may not overlap with var bindings in the same scope. This patch
adds tests for those properties.

R=adamk
BUG=3305
LOG=N

Please review this at https://codereview.chromium.org/1254003004/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+45, -0 lines):
  A test/mjsunit/harmony/block-scope-class.js


Index: test/mjsunit/harmony/block-scope-class.js
diff --git a/test/mjsunit/harmony/block-scope-class.js b/test/mjsunit/harmony/block-scope-class.js
new file mode 100644
index 0000000000000000000000000000000000000000..5bcf8ded228a6e15189c52c1c474194e64afe5ea
--- /dev/null
+++ b/test/mjsunit/harmony/block-scope-class.js
@@ -0,0 +1,45 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Test for conflicting variable bindings.
+
+// Flags: --no-legacy-const --harmony-sloppy
+
+function AssertEqualsStrictAndSloppy(value, code) {
+  assertEquals(value, eval("(function() {" + code + "})()"));
+ assertEquals(value, eval("(function() { 'use strict'; " + code + "})()")); + assertEquals(value, eval("(function() { var x = 0; {" + code + "} })()")); + assertEquals(value, eval("(function() { 'use strict'; var x = 0; {" + code + "} })()"));
+}
+
+function AssertThrowsStrictAndSloppy(code, error) {
+  assertThrows("(function() {" + code + "})()", error);
+  assertThrows("(function() { 'use strict'; " + code + "})()", error);
+  assertThrows("(function() { var x = 0; { " + code + "} })()", error);
+ assertThrows("(function() { 'use strict'; var x = 0; {" + code + "} })()", error);
+}
+
+(function TestClassTDZ() {
+ AssertEqualsStrictAndSloppy("x", "function f() { return x; }; class x { }; return f().name;"); + AssertEqualsStrictAndSloppy("x", "class x { }; function f() { return x; }; return f().name;"); + AssertEqualsStrictAndSloppy("x", "class x { }; var result = f().name; function f() { return x; }; return result;"); + AssertThrowsStrictAndSloppy("function f() { return x; }; f(); class x { };", ReferenceError); + AssertThrowsStrictAndSloppy("f(); function f() { return x; }; class x { };", ReferenceError); + AssertThrowsStrictAndSloppy("f(); class x { }; function f() { return x; };", ReferenceError); + AssertThrowsStrictAndSloppy("var x = 1; { f(); class x { }; function f() { return x; }; }", ReferenceError);
+  AssertThrowsStrictAndSloppy("x = 3; class x { };", ReferenceError)
+})();
+
+(function TestClassNameConflict() {
+  AssertThrowsStrictAndSloppy("class x { }; var x;", SyntaxError);
+  AssertThrowsStrictAndSloppy("var x; class x { };", SyntaxError);
+ AssertThrowsStrictAndSloppy("class x { }; function x() { };", SyntaxError); + AssertThrowsStrictAndSloppy("function x() { }; class x { };", SyntaxError); + AssertThrowsStrictAndSloppy("class x { }; for (var x = 0; false;) { };", SyntaxError); + AssertThrowsStrictAndSloppy("for (var x = 0; false;) { }; class x { };", SyntaxError);
+})();
+
+(function TestClassMutableBinding() {
+ AssertEqualsStrictAndSloppy("x3", "class x { }; var y = x.name; x = 3; return y + x;")
+})();


--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to