| Index: test/mjsunit/harmony/classes.js
|
| diff --git a/test/mjsunit/harmony/classes.js b/test/mjsunit/harmony/classes.js
|
| deleted file mode 100644
|
| index 9c090413450ca203116da1d13dbbc5f03d980374..0000000000000000000000000000000000000000
|
| --- a/test/mjsunit/harmony/classes.js
|
| +++ /dev/null
|
| @@ -1,948 +0,0 @@
|
| -// 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-classes --harmony-sloppy
|
| -
|
| -(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);
|
| -
|
| - class D2 { constructor() {} }
|
| - assertEquals('D2', D2.name);
|
| -
|
| - // TODO(arv): The logic for the name of anonymous functions in ES6 requires
|
| - // the below to be 'E';
|
| - var E = class {}
|
| - assertEquals('', E.name); // Should be 'E'.
|
| -
|
| - var F = class { constructor() {} };
|
| - assertEquals('', F.name); // Should be 'F'.
|
| -})();
|
| -
|
| -
|
| -(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;
|
| -
|
| - assertThrows(function() {
|
| - function* g() {}
|
| - class C extends g {}
|
| - }, TypeError);
|
| -})();
|
| -
|
| -
|
| -(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() {
|
| - super();
|
| - 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);
|
| -
|
| - var D = class extends function() {
|
| - arguments.caller;
|
| - } {};
|
| - assertThrows(function() {
|
| - Object.getPrototypeOf(D).arguments;
|
| - }, TypeError);
|
| - assertThrows(function() {
|
| - new D;
|
| - }, TypeError);
|
| -})();
|
| -
|
| -
|
| -(function TestToString() {
|
| - class C {}
|
| - assertEquals('class C {}', C.toString());
|
| -
|
| - class D { constructor() { 42; } }
|
| - assertEquals('class D { constructor() { 42; } }', D.toString());
|
| -
|
| - class E { x() { 42; } }
|
| - assertEquals('class E { x() { 42; } }', E.toString());
|
| -})();
|
| -
|
| -
|
| -function assertMethodDescriptor(object, name) {
|
| - var descr = Object.getOwnPropertyDescriptor(object, name);
|
| - assertTrue(descr.configurable);
|
| - assertFalse(descr.enumerable);
|
| - assertTrue(descr.writable);
|
| - assertEquals('function', typeof descr.value);
|
| - assertFalse('prototype' in descr.value);
|
| -}
|
| -
|
| -
|
| -function assertGetterDescriptor(object, name) {
|
| - var descr = Object.getOwnPropertyDescriptor(object, name);
|
| - assertTrue(descr.configurable);
|
| - assertFalse(descr.enumerable);
|
| - assertEquals('function', typeof descr.get);
|
| - assertFalse('prototype' in descr.get);
|
| - assertEquals(undefined, descr.set);
|
| -}
|
| -
|
| -
|
| -function assertSetterDescriptor(object, name) {
|
| - var descr = Object.getOwnPropertyDescriptor(object, name);
|
| - assertTrue(descr.configurable);
|
| - assertFalse(descr.enumerable);
|
| - assertEquals(undefined, descr.get);
|
| - assertEquals('function', typeof descr.set);
|
| - assertFalse('prototype' in descr.set);
|
| -}
|
| -
|
| -
|
| -function assertAccessorDescriptor(object, name) {
|
| - var descr = Object.getOwnPropertyDescriptor(object, name);
|
| - assertTrue(descr.configurable);
|
| - assertFalse(descr.enumerable);
|
| - assertEquals('function', typeof descr.get);
|
| - assertEquals('function', typeof descr.set);
|
| - assertFalse('prototype' in descr.get);
|
| - assertFalse('prototype' in descr.set);
|
| -}
|
| -
|
| -
|
| -(function TestMethods() {
|
| - class C {
|
| - method() { return 1; }
|
| - static staticMethod() { return 2; }
|
| - method2() { return 3; }
|
| - static staticMethod2() { return 4; }
|
| - }
|
| -
|
| - assertMethodDescriptor(C.prototype, 'method');
|
| - assertMethodDescriptor(C.prototype, 'method2');
|
| - assertMethodDescriptor(C, 'staticMethod');
|
| - assertMethodDescriptor(C, 'staticMethod2');
|
| -
|
| - assertEquals(1, new C().method());
|
| - assertEquals(2, C.staticMethod());
|
| - assertEquals(3, new C().method2());
|
| - assertEquals(4, C.staticMethod2());
|
| -})();
|
| -
|
| -
|
| -(function TestGetters() {
|
| - class C {
|
| - get x() { return 1; }
|
| - static get staticX() { return 2; }
|
| - get y() { return 3; }
|
| - static get staticY() { return 4; }
|
| - }
|
| -
|
| - assertGetterDescriptor(C.prototype, 'x');
|
| - assertGetterDescriptor(C.prototype, 'y');
|
| - assertGetterDescriptor(C, 'staticX');
|
| - assertGetterDescriptor(C, 'staticY');
|
| -
|
| - assertEquals(1, new C().x);
|
| - assertEquals(2, C.staticX);
|
| - assertEquals(3, new C().y);
|
| - assertEquals(4, C.staticY);
|
| -})();
|
| -
|
| -
|
| -
|
| -(function TestSetters() {
|
| - var x, staticX, y, staticY;
|
| - class C {
|
| - set x(v) { x = v; }
|
| - static set staticX(v) { staticX = v; }
|
| - set y(v) { y = v; }
|
| - static set staticY(v) { staticY = v; }
|
| - }
|
| -
|
| - assertSetterDescriptor(C.prototype, 'x');
|
| - assertSetterDescriptor(C.prototype, 'y');
|
| - assertSetterDescriptor(C, 'staticX');
|
| - assertSetterDescriptor(C, 'staticY');
|
| -
|
| - assertEquals(1, new C().x = 1);
|
| - assertEquals(1, x);
|
| - assertEquals(2, C.staticX = 2);
|
| - assertEquals(2, staticX);
|
| - assertEquals(3, new C().y = 3);
|
| - assertEquals(3, y);
|
| - assertEquals(4, C.staticY = 4);
|
| - assertEquals(4, staticY);
|
| -})();
|
| -
|
| -
|
| -(function TestSideEffectsInPropertyDefine() {
|
| - function B() {}
|
| - B.prototype = {
|
| - constructor: B,
|
| - set m(v) {
|
| - throw Error();
|
| - }
|
| - };
|
| -
|
| - class C extends B {
|
| - m() { return 1; }
|
| - }
|
| -
|
| - assertEquals(1, new C().m());
|
| -})();
|
| -
|
| -
|
| -(function TestAccessors() {
|
| - class C {
|
| - constructor(x) {
|
| - this._x = x;
|
| - }
|
| -
|
| - get x() { return this._x; }
|
| - set x(v) { this._x = v; }
|
| -
|
| - static get staticX() { return this._x; }
|
| - static set staticX(v) { this._x = v; }
|
| - }
|
| -
|
| - assertAccessorDescriptor(C.prototype, 'x');
|
| - assertAccessorDescriptor(C, 'staticX');
|
| -
|
| - var c = new C(1);
|
| - c._x = 1;
|
| - assertEquals(1, c.x);
|
| - c.x = 2;
|
| - assertEquals(2, c._x);
|
| -
|
| - C._x = 3;
|
| - assertEquals(3, C.staticX);
|
| - C._x = 4;
|
| - assertEquals(4, C.staticX );
|
| -})();
|
| -
|
| -
|
| -(function TestProto() {
|
| - class C {
|
| - __proto__() { return 1; }
|
| - }
|
| - assertMethodDescriptor(C.prototype, '__proto__');
|
| - assertEquals(1, new C().__proto__());
|
| -})();
|
| -
|
| -
|
| -(function TestProtoStatic() {
|
| - class C {
|
| - static __proto__() { return 1; }
|
| - }
|
| - assertMethodDescriptor(C, '__proto__');
|
| - assertEquals(1, C.__proto__());
|
| -})();
|
| -
|
| -
|
| -(function TestProtoAccessor() {
|
| - class C {
|
| - get __proto__() { return this._p; }
|
| - set __proto__(v) { this._p = v; }
|
| - }
|
| - assertAccessorDescriptor(C.prototype, '__proto__');
|
| - var c = new C();
|
| - c._p = 1;
|
| - assertEquals(1, c.__proto__);
|
| - c.__proto__ = 2;
|
| - assertEquals(2, c.__proto__);
|
| -})();
|
| -
|
| -
|
| -(function TestStaticProtoAccessor() {
|
| - class C {
|
| - static get __proto__() { return this._p; }
|
| - static set __proto__(v) { this._p = v; }
|
| - }
|
| - assertAccessorDescriptor(C, '__proto__');
|
| - C._p = 1;
|
| - assertEquals(1, C.__proto__);
|
| - C.__proto__ = 2;
|
| - assertEquals(2, C.__proto__);
|
| -})();
|
| -
|
| -
|
| -(function TestSettersOnProto() {
|
| - function Base() {}
|
| - Base.prototype = {
|
| - set constructor(_) {
|
| - assertUnreachable();
|
| - },
|
| - set m(_) {
|
| - assertUnreachable();
|
| - }
|
| - };
|
| - Object.defineProperty(Base, 'staticM', {
|
| - set: function() {
|
| - assertUnreachable();
|
| - }
|
| - });
|
| -
|
| - class C extends Base {
|
| - m() {
|
| - return 1;
|
| - }
|
| - static staticM() {
|
| - return 2;
|
| - }
|
| - }
|
| -
|
| - assertEquals(1, new C().m());
|
| - assertEquals(2, C.staticM());
|
| -})();
|
| -
|
| -
|
| -(function TestConstructableButNoPrototype() {
|
| - var Base = function() {}.bind();
|
| - assertThrows(function() {
|
| - class C extends Base {}
|
| - }, TypeError);
|
| -})();
|
| -
|
| -
|
| -(function TestPrototypeGetter() {
|
| - var calls = 0;
|
| - var Base = function() {}.bind();
|
| - Object.defineProperty(Base, 'prototype', {
|
| - get: function() {
|
| - calls++;
|
| - return null;
|
| - },
|
| - configurable: true
|
| - });
|
| - class C extends Base {}
|
| - assertEquals(1, calls);
|
| -
|
| - calls = 0;
|
| - Object.defineProperty(Base, 'prototype', {
|
| - get: function() {
|
| - calls++;
|
| - return 42;
|
| - },
|
| - configurable: true
|
| - });
|
| - assertThrows(function() {
|
| - class C extends Base {}
|
| - }, TypeError);
|
| - assertEquals(1, calls);
|
| -})();
|
| -
|
| -
|
| -(function TestPrototypeSetter() {
|
| - var Base = function() {}.bind();
|
| - Object.defineProperty(Base, 'prototype', {
|
| - set: function() {
|
| - assertUnreachable();
|
| - }
|
| - });
|
| - assertThrows(function() {
|
| - class C extends Base {}
|
| - }, TypeError);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInMethods() {
|
| - class B {
|
| - method() {
|
| - return 1;
|
| - }
|
| - get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - method() {
|
| - assertEquals(2, super.x);
|
| - return super.method();
|
| - }
|
| - }
|
| - assertEquals(1, new C().method());
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInGetter() {
|
| - class B {
|
| - method() {
|
| - return 1;
|
| - }
|
| - get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - get y() {
|
| - assertEquals(2, super.x);
|
| - return super.method();
|
| - }
|
| - }
|
| - assertEquals(1, new C().y);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInSetter() {
|
| - class B {
|
| - method() {
|
| - return 1;
|
| - }
|
| - get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - set y(v) {
|
| - assertEquals(3, v);
|
| - assertEquals(2, super.x);
|
| - assertEquals(1, super.method());
|
| - }
|
| - }
|
| - assertEquals(3, new C().y = 3);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInStaticMethods() {
|
| - class B {
|
| - static method() {
|
| - return 1;
|
| - }
|
| - static get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - static method() {
|
| - assertEquals(2, super.x);
|
| - return super.method();
|
| - }
|
| - }
|
| - assertEquals(1, C.method());
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInStaticGetter() {
|
| - class B {
|
| - static method() {
|
| - return 1;
|
| - }
|
| - static get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - static get x() {
|
| - assertEquals(2, super.x);
|
| - return super.method();
|
| - }
|
| - }
|
| - assertEquals(1, C.x);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInStaticSetter() {
|
| - class B {
|
| - static method() {
|
| - return 1;
|
| - }
|
| - static get x() {
|
| - return 2;
|
| - }
|
| - }
|
| - class C extends B {
|
| - static set x(v) {
|
| - assertEquals(3, v);
|
| - assertEquals(2, super.x);
|
| - assertEquals(1, super.method());
|
| - }
|
| - }
|
| - assertEquals(3, C.x = 3);
|
| -})();
|
| -
|
| -
|
| -(function TestNumericPropertyNames() {
|
| - class B {
|
| - 1() { return 1; }
|
| - get 2() { return 2; }
|
| - set 3(_) {}
|
| -
|
| - static 4() { return 4; }
|
| - static get 5() { return 5; }
|
| - static set 6(_) {}
|
| - }
|
| -
|
| - assertMethodDescriptor(B.prototype, '1');
|
| - assertGetterDescriptor(B.prototype, '2');
|
| - assertSetterDescriptor(B.prototype, '3');
|
| -
|
| - assertMethodDescriptor(B, '4');
|
| - assertGetterDescriptor(B, '5');
|
| - assertSetterDescriptor(B, '6');
|
| -
|
| - class C extends B {
|
| - 1() { return super[1](); }
|
| - get 2() { return super[2]; }
|
| -
|
| - static 4() { return super[4](); }
|
| - static get 5() { return super[5]; }
|
| - }
|
| -
|
| - assertEquals(1, new C()[1]());
|
| - assertEquals(2, new C()[2]);
|
| - assertEquals(4, C[4]());
|
| - assertEquals(5, C[5]);
|
| -})();
|
| -
|
| -
|
| -(function TestDefaultConstructorNoCrash() {
|
| - // Regression test for https://code.google.com/p/v8/issues/detail?id=3661
|
| - class C {}
|
| - assertThrows(function () {C();}, TypeError);
|
| - assertThrows(function () {C(1);}, TypeError);
|
| - assertTrue(new C() instanceof C);
|
| - assertTrue(new C(1) instanceof C);
|
| -})();
|
| -
|
| -
|
| -(function TestDefaultConstructor() {
|
| - var calls = 0;
|
| - class Base {
|
| - constructor() {
|
| - calls++;
|
| - }
|
| - }
|
| - class Derived extends Base {}
|
| - var object = new Derived;
|
| - assertEquals(1, calls);
|
| -
|
| - calls = 0;
|
| - assertThrows(function() { Derived(); }, TypeError);
|
| - assertEquals(0, calls);
|
| -})();
|
| -
|
| -
|
| -(function TestDefaultConstructorArguments() {
|
| - var args, self;
|
| - class Base {
|
| - constructor() {
|
| - self = this;
|
| - args = arguments;
|
| - }
|
| - }
|
| - class Derived extends Base {}
|
| -
|
| - new Derived;
|
| - assertEquals(0, args.length);
|
| -
|
| - new Derived(0, 1, 2);
|
| - assertEquals(3, args.length);
|
| - assertTrue(self instanceof Derived);
|
| -
|
| - var arr = new Array(100);
|
| - var obj = {};
|
| - assertThrows(function() {Derived.apply(obj, arr);}, TypeError);
|
| -})();
|
| -
|
| -
|
| -(function TestDefaultConstructorArguments2() {
|
| - var args;
|
| - class Base {
|
| - constructor(x, y) {
|
| - args = arguments;
|
| - }
|
| - }
|
| - class Derived extends Base {}
|
| -
|
| - new Derived;
|
| - assertEquals(0, args.length);
|
| -
|
| - new Derived(1);
|
| - assertEquals(1, args.length);
|
| - assertEquals(1, args[0]);
|
| -
|
| - new Derived(1, 2, 3);
|
| - assertEquals(3, args.length);
|
| - assertEquals(1, args[0]);
|
| - assertEquals(2, args[1]);
|
| - assertEquals(3, args[2]);
|
| -})();
|
| -
|
| -
|
| -(function TestNameBindingConst() {
|
| - assertThrows('class C { constructor() { C = 42; } }; new C();', TypeError);
|
| - assertThrows('new (class C { constructor() { C = 42; } })', TypeError);
|
| - assertThrows('class C { m() { C = 42; } }; new C().m()', TypeError);
|
| - assertThrows('new (class C { m() { C = 42; } }).m()', TypeError);
|
| - assertThrows('class C { get x() { C = 42; } }; new C().x', TypeError);
|
| - assertThrows('(new (class C { get x() { C = 42; } })).x', TypeError);
|
| - assertThrows('class C { set x(_) { C = 42; } }; new C().x = 15;', TypeError);
|
| - assertThrows('(new (class C { set x(_) { C = 42; } })).x = 15;', TypeError);
|
| -})();
|
| -
|
| -
|
| -(function TestNameBinding() {
|
| - var C2;
|
| - class C {
|
| - constructor() {
|
| - C2 = C;
|
| - }
|
| - m() {
|
| - C2 = C;
|
| - }
|
| - get x() {
|
| - C2 = C;
|
| - }
|
| - set x(_) {
|
| - C2 = C;
|
| - }
|
| - }
|
| - new C();
|
| - assertEquals(C, C2);
|
| -
|
| - C2 = undefined;
|
| - new C().m();
|
| - assertEquals(C, C2);
|
| -
|
| - C2 = undefined;
|
| - new C().x;
|
| - assertEquals(C, C2);
|
| -
|
| - C2 = undefined;
|
| - new C().x = 1;
|
| - assertEquals(C, C2);
|
| -})();
|
| -
|
| -
|
| -(function TestNameBindingExpression() {
|
| - var C3;
|
| - var C = class C2 {
|
| - constructor() {
|
| - assertEquals(C2, C);
|
| - C3 = C2;
|
| - }
|
| - m() {
|
| - assertEquals(C2, C);
|
| - C3 = C2;
|
| - }
|
| - get x() {
|
| - assertEquals(C2, C);
|
| - C3 = C2;
|
| - }
|
| - set x(_) {
|
| - assertEquals(C2, C);
|
| - C3 = C2;
|
| - }
|
| - }
|
| - new C();
|
| - assertEquals(C, C3);
|
| -
|
| - C3 = undefined;
|
| - new C().m();
|
| - assertEquals(C, C3);
|
| -
|
| - C3 = undefined;
|
| - new C().x;
|
| - assertEquals(C, C3);
|
| -
|
| - C3 = undefined;
|
| - new C().x = 1;
|
| - assertEquals(C, C3);
|
| -})();
|
| -
|
| -
|
| -(function TestNameBindingInExtendsExpression() {
|
| - assertThrows(function() {
|
| - class x extends x {}
|
| - }, ReferenceError);
|
| -
|
| - assertThrows(function() {
|
| - (class x extends x {});
|
| - }, ReferenceError);
|
| -
|
| - assertThrows(function() {
|
| - var x = (class x extends x {});
|
| - }, ReferenceError);
|
| -})();
|
| -
|
| -
|
| -(function TestThisAccessRestriction() {
|
| - class Base {}
|
| - (function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - var y;
|
| - super();
|
| - }
|
| - }; new C();
|
| - }());
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super(this.x);
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super(this);
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super.method();
|
| - super(this);
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super(super.method());
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super(super());
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - assertThrows(function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - super(1, 2, Object.getPrototypeOf(this));
|
| - }
|
| - }; new C();
|
| - }, ReferenceError);
|
| - (function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - { super(1, 2); }
|
| - }
|
| - }; new C();
|
| - }());
|
| - (function() {
|
| - class C extends Base {
|
| - constructor() {
|
| - if (1) super();
|
| - }
|
| - }; new C();
|
| - }());
|
| -
|
| - class C1 extends Object {
|
| - constructor() {
|
| - 'use strict';
|
| - super();
|
| - }
|
| - };
|
| - new C1();
|
| -
|
| - class C2 extends Object {
|
| - constructor() {
|
| - ; 'use strict';;;;;
|
| - super();
|
| - }
|
| - };
|
| - new C2();
|
| -
|
| - class C3 extends Object {
|
| - constructor() {
|
| - ; 'use strict';;;;;
|
| - // This is a comment.
|
| - super();
|
| - }
|
| - };
|
| - new C3();
|
| -}());
|
| -
|
| -
|
| -function testClassRestrictedProperties(C) {
|
| - assertEquals(false, C.hasOwnProperty("arguments"));
|
| - assertThrows(function() { return C.arguments; }, TypeError);
|
| - assertThrows(function() { C.arguments = {}; }, TypeError);
|
| -
|
| - assertEquals(false, C.hasOwnProperty("caller"));
|
| - assertThrows(function() { return C.caller; }, TypeError);
|
| - assertThrows(function() { C.caller = {}; }, TypeError);
|
| -
|
| - assertEquals(false, (new C).method.hasOwnProperty("arguments"));
|
| - assertThrows(function() { return new C().method.arguments; }, TypeError);
|
| - assertThrows(function() { new C().method.arguments = {}; }, TypeError);
|
| -
|
| - assertEquals(false, (new C).method.hasOwnProperty("caller"));
|
| - assertThrows(function() { return new C().method.caller; }, TypeError);
|
| - assertThrows(function() { new C().method.caller = {}; }, TypeError);
|
| -}
|
| -
|
| -
|
| -(function testRestrictedPropertiesStrict() {
|
| - "use strict";
|
| - class ClassWithDefaultConstructor {
|
| - method() {}
|
| - }
|
| - class Class {
|
| - constructor() {}
|
| - method() {}
|
| - }
|
| - class DerivedClassWithDefaultConstructor extends Class {}
|
| - class DerivedClass extends Class { constructor() { super(); } }
|
| -
|
| - testClassRestrictedProperties(ClassWithDefaultConstructor);
|
| - testClassRestrictedProperties(Class);
|
| - testClassRestrictedProperties(DerivedClassWithDefaultConstructor);
|
| - testClassRestrictedProperties(DerivedClass);
|
| - testClassRestrictedProperties(class { method() {} });
|
| - testClassRestrictedProperties(class { constructor() {} method() {} });
|
| - testClassRestrictedProperties(class extends Class { });
|
| - testClassRestrictedProperties(
|
| - class extends Class { constructor() { super(); } });
|
| -})();
|
| -
|
| -
|
| -(function testRestrictedPropertiesSloppy() {
|
| - class ClassWithDefaultConstructor {
|
| - method() {}
|
| - }
|
| - class Class {
|
| - constructor() {}
|
| - method() {}
|
| - }
|
| - class DerivedClassWithDefaultConstructor extends Class {}
|
| - class DerivedClass extends Class { constructor() { super(); } }
|
| -
|
| - testClassRestrictedProperties(ClassWithDefaultConstructor);
|
| - testClassRestrictedProperties(Class);
|
| - testClassRestrictedProperties(DerivedClassWithDefaultConstructor);
|
| - testClassRestrictedProperties(DerivedClass);
|
| - testClassRestrictedProperties(class { method() {} });
|
| - testClassRestrictedProperties(class { constructor() {} method() {} });
|
| - testClassRestrictedProperties(class extends Class { });
|
| - testClassRestrictedProperties(
|
| - class extends Class { constructor() { super(); } });
|
| -})();
|
|
|