blob: 3272b81f7e339aa6b0711f32dfcad4a04aafc0fa [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 Murdochda12d292016-06-02 14:46:10 +010024// Flags: --harmony-sloppy
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025
26description('Tests for ES6 class syntax expressions');
27
28var constructorCallCount = 0;
29const staticMethodValue = [1];
30const instanceMethodValue = [2];
31const getterValue = [3];
32var setterValue = undefined;
33var A = class {
34 constructor() { constructorCallCount++; }
35 static someStaticMethod() { return staticMethodValue; }
36 static get someStaticGetter() { return getterValue; }
37 static set someStaticSetter(value) { setterValue = value; }
38 someInstanceMethod() { return instanceMethodValue; }
39 get someGetter() { return getterValue; }
40 set someSetter(value) { setterValue = value; }
41};
42
43shouldBe("constructorCallCount", "0");
44shouldBe("A.someStaticMethod()", "staticMethodValue");
45shouldBe("A.someStaticGetter", "getterValue");
46shouldBe("setterValue = undefined; A.someStaticSetter = 123; setterValue", "123");
47shouldBe("(new A).someInstanceMethod()", "instanceMethodValue");
48shouldBe("constructorCallCount", "1");
49shouldBe("(new A).someGetter", "getterValue");
50shouldBe("constructorCallCount", "2");
51shouldBe("(new A).someGetter", "getterValue");
52shouldBe("setterValue = undefined; (new A).someSetter = 789; setterValue", "789");
53shouldBe("(new A).__proto__", "A.prototype");
54shouldBe("A.prototype.constructor", "A");
55
56shouldThrow("x = class", "'SyntaxError: Unexpected end of input'");
57shouldThrow("x = class {", "'SyntaxError: Unexpected end of input'");
58shouldThrow("x = class { ( }", "'SyntaxError: Unexpected token ('");
59shouldNotThrow("x = class {}");
60
61shouldThrow("x = class { constructor() {} constructor() {} }", "'SyntaxError: A class may only have one constructor'");
62shouldThrow("x = class { get constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
63shouldThrow("x = class { set constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
64shouldNotThrow("x = class { constructor() {} static constructor() { return staticMethodValue; } }");
65shouldBe("x = class { constructor() {} static constructor() { return staticMethodValue; } }; x.constructor()", "staticMethodValue");
66
67shouldThrow("x = class { constructor() {} static prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
68shouldThrow("x = class { constructor() {} static get prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
69shouldThrow("x = class { constructor() {} static set prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
70shouldNotThrow("x = class { constructor() {} prototype() { return instanceMethodValue; } }");
71shouldBe("x = class { constructor() {} prototype() { return instanceMethodValue; } }; (new x).prototype()", "instanceMethodValue");
72
73shouldNotThrow("x = class { constructor() {} set foo(a) {} }");
74shouldNotThrow("x = class { constructor() {} set foo({x, y}) {} }");
75shouldThrow("x = class { constructor() {} set foo() {} }");
76shouldThrow("x = class { constructor() {} set foo(a, b) {} }");
77shouldNotThrow("x = class { constructor() {} get foo() {} }");
78shouldThrow("x = class { constructor() {} get foo(x) {} }");
79shouldThrow("x = class { constructor() {} get foo({x, y}) {} }");
80
81var successfullyParsed = true;