// 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 testNonConstructorStrict() {
  "use strict";
  assertThrows(function() {
    return new Math.cos(...[1,2,3]);
  }, TypeError);

  assertThrows(function() {
    var CallNull = null;
    return new CallNull(...[1,2,3]);
  }, TypeError);
})();


(function testNonConstructorSloppy() {
  assertThrows(function() {
    return new Math.cos(...[1,2,3]);
  }, TypeError);

  assertThrows(function() {
    var CallNull = null;
    return new CallNull(...[1,2,3]);
  }, TypeError);
})();


(function testConstructStrict() {
  "use strict";
  function TestClass(a, b, c) {
    this.wasCalled = true;
    this.args = [a, b, c];
  }
  TestClass.prototype.method = function() {
    return this.args;
  }

  assertInstanceof(new TestClass(...[1, 2, 3]), TestClass);
  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).method());
  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).args);
  assertTrue((new TestClass(...[1, 2, 3])).wasCalled);
})();


(function testConstructSloppy() {
  function TestClass(a, b, c) {
    this.wasCalled = true;
    this.args = [a, b, c];
  }
  TestClass.prototype.method = function() {
    return this.args;
  }

  assertInstanceof(new TestClass(...[1, 2, 3]), TestClass);
  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).method());
  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).args);
  assertTrue((new TestClass(...[1, 2, 3])).wasCalled);
})();