| // 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. |
| |
| |
| (function testConstructClassStrict() { |
| "use strict"; |
| class Base { |
| constructor(...args) { |
| this.baseArgs = args; |
| } |
| method() { return this.baseArgs; } |
| } |
| |
| class Child extends Base { |
| constructor(...args) { |
| super(...args); |
| this.childArgs = args; |
| } |
| } |
| |
| class Child2 extends Base { |
| constructor(...args) { |
| super("extra", ...args); |
| this.childArgs = args; |
| } |
| } |
| |
| var c = new Base(...[1, 2, 3]); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| |
| c = new Child(...[1, 2, 3]); |
| assertInstanceof(c, Child); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| assertEquals([1, 2, 3], c.childArgs); |
| |
| c = new Child2(...[1, 2, 3]); |
| assertInstanceof(c, Child2); |
| assertInstanceof(c, Base); |
| assertEquals(["extra", 1, 2, 3], c.method()); |
| assertEquals(["extra", 1, 2, 3], c.baseArgs); |
| assertEquals([1, 2, 3], c.childArgs); |
| })(); |
| |
| |
| (function testConstructSloppy() { |
| class Base { |
| constructor(...args) { |
| this.baseArgs = args; |
| } |
| method() { return this.baseArgs; } |
| } |
| |
| class Child extends Base { |
| constructor(...args) { |
| super(...args); |
| this.childArgs = args; |
| } |
| } |
| |
| class Child2 extends Base { |
| constructor(...args) { |
| super("extra", ...args); |
| this.childArgs = args; |
| } |
| } |
| |
| var c = new Base(...[1, 2, 3]); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| |
| c = new Child(...[1, 2, 3]); |
| assertInstanceof(c, Child); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| assertEquals([1, 2, 3], c.childArgs); |
| |
| c = new Child2(...[1, 2, 3]); |
| assertInstanceof(c, Child2); |
| assertInstanceof(c, Base); |
| assertEquals(["extra", 1, 2, 3], c.method()); |
| assertEquals(["extra", 1, 2, 3], c.baseArgs); |
| assertEquals([1, 2, 3], c.childArgs); |
| })(); |
| |
| (function testArgumentsObjectStrict() { |
| "use strict"; |
| class Base { |
| constructor(...args) { |
| this.baseArgs = args; |
| } |
| method() { return this.baseArgs; } |
| } |
| |
| class Child extends Base { |
| constructor() { |
| super(...arguments); |
| this.childArgs = arguments; |
| } |
| } |
| |
| class Child2 extends Base { |
| constructor() { |
| super("extra", ...arguments); |
| this.childArgs = arguments; |
| } |
| } |
| |
| var c = new Child(...[1, 2, 3]); |
| assertInstanceof(c, Child); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| assertFalse(Array.__proto__ === c.childArgs.__proto__); |
| assertEquals([1, 2, 3], Array.prototype.slice.call(c.childArgs)); |
| |
| c = new Child2(...[1, 2, 3]); |
| assertInstanceof(c, Child2); |
| assertInstanceof(c, Base); |
| assertEquals(["extra", 1, 2, 3], c.method()); |
| assertEquals(["extra", 1, 2, 3], c.baseArgs); |
| assertFalse(Array.__proto__ === c.childArgs.__proto__); |
| assertEquals([1, 2, 3], Array.prototype.slice.call(c.childArgs)); |
| })(); |
| |
| (function testArgumentsObjectSloppy() { |
| class Base { |
| constructor(...args) { |
| this.baseArgs = args; |
| } |
| method() { return this.baseArgs; } |
| } |
| |
| class Child extends Base { |
| constructor() { |
| super(...arguments); |
| this.childArgs = arguments; |
| } |
| } |
| |
| class Child2 extends Base { |
| constructor() { |
| super("extra", ...arguments); |
| this.childArgs = arguments; |
| } |
| } |
| |
| var c = new Child(...[1, 2, 3]); |
| assertInstanceof(c, Child); |
| assertInstanceof(c, Base); |
| assertEquals([1, 2, 3], c.method()); |
| assertEquals([1, 2, 3], c.baseArgs); |
| assertFalse(Array.__proto__ === c.childArgs.__proto__); |
| assertEquals([1, 2, 3], Array.prototype.slice.call(c.childArgs)); |
| |
| c = new Child2(...[1, 2, 3]); |
| assertInstanceof(c, Child2); |
| assertInstanceof(c, Base); |
| assertEquals(["extra", 1, 2, 3], c.method()); |
| assertEquals(["extra", 1, 2, 3], c.baseArgs); |
| assertFalse(Array.__proto__ === c.childArgs.__proto__); |
| assertEquals([1, 2, 3], Array.prototype.slice.call(c.childArgs)); |
| })(); |