1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --harmony-sloppy
6
7
8(function testConstructClassStrict() {
9  "use strict";
10  class Base {
11    constructor(...args) {
12      this.baseArgs = args;
13    }
14    method() { return this.baseArgs; }
15  }
16
17  class Child extends Base {
18    constructor(...args) {
19      super(...args);
20      this.childArgs = args;
21    }
22  }
23
24  class Child2 extends Base {
25    constructor(...args) {
26      super("extra", ...args);
27      this.childArgs = args;
28    }
29  }
30
31  var c = new Base(...[1, 2, 3]);
32  assertInstanceof(c, Base);
33  assertEquals([1, 2, 3], c.method());
34  assertEquals([1, 2, 3], c.baseArgs);
35
36  c = new Child(...[1, 2, 3]);
37  assertInstanceof(c, Child);
38  assertInstanceof(c, Base);
39  assertEquals([1, 2, 3], c.method());
40  assertEquals([1, 2, 3], c.baseArgs);
41  assertEquals([1, 2, 3], c.childArgs);
42
43  c = new Child2(...[1, 2, 3]);
44  assertInstanceof(c, Child2);
45  assertInstanceof(c, Base);
46  assertEquals(["extra", 1, 2, 3], c.method());
47  assertEquals(["extra", 1, 2, 3], c.baseArgs);
48  assertEquals([1, 2, 3], c.childArgs);
49})();
50
51
52(function testConstructSloppy() {
53  class Base {
54    constructor(...args) {
55      this.baseArgs = args;
56    }
57    method() { return this.baseArgs; }
58  }
59
60  class Child extends Base {
61    constructor(...args) {
62      super(...args);
63      this.childArgs = args;
64    }
65  }
66
67  class Child2 extends Base {
68    constructor(...args) {
69      super("extra", ...args);
70      this.childArgs = args;
71    }
72  }
73
74  var c = new Base(...[1, 2, 3]);
75  assertInstanceof(c, Base);
76  assertEquals([1, 2, 3], c.method());
77  assertEquals([1, 2, 3], c.baseArgs);
78
79  c = new Child(...[1, 2, 3]);
80  assertInstanceof(c, Child);
81  assertInstanceof(c, Base);
82  assertEquals([1, 2, 3], c.method());
83  assertEquals([1, 2, 3], c.baseArgs);
84  assertEquals([1, 2, 3], c.childArgs);
85
86  c = new Child2(...[1, 2, 3]);
87  assertInstanceof(c, Child2);
88  assertInstanceof(c, Base);
89  assertEquals(["extra", 1, 2, 3], c.method());
90  assertEquals(["extra", 1, 2, 3], c.baseArgs);
91  assertEquals([1, 2, 3], c.childArgs);
92})();
93