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_cifunction check_reference_error(code)
16425bb815Sopenharmony_ci{
17425bb815Sopenharmony_ci  try {
18425bb815Sopenharmony_ci    eval(code);
19425bb815Sopenharmony_ci    assert(false);
20425bb815Sopenharmony_ci  } catch (e) {
21425bb815Sopenharmony_ci    assert(e instanceof ReferenceError);
22425bb815Sopenharmony_ci  }
23425bb815Sopenharmony_ci}
24425bb815Sopenharmony_ci
25425bb815Sopenharmony_cifunction f1(a = a)
26425bb815Sopenharmony_ci{
27425bb815Sopenharmony_ci  assert(a === 1)
28425bb815Sopenharmony_ci}
29425bb815Sopenharmony_cif1(1)
30425bb815Sopenharmony_cicheck_reference_error("f1()");
31425bb815Sopenharmony_ci
32425bb815Sopenharmony_cifunction f2([a] = 1 + a)
33425bb815Sopenharmony_ci{
34425bb815Sopenharmony_ci  assert(a === 2)
35425bb815Sopenharmony_ci}
36425bb815Sopenharmony_cif2([2])
37425bb815Sopenharmony_cicheck_reference_error("f2()");
38425bb815Sopenharmony_ci
39425bb815Sopenharmony_cifunction f3([a = !a])
40425bb815Sopenharmony_ci{
41425bb815Sopenharmony_ci  assert(a === 2)
42425bb815Sopenharmony_ci}
43425bb815Sopenharmony_cif3([2])
44425bb815Sopenharmony_cicheck_reference_error("f3([])");
45425bb815Sopenharmony_ci
46425bb815Sopenharmony_cifunction f4([[a]] = a)
47425bb815Sopenharmony_ci{
48425bb815Sopenharmony_ci  assert(a === 3)
49425bb815Sopenharmony_ci}
50425bb815Sopenharmony_cif4([[3]])
51425bb815Sopenharmony_cicheck_reference_error("f4()");
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_cifunction f5([[a], b = a] = a)
54425bb815Sopenharmony_ci{
55425bb815Sopenharmony_ci  assert(a === 4 && b === 4)
56425bb815Sopenharmony_ci}
57425bb815Sopenharmony_cif5([[4]])
58425bb815Sopenharmony_cicheck_reference_error("f5()")
59425bb815Sopenharmony_ci
60425bb815Sopenharmony_cifunction f6(a = 3 - ((b)), b)
61425bb815Sopenharmony_ci{
62425bb815Sopenharmony_ci  assert(a === 1 && b === 2)
63425bb815Sopenharmony_ci}
64425bb815Sopenharmony_cif6(1, 2)
65425bb815Sopenharmony_cicheck_reference_error("f6(undefined, 2)");
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_cifunction f7(a = b(), [b])
68425bb815Sopenharmony_ci{
69425bb815Sopenharmony_ci  assert(a === 3 && b === 4)
70425bb815Sopenharmony_ci}
71425bb815Sopenharmony_cif7(3, [4])
72425bb815Sopenharmony_cicheck_reference_error("f7(undefined, [4])");
73425bb815Sopenharmony_ci
74425bb815Sopenharmony_cifunction f8(a = (function () { return a * 2 })())
75425bb815Sopenharmony_ci{
76425bb815Sopenharmony_ci  assert(a === 1)
77425bb815Sopenharmony_ci}
78425bb815Sopenharmony_cif8(1)
79425bb815Sopenharmony_cicheck_reference_error("f8()");
80425bb815Sopenharmony_ci
81425bb815Sopenharmony_cifunction f9({a = b, b:{b}})
82425bb815Sopenharmony_ci{
83425bb815Sopenharmony_ci  assert(a === 2 && b === 3)
84425bb815Sopenharmony_ci}
85425bb815Sopenharmony_cif9({a:2, b:{b:3}})
86425bb815Sopenharmony_cicheck_reference_error("f9({b:{b:3}})");
87425bb815Sopenharmony_ci
88425bb815Sopenharmony_cifunction f10(a = eval("a"))
89425bb815Sopenharmony_ci{
90425bb815Sopenharmony_ci  assert(a === 1)
91425bb815Sopenharmony_ci}
92425bb815Sopenharmony_cif10(1)
93425bb815Sopenharmony_cicheck_reference_error("f10()");
94425bb815Sopenharmony_ci
95425bb815Sopenharmony_cifunction f11([a] = eval("a"))
96425bb815Sopenharmony_ci{
97425bb815Sopenharmony_ci  assert(a === 2)
98425bb815Sopenharmony_ci}
99425bb815Sopenharmony_cif11([2])
100425bb815Sopenharmony_cicheck_reference_error("f11()");
101425bb815Sopenharmony_ci
102425bb815Sopenharmony_cifunction f12({a} = eval("a"))
103425bb815Sopenharmony_ci{
104425bb815Sopenharmony_ci  assert(a === 3)
105425bb815Sopenharmony_ci}
106425bb815Sopenharmony_cif12({a:3})
107425bb815Sopenharmony_cicheck_reference_error("f12()");
108425bb815Sopenharmony_ci
109425bb815Sopenharmony_cifunction f13(a = arguments)
110425bb815Sopenharmony_ci{
111425bb815Sopenharmony_ci  assert(a[0] === undefined)
112425bb815Sopenharmony_ci  assert(a[1] === 4)
113425bb815Sopenharmony_ci  arguments[0] = 5
114425bb815Sopenharmony_ci  assert(a[0] === 5)
115425bb815Sopenharmony_ci}
116425bb815Sopenharmony_cif13(undefined, 4)
117425bb815Sopenharmony_ci
118425bb815Sopenharmony_cifunction f14(a, b = function() { return a; }(), c = (() => a)())
119425bb815Sopenharmony_ci{
120425bb815Sopenharmony_ci  assert(a === 6 && b === 6 && c === 6)
121425bb815Sopenharmony_ci}
122425bb815Sopenharmony_cif14(6)
123425bb815Sopenharmony_ci
124425bb815Sopenharmony_cifunction f15(a = (() => b)(), b)
125425bb815Sopenharmony_ci{
126425bb815Sopenharmony_ci  assert(a === 1 && b === 2)
127425bb815Sopenharmony_ci}
128425bb815Sopenharmony_cif15(1, 2)
129425bb815Sopenharmony_cicheck_reference_error("f15(undefined, 2)");
130425bb815Sopenharmony_ci
131425bb815Sopenharmony_civar f16 = (a = a) =>
132425bb815Sopenharmony_ci{
133425bb815Sopenharmony_ci  assert(a === 1)
134425bb815Sopenharmony_ci}
135425bb815Sopenharmony_cif16(1)
136425bb815Sopenharmony_cicheck_reference_error("f16()");
137425bb815Sopenharmony_ci
138425bb815Sopenharmony_civar f17 = ([[a]] = a) =>
139425bb815Sopenharmony_ci{
140425bb815Sopenharmony_ci  assert(a === 2)
141425bb815Sopenharmony_ci}
142425bb815Sopenharmony_cif17([[2]])
143425bb815Sopenharmony_cicheck_reference_error("f17()");
144425bb815Sopenharmony_ci
145425bb815Sopenharmony_civar f18 = ({a = b, b:{b}}) =>
146425bb815Sopenharmony_ci{
147425bb815Sopenharmony_ci  assert(a === 3 && b === 4)
148425bb815Sopenharmony_ci}
149425bb815Sopenharmony_cif18({a:3, b:{b:4}})
150425bb815Sopenharmony_cicheck_reference_error("f18({b:{b:4}})");
151425bb815Sopenharmony_ci
152425bb815Sopenharmony_civar f19 = (a = eval("a")) =>
153425bb815Sopenharmony_ci{
154425bb815Sopenharmony_ci  assert(a === 5)
155425bb815Sopenharmony_ci}
156425bb815Sopenharmony_cif19(5)
157425bb815Sopenharmony_cicheck_reference_error("f19()");
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_civar f20 = ([a] = eval("a")) =>
160425bb815Sopenharmony_ci{
161425bb815Sopenharmony_ci  assert(a === 6)
162425bb815Sopenharmony_ci}
163425bb815Sopenharmony_cif20([6])
164425bb815Sopenharmony_cicheck_reference_error("f20()");
165