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 checkSyntax (str) {
16425bb815Sopenharmony_ci  try {
17425bb815Sopenharmony_ci    eval (str);
18425bb815Sopenharmony_ci    assert (false);
19425bb815Sopenharmony_ci  } catch (e) {
20425bb815Sopenharmony_ci    assert (e instanceof SyntaxError);
21425bb815Sopenharmony_ci  }
22425bb815Sopenharmony_ci}
23425bb815Sopenharmony_ci
24425bb815Sopenharmony_cifunction mustThrow (str) {
25425bb815Sopenharmony_ci  try {
26425bb815Sopenharmony_ci    eval (str);
27425bb815Sopenharmony_ci    assert (false);
28425bb815Sopenharmony_ci  } catch (e) {
29425bb815Sopenharmony_ci    assert (e instanceof TypeError);
30425bb815Sopenharmony_ci  }
31425bb815Sopenharmony_ci}
32425bb815Sopenharmony_ci
33425bb815Sopenharmony_cicheckSyntax ("var {a}");
34425bb815Sopenharmony_cicheckSyntax ("var {a, o.a}");
35425bb815Sopenharmony_cicheckSyntax ("var {a, ...b}");
36425bb815Sopenharmony_cicheckSyntax ("var {a, ...b} = 4");
37425bb815Sopenharmony_cicheckSyntax ("var {a, ...[b] = 4}");
38425bb815Sopenharmony_cicheckSyntax ("var {a,,} = 4");
39425bb815Sopenharmony_cicheckSyntax ("var {a :} = 4");
40425bb815Sopenharmony_cicheckSyntax ("var {a : ,} = 4");
41425bb815Sopenharmony_cicheckSyntax ("var {a : ['foobar']} = 4");
42425bb815Sopenharmony_cicheckSyntax ("var {let}");
43425bb815Sopenharmony_cicheckSyntax ("var {get = []");
44425bb815Sopenharmony_cicheckSyntax ("var {get : 5}");
45425bb815Sopenharmony_cicheckSyntax ("var {[a = {},}");
46425bb815Sopenharmony_cicheckSyntax ("let {a,a} = []");
47425bb815Sopenharmony_cicheckSyntax ("let {a : b, b} = []");
48425bb815Sopenharmony_cicheckSyntax ("const {a,a} = []");
49425bb815Sopenharmony_cicheckSyntax ("const {a : b, b} = []");
50425bb815Sopenharmony_cicheckSyntax ("try { let {$} = $;");
51425bb815Sopenharmony_cicheckSyntax ("let a, { 'x': a } = {x : 4};");
52425bb815Sopenharmony_cicheckSyntax ("let a, { x: b.c } = {x : 6};");
53425bb815Sopenharmony_cicheckSyntax ("let {a:(a)} = {a:1}");
54425bb815Sopenharmony_ci
55425bb815Sopenharmony_cimustThrow ("var {a} = null");
56425bb815Sopenharmony_cimustThrow ("var {a} = undefined");
57425bb815Sopenharmony_cimustThrow ("function f ({a : {}}) {}; f({});");
58425bb815Sopenharmony_cimustThrow ("function f ({}) {}; f();");
59425bb815Sopenharmony_ci
60425bb815Sopenharmony_ci// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
61425bb815Sopenharmony_ci
62425bb815Sopenharmony_ci// Basic assignment
63425bb815Sopenharmony_ci(function () {
64425bb815Sopenharmony_ci  var o = {p: 42, q: true};
65425bb815Sopenharmony_ci  var {p, q} = o;
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_ci  assert (p === 42);
68425bb815Sopenharmony_ci  assert (q === true);
69425bb815Sopenharmony_ci}) ();
70425bb815Sopenharmony_ci
71425bb815Sopenharmony_ci// Assignment without declaration
72425bb815Sopenharmony_ci(function () {
73425bb815Sopenharmony_ci  var a, b;
74425bb815Sopenharmony_ci  ({a, b} = {a: 1, b: 2});
75425bb815Sopenharmony_ci
76425bb815Sopenharmony_ci  assert (a === 1);
77425bb815Sopenharmony_ci  assert (b === 2);
78425bb815Sopenharmony_ci}) ();
79425bb815Sopenharmony_ci
80425bb815Sopenharmony_ci// Assigning to new variable names
81425bb815Sopenharmony_ci(function () {
82425bb815Sopenharmony_ci  var o = {p: 42, q: true};
83425bb815Sopenharmony_ci  var {p: foo, q: bar} = o;
84425bb815Sopenharmony_ci
85425bb815Sopenharmony_ci  assert (foo === 42);
86425bb815Sopenharmony_ci  assert (bar === true);
87425bb815Sopenharmony_ci}) ();
88425bb815Sopenharmony_ci
89425bb815Sopenharmony_ci// Default values
90425bb815Sopenharmony_ci(function () {
91425bb815Sopenharmony_ci  var {a = 10, b = 5} = {a: 3};
92425bb815Sopenharmony_ci
93425bb815Sopenharmony_ci  assert (a === 3);
94425bb815Sopenharmony_ci  assert (b === 5);
95425bb815Sopenharmony_ci}) ();
96425bb815Sopenharmony_ci
97425bb815Sopenharmony_ci
98425bb815Sopenharmony_ci// Assigning to new variables names and providing default values
99425bb815Sopenharmony_ci(function () {
100425bb815Sopenharmony_ci  var {a: aa = 10, b: bb = 5} = {a: 3};
101425bb815Sopenharmony_ci
102425bb815Sopenharmony_ci  assert (aa === 3);
103425bb815Sopenharmony_ci  assert (bb === 5);
104425bb815Sopenharmony_ci}) ();
105425bb815Sopenharmony_ci
106425bb815Sopenharmony_ci// Nested object and array destructuring
107425bb815Sopenharmony_ci(function () {
108425bb815Sopenharmony_ci  const metadata = {
109425bb815Sopenharmony_ci    title: 'Scratchpad',
110425bb815Sopenharmony_ci    translations: [
111425bb815Sopenharmony_ci      {
112425bb815Sopenharmony_ci        locale: 'de',
113425bb815Sopenharmony_ci        localization_tags: [],
114425bb815Sopenharmony_ci        last_edit: '2014-04-14T08:43:37',
115425bb815Sopenharmony_ci        url: '/de/docs/Tools/Scratchpad',
116425bb815Sopenharmony_ci        title: 'JavaScript-Umgebung'
117425bb815Sopenharmony_ci      }
118425bb815Sopenharmony_ci    ],
119425bb815Sopenharmony_ci    url: '/en-US/docs/Tools/Scratchpad'
120425bb815Sopenharmony_ci  };
121425bb815Sopenharmony_ci
122425bb815Sopenharmony_ci  let {
123425bb815Sopenharmony_ci    title: englishTitle, // rename
124425bb815Sopenharmony_ci    translations: [
125425bb815Sopenharmony_ci      {
126425bb815Sopenharmony_ci         title: localeTitle, // rename
127425bb815Sopenharmony_ci      },
128425bb815Sopenharmony_ci    ],
129425bb815Sopenharmony_ci  } = metadata;
130425bb815Sopenharmony_ci
131425bb815Sopenharmony_ci  assert (englishTitle === "Scratchpad");
132425bb815Sopenharmony_ci  assert (localeTitle === "JavaScript-Umgebung");
133425bb815Sopenharmony_ci}) ();
134425bb815Sopenharmony_ci
135425bb815Sopenharmony_ci// Computed object property names and destructuring
136425bb815Sopenharmony_ci(function () {
137425bb815Sopenharmony_ci  let key = 'z';
138425bb815Sopenharmony_ci  let {[key]: foo} = {z: 'bar'};
139425bb815Sopenharmony_ci
140425bb815Sopenharmony_ci  assert (foo === "bar");
141425bb815Sopenharmony_ci}) ();
142425bb815Sopenharmony_ci
143425bb815Sopenharmony_ci// Invalid JavaScript identifier as a property name
144425bb815Sopenharmony_ci(function () {
145425bb815Sopenharmony_ci  const foo = { 'fizz-buzz': true };
146425bb815Sopenharmony_ci  const { 'fizz-buzz': fizzBuzz } = foo;
147425bb815Sopenharmony_ci
148425bb815Sopenharmony_ci  assert (fizzBuzz === true);
149425bb815Sopenharmony_ci}) ();
150425bb815Sopenharmony_ci
151425bb815Sopenharmony_ci// Combined Array and Object Destructuring
152425bb815Sopenharmony_ci(function () {
153425bb815Sopenharmony_ci  const props = [
154425bb815Sopenharmony_ci    { id: 1, name: 'Fizz'},
155425bb815Sopenharmony_ci    { id: 2, name: 'Buzz'},
156425bb815Sopenharmony_ci    { id: 3, name: 'FizzBuzz'}
157425bb815Sopenharmony_ci  ];
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_ci  const [,, { name }] = props;
160425bb815Sopenharmony_ci
161425bb815Sopenharmony_ci  assert (name === "FizzBuzz");
162425bb815Sopenharmony_ci}) ();
163425bb815Sopenharmony_ci
164425bb815Sopenharmony_ci// The prototype chain is looked up when the object is deconstructed
165425bb815Sopenharmony_ci(function () {
166425bb815Sopenharmony_ci  var obj = {self: '123'};
167425bb815Sopenharmony_ci  Object.getPrototypeOf(obj).prot = '456';
168425bb815Sopenharmony_ci  const {self, prot} = obj;
169425bb815Sopenharmony_ci  assert (self === '123');
170425bb815Sopenharmony_ci  assert (prot === '456');
171425bb815Sopenharmony_ci}) ();
172425bb815Sopenharmony_ci
173425bb815Sopenharmony_ci// Test inner patterns I.
174425bb815Sopenharmony_ci(function () {
175425bb815Sopenharmony_ci  var a,b,c,d,e;
176425bb815Sopenharmony_ci  var o = { a : { b: 2 }, c: 1, d: { e: undefined } };
177425bb815Sopenharmony_ci  var { e: { b : a } = { b : 2, a : 1}, d: { e: { b : e = 2} = { b } } } = o;
178425bb815Sopenharmony_ci  assert (a === 2);
179425bb815Sopenharmony_ci  assert (b === undefined);
180425bb815Sopenharmony_ci  assert (c === undefined);
181425bb815Sopenharmony_ci  assert (d === undefined);
182425bb815Sopenharmony_ci  assert (e === 2);
183425bb815Sopenharmony_ci}) ();
184425bb815Sopenharmony_ci
185425bb815Sopenharmony_ci// Test inner patterns II.
186425bb815Sopenharmony_ci(function () {
187425bb815Sopenharmony_ci  var a,b,c,d,e;
188425bb815Sopenharmony_ci  var o = { a : [{ b : 2 ,}, d], e : 5 };
189425bb815Sopenharmony_ci
190425bb815Sopenharmony_ci  var { a: [{b, c  = 3}, d = 4], e } = o;
191425bb815Sopenharmony_ci  assert (a === undefined);
192425bb815Sopenharmony_ci  assert (b === 2);
193425bb815Sopenharmony_ci  assert (c === 3);
194425bb815Sopenharmony_ci  assert (d === 4);
195425bb815Sopenharmony_ci  assert (e === 5);
196425bb815Sopenharmony_ci}) ();
197425bb815Sopenharmony_ci
198425bb815Sopenharmony_ci// Multiple declaration
199425bb815Sopenharmony_ci(function () {
200425bb815Sopenharmony_ci  var {a} = {a : 1}, {b} = {b : 2};
201425bb815Sopenharmony_ci
202425bb815Sopenharmony_ci  assert (a === 1);
203425bb815Sopenharmony_ci  assert (b === 2);
204425bb815Sopenharmony_ci}) ();
205425bb815Sopenharmony_ci
206425bb815Sopenharmony_ci// Force the creation of lexical environment I.
207425bb815Sopenharmony_ci(function () {
208425bb815Sopenharmony_ci  const {a} = {a : 1};
209425bb815Sopenharmony_ci  eval();
210425bb815Sopenharmony_ci
211425bb815Sopenharmony_ci  assert (a === 1);
212425bb815Sopenharmony_ci}) ();
213425bb815Sopenharmony_ci
214425bb815Sopenharmony_ci// Force the creation of lexical environment II.
215425bb815Sopenharmony_ci(function () {
216425bb815Sopenharmony_ci  let {a} = {a : 1};
217425bb815Sopenharmony_ci  eval();
218425bb815Sopenharmony_ci
219425bb815Sopenharmony_ci  assert (a === 1);
220425bb815Sopenharmony_ci}) ();
221425bb815Sopenharmony_ci
222425bb815Sopenharmony_ci// Check the parsing of AssignmentElement
223425bb815Sopenharmony_ci(function () {
224425bb815Sopenharmony_ci  var a = 6;
225425bb815Sopenharmony_ci  ({"a": ((a)) } = {a : 7});
226425bb815Sopenharmony_ci  assert (a === 7);
227425bb815Sopenharmony_ci}) ();
228425bb815Sopenharmony_ci
229425bb815Sopenharmony_citry {
230425bb815Sopenharmony_ci  eval ("var a = 0; -{a} = {a:1}");
231425bb815Sopenharmony_ci  assert (false);
232425bb815Sopenharmony_ci} catch (e) {
233425bb815Sopenharmony_ci  assert (e instanceof ReferenceError);
234425bb815Sopenharmony_ci}
235