Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index 4f2603d9f60bb2c0277afa99b948129ecc285d24..aa350092a60d98f3e4133130dcd6db1dd2f27920 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -1448,9 +1448,15 @@ TEST(ParserSync) { |
i::GetCurrentStackPosition() - 128 * 1024); |
static const ParserFlag flags1[] = { |
- kAllowLazy, kAllowHarmonyScoping, |
- kAllowModules, kAllowArrowFunctions, |
- kAllowHarmonyNumericLiterals, kAllowHarmonyObjectLiterals}; |
+ kAllowArrowFunctions, |
+ kAllowClasses, |
+ kAllowHarmonyNumericLiterals, |
+ kAllowHarmonyObjectLiterals, |
+ kAllowHarmonyScoping, |
+ kAllowLazy, |
+ kAllowModules, |
+ }; |
+ |
for (int i = 0; context_data[i][0] != NULL; ++i) { |
for (int j = 0; statement_data[j] != NULL; ++j) { |
for (int k = 0; termination_data[k] != NULL; ++k) { |
@@ -1525,10 +1531,14 @@ void RunParserSyncTest(const char* context_data[][2], |
i::GetCurrentStackPosition() - 128 * 1024); |
static const ParserFlag default_flags[] = { |
- kAllowArrowFunctions, kAllowClasses, |
- kAllowHarmonyNumericLiterals, kAllowHarmonyObjectLiterals, |
- kAllowHarmonyScoping, kAllowLazy, |
- kAllowModules, kAllowNativesSyntax, |
+ kAllowArrowFunctions, |
+ kAllowClasses, |
+ kAllowHarmonyNumericLiterals, |
+ kAllowHarmonyObjectLiterals, |
+ kAllowHarmonyScoping, |
+ kAllowLazy, |
+ kAllowModules, |
+ kAllowNativesSyntax, |
}; |
ParserFlag* generated_flags = NULL; |
if (flags == NULL) { |
@@ -3537,3 +3547,405 @@ TEST(MethodDefinitionDuplicateProperty) { |
RunParserSyncTest(context_data, params_data, kError, NULL, 0, |
always_flags, arraysize(always_flags)); |
} |
+ |
+ |
+TEST(NoErrorsClassExpression) { |
+ const char* context_data[][2] = {{"(", ");"}, |
+ {"var C = ", ";"}, |
+ {"bar, ", ";"}, |
+ {NULL, NULL}}; |
+ const char* class_data[] = { |
+ "class {}", |
+ "class name {}", |
+ "class extends F {}", |
+ "class name extends F {}", |
+ "class extends (F, G) {}", |
+ "class name extends (F, G) {}", |
+ "class extends class {} {}", |
+ "class name extends class {} {}", |
+ "class extends class base {} {}", |
+ "class name extends class base {} {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = {kAllowClasses}; |
+ RunParserSyncTest(context_data, class_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(NoErrorsClassDeclaration) { |
+ const char* context_data[][2] = {{"", ""}, |
+ {"{", "}"}, |
+ {"if (true) {", "}"}, |
+ {NULL, NULL}}; |
+ const char* statement_data[] = { |
+ "class name {}", |
+ "class name extends F {}", |
+ "class name extends (F, G) {}", |
+ "class name extends class {} {}", |
+ "class name extends class base {} {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = {kAllowClasses}; |
+ RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(NoErrorsClassBody) { |
+ // Tests that parser and preparser accept valid class syntax. |
+ const char* context_data[][2] = {{"(class {", "});"}, |
+ {"(class extends Base {", "});"}, |
+ {"class C {", "}"}, |
+ {"class C extends Base {", "}"}, |
+ {NULL, NULL}}; |
+ const char* class_body_data[] = { |
+ ";", |
+ ";;", |
+ "m() {}", |
+ "m() {};", |
+ ";m() {}", |
+ "m() {}; n(x) {}", |
+ "get x() {}", |
+ "set x(v) {}", |
+ "get() {}", |
+ "set() {}", |
+ "static() {}", |
+ "static m() {}", |
+ "static get x() {}", |
+ "static set x(v) {}", |
+ "static get() {}", |
+ "static set() {}", |
+ "static static() {}", |
+ "static get static() {}", |
+ "static set static(v) {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(MethodDefinitionstrictFormalParamereters) { |
+ const char* context_data[][2] = {{"({method(", "){}});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* params_data[] = { |
+ "x, x", |
+ "x, y, x", |
+ "eval", |
+ "arguments", |
+ "var", |
+ "const", |
+ NULL |
+ }; |
+ |
+ static const ParserFlag always_flags[] = {kAllowHarmonyObjectLiterals}; |
+ RunParserSyncTest(context_data, params_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(NoErrorsClassPropertyName) { |
+ const char* context_data[][2] = {{"(class {", "() {}});"}, |
+ {"(class { get ", "() {}});"}, |
+ {"(class { set ", "(v) {}});"}, |
+ {"(class { static ", "() {}});"}, |
+ {"(class { static get ", "() {}});"}, |
+ {"(class { static set ", "(v) {}});"}, |
+ {"class C {", "() {}}"}, |
+ {"class C { get ", "() {}}"}, |
+ {"class C { set ", "(v) {}}"}, |
+ {"class C { static ", "() {}}"}, |
+ {"class C { static get ", "() {}}"}, |
+ {"class C { static set ", "(v) {}}"}, |
+ {NULL, NULL}}; |
+ const char* name_data[] = { |
+ "42", |
+ "42.5", |
+ "42e2", |
+ "42e+2", |
+ "42e-2", |
+ "null", |
+ "false", |
+ "true", |
+ "'str'", |
+ "\"str\"", |
+ "static", |
+ "get", |
+ "set", |
+ "var", |
+ "const", |
+ "let", |
+ "this", |
+ "class", |
+ "function", |
+ "yield", |
+ "if", |
+ "else", |
+ "for", |
+ "while", |
+ "do", |
+ "try", |
+ "catch", |
+ "finally", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, name_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassExpression) { |
+ const char* context_data[][2] = {{"(", ");"}, |
+ {"var C = ", ";"}, |
+ {"bar, ", ";"}, |
+ {NULL, NULL}}; |
+ const char* class_data[] = { |
+ "class", |
+ "class name", |
+ "class name extends", |
+ "class extends", |
+ "class {", |
+ "class { m }", |
+ "class { m; n }", |
+ "class { m: 1 }", |
+ "class { m(); n() }", |
+ "class { get m }", |
+ "class { get m() }", |
+ "class { get m() { }", |
+ "class { set m() {} }", // Missing required parameter. |
+ "class { m() {}, n() {} }", // No commas allowed. |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassDeclaration) { |
+ const char* context_data[][2] = {{"", ""}, |
+ {"{", "}"}, |
+ {"if (true) {", "}"}, |
+ {NULL, NULL}}; |
+ const char* class_data[] = { |
+ "class", |
+ "class name", |
+ "class name extends", |
+ "class extends", |
+ "class name {", |
+ "class name { m }", |
+ "class name { m; n }", |
+ "class name { m: 1 }", |
+ "class name { m(); n() }", |
+ "class name { get m }", |
+ "class name { get m() }", |
+ "class name { set m() {) }", // missing required param |
+ "class {}", // Name is required for declaration |
+ "class extends base {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyNumericLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassName) { |
+ const char* context_data[][2] = {{"class ", "{}"}, |
+ {"(class ", "{});"}, |
+ {"'use strict'; class ", "{}"}, |
+ {"'use strict'; (class ", "{});"}, |
+ {NULL, NULL}}; |
+ const char* class_name[] = { |
+ "arguments", |
+ "eval", |
+ "implements", |
+ "interface", |
+ "let", |
+ "package", |
+ "private", |
+ "protected", |
+ "public", |
+ "static", |
+ "var", |
+ "yield", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_name, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassGetterParamName) { |
+ const char* context_data[][2] = { |
+ {"class C { get name(", ") {} }"}, |
+ {"(class { get name(", ") {} });"}, |
+ {"'use strict'; class C { get name(", ") {} }"}, |
+ {"'use strict'; (class { get name(", ") {} })"}, |
+ {NULL, NULL} |
+ }; |
+ |
+ const char* class_name[] = { |
+ "arguments", |
+ "eval", |
+ "implements", |
+ "interface", |
+ "let", |
+ "package", |
+ "private", |
+ "protected", |
+ "public", |
+ "static", |
+ "var", |
+ "yield", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_name, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassStaticPrototype) { |
+ const char* context_data[][2] = {{"class C {", "}"}, |
+ {"(class {", "});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "static prototype() {}", |
+ "static get prototype() {}", |
+ "static set prototype(_) {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassSpecialConstructor) { |
+ const char* context_data[][2] = {{"class C {", "}"}, |
+ {"(class {", "});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "get constructor() {}", |
+ "get constructor(_) {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(NoErrorsClassConstructor) { |
+ const char* context_data[][2] = {{"class C {", "}"}, |
+ {"(class {", "});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "constructor() {}", |
+ "static constructor() {}", |
+ "static get constructor() {}", |
+ "static set constructor(_) {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassMultipleConstructor) { |
+ // We currently do not allow any duplicate properties in class bodies. This |
+ // test ensures that when we change that we still throw on duplicate |
+ // constructors. |
+ const char* context_data[][2] = {{"class C {", "}"}, |
+ {"(class {", "});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "constructor() {}; constructor() {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+// TODO(arv): We should allow duplicate property names. |
+// https://code.google.com/p/v8/issues/detail?id=3570 |
+DISABLED_TEST(NoErrorsClassMultiplePropertyNames) { |
+ const char* context_data[][2] = {{"class C {", "}"}, |
+ {"(class {", "});"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "constructor() {}; static constructor() {}", |
+ "m() {}; static m() {}", |
+ "m() {}; m() {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |
+ |
+ |
+TEST(ErrorsClassesAreStrict) { |
+ const char* context_data[][2] = {{"", ""}, |
+ {"(", ");"}, |
+ {NULL, NULL}}; |
+ |
+ const char* class_body_data[] = { |
+ "class C { method() { with ({}) {} } }", |
+ "class C extends function() { with ({}) {} } {}", |
+ NULL}; |
+ |
+ static const ParserFlag always_flags[] = { |
+ kAllowClasses, |
+ kAllowHarmonyObjectLiterals |
+ }; |
+ RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
+ always_flags, arraysize(always_flags)); |
+} |