1// Copyright JS Foundation and other contributors, http://js.foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15function check_reference_error(code)
16{
17  try {
18    eval(code);
19    assert(false);
20  } catch (e) {
21    assert(e instanceof ReferenceError);
22  }
23}
24
25function f1(a = a)
26{
27  assert(a === 1)
28}
29f1(1)
30check_reference_error("f1()");
31
32function f2([a] = 1 + a)
33{
34  assert(a === 2)
35}
36f2([2])
37check_reference_error("f2()");
38
39function f3([a = !a])
40{
41  assert(a === 2)
42}
43f3([2])
44check_reference_error("f3([])");
45
46function f4([[a]] = a)
47{
48  assert(a === 3)
49}
50f4([[3]])
51check_reference_error("f4()");
52
53function f5([[a], b = a] = a)
54{
55  assert(a === 4 && b === 4)
56}
57f5([[4]])
58check_reference_error("f5()")
59
60function f6(a = 3 - ((b)), b)
61{
62  assert(a === 1 && b === 2)
63}
64f6(1, 2)
65check_reference_error("f6(undefined, 2)");
66
67function f7(a = b(), [b])
68{
69  assert(a === 3 && b === 4)
70}
71f7(3, [4])
72check_reference_error("f7(undefined, [4])");
73
74function f8(a = (function () { return a * 2 })())
75{
76  assert(a === 1)
77}
78f8(1)
79check_reference_error("f8()");
80
81function f9({a = b, b:{b}})
82{
83  assert(a === 2 && b === 3)
84}
85f9({a:2, b:{b:3}})
86check_reference_error("f9({b:{b:3}})");
87
88function f10(a = eval("a"))
89{
90  assert(a === 1)
91}
92f10(1)
93check_reference_error("f10()");
94
95function f11([a] = eval("a"))
96{
97  assert(a === 2)
98}
99f11([2])
100check_reference_error("f11()");
101
102function f12({a} = eval("a"))
103{
104  assert(a === 3)
105}
106f12({a:3})
107check_reference_error("f12()");
108
109function f13(a = arguments)
110{
111  assert(a[0] === undefined)
112  assert(a[1] === 4)
113  arguments[0] = 5
114  assert(a[0] === 5)
115}
116f13(undefined, 4)
117
118function f14(a, b = function() { return a; }(), c = (() => a)())
119{
120  assert(a === 6 && b === 6 && c === 6)
121}
122f14(6)
123
124function f15(a = (() => b)(), b)
125{
126  assert(a === 1 && b === 2)
127}
128f15(1, 2)
129check_reference_error("f15(undefined, 2)");
130
131var f16 = (a = a) =>
132{
133  assert(a === 1)
134}
135f16(1)
136check_reference_error("f16()");
137
138var f17 = ([[a]] = a) =>
139{
140  assert(a === 2)
141}
142f17([[2]])
143check_reference_error("f17()");
144
145var f18 = ({a = b, b:{b}}) =>
146{
147  assert(a === 3 && b === 4)
148}
149f18({a:3, b:{b:4}})
150check_reference_error("f18({b:{b:4}})");
151
152var f19 = (a = eval("a")) =>
153{
154  assert(a === 5)
155}
156f19(5)
157check_reference_error("f19()");
158
159var f20 = ([a] = eval("a")) =>
160{
161  assert(a === 6)
162}
163f20([6])
164check_reference_error("f20()");
165