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