// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.1
description: >
    with new target
includes: [compareArray.js]
---*/
class Base {
  constructor(...a) {
    assert.sameValue(
      arguments.length,
      a.length,
      "The value of `arguments.length` is `a.length`"
    );
    this.base = a;
    var args = [];
    for (var i = 0; i < arguments.length; ++i) {
      args.push(arguments[i]);
    }
    assert(compareArray(args, a), "`compareArray(args, a)` returns `true`");
  }
}
class Child extends Base {
  constructor(...b) {
    super(1, 2, 3);
    assert.sameValue(
      arguments.length,
      b.length,
      "The value of `arguments.length` is `b.length`"
    );
    this.child = b;
    var args = [];
    for (var i = 0; i < arguments.length; ++i) {
      args.push(arguments[i]);
    }
    assert(compareArray(args, b), "`compareArray(args, b)` returns `true`");
  }
}

var c = new Child(1, 2, 3);

assert.sameValue(c.child.length, 3, "The value of `c.child.length` is `3`");
assert.sameValue(c.base.length, 3, "The value of `c.base.length` is `3`");

assert(
  compareArray(c.child, [1, 2, 3]),
  "`compareArray(c.child, [1, 2, 3])` returns `true`"
);
assert(
  compareArray(c.base, [1, 2, 3]),
  "`compareArray(c.base, [1, 2, 3])` returns `true`"
);
