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