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{
18425bb815Sopenharmony_ci  try
19425bb815Sopenharmony_ci  {
20425bb815Sopenharmony_ci    eval ("switch (1) { default: " + str + "}");
21425bb815Sopenharmony_ci    assert (false);
22425bb815Sopenharmony_ci  }
23425bb815Sopenharmony_ci  catch (e)
24425bb815Sopenharmony_ci  {
25425bb815Sopenharmony_ci  }
26425bb815Sopenharmony_ci
27425bb815Sopenharmony_ci  try
28425bb815Sopenharmony_ci  {
29425bb815Sopenharmony_ci    eval (str);
30425bb815Sopenharmony_ci    assert (false);
31425bb815Sopenharmony_ci  }
32425bb815Sopenharmony_ci  catch (e)
33425bb815Sopenharmony_ci  {
34425bb815Sopenharmony_ci  }
35425bb815Sopenharmony_ci}
36425bb815Sopenharmony_ci
37425bb815Sopenharmony_cifunction must_throw_strict (str)
38425bb815Sopenharmony_ci{
39425bb815Sopenharmony_ci  try
40425bb815Sopenharmony_ci  {
41425bb815Sopenharmony_ci    eval ("'use strict'; switch (1) { default: " + str + "}");
42425bb815Sopenharmony_ci    assert (false);
43425bb815Sopenharmony_ci  }
44425bb815Sopenharmony_ci  catch (e)
45425bb815Sopenharmony_ci  {
46425bb815Sopenharmony_ci  }
47425bb815Sopenharmony_ci
48425bb815Sopenharmony_ci  try
49425bb815Sopenharmony_ci  {
50425bb815Sopenharmony_ci    eval ("'use strict'; " + str);
51425bb815Sopenharmony_ci    assert (false);
52425bb815Sopenharmony_ci  }
53425bb815Sopenharmony_ci  catch (e)
54425bb815Sopenharmony_ci  {
55425bb815Sopenharmony_ci  }
56425bb815Sopenharmony_ci}
57425bb815Sopenharmony_ci
58425bb815Sopenharmony_ciswitch (1)
59425bb815Sopenharmony_ci{
60425bb815Sopenharmony_cidefault:
61425bb815Sopenharmony_ci
62425bb815Sopenharmony_ci  var func = x => { return x + 3 }
63425bb815Sopenharmony_ci  assert (func(5) == 8);
64425bb815Sopenharmony_ci
65425bb815Sopenharmony_ci  a => 5 /* no semicolon after */
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_ci  assert (((x =>
68425bb815Sopenharmony_ci    x + 1))(4) == 5)
69425bb815Sopenharmony_ci
70425bb815Sopenharmony_ci  assert ((a => a += 3, b => b -= 3)(4) == 1);
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_ci  func = true ? x=>x+2:y=>y-2
73425bb815Sopenharmony_ci  assert (func(10) == 12);
74425bb815Sopenharmony_ci
75425bb815Sopenharmony_ci  func = arguments =>
76425bb815Sopenharmony_ci    { return arguments + 4; }
77425bb815Sopenharmony_ci  assert (func(2) == 6);
78425bb815Sopenharmony_ci
79425bb815Sopenharmony_ci  func = (
80425bb815Sopenharmony_ci          ) => { return typeof
81425bb815Sopenharmony_ci    arguments
82425bb815Sopenharmony_ci  }
83425bb815Sopenharmony_ci  assert (func() === "undefined");
84425bb815Sopenharmony_ci
85425bb815Sopenharmony_ci  if (a => 0)
86425bb815Sopenharmony_ci  {
87425bb815Sopenharmony_ci  }
88425bb815Sopenharmony_ci  else
89425bb815Sopenharmony_ci  {
90425bb815Sopenharmony_ci    assert (false);
91425bb815Sopenharmony_ci  }
92425bb815Sopenharmony_ci
93425bb815Sopenharmony_ci  assert ((
94425bb815Sopenharmony_ci    (
95425bb815Sopenharmony_ci    static
96425bb815Sopenharmony_ci    ,
97425bb815Sopenharmony_ci    package
98425bb815Sopenharmony_ci    ) => static + package
99425bb815Sopenharmony_ci  ) (2, 12) == 14);
100425bb815Sopenharmony_ci
101425bb815Sopenharmony_ci  var global_var = 7;
102425bb815Sopenharmony_ci
103425bb815Sopenharmony_ci  assert ((
104425bb815Sopenharmony_ci    (
105425bb815Sopenharmony_ci    static
106425bb815Sopenharmony_ci    ,
107425bb815Sopenharmony_ci    package
108425bb815Sopenharmony_ci    ) => { global_var = 5; return static + package }
109425bb815Sopenharmony_ci  )(4, 5) == 9);
110425bb815Sopenharmony_ci
111425bb815Sopenharmony_ci  assert (global_var == 5);
112425bb815Sopenharmony_ci
113425bb815Sopenharmony_ci  func = (x , y) => {}
114425bb815Sopenharmony_ci  assert (func() === undefined)
115425bb815Sopenharmony_ci
116425bb815Sopenharmony_ci  assert ((x => y => z => 6)()()() == 6)
117425bb815Sopenharmony_ci
118425bb815Sopenharmony_ci  func = x => x - 6
119425bb815Sopenharmony_ci  var func2 = y => func(y)
120425bb815Sopenharmony_ci  assert (func2 (17) == 11)
121425bb815Sopenharmony_ci
122425bb815Sopenharmony_ci  func = (m) => m++
123425bb815Sopenharmony_ci  assert (func (4) == 4)
124425bb815Sopenharmony_ci
125425bb815Sopenharmony_ci  func = () =>
126425bb815Sopenharmony_ci    ((([0,0,0])))
127425bb815Sopenharmony_ci  assert (func ().length == 3);
128425bb815Sopenharmony_ci
129425bb815Sopenharmony_ci  func = (a = 5, b = 7 * 2) => a + b;
130425bb815Sopenharmony_ci  assert (func() == 19);
131425bb815Sopenharmony_ci  assert (func(1) == 15);
132425bb815Sopenharmony_ci
133425bb815Sopenharmony_ci  func = (a = Math.cos(0)) => a;
134425bb815Sopenharmony_ci  assert (func() == 1);
135425bb815Sopenharmony_ci}
136425bb815Sopenharmony_ci
137425bb815Sopenharmony_cimust_throw ("var x => x;");
138425bb815Sopenharmony_cimust_throw ("(()) => 0");
139425bb815Sopenharmony_cimust_throw ("((x)) => 0");
140425bb815Sopenharmony_cimust_throw ("(((x))) => 0");
141425bb815Sopenharmony_cimust_throw ("(x,) => 0");
142425bb815Sopenharmony_cimust_throw ("(x==6) => 0");
143425bb815Sopenharmony_cimust_throw ("(x y) => 0");
144425bb815Sopenharmony_cimust_throw ("(x,y,) => 0");
145425bb815Sopenharmony_cimust_throw ("x\n => 0");
146425bb815Sopenharmony_cimust_throw ("this => 0");
147425bb815Sopenharmony_cimust_throw ("(true) => 0");
148425bb815Sopenharmony_cimust_throw ("()\n=>5");
149425bb815Sopenharmony_cimust_throw ("3 + x => 3");
150425bb815Sopenharmony_cimust_throw ("3 || x => 3");
151425bb815Sopenharmony_cimust_throw ("a = 3 || (x,y) => 3");
152425bb815Sopenharmony_cimust_throw ("x => {} (4)");
153425bb815Sopenharmony_cimust_throw ("!x => 4");
154425bb815Sopenharmony_cimust_throw ("x => {} = 1");
155425bb815Sopenharmony_cimust_throw ("x => {} a = 1");
156425bb815Sopenharmony_cimust_throw ("x => {} ? 1 : 0");
157425bb815Sopenharmony_cimust_throw ("(x,x,x) => 0");
158425bb815Sopenharmony_cimust_throw ("(x,x,x) => { }");
159425bb815Sopenharmony_cimust_throw_strict ("(package) => 0");
160425bb815Sopenharmony_cimust_throw_strict ("(package) => { return 5 }");
161425bb815Sopenharmony_cimust_throw_strict ("(x,x,x) => 0");
162425bb815Sopenharmony_cimust_throw_strict ("(x,x,x) => { }");
163425bb815Sopenharmony_ci
164425bb815Sopenharmony_civar f = (a) => 1;
165425bb815Sopenharmony_ciassert(f() === 1);
166425bb815Sopenharmony_ci
167425bb815Sopenharmony_civar f = (a => 2);
168425bb815Sopenharmony_ciassert(f() === 2);
169425bb815Sopenharmony_ci
170425bb815Sopenharmony_civar f = ((((a => ((3))))));
171425bb815Sopenharmony_ciassert(f() === 3);
172425bb815Sopenharmony_ci
173425bb815Sopenharmony_civar f = (((a) => 4));
174425bb815Sopenharmony_ciassert(f() === 4);
175425bb815Sopenharmony_ci
176425bb815Sopenharmony_civar f = (a,b) => 5;
177425bb815Sopenharmony_ciassert(f() === 5);
178425bb815Sopenharmony_ci
179425bb815Sopenharmony_civar f = (((a,b) => 6));
180425bb815Sopenharmony_ciassert(f() === 6);
181425bb815Sopenharmony_ci
182425bb815Sopenharmony_civar f = ((a,b) => x => (a) => 7);
183425bb815Sopenharmony_ciassert(f()()() === 7);
184425bb815Sopenharmony_ci
185425bb815Sopenharmony_civar f = (((a=1,b=2) => ((x => (((a) => 8))))));
186425bb815Sopenharmony_ciassert(f()()() === 8);
187