1// 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 24description('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; 80