Index: test/mjsunit/harmony/classes.js |
diff --git a/test/mjsunit/harmony/classes.js b/test/mjsunit/harmony/classes.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7156dbdb8ef6c3c11b47ee13012af8e56ea589ca |
--- /dev/null |
+++ b/test/mjsunit/harmony/classes.js |
@@ -0,0 +1,167 @@ |
+// Copyright 2014 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 |
+ |
+(function TestBasics() { |
+ var C = class C {} |
+ assertEquals(typeof C, 'function'); |
+ assertEquals(C.__proto__, Function.prototype); |
+ assertEquals(Object.prototype, Object.getPrototypeOf(C.prototype)); |
+ assertEquals(Function.prototype, Object.getPrototypeOf(C)); |
+ assertEquals('C', C.name); |
+ |
+ class D {} |
+ assertEquals(typeof D, 'function'); |
+ assertEquals(D.__proto__, Function.prototype); |
+ assertEquals(Object.prototype, Object.getPrototypeOf(D.prototype)); |
+ assertEquals(Function.prototype, Object.getPrototypeOf(D)); |
+ assertEquals('D', D.name); |
+ |
+ var E = class {} |
+ assertEquals('', E.name); |
+})(); |
+ |
+ |
+(function TestBasicsExtends() { |
+ class C extends null {} |
+ assertEquals(typeof C, 'function'); |
+ assertEquals(C.__proto__, Function.prototype); |
+ assertEquals(null, Object.getPrototypeOf(C.prototype)); |
+ |
+ class D extends C {} |
+ assertEquals(typeof D, 'function'); |
+ assertEquals(D.__proto__, C); |
+ assertEquals(C.prototype, Object.getPrototypeOf(D.prototype)); |
+})(); |
+ |
+ |
+(function TestSideEffectInExtends() { |
+ var calls = 0; |
+ class C {} |
+ class D extends (calls++, C) {} |
+ assertEquals(1, calls); |
+ assertEquals(typeof D, 'function'); |
+ assertEquals(D.__proto__, C); |
+ assertEquals(C.prototype, Object.getPrototypeOf(D.prototype)); |
+})(); |
+ |
+ |
+(function TestInvalidExtends() { |
+ assertThrows(function() { |
+ class C extends 42 {} |
+ }, TypeError); |
+ |
+ assertThrows(function() { |
+ // Function but its .prototype is not null or a function. |
+ class C extends Math.abs {} |
+ }, TypeError); |
+ |
+ assertThrows(function() { |
+ Math.abs.prototype = 42; |
+ class C extends Math.abs {} |
+ }, TypeError); |
+ delete Math.abs.prototype; |
+})(); |
+ |
+ |
+(function TestConstructorProperty() { |
+ class C {} |
+ assertEquals(C, C.prototype.constructor); |
+ var descr = Object.getOwnPropertyDescriptor(C.prototype, 'constructor'); |
+ assertTrue(descr.configurable); |
+ assertFalse(descr.enumerable); |
+ assertTrue(descr.writable); |
+})(); |
+ |
+ |
+(function TestPrototypeProperty() { |
+ class C {} |
+ var descr = Object.getOwnPropertyDescriptor(C, 'prototype'); |
+ assertFalse(descr.configurable); |
+ assertFalse(descr.enumerable); |
+ assertFalse(descr.writable); |
+})(); |
+ |
+ |
+(function TestConstructor() { |
+ var count = 0; |
+ class C { |
+ constructor() { |
+ assertEquals(Object.getPrototypeOf(this), C.prototype); |
+ count++; |
+ } |
+ } |
+ assertEquals(C, C.prototype.constructor); |
+ var descr = Object.getOwnPropertyDescriptor(C.prototype, 'constructor'); |
+ assertTrue(descr.configurable); |
+ assertFalse(descr.enumerable); |
+ assertTrue(descr.writable); |
+ |
+ var c = new C(); |
+ assertEquals(1, count); |
+ assertEquals(Object.getPrototypeOf(c), C.prototype); |
+})(); |
+ |
+ |
+(function TestImplicitConstructor() { |
+ class C {} |
+ var c = new C(); |
+ assertEquals(Object.getPrototypeOf(c), C.prototype); |
+})(); |
+ |
+ |
+(function TestConstructorStrict() { |
+ class C { |
+ constructor() { |
+ assertThrows(function() { |
+ nonExistingBinding = 42; |
+ }, ReferenceError); |
+ } |
+ } |
+ new C(); |
+})(); |
+ |
+ |
+(function TestSuperInConstructor() { |
+ var calls = 0; |
+ class B {} |
+ B.prototype.x = 42; |
+ |
+ class C extends B { |
+ constructor() { |
+ calls++; |
+ assertEquals(42, super.x); |
+ } |
+ } |
+ |
+ new C; |
+ assertEquals(1, calls); |
+})(); |
+ |
+ |
+(function TestStrictMode() { |
+ class C {} |
+ |
+ with ({a: 1}) { |
+ assertEquals(1, a); |
+ } |
+ |
+ assertThrows('class C extends function B() { with ({}); return B; }() {}', |
+ SyntaxError); |
+ |
+})(); |
+ |
+/* TODO(arv): Implement |
+(function TestNameBindingInConstructor() { |
+ class C { |
+ constructor() { |
+ assertThrows(function() { |
+ C = 42; |
+ }, ReferenceError); |
+ } |
+ } |
+ new C(); |
+})(); |
+*/ |