Index: test/mjsunit/harmony/class-fields-syntax.js |
diff --git a/test/mjsunit/harmony/class-fields-syntax.js b/test/mjsunit/harmony/class-fields-syntax.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..39146c23b5307e5d5164984e5d4d643336aefcc6 |
--- /dev/null |
+++ b/test/mjsunit/harmony/class-fields-syntax.js |
@@ -0,0 +1,163 @@ |
+// Copyright 2016 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. |
+ |
+// Flags: --harmony-class-fields |
+ |
+// ASI |
+ |
+{ |
+ class C { |
+ a = 0 |
+ b(){} |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor', 'b'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { |
+ a |
+ b(){} |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor', 'b'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { |
+ a |
+ b |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a', 'b'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { |
+ a |
+ *b(){} |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor', 'b'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { |
+ a |
+ ['b'](){} |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor', 'b'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { // a property named 'a' and a property named 'get' |
+ a |
+ get |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['a', 'get'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { |
+ get |
+ *a(){} |
+ } |
+ |
+ let c = new C; |
+ assertArrayEquals(['constructor', 'a'], Object.getOwnPropertyNames(C.prototype)); |
+ assertArrayEquals(['get'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { // a single static property named 'a' |
+ static |
+ a |
+ } |
+ |
+ let c = new C; |
+ //assertArrayEquals(['length', 'name', 'prototype', 'a'], Object.getOwnPropertyNames(C)); // TODO(bakkot) re-enable once no longer using fields to communicate |
+ assertArrayEquals([], Object.getOwnPropertyNames(c)); |
+} |
+ |
+{ |
+ class C { // a property named 'a' and a property named 'static' |
+ a |
+ static |
+ } |
+ |
+ let c = new C; |
+ //assertArrayEquals(['length', 'name', 'prototype'], Object.getOwnPropertyNames(C)); // TODO(bakkot) re-enable once no longer using fields to communicate |
+ assertArrayEquals(['a', 'static'], Object.getOwnPropertyNames(c)); |
+} |
+ |
+ |
+// ASI non-examples / errors |
+ |
+assertThrows(() => eval(` |
+ class C { a b } |
+`)); // There is no line terminator after 'a', so ASI does not occur |
+ |
+assertThrows(() => eval(` |
+ class C { |
+ a = 0 |
+ *b(){} |
+ } |
+`)); // '*' may follow 0 in an AssignmentExpression, so no ASI occurs after 0 |
+ |
+assertThrows(() => eval(` |
+ class C { |
+ a = 0 |
+ ['b'](){} |
+ } |
+`)); // '[' may follow 0 in an AssignmentExpression, so no ASI occurs after 0 |
+ |
+assertThrows(() => eval(` |
+ class C { |
+ get |
+ a |
+ } |
+`)); // 'a' may follow 'get' in a MethodDefinition, so no ASI occurs after 'get' |
+ |
+ |
+// Forbid static properties named 'prototype' |
+ |
+// assertThrows(() => eval(` |
+// class C { |
+// static prototype; |
+// } |
+// `), SyntaxError); // TODO(bakkot) re-enable once this restriction is spec'd and added |
+ |
+// assertThrows(() => eval(` |
+// class C { |
+// static prototype; |
+// } |
+// `), TypeError); // TODO(bakkot) re-enable once this restriction is spec'd and added |
+ |
+ |
+// Non-examples |
+ |
+{ |
+ class C { // a getter for 'a' on C.prototype; this is pre-existing syntax |
+ get |
+ a(){} |
+ } |
+ |
+ let c = new C; |
+ assertTrue(Object.getOwnPropertyDescriptor(C.prototype, 'a').hasOwnProperty('get')); |
+ assertArrayEquals([], Object.getOwnPropertyNames(c)); |
+} |