blob: 3c9aed7441e359838a22667f368ffc5c9831efca [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 declarations');
27
28var constructorCallCount = 0;
29const staticMethodValue = [1];
30const instanceMethodValue = [2];
31const getterValue = [3];
32var setterValue = undefined;
33class A {
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("class", "'SyntaxError: Unexpected end of input'");
57shouldThrow("class [", "'SyntaxError: Unexpected token ['");
58shouldThrow("class {", "'SyntaxError: Unexpected token {'");
59shouldThrow("class X {", "'SyntaxError: Unexpected end of input'");
60shouldThrow("class X { ( }", "'SyntaxError: Unexpected token ('");
61shouldNotThrow("class X {}");
62
63shouldThrow("class X { constructor() {} constructor() {} }", "'SyntaxError: A class may only have one constructor'");
64shouldThrow("class X { get constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
65shouldThrow("class X { set constructor() {} }", "'SyntaxError: Class constructor may not be an accessor'");
66shouldNotThrow("class X { constructor() {} static constructor() { return staticMethodValue; } }");
67shouldBe("class X { constructor() {} static constructor() { return staticMethodValue; } }; X.constructor()", "staticMethodValue");
68
69shouldThrow("class X { constructor() {} static prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
70shouldThrow("class X { constructor() {} static get prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
71shouldThrow("class X { constructor() {} static set prototype() {} }", "'SyntaxError: Classes may not have static property named prototype'");
72shouldNotThrow("class X { constructor() {} prototype() { return instanceMethodValue; } }");
73shouldBe("class X { constructor() {} prototype() { return instanceMethodValue; } }; (new X).prototype()", "instanceMethodValue");
74
75shouldNotThrow("class X { constructor() {} set foo(a) {} }");
76shouldNotThrow("class X { constructor() {} set foo({x, y}) {} }");
77shouldThrow("class X { constructor() {} set foo() {} }");
78shouldThrow("class X { constructor() {} set foo(a, b) {} }");
79shouldNotThrow("class X { constructor() {} get foo() {} }");
80shouldThrow("class X { constructor() {} get foo(x) {} }");
81shouldThrow("class X { constructor() {} get foo({x, y}) {} }");
82
83var successfullyParsed = true;