1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_cifunction must_throw(str) {
17425bb815Sopenharmony_ci  try {
18425bb815Sopenharmony_ci    eval("switch (1) { default: " + str + "}");
19425bb815Sopenharmony_ci    assert(false);
20425bb815Sopenharmony_ci  } catch (e) {
21425bb815Sopenharmony_ci  }
22425bb815Sopenharmony_ci
23425bb815Sopenharmony_ci  try {
24425bb815Sopenharmony_ci    eval(str);
25425bb815Sopenharmony_ci    assert(false);
26425bb815Sopenharmony_ci  }
27425bb815Sopenharmony_ci  catch (e) {
28425bb815Sopenharmony_ci  }
29425bb815Sopenharmony_ci
30425bb815Sopenharmony_ci  must_throw_strict(str);
31425bb815Sopenharmony_ci}
32425bb815Sopenharmony_ci
33425bb815Sopenharmony_cifunction must_throw_strict(str) {
34425bb815Sopenharmony_ci  try {
35425bb815Sopenharmony_ci    eval ("'use strict'; switch (1) { default: " + str + "}");
36425bb815Sopenharmony_ci    assert (false);
37425bb815Sopenharmony_ci  } catch (e) {
38425bb815Sopenharmony_ci  }
39425bb815Sopenharmony_ci
40425bb815Sopenharmony_ci  try {
41425bb815Sopenharmony_ci    eval("'use strict'; " + str);
42425bb815Sopenharmony_ci    assert(false);
43425bb815Sopenharmony_ci  } catch (e) {
44425bb815Sopenharmony_ci  }
45425bb815Sopenharmony_ci}
46425bb815Sopenharmony_ci
47425bb815Sopenharmony_cimust_throw("class {}");
48425bb815Sopenharmony_cimust_throw("class class {}");
49425bb815Sopenharmony_cimust_throw("class A { constructor() {} this.a = 5 }");
50425bb815Sopenharmony_cimust_throw("class A { constructor() {} constructor() {} }");
51425bb815Sopenharmony_cimust_throw("class A { static prototype() {} }");
52425bb815Sopenharmony_cimust_throw("class A { get constructor() {} }");
53425bb815Sopenharmony_cimust_throw("class A { set constructor() {} }");
54425bb815Sopenharmony_cimust_throw("class A {}; A()");
55425bb815Sopenharmony_cimust_throw("class X {}; var o = {}; Object.defineProperty(o, 'p', { get: X, set: X }); o.p;");
56425bb815Sopenharmony_cimust_throw("var a = new A; class A {};");
57425bb815Sopenharmony_cimust_throw("class A { g\\u0065t e() {} }");
58425bb815Sopenharmony_cimust_throw('class A { "static" e() {} }');
59425bb815Sopenharmony_cimust_throw('class A { *constructor() {} }');
60425bb815Sopenharmony_ci
61425bb815Sopenharmony_ciassert(eval("class A {}") === undefined);
62425bb815Sopenharmony_ciassert(eval("var a = class A {}") === undefined);
63425bb815Sopenharmony_ciassert(eval("var a = class {}") === undefined);
64425bb815Sopenharmony_ciassert(eval("class A { ; ; ; ;;;;;;;;;;;; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;; }") === undefined);
65425bb815Sopenharmony_ciassert(eval('class A {"constructor"() {} }') === undefined);
66425bb815Sopenharmony_ciassert(isNaN (eval('switch(1) { default: (class A{} % 1) }')));
67425bb815Sopenharmony_ci
68425bb815Sopenharmony_ciclass A1 {
69425bb815Sopenharmony_ci  ["constructor"]() {
70425bb815Sopenharmony_ci    return 5;
71425bb815Sopenharmony_ci  }
72425bb815Sopenharmony_ci}
73425bb815Sopenharmony_ci
74425bb815Sopenharmony_ciassert ((new A1).constructor() === 5);
75425bb815Sopenharmony_ci
76425bb815Sopenharmony_ciclass A2 {
77425bb815Sopenharmony_ci  *["constructor"]() {
78425bb815Sopenharmony_ci    yield 5;
79425bb815Sopenharmony_ci  }
80425bb815Sopenharmony_ci}
81425bb815Sopenharmony_ci
82425bb815Sopenharmony_ciassert ((new A2).constructor().next().value === 5);
83425bb815Sopenharmony_ci
84425bb815Sopenharmony_ciclass B {
85425bb815Sopenharmony_ci}
86425bb815Sopenharmony_ci
87425bb815Sopenharmony_civar b = new B;
88425bb815Sopenharmony_ciassert (typeof B  === "function");
89425bb815Sopenharmony_ciassert (typeof b === "object");
90425bb815Sopenharmony_ciassert (b.constructor === B);
91425bb815Sopenharmony_ci
92425bb815Sopenharmony_ciclass C {
93425bb815Sopenharmony_ci  c1() {
94425bb815Sopenharmony_ci    return 5;
95425bb815Sopenharmony_ci  }
96425bb815Sopenharmony_ci
97425bb815Sopenharmony_ci  c2() {
98425bb815Sopenharmony_ci    return this._c;
99425bb815Sopenharmony_ci  }
100425bb815Sopenharmony_ci  3() {
101425bb815Sopenharmony_ci    return 3;
102425bb815Sopenharmony_ci  }
103425bb815Sopenharmony_ci
104425bb815Sopenharmony_ci  super() {
105425bb815Sopenharmony_ci    return 42;
106425bb815Sopenharmony_ci  }
107425bb815Sopenharmony_ci  return() {
108425bb815Sopenharmony_ci    return 43;
109425bb815Sopenharmony_ci  }
110425bb815Sopenharmony_ci
111425bb815Sopenharmony_ci  static *constructor() {
112425bb815Sopenharmony_ci    return 44;
113425bb815Sopenharmony_ci  }
114425bb815Sopenharmony_ci}
115425bb815Sopenharmony_ci
116425bb815Sopenharmony_civar c = new C;
117425bb815Sopenharmony_ciassert (c.c1() === 5);
118425bb815Sopenharmony_ciassert (c.c2() === undefined);
119425bb815Sopenharmony_ciassert (c["3"]() === 3);
120425bb815Sopenharmony_ciassert (c.super() === 42);
121425bb815Sopenharmony_ciassert (c.return() === 43);
122425bb815Sopenharmony_ciassert (c.constructor === C);
123425bb815Sopenharmony_ciassert (C.constructor().next().value === 44);
124425bb815Sopenharmony_ci
125425bb815Sopenharmony_ciclass D {
126425bb815Sopenharmony_ci  constructor(d) {
127425bb815Sopenharmony_ci    this._d = d;
128425bb815Sopenharmony_ci  }
129425bb815Sopenharmony_ci
130425bb815Sopenharmony_ci  d1() {
131425bb815Sopenharmony_ci    return this._d;
132425bb815Sopenharmony_ci  }
133425bb815Sopenharmony_ci}
134425bb815Sopenharmony_civar d = new D(5);
135425bb815Sopenharmony_ciassert (d.d1() === 5);
136425bb815Sopenharmony_ciassert (d.constructor === D);
137425bb815Sopenharmony_ci
138425bb815Sopenharmony_ciclass E {
139425bb815Sopenharmony_ci  constructor(e) {
140425bb815Sopenharmony_ci    this._e = e;
141425bb815Sopenharmony_ci  }
142425bb815Sopenharmony_ci
143425bb815Sopenharmony_ci  get e() {
144425bb815Sopenharmony_ci    return this._e;
145425bb815Sopenharmony_ci  }
146425bb815Sopenharmony_ci
147425bb815Sopenharmony_ci  set e(e) {
148425bb815Sopenharmony_ci    this._e = e;
149425bb815Sopenharmony_ci  }
150425bb815Sopenharmony_ci
151425bb815Sopenharmony_ci  get () {
152425bb815Sopenharmony_ci    return 11;
153425bb815Sopenharmony_ci  }
154425bb815Sopenharmony_ci
155425bb815Sopenharmony_ci  set () {
156425bb815Sopenharmony_ci    return 12;
157425bb815Sopenharmony_ci  }
158425bb815Sopenharmony_ci}
159425bb815Sopenharmony_civar e = new E (5);
160425bb815Sopenharmony_ciassert (e.e === 5);
161425bb815Sopenharmony_cie.e = 10;
162425bb815Sopenharmony_ciassert (e.e === 10);
163425bb815Sopenharmony_ciassert (e.get() === 11);
164425bb815Sopenharmony_ciassert (e.set() === 12);
165425bb815Sopenharmony_ciassert (e.constructor === E);
166425bb815Sopenharmony_ci
167425bb815Sopenharmony_civar F = class ClassF {
168425bb815Sopenharmony_ci  constructor(f) {
169425bb815Sopenharmony_ci    this._f = f;
170425bb815Sopenharmony_ci  }
171425bb815Sopenharmony_ci
172425bb815Sopenharmony_ci  static f1() {
173425bb815Sopenharmony_ci    return this;
174425bb815Sopenharmony_ci  }
175425bb815Sopenharmony_ci
176425bb815Sopenharmony_ci  static f2() {
177425bb815Sopenharmony_ci    return this._f;
178425bb815Sopenharmony_ci  }
179425bb815Sopenharmony_ci
180425bb815Sopenharmony_ci  static f3(a, b) {
181425bb815Sopenharmony_ci    return a + b;
182425bb815Sopenharmony_ci  }
183425bb815Sopenharmony_ci
184425bb815Sopenharmony_ci  static constructor(a) {
185425bb815Sopenharmony_ci    return a;
186425bb815Sopenharmony_ci  }
187425bb815Sopenharmony_ci
188425bb815Sopenharmony_ci  static static(a) {
189425bb815Sopenharmony_ci    return a;
190425bb815Sopenharmony_ci  }
191425bb815Sopenharmony_ci
192425bb815Sopenharmony_ci  static 2 (a) {
193425bb815Sopenharmony_ci    return 2 * a;
194425bb815Sopenharmony_ci  }
195425bb815Sopenharmony_ci
196425bb815Sopenharmony_ci  static function(a) {
197425bb815Sopenharmony_ci    return 3 * a;
198425bb815Sopenharmony_ci  }
199425bb815Sopenharmony_ci}
200425bb815Sopenharmony_ci
201425bb815Sopenharmony_civar f = new F(5);
202425bb815Sopenharmony_ci
203425bb815Sopenharmony_ciassert (f.f1 === undefined);
204425bb815Sopenharmony_ciassert (f.f2 === undefined);
205425bb815Sopenharmony_ciassert (F.f1() === F);
206425bb815Sopenharmony_ciassert (F.f2() === undefined);
207425bb815Sopenharmony_ciassert (F.f3(1, 1) === 2);
208425bb815Sopenharmony_ciassert (F.constructor(5) === 5);
209425bb815Sopenharmony_ciassert (F.static(5) === 5);
210425bb815Sopenharmony_ciassert (F["2"](5) === 10);
211425bb815Sopenharmony_ciassert (F.function(5) === 15);
212425bb815Sopenharmony_ciassert (f.constructor === F);
213425bb815Sopenharmony_ci
214425bb815Sopenharmony_civar G = class {
215425bb815Sopenharmony_ci  static set a(a) {
216425bb815Sopenharmony_ci    this._a = a;
217425bb815Sopenharmony_ci  }
218425bb815Sopenharmony_ci  static get a() {
219425bb815Sopenharmony_ci    return this._a;
220425bb815Sopenharmony_ci  }
221425bb815Sopenharmony_ci  static set 1(a) {
222425bb815Sopenharmony_ci    this._a = a;
223425bb815Sopenharmony_ci  }
224425bb815Sopenharmony_ci  static get 1() {
225425bb815Sopenharmony_ci    return this._a;
226425bb815Sopenharmony_ci  }
227425bb815Sopenharmony_ci
228425bb815Sopenharmony_ci  static get() {
229425bb815Sopenharmony_ci    return 11;
230425bb815Sopenharmony_ci  }
231425bb815Sopenharmony_ci
232425bb815Sopenharmony_ci  static set() {
233425bb815Sopenharmony_ci    return 12;
234425bb815Sopenharmony_ci  }
235425bb815Sopenharmony_ci
236425bb815Sopenharmony_ci  static set constructor(a) {
237425bb815Sopenharmony_ci    this._a = a;
238425bb815Sopenharmony_ci  }
239425bb815Sopenharmony_ci  static get constructor() {
240425bb815Sopenharmony_ci    return this._a;
241425bb815Sopenharmony_ci  }
242425bb815Sopenharmony_ci
243425bb815Sopenharmony_ci  static g1() {
244425bb815Sopenharmony_ci    return 5;
245425bb815Sopenharmony_ci  }
246425bb815Sopenharmony_ci
247425bb815Sopenharmony_ci  static g1() {
248425bb815Sopenharmony_ci    return 10;
249425bb815Sopenharmony_ci  }
250425bb815Sopenharmony_ci}
251425bb815Sopenharmony_ci
252425bb815Sopenharmony_ciG.a = 10;
253425bb815Sopenharmony_ciassert (G.a === 10);
254425bb815Sopenharmony_ciassert (G.g1() === 10);
255425bb815Sopenharmony_ciG["1"] = 20;
256425bb815Sopenharmony_ciassert (G["1"] === 20);
257425bb815Sopenharmony_ciassert (G.get() == 11);
258425bb815Sopenharmony_ciassert (G.set() == 12);
259425bb815Sopenharmony_ciG.constructor = 30;
260425bb815Sopenharmony_ciassert (G.constructor === 30);
261425bb815Sopenharmony_ci
262425bb815Sopenharmony_ciclass H {
263425bb815Sopenharmony_ci  method() { assert (typeof H === 'function'); return H; }
264425bb815Sopenharmony_ci}
265425bb815Sopenharmony_ci
266425bb815Sopenharmony_cilet H_original = H;
267425bb815Sopenharmony_civar H_method = H.prototype.method;
268425bb815Sopenharmony_ciC = undefined;
269425bb815Sopenharmony_ciassert(C === undefined);
270425bb815Sopenharmony_ciC = H_method();
271425bb815Sopenharmony_ciassert(C === H_original);
272425bb815Sopenharmony_ci
273425bb815Sopenharmony_civar I = class C {
274425bb815Sopenharmony_ci  method() { assert(typeof C === 'function'); return C; }
275425bb815Sopenharmony_ci}
276425bb815Sopenharmony_ci
277425bb815Sopenharmony_cilet I_original = I;
278425bb815Sopenharmony_civar I_method = I.prototype.method;
279425bb815Sopenharmony_ciI = undefined;
280425bb815Sopenharmony_ciassert(I === undefined);
281425bb815Sopenharmony_ciI = I_method();
282425bb815Sopenharmony_ciassert(I == I_original);
283425bb815Sopenharmony_ci
284425bb815Sopenharmony_civar J_method;
285425bb815Sopenharmony_ciclass J {
286425bb815Sopenharmony_ci  static [(J_method = eval('(function() { return J; })'), "X")]() {}
287425bb815Sopenharmony_ci}
288425bb815Sopenharmony_civar J_original = J;
289425bb815Sopenharmony_ciJ = 6;
290425bb815Sopenharmony_ciassert (J_method() == J_original);
291425bb815Sopenharmony_ci
292425bb815Sopenharmony_civar K_method;
293425bb815Sopenharmony_ciclass K {
294425bb815Sopenharmony_ci  constructor () {
295425bb815Sopenharmony_ci    K_method = function() { return K; }
296425bb815Sopenharmony_ci  }
297425bb815Sopenharmony_ci}
298425bb815Sopenharmony_civar K_original = K;
299425bb815Sopenharmony_cinew K;
300425bb815Sopenharmony_ciK = 6;
301425bb815Sopenharmony_ciassert (K_method() == K_original);
302425bb815Sopenharmony_ci
303425bb815Sopenharmony_civar L_method;
304425bb815Sopenharmony_ciclass L extends (L_method = function() { return L; }) {
305425bb815Sopenharmony_ci}
306425bb815Sopenharmony_civar L_original = L;
307425bb815Sopenharmony_ciL = 6;
308425bb815Sopenharmony_ciassert (L_method() == L_original);
309425bb815Sopenharmony_ci
310425bb815Sopenharmony_ci/* Test cleanup class environment */
311425bb815Sopenharmony_citry {
312425bb815Sopenharmony_ci  class A {
313425bb815Sopenharmony_ci    [d]() {}
314425bb815Sopenharmony_ci  }
315425bb815Sopenharmony_ci  let d;
316425bb815Sopenharmony_ci  assert(false);
317425bb815Sopenharmony_ci} catch (e) {
318425bb815Sopenharmony_ci  assert(e instanceof ReferenceError);
319425bb815Sopenharmony_ci}
320425bb815Sopenharmony_ci
321425bb815Sopenharmony_citry {
322425bb815Sopenharmony_ci  class A extends d {}
323425bb815Sopenharmony_ci  let d;
324425bb815Sopenharmony_ci  assert(false);
325425bb815Sopenharmony_ci} catch (e) {
326425bb815Sopenharmony_ci  assert(e instanceof ReferenceError);
327425bb815Sopenharmony_ci}
328425bb815Sopenharmony_citry {
329425bb815Sopenharmony_ci  var a = 1 + 2 * 3 >> class A extends d {};
330425bb815Sopenharmony_ci  let d;
331425bb815Sopenharmony_ci  assert(false);
332425bb815Sopenharmony_ci} catch (e) {
333425bb815Sopenharmony_ci  assert(e instanceof ReferenceError);
334425bb815Sopenharmony_ci}
335