blob: ab6dc0e49e4412a06b007306636f5303245f2fe6 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1. Redistributions of source code must retain the above copyright
8// notice, this list of conditions and the following disclaimer.
9// 2. Redistributions in binary form must reproduce the above copyright
10// notice, this list of conditions and the following disclaimer in the
11// documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000024description('Tests for ES6 class syntax expressions');
25
26var constructorCallCount = 0;
27const staticMethodValue = [1];
28const instanceMethodValue = [2];
29const getterValue = [3];
30var setterValue = undefined;
31var A = class {
32 constructor() { constructorCallCount++; }
33 static someStaticMethod() { return staticMethodValue; }
34 static get someStaticGetter() { return getterValue; }
35 static set someStaticSetter(value) { setterValue = value; }
36 someInstanceMethod() { return instanceMethodValue; }
37 get someGetter() { return getterValue; }
38 set someSetter(value) { setterValue = value; }
39};
40
41shouldBe("constructorCallCount", "0");
42shouldBe("A.someStaticMethod()", "staticMethodValue");
43shouldBe("A.someStaticGetter", "getterValue");
44shouldBe("setterValue = undefined; A.someStaticSetter = 123; setterValue", "123");
45shouldBe("(new A).someInstanceMethod()", "instanceMethodValue");
46shouldBe("constructorCallCount", "1");
47shouldBe("(new A).someGetter", "getterValue");
48shouldBe("constructorCallCount", "2");
49shouldBe("(new A).someGetter", "getterValue");
50shouldBe("setterValue = undefined; (new A).someSetter = 789; setterValue", "789");
51shouldBe("(new A).__proto__", "A.prototype");
52shouldBe("A.prototype.constructor", "A");
53
54shouldThrow("x = class", "'SyntaxError: Unexpected end of input'");
55shouldThrow("x = class {", "'SyntaxError: Unexpected end of input'");
56shouldThrow("x = class { ( }", "'SyntaxError: Unexpected token ('");
57shouldNotThrow("x = class {}");
58
59shouldThrow("x = class { constructor() {} constructor() {} }", "'SyntaxError: A class may only have one constructor'");
60shouldThrow("x = class { get constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
61shouldThrow("x = class { set constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
62shouldNotThrow("x = class { constructor() {} static constructor() { return staticMethodValue; } }");
63shouldBe("x = class { constructor() {} static constructor() { return staticMethodValue; } }; x.constructor()", "staticMethodValue");
64
65shouldThrow("x = class { constructor() {} static prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
66shouldThrow("x = class { constructor() {} static get prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
67shouldThrow("x = class { constructor() {} static set prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
68shouldNotThrow("x = class { constructor() {} prototype() { return instanceMethodValue; } }");
69shouldBe("x = class { constructor() {} prototype() { return instanceMethodValue; } }; (new x).prototype()", "instanceMethodValue");
70
71shouldNotThrow("x = class { constructor() {} set foo(a) {} }");
72shouldNotThrow("x = class { constructor() {} set foo({x, y}) {} }");
73shouldThrow("x = class { constructor() {} set foo() {} }");
74shouldThrow("x = class { constructor() {} set foo(a, b) {} }");
75shouldNotThrow("x = class { constructor() {} get foo() {} }");
76shouldThrow("x = class { constructor() {} get foo(x) {} }");
77shouldThrow("x = class { constructor() {} get foo({x, y}) {} }");
78
79var successfullyParsed = true;