7d3b442aee60481fc5dfe6f96cfdefc4c1c0076c
[WebKit.git] / LayoutTests / js / script-tests / class-syntax-declaration.js
1
2 description('Tests for ES6 class syntax declarations');
3
4 var constructorCallCount = 0;
5 var staticMethodValue = [1];
6 var instanceMethodValue = [2];
7 var getterValue = [3];
8 var setterValue = undefined;
9 class A {
10     constructor() { constructorCallCount++; }
11     static someStaticMethod() { return staticMethodValue; }
12     static get someStaticGetter() { return getterValue; }
13     static set someStaticSetter(value) { setterValue = value; }
14     someInstanceMethod() { return instanceMethodValue; }
15     get someGetter() { return getterValue; }
16     set someSetter(value) { setterValue = value; }
17 }
18
19 shouldBe("constructorCallCount", "0");
20 shouldBe("A.someStaticMethod()", "staticMethodValue");
21 shouldBe("A.someStaticGetter", "getterValue");
22 shouldBe("setterValue = undefined; A.someStaticSetter = 123; setterValue", "123");
23 shouldBe("(new A).someInstanceMethod()", "instanceMethodValue");
24 shouldBe("constructorCallCount", "1");
25 shouldBe("(new A).someGetter", "getterValue");
26 shouldBe("constructorCallCount", "2");
27 shouldBe("(new A).someGetter", "getterValue");
28 shouldBe("setterValue = undefined; (new A).someSetter = 789; setterValue", "789");
29 shouldBe("(new A).__proto__", "A.prototype");
30 shouldBe("A.prototype.constructor", "A");
31
32 shouldThrow("class", "'SyntaxError: Unexpected end of script'");
33 shouldThrow("class [", "'SyntaxError: Unexpected token \\'[\\''");
34 shouldThrow("class {", "'SyntaxError: Class statements must have a name.'");
35 shouldThrow("class X {", "'SyntaxError: Unexpected end of script'");
36 shouldThrow("class X { ( }", "'SyntaxError: Unexpected token \\'(\\''");
37 shouldNotThrow("class X {}");
38
39 shouldThrow("class X { constructor() {} constructor() {} }", "'SyntaxError: Cannot declare multiple constructors in a single class.'");
40 shouldThrow("class X { get constructor() {} }", "'SyntaxError: Cannot declare a getter or setter named \\'constructor\\'.'");
41 shouldThrow("class X { set constructor() {} }", "'SyntaxError: Cannot declare a getter or setter named \\'constructor\\'.'");
42 shouldNotThrow("class X { constructor() {} static constructor() { return staticMethodValue; } }");
43 shouldBe("class X { constructor() {} static constructor() { return staticMethodValue; } }; X.constructor()", "staticMethodValue");
44
45 shouldThrow("class X { constructor() {} static prototype() {} }", "'SyntaxError: Cannot declare a static method named \\'prototype\\'.'");
46 shouldThrow("class X { constructor() {} static get prototype() {} }", "'SyntaxError: Cannot declare a static method named \\'prototype\\'.'");
47 shouldThrow("class X { constructor() {} static set prototype() {} }", "'SyntaxError: Cannot declare a static method named \\'prototype\\'.'");
48 shouldNotThrow("class X { constructor() {} prototype() { return instanceMethodValue; } }");
49 shouldBe("class X { constructor() {} prototype() { return instanceMethodValue; } }; (new X).prototype()", "instanceMethodValue");
50
51 shouldNotThrow("class X { constructor() {} set foo(a) {} }");
52 shouldNotThrow("class X { constructor() {} set foo({x, y}) {} }");
53 shouldThrow("class X { constructor() {} set foo() {} }");
54 shouldThrow("class X { constructor() {} set foo(a, b) {} }");
55 shouldNotThrow("class X { constructor() {} get foo() {} }");
56 shouldThrow("class X { constructor() {} get foo(x) {} }");
57 shouldThrow("class X { constructor() {} get foo({x, y}) {} }");
58
59 var successfullyParsed = true;