1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function testNonConstructorStrict() {
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "use strict";
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertThrows(function() {
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new Math.cos(...[1,2,3]);
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }, TypeError);
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertThrows(function() {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    var CallNull = null;
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new CallNull(...[1,2,3]);
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }, TypeError);
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})();
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function testNonConstructorSloppy() {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertThrows(function() {
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new Math.cos(...[1,2,3]);
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }, TypeError);
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertThrows(function() {
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    var CallNull = null;
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new CallNull(...[1,2,3]);
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }, TypeError);
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})();
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function testConstructStrict() {
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "use strict";
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function TestClass(a, b, c) {
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    this.wasCalled = true;
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    this.args = [a, b, c];
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestClass.prototype.method = function() {
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return this.args;
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertInstanceof(new TestClass(...[1, 2, 3]), TestClass);
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).method());
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).args);
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertTrue((new TestClass(...[1, 2, 3])).wasCalled);
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})();
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function testConstructSloppy() {
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function TestClass(a, b, c) {
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    this.wasCalled = true;
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    this.args = [a, b, c];
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestClass.prototype.method = function() {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return this.args;
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertInstanceof(new TestClass(...[1, 2, 3]), TestClass);
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).method());
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertEquals([1, 2, 3], (new TestClass(...[1, 2, 3])).args);
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  assertTrue((new TestClass(...[1, 2, 3])).wasCalled);
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch})();
61