blob: 1f16c45270a9574d22f60865fbe1ca0377eb40e3 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00004
5(function TestObjectLiteralPattern() {
6 var { x : x, y : y, get, set } = { x : 1, y : 2, get: 3, set: 4 };
7 assertEquals(1, x);
8 assertEquals(2, y);
9 assertEquals(3, get);
10 assertEquals(4, set);
11
12 var {z} = { z : 3 };
13 assertEquals(3, z);
14
15
16 var sum = 0;
17 for (var {z} = { z : 3 }; z != 0; z--) {
18 sum += z;
19 }
20 assertEquals(6, sum);
21
22
23 var log = [];
24 var o = {
25 get x() {
26 log.push("x");
27 return 0;
28 },
29 get y() {
30 log.push("y");
31 return {
32 get z() { log.push("z"); return 1; }
33 }
34 }
35 };
36 var { x : x0, y : { z : z1 }, x : x1 } = o;
37 assertSame(0, x0);
38 assertSame(1, z1);
39 assertSame(0, x1);
40 assertArrayEquals(["x", "y", "z", "x"], log);
41}());
42
43
44(function TestObjectLiteralPatternInitializers() {
45 var { x : x, y : y = 2 } = { x : 1 };
46 assertEquals(1, x);
47 assertEquals(2, y);
48
49 var {z = 3} = {};
50 assertEquals(3, z);
51
52 var sum = 0;
53 for (var {z = 3} = {}; z != 0; z--) {
54 sum += z;
55 }
56 assertEquals(6, sum);
57
58 var log = [];
59 var o = {
60 get x() {
61 log.push("x");
62 return undefined;
63 },
64 get y() {
65 log.push("y");
66 return {
67 get z() { log.push("z"); return undefined; }
68 }
69 }
70 };
71 var { x : x0 = 0, y : { z : z1 = 1}, x : x1 = 0} = o;
72 assertSame(0, x0);
73 assertSame(1, z1);
74 assertSame(0, x1);
75 assertArrayEquals(["x", "y", "z", "x"], log);
76}());
77
78
79(function TestObjectLiteralPatternLexicalInitializers() {
80 'use strict';
81 let { x : x, y : y = 2 } = { x : 1 };
82 assertEquals(1, x);
83 assertEquals(2, y);
84
85 let {z = 3} = {};
86 assertEquals(3, z);
87
88 let log = [];
89 let o = {
90 get x() {
91 log.push("x");
92 return undefined;
93 },
94 get y() {
95 log.push("y");
96 return {
97 get z() { log.push("z"); return undefined; }
98 }
99 }
100 };
101
102 let { x : x0 = 0, y : { z : z1 = 1 }, x : x1 = 5} = o;
103 assertSame(0, x0);
104 assertSame(1, z1);
105 assertSame(5, x1);
106 assertArrayEquals(["x", "y", "z", "x"], log);
107
108 let sum = 0;
109 for (let {x = 0, z = 3} = {}; z != 0; z--) {
110 assertEquals(0, x);
111 sum += z;
112 }
113 assertEquals(6, sum);
114}());
115
116
117(function TestObjectLiteralPatternLexical() {
118 'use strict';
119 let { x : x, y : y } = { x : 1, y : 2 };
120 assertEquals(1, x);
121 assertEquals(2, y);
122
123 let {z} = { z : 3 };
124 assertEquals(3, z);
125
126 let log = [];
127 let o = {
128 get x() {
129 log.push("x");
130 return 0;
131 },
132 get y() {
133 log.push("y");
134 return {
135 get z() { log.push("z"); return 1; }
136 }
137 }
138 };
139 let { x : x0, y : { z : z1 }, x : x1 } = o;
140 assertSame(0, x0);
141 assertSame(1, z1);
142 assertSame(0, x1);
143 assertArrayEquals(["x", "y", "z", "x"], log);
144
145 let sum = 0;
146 for (let {x, z} = { x : 0, z : 3 }; z != 0; z--) {
147 assertEquals(0, x);
148 sum += z;
149 }
150 assertEquals(6, sum);
151}());
152
153
154(function TestObjectLiteralPatternLexicalConst() {
155 'use strict';
156 const { x : x, y : y } = { x : 1, y : 2 };
157 assertEquals(1, x);
158 assertEquals(2, y);
159
160 assertThrows(function() { x++; }, TypeError);
161 assertThrows(function() { y++; }, TypeError);
162
163 const {z} = { z : 3 };
164 assertEquals(3, z);
165
166 for (const {x, z} = { x : 0, z : 3 }; z != 3 || x != 0;) {
167 assertTrue(false);
168 }
169}());
170
171
172(function TestFailingMatchesSloppy() {
173 var {x, y} = {};
174 assertSame(undefined, x);
175 assertSame(undefined, y);
176
177 var { x : { z1 }, y2} = { x : {}, y2 : 42 }
178 assertSame(undefined, z1);
179 assertSame(42, y2);
180}());
181
182
183(function TestFailingMatchesStrict() {
184 'use strict';
185 var {x, y} = {};
186 assertSame(undefined, x);
187 assertSame(undefined, y);
188
189 var { x : { z1 }, y2} = { x : {}, y2 : 42 }
190 assertSame(undefined, z1);
191 assertSame(42, y2);
192
193 {
194 let {x1,y1} = {};
195 assertSame(undefined, x1);
196 assertSame(undefined, y1);
197
198 let { x : { z1 }, y2} = { x : {}, y2 : 42 }
199 assertSame(undefined, z1);
200 assertSame(42, y2);
201 }
202}());
203
204
205(function TestTDZInIntializers() {
206 'use strict';
207 {
208 let {x, y = x} = {x : 42, y : 27};
209 assertSame(42, x);
210 assertSame(27, y);
211 }
212
213 {
214 let {x, y = x + 1} = { x : 42 };
215 assertSame(42, x);
216 assertSame(43, y);
217 }
218 assertThrows(function() {
219 let {x = y, y} = { y : 42 };
220 }, ReferenceError);
221
222 {
223 let {x, y = eval("x+1")} = {x:42};
224 assertEquals(42, x);
225 assertEquals(43, y);
226 }
227
228 {
229 let {x, y = () => eval("x+1")} = {x:42};
230 assertEquals(42, x);
231 assertEquals(43, y());
232 }
233
234 {
235 let {x = function() {return y+1;}, y} = {y:42};
236 assertEquals(43, x());
237 assertEquals(42, y);
238 }
239 {
240 let {x = function() {return eval("y+1");}, y} = {y:42};
241 assertEquals(43, x());
242 assertEquals(42, y);
243 }
244}());
245
246
247(function TestSideEffectsInInitializers() {
248 var callCount = 0;
249 function f(v) { callCount++; return v; }
250
251 callCount = 0;
252 var { x = f(42) } = { x : 27 };
253 assertSame(27, x);
254 assertEquals(0, callCount);
255
256 callCount = 0;
257 var { x = f(42) } = {};
258 assertSame(42, x);
259 assertEquals(1, callCount);
260}());
261
262
Ben Murdoch097c5b22016-05-18 11:27:45 +0100263(function TestAssignmentExprInInitializers() {
264 {
265 let x, y;
266 {
267 let { x = y = 1 } = {};
268 assertSame(x, 1);
269 assertSame(y, 1);
270 }
271 assertSame(undefined, x);
272 assertSame(1, y);
273 }
274
275 {
276 let x, y;
277 {
278 let { x: x = y = 1 } = {};
279 assertSame(1, x);
280 assertSame(1, y);
281 }
282 assertSame(undefined, x);
283 assertSame(1, y);
284 }
285
286 {
287 let x, y;
288 {
289 let [ x = y = 1 ] = [];
290 assertSame(1, x);
291 assertSame(1, y);
292 }
293 assertSame(undefined, x);
294 assertSame(1, y);
295 }
296
297 {
298 let x, y;
299 (function({ x = y = 1 }) {}({}));
300 assertSame(undefined, x);
301 assertSame(1, y);
302 }
303
304 {
305 let x, y;
306 (function({ x: x = y = 1 }) {}({}));
307 assertSame(undefined, x);
308 assertSame(1, y);
309 }
310
311 {
312 let x, y;
313 (function([ x = y = 1 ]) {}([]));
314 assertSame(undefined, x);
315 assertSame(1, y);
316 }
317}());
318
319
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000320(function TestMultipleAccesses() {
321 assertThrows(
322 "'use strict';"+
323 "const {x,x} = {x:1};",
324 SyntaxError);
325
326 assertThrows(
327 "'use strict';"+
328 "let {x,x} = {x:1};",
329 SyntaxError);
330
331 (function() {
332 var {x,x = 2} = {x : 1};
333 assertSame(1, x);
334 }());
335
336 assertThrows(function () {
337 'use strict';
338 let {x = (function() { x = 2; }())} = {};
339 }, ReferenceError);
340
341 (function() {
342 'use strict';
343 let {x = (function() { x = 2; }())} = {x:1};
344 assertSame(1, x);
345 }());
346}());
347
348
349(function TestComputedNames() {
350 var x = 1;
351 var {[x]:y} = {1:2};
352 assertSame(2, y);
353
354 (function(){
355 'use strict';
356 let {[x]:y} = {1:2};
357 assertSame(2, y);
358 }());
359
360 var callCount = 0;
361 function foo(v) { callCount++; return v; }
362
363 (function() {
364 callCount = 0;
365 var {[foo("abc")]:x} = {abc:42};
366 assertSame(42, x);
367 assertEquals(1, callCount);
368 }());
369
370 (function() {
371 'use strict';
372 callCount = 0;
373 let {[foo("abc")]:x} = {abc:42};
374 assertSame(42, x);
375 assertEquals(1, callCount);
376 }());
377
378 (function() {
379 callCount = 0;
380 var {[foo("abc")]:x} = {};
381 assertSame(undefined, x);
382 assertEquals(1, callCount);
383 }());
384
385 (function() {
386 'use strict';
387 callCount = 0;
388 let {[foo("abc")]:x} = {};
389 assertSame(undefined, x);
390 assertEquals(1, callCount);
391 }());
392
393 for (val of [null, undefined]) {
394 callCount = 0;
395 assertThrows(function() {
396 var {[foo()]:x} = val;
397 }, TypeError);
398 assertEquals(0, callCount);
399
400 callCount = 0;
401 assertThrows(function() {
402 'use strict';
403 let {[foo()]:x} = val;
404 }, TypeError);
405 assertEquals(0, callCount);
406 }
407
408 var log = [];
409 var o = {
410 get x() { log.push("get x"); return 1; },
411 get y() { log.push("get y"); return 2; }
412 }
413 function f(v) { log.push("f " + v); return v; }
414
415 (function() {
416 log = [];
417 var { [f('x')]:x, [f('y')]:y } = o;
418 assertSame(1, x);
419 assertSame(2, y);
420 assertArrayEquals(["f x", "get x", "f y", "get y"], log);
421 }());
422
423 (function() {
424 'use strict';
425 log = [];
426 let { [f('x')]:x, [f('y')]:y } = o;
427 assertSame(1, x);
428 assertSame(2, y);
429 assertArrayEquals(["f x", "get x", "f y", "get y"], log);
430 }());
431
432 (function() {
433 'use strict';
434 log = [];
435 const { [f('x')]:x, [f('y')]:y } = o;
436 assertSame(1, x);
437 assertSame(2, y);
438 assertArrayEquals(["f x", "get x", "f y", "get y"], log);
439 }());
440}());
441
442
443(function TestExceptions() {
444 for (var val of [null, undefined]) {
445 assertThrows(function() { var {} = val; }, TypeError);
446 assertThrows(function() { var {x} = val; }, TypeError);
447 assertThrows(function() { var { x : {} } = { x : val }; }, TypeError);
448 assertThrows(function() { 'use strict'; let {} = val; }, TypeError);
449 assertThrows(function() { 'use strict'; let {x} = val; }, TypeError);
450 assertThrows(function() { 'use strict'; let { x : {} } = { x : val }; },
451 TypeError);
452 }
453}());
454
455
456(function TestArrayLiteral() {
457 var [a, b, c] = [1, 2, 3];
458 assertSame(1, a);
459 assertSame(2, b);
460 assertSame(3, c);
461}());
462
463(function TestIterators() {
464 var log = [];
465 function* f() {
466 log.push("1");
467 yield 1;
468 log.push("2");
469 yield 2;
470 log.push("3");
471 yield 3;
472 log.push("done");
473 };
474
475 (function() {
476 log = [];
477 var [a, b, c] = f();
478 assertSame(1, a);
479 assertSame(2, b);
480 assertSame(3, c);
481 assertArrayEquals(["1", "2", "3"], log);
482 }());
483
484 (function() {
485 log = [];
486 var [a, b, c, d] = f();
487 assertSame(1, a);
488 assertSame(2, b);
489 assertSame(3, c);
490 assertSame(undefined, d);
491 assertArrayEquals(["1", "2", "3", "done"], log);
492 }());
493
494 (function() {
495 log = [];
496 var [a, , c] = f();
497 assertSame(1, a);
498 assertSame(3, c);
499 assertArrayEquals(["1", "2", "3"], log);
500 }());
501
502 (function() {
503 log = [];
504 var [a, , c, d] = f();
505 assertSame(1, a);
506 assertSame(3, c);
507 assertSame(undefined, d);
508 assertArrayEquals(["1", "2", "3", "done"], log);
509 }());
510
511 (function() {
512 log = [];
513 // last comma is not an elision.
514 var [a, b,] = f();
515 assertSame(1, a);
516 assertSame(2, b);
517 assertArrayEquals(["1", "2"], log);
518 }());
519
520 (function() {
521 log = [];
522 // last comma is not an elision, but the comma before the last is.
523 var [a, b, ,] = f();
524 assertSame(1, a);
525 assertSame(2, b);
526 assertArrayEquals(["1", "2", "3"], log);
527 }());
528
529 (function() {
530 log = [];
531 var [a, ...rest] = f();
532 assertSame(1, a);
533 assertArrayEquals([2,3], rest);
534 assertArrayEquals(["1", "2", "3", "done"], log);
535 }());
536
537 (function() {
538 log = [];
539 var [a, b, c, ...rest] = f();
540 assertSame(1, a);
541 assertSame(2, b);
542 assertSame(3, c);
543 assertArrayEquals([], rest);
544 assertArrayEquals(["1", "2", "3", "done"], log);
545 }());
546
547 (function() {
548 log = [];
549 var [a, b, c, d, ...rest] = f();
550 assertSame(1, a);
551 assertSame(2, b);
552 assertSame(3, c);
553 assertSame(undefined, d);
554 assertArrayEquals([], rest);
555 assertArrayEquals(["1", "2", "3", "done"], log);
556 }());
557}());
558
559
560(function TestIteratorsLexical() {
561 'use strict';
562 var log = [];
563 function* f() {
564 log.push("1");
565 yield 1;
566 log.push("2");
567 yield 2;
568 log.push("3");
569 yield 3;
570 log.push("done");
571 };
572
573 (function() {
574 log = [];
575 let [a, b, c] = f();
576 assertSame(1, a);
577 assertSame(2, b);
578 assertSame(3, c);
579 assertArrayEquals(["1", "2", "3"], log);
580 }());
581
582 (function() {
583 log = [];
584 let [a, b, c, d] = f();
585 assertSame(1, a);
586 assertSame(2, b);
587 assertSame(3, c);
588 assertSame(undefined, d);
589 assertArrayEquals(["1", "2", "3", "done"], log);
590 }());
591
592 (function() {
593 log = [];
594 let [a, , c] = f();
595 assertSame(1, a);
596 assertSame(3, c);
597 assertArrayEquals(["1", "2", "3"], log);
598 }());
599
600 (function() {
601 log = [];
602 let [a, , c, d] = f();
603 assertSame(1, a);
604 assertSame(3, c);
605 assertSame(undefined, d);
606 assertArrayEquals(["1", "2", "3", "done"], log);
607 }());
608
609 (function() {
610 log = [];
611 // last comma is not an elision.
612 let [a, b,] = f();
613 assertSame(1, a);
614 assertSame(2, b);
615 assertArrayEquals(["1", "2"], log);
616 }());
617
618 (function() {
619 log = [];
620 // last comma is not an elision, but the comma before the last is.
621 let [a, b, ,] = f();
622 assertSame(1, a);
623 assertSame(2, b);
624 assertArrayEquals(["1", "2", "3"], log);
625 }());
626
627 (function() {
628 log = [];
629 let [a, ...rest] = f();
630 assertSame(1, a);
631 assertArrayEquals([2,3], rest);
632 assertArrayEquals(["1", "2", "3", "done"], log);
633 }());
634
635 (function() {
636 log = [];
637 let [a, b, c, ...rest] = f();
638 assertSame(1, a);
639 assertSame(2, b);
640 assertSame(3, c);
641 assertArrayEquals([], rest);
642 assertArrayEquals(["1", "2", "3", "done"], log);
643 }());
644
645 (function() {
646 log = [];
647 let [a, b, c, d, ...rest] = f();
648 assertSame(1, a);
649 assertSame(2, b);
650 assertSame(3, c);
651 assertSame(undefined, d);
652 assertArrayEquals([], rest);
653 assertArrayEquals(["1", "2", "3", "done"], log);
654 }());
655}());
656
657(function TestIteratorsRecursive() {
658 var log = [];
659 function* f() {
660 log.push("1");
661 yield {x : 1, y : 2};
662 log.push("2");
663 yield [42, 27, 30];
664 log.push("3");
665 yield "abc";
666 log.push("done");
667 };
668
669 (function() {
670 var [{x, y}, [a, b]] = f();
671 assertSame(1, x);
672 assertSame(2, y);
673 assertSame(42, a);
674 assertSame(27, b);
675 assertArrayEquals(["1", "2"], log);
676 }());
677
678 (function() {
679 'use strict';
680 log = [];
681 let [{x, y}, [a, b]] = f();
682 assertSame(1, x);
683 assertSame(2, y);
684 assertSame(42, a);
685 assertSame(27, b);
686 assertArrayEquals(["1", "2"], log);
687 }());
688}());
689
690
691(function TestForEachLexical() {
692 'use strict';
693 let a = [{x:1, y:-1}, {x:2,y:-2}, {x:3,y:-3}];
694 let sumX = 0;
695 let sumY = 0;
696 let fs = [];
697 for (let {x,y} of a) {
698 sumX += x;
699 sumY += y;
700 fs.push({fx : function() { return x; }, fy : function() { return y }});
701 }
702 assertSame(6, sumX);
703 assertSame(-6, sumY);
704 assertSame(3, fs.length);
705 for (let i = 0; i < fs.length; i++) {
706 let {fx,fy} = fs[i];
707 assertSame(i+1, fx());
708 assertSame(-(i+1), fy());
709 }
710
711 var o = { __proto__:null, 'a1':1, 'b2':2 };
712 let sx = '';
713 let sy = '';
714 for (let [x,y] in o) {
715 sx += x;
716 sy += y;
717 }
718 assertEquals('ab', sx);
719 assertEquals('12', sy);
720}());
721
722
723(function TestForEachVars() {
724 var a = [{x:1, y:-1}, {x:2,y:-2}, {x:3,y:-3}];
725 var sumX = 0;
726 var sumY = 0;
727 var fs = [];
728 for (var {x,y} of a) {
729 sumX += x;
730 sumY += y;
731 fs.push({fx : function() { return x; }, fy : function() { return y }});
732 }
733 assertSame(6, sumX);
734 assertSame(-6, sumY);
735 assertSame(3, fs.length);
736 for (var i = 0; i < fs.length; i++) {
737 var {fx,fy} = fs[i];
738 assertSame(3, fx());
739 assertSame(-3, fy());
740 }
741
742 var o = { __proto__:null, 'a1':1, 'b2':2 };
743 var sx = '';
744 var sy = '';
745 for (var [x,y] in o) {
746 sx += x;
747 sy += y;
748 }
749 assertEquals('ab', sx);
750 assertEquals('12', sy);
751}());
752
753
754(function TestParameters() {
755 function f({a, b}) { return a - b; }
756 assertEquals(1, f({a : 6, b : 5}));
757
758 function f1(c, {a, b}) { return c + a - b; }
759 assertEquals(8, f1(7, {a : 6, b : 5}));
760
761 function f2({c, d}, {a, b}) { return c - d + a - b; }
762 assertEquals(7, f2({c : 7, d : 1}, {a : 6, b : 5}));
763
764 function f3([{a, b}]) { return a - b; }
765 assertEquals(1, f3([{a : 6, b : 5}]));
766
767 var g = ({a, b}) => { return a - b; };
768 assertEquals(1, g({a : 6, b : 5}));
769
770 var g1 = (c, {a, b}) => { return c + a - b; };
771 assertEquals(8, g1(7, {a : 6, b : 5}));
772
773 var g2 = ({c, d}, {a, b}) => { return c - d + a - b; };
774 assertEquals(7, g2({c : 7, d : 1}, {a : 6, b : 5}));
775
776 var g3 = ([{a, b}]) => { return a - b; };
777 assertEquals(1, g3([{a : 6, b : 5}]));
778}());
779
780
781(function TestExpressionsInParameters() {
782 function f0(x = eval(0)) { return x }
783 assertEquals(0, f0());
784 function f1({a = eval(1)}) { return a }
785 assertEquals(1, f1({}));
786 function f2([x = eval(2)]) { return x }
787 assertEquals(2, f2([]));
788 function f3({[eval(7)]: x}) { return x }
789 assertEquals(3, f3({7: 3}));
790})();
791
792
793(function TestParameterScoping() {
794 var x = 1;
795
796 function f1({a = x}) { var x = 2; return a; }
797 assertEquals(1, f1({}));
798 function f2({a = x}) { function x() {}; return a; }
799 assertEquals(1, f2({}));
800 (function() {
801 'use strict';
802 function f3({a = x}) { let x = 2; return a; }
803 assertEquals(1, f3({}));
804 function f4({a = x}) { const x = 2; return a; }
805 assertEquals(1, f4({}));
806 function f5({a = x}) { function x() {}; return a; }
807 assertEquals(1, f5({}));
808 })();
809 function f6({a = eval("x")}) { var x; return a; }
810 assertEquals(1, f6({}));
811 (function() {
812 'use strict';
813 function f61({a = eval("x")}) { var x; return a; }
814 assertEquals(1, f61({}));
815 })();
816 function f62({a = eval("'use strict'; x")}) { var x; return a; }
817 assertEquals(1, f62({}));
818 function f7({a = function() { return x }}) { var x; return a(); }
819 assertEquals(1, f7({}));
820 function f8({a = () => x}) { var x; return a(); }
821 assertEquals(1, f8({}));
822 function f9({a = () => eval("x")}) { var x; return a(); }
823 assertEquals(1, f9({}));
824 (function TestInitializedWithEvalArrowStrict() {
825 'use strict';
826 function f91({a = () => eval("x")}) { var x; return a(); }
827 assertEquals(1, f91({}));
828 })();
829 function f92({a = () => { 'use strict'; return eval("x") }}) { var x; return a(); }
830 assertEquals(1, f92({}));
831 function f93({a = () => eval("'use strict'; x")}) { var x; return a(); }
832 assertEquals(1, f93({}));
833
834 var g1 = ({a = x}) => { var x = 2; return a; };
835 assertEquals(1, g1({}));
836 var g2 = ({a = x}) => { function x() {}; return a; };
837 assertEquals(1, g2({}));
838 (function() {
839 'use strict';
840 var g3 = ({a = x}) => { let x = 2; return a; };
841 assertEquals(1, g3({}));
842 var g4 = ({a = x}) => { const x = 2; return a; };
843 assertEquals(1, g4({}));
844 var g5 = ({a = x}) => { function x() {}; return a; };
845 assertEquals(1, g5({}));
846 })();
847 var g6 = ({a = eval("x")}) => { var x; return a; };
848 assertEquals(1, g6({}));
849 (function() {
850 'use strict';
851 var g61 = ({a = eval("x")}) => { var x; return a; };
852 assertEquals(1, g61({}));
853 })();
854 var g62 = ({a = eval("'use strict'; x")}) => { var x; return a; };
855 assertEquals(1, g62({}));
856 var g7 = ({a = function() { return x }}) => { var x; return a(); };
857 assertEquals(1, g7({}));
858 var g8 = ({a = () => x}) => { var x; return a(); };
859 assertEquals(1, g8({}));
860 var g9 = ({a = () => eval("x")}) => { var x; return a(); };
861 assertEquals(1, g9({}));
862 (function() {
863 'use strict';
864 var g91 = ({a = () => eval("x")}) => { var x; return a(); };
865 assertEquals(1, g91({}));
866 var g92 = ({a = () => { return eval("x") }}) => { var x; return a(); };
867 assertEquals(1, g92({}));
868 })();
869 var g93 = ({a = () => eval("'use strict'; x")}) => { var x; return a(); };
870 assertEquals(1, g93({}));
871
872 var f11 = function f({x = f}) { var f; return x; }
873 assertSame(f11, f11({}));
874 var f12 = function f({x = f}) { function f() {}; return x; }
875 assertSame(f12, f12({}));
876 (function() {
877 'use strict';
878 var f13 = function f({x = f}) { let f; return x; }
879 assertSame(f13, f13({}));
880 var f14 = function f({x = f}) { const f = 0; return x; }
881 assertSame(f14, f14({}));
882 var f15 = function f({x = f}) { function f() {}; return x; }
883 assertSame(f15, f15({}));
884 })();
885 var f16 = function f({f = 7, x = f}) { return x; }
886 assertSame(7, f16({}));
887
888 var y = 'a';
889 function f20({[y]: x}) { var y = 'b'; return x; }
890 assertEquals(1, f20({a: 1, b: 2}));
891 function f21({[eval('y')]: x}) { var y = 'b'; return x; }
892 assertEquals(1, f21({a: 1, b: 2}));
893 var g20 = ({[y]: x}) => { var y = 'b'; return x; };
894 assertEquals(1, g20({a: 1, b: 2}));
895 var g21 = ({[eval('y')]: x}) => { var y = 'b'; return x; };
896 assertEquals(1, g21({a: 1, b: 2}));
897})();
898
899
900(function TestParameterDestructuringTDZ() {
901 function f1({a = x}, x) { return a }
902 assertThrows(() => f1({}, 4), ReferenceError);
903 assertEquals(4, f1({a: 4}, 5));
904 function f2({a = eval("x")}, x) { return a }
905 assertThrows(() => f2({}, 4), ReferenceError);
906 assertEquals(4, f2({a: 4}, 5));
907 (function() {
908 'use strict';
909 function f3({a = eval("x")}, x) { return a }
910 assertThrows(() => f3({}, 4), ReferenceError);
911 assertEquals(4, f3({a: 4}, 5));
912 })();
913 function f4({a = eval("'use strict'; x")}, x) { return a }
914 assertThrows(() => f4({}, 4), ReferenceError);
915 assertEquals(4, f4({a: 4}, 5));
916
917 function f5({a = () => x}, x) { return a() }
918 assertEquals(4, f5({a: () => 4}, 5));
919 function f6({a = () => eval("x")}, x) { return a() }
920 assertEquals(4, f6({a: () => 4}, 5));
921 (function() {
922 'use strict';
923 function f7({a = () => eval("x")}, x) { return a() }
924 assertEquals(4, f7({a: () => 4}, 5));
925 })();
926 function f8({a = () => eval("'use strict'; x")}, x) { return a() }
927 assertEquals(4, f8({a: () => 4}, 5));
928
929 function f11({a = b}, {b}) { return a }
930 assertThrows(() => f11({}, {b: 4}), ReferenceError);
931 assertEquals(4, f11({a: 4}, {b: 5}));
932 function f12({a = eval("b")}, {b}) { return a }
933 assertThrows(() => f12({}, {b: 4}), ReferenceError);
934 assertEquals(4, f12({a: 4}, {b: 5}));
935 (function() {
936 'use strict';
937 function f13({a = eval("b")}, {b}) { return a }
938 assertThrows(() => f13({}, {b: 4}), ReferenceError);
939 assertEquals(4, f13({a: 4}, {b: 5}));
940 })();
941 function f14({a = eval("'use strict'; b")}, {b}) { return a }
942 assertThrows(() => f14({}, {b: 4}), ReferenceError);
943 assertEquals(4, f14({a: 4}, {b: 5}));
944
945 function f15({a = () => b}, {b}) { return a() }
946 assertEquals(4, f15({a: () => 4}, {b: 5}));
947 function f16({a = () => eval("b")}, {b}) { return a() }
948 assertEquals(4, f16({a: () => 4}, {b: 5}));
949 (function() {
950 'use strict';
951 function f17({a = () => eval("b")}, {b}) { return a() }
952 assertEquals(4, f17({a: () => 4}, {b: 5}));
953 })();
954 function f18({a = () => eval("'use strict'; b")}, {b}) { return a() }
955 assertEquals(4, f18({a: () => 4}, {b: 5}));
956
957 // TODO(caitp): TDZ for rest parameters is not working yet.
958 // function f30({x = a}, ...a) { return x[0] }
959 // assertThrows(() => f30({}), ReferenceError);
960 // assertEquals(4, f30({a: [4]}, 5));
961 // function f31({x = eval("a")}, ...a) { return x[0] }
962 // assertThrows(() => f31({}), ReferenceError);
963 // assertEquals(4, f31({a: [4]}, 5));
964 // function f32({x = eval("a")}, ...a) { 'use strict'; return x[0] }
965 // assertThrows(() => f32({}), ReferenceError);
966 // assertEquals(4, f32({a: [4]}, 5));
967 // function f33({x = eval("'use strict'; a")}, ...a) { return x[0] }
968 // assertThrows(() => f33({}), ReferenceError);
969 // assertEquals(4, f33({a: [4]}, 5));
970
971 function f34({x = function() { return a }}, ...a) { return x()[0] }
972 assertEquals(4, f34({}, 4));
973 function f35({x = () => a}, ...a) { return x()[0] }
974 assertEquals(4, f35({}, 4));
975 function f36({x = () => eval("a")}, ...a) { return x()[0] }
976 assertEquals(4, f36({}, 4));
977 (function() {
978 'use strict';
979 function f37({x = () => eval("a")}, ...a) { return x()[0] }
980 assertEquals(4, f37({}, 4));
981 })();
982 function f38({x = () => { 'use strict'; return eval("a") }}, ...a) { return x()[0] }
983 assertEquals(4, f38({}, 4));
984 function f39({x = () => eval("'use strict'; a")}, ...a) { return x()[0] }
985 assertEquals(4, f39({}, 4));
986
987 // var g30 = ({x = a}, ...a) => {};
988 // assertThrows(() => g30({}), ReferenceError);
989 // var g31 = ({x = eval("a")}, ...a) => {};
990 // assertThrows(() => g31({}), ReferenceError);
991 // var g32 = ({x = eval("a")}, ...a) => { 'use strict'; };
992 // assertThrows(() => g32({}), ReferenceError);
993 // var g33 = ({x = eval("'use strict'; a")}, ...a) => {};
994 // assertThrows(() => g33({}), ReferenceError);
995 var g34 = ({x = function() { return a }}, ...a) => { return x()[0] };
996 assertEquals(4, g34({}, 4));
997 var g35 = ({x = () => a}, ...a) => { return x()[0] };
998 assertEquals(4, g35({}, 4));
999})();
1000
1001
1002(function TestDuplicatesInParameters() {
1003 assertThrows("'use strict';function f(x,x){}", SyntaxError);
1004 assertThrows("'use strict';function f({x,x}){}", SyntaxError);
1005 assertThrows("'use strict';function f(x, {x}){}", SyntaxError);
1006 assertThrows("'use strict';var f = (x,x) => {};", SyntaxError);
1007 assertThrows("'use strict';var f = ({x,x}) => {};", SyntaxError);
1008 assertThrows("'use strict';var f = (x, {x}) => {};", SyntaxError);
1009
1010 function ok1(x) { var x; return x; };
1011 assertEquals(1, ok1(1));
1012 function ok2(x) { 'use strict'; { let x = 2; return x; } };
1013 assertEquals(2, ok2(1));
1014}());
1015
1016
1017(function TestShadowingOfParameters() {
1018 function f1({x}) { var x = 2; return x }
1019 assertEquals(2, f1({x: 1}));
1020 function f2({x}) { { var x = 2; } return x; }
1021 assertEquals(2, f2({x: 1}));
1022 function f3({x}) { var y = x; var x = 2; return y; }
1023 assertEquals(1, f3({x: 1}));
1024 function f4({x}) { { var y = x; var x = 2; } return y; }
1025 assertEquals(1, f4({x: 1}));
1026 function f5({x}, g = () => x) { var x = 2; return g(); }
1027 assertEquals(1, f5({x: 1}));
1028 function f6({x}, g = () => x) { { var x = 2; } return g(); }
1029 assertEquals(1, f6({x: 1}));
1030 function f7({x}) { var g = () => x; var x = 2; return g(); }
1031 assertEquals(2, f7({x: 1}));
1032 function f8({x}) { { var g = () => x; var x = 2; } return g(); }
1033 assertEquals(2, f8({x: 1}));
1034 function f9({x}, g = () => eval("x")) { var x = 2; return g(); }
1035 assertEquals(1, f9({x: 1}));
1036
1037 function f10({x}, y) { var y; return y }
1038 assertEquals(2, f10({x: 6}, 2));
1039 function f11({x}, y) { var z = y; var y = 2; return z; }
1040 assertEquals(1, f11({x: 6}, 1));
1041 function f12(y, g = () => y) { var y = 2; return g(); }
1042 assertEquals(1, f12(1));
1043 function f13({x}, y, [z], v) { var x, y, z; return x*y*z*v }
1044 assertEquals(210, f13({x: 2}, 3, [5], 7));
1045
1046 function f20({x}) { function x() { return 2 }; return x(); }
1047 assertEquals(2, f20({x: 1}));
1048 // Function hoisting is blocked by the conflicting x declaration
1049 function f21({x}) { { function x() { return 2 } } return x(); }
1050 assertThrows(() => f21({x: 1}), TypeError);
1051
1052 var g1 = ({x}) => { var x = 2; return x };
1053 assertEquals(2, g1({x: 1}));
1054 var g2 = ({x}) => { { var x = 2; } return x; };
1055 assertEquals(2, g2({x: 1}));
1056 var g3 = ({x}) => { var y = x; var x = 2; return y; };
1057 assertEquals(1, g3({x: 1}));
1058 var g4 = ({x}) => { { var y = x; var x = 2; } return y; };
1059 assertEquals(1, g4({x: 1}));
1060 var g5 = ({x}, g = () => x) => { var x = 2; return g(); };
1061 assertEquals(1, g5({x: 1}));
1062 var g6 = ({x}, g = () => x) => { { var x = 2; } return g(); };
1063 assertEquals(1, g6({x: 1}));
1064 var g7 = ({x}) => { var g = () => x; var x = 2; return g(); };
1065 assertEquals(2, g7({x: 1}));
1066 var g8 = ({x}) => { { var g = () => x; var x = 2; } return g(); };
1067 assertEquals(2, g8({x: 1}));
1068 var g9 = ({x}, g = () => eval("x")) => { var x = 2; return g(); };
1069 assertEquals(1, g9({x: 1}));
1070
1071 var g10 = ({x}, y) => { var y; return y };
1072 assertEquals(2, g10({x: 6}, 2));
1073 var g11 = ({x}, y) => { var z = y; var y = 2; return z; };
1074 assertEquals(1, g11({x: 6}, 1));
1075 var g12 = (y, g = () => y) => { var y = 2; return g(); };
1076 assertEquals(1, g12(1));
1077 var g13 = ({x}, y, [z], v) => { var x, y, z; return x*y*z*v };
1078 assertEquals(210, g13({x: 2}, 3, [5], 7));
1079
1080 var g20 = ({x}) => { function x() { return 2 }; return x(); }
1081 assertEquals(2, g20({x: 1}));
1082 var g21 = ({x}) => { { function x() { return 2 } } return x(); }
1083 assertThrows(() => g21({x: 1}), TypeError);
1084
1085 assertThrows("'use strict'; function f(x) { let x = 0; }; f({});", SyntaxError);
1086 assertThrows("'use strict'; function f({x}) { let x = 0; }; f({});", SyntaxError);
1087 assertThrows("'use strict'; function f(x) { const x = 0; }; f({});", SyntaxError);
1088 assertThrows("'use strict'; function f({x}) { const x = 0; }; f({});", SyntaxError);
1089
1090 assertThrows("'use strict'; let g = (x) => { let x = 0; }; f({});", SyntaxError);
1091 assertThrows("'use strict'; let g = ({x}) => { let x = 0; }; f({});", SyntaxError);
1092 assertThrows("'use strict'; let g = (x) => { const x = 0; }; f({});", SyntaxError);
1093 assertThrows("'use strict'; let g = ({x}) => { const x = 0; }; f({});", SyntaxError);
1094}());
1095
1096
1097(function TestArgumentsForNonSimpleParameters() {
1098 function f1({}, x) { arguments[1] = 0; return x }
1099 assertEquals(6, f1({}, 6));
1100 function f2({}, x) { x = 2; return arguments[1] }
1101 assertEquals(7, f2({}, 7));
1102 function f3(x, {}) { arguments[0] = 0; return x }
1103 assertEquals(6, f3(6, {}));
1104 function f4(x, {}) { x = 2; return arguments[0] }
1105 assertEquals(7, f4(7, {}));
1106 function f5(x, ...a) { arguments[0] = 0; return x }
1107 assertEquals(6, f5(6, {}));
1108 function f6(x, ...a) { x = 2; return arguments[0] }
1109 assertEquals(6, f6(6, {}));
1110 function f7({a: x}) { x = 2; return arguments[0].a }
1111 assertEquals(5, f7({a: 5}));
1112 function f8(x, ...a) { a = []; return arguments[1] }
1113 assertEquals(6, f8(5, 6));
1114}());
1115
1116
1117(function TestForInOfTDZ() {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001118 assertThrows("'use strict'; let x = {}; for (let [x, y] of [x]);", ReferenceError);
1119 assertThrows("'use strict'; let x = {}; for (let [y, x] of [x]);", ReferenceError);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001120 assertThrows("'use strict'; let x = {}; for (let [x, y] in {x});", ReferenceError);
1121 assertThrows("'use strict'; let x = {}; for (let [y, x] in {x});", ReferenceError);
1122}());
1123
1124
1125(function TestFunctionLength() {
1126 assertEquals(1, (function({}) {}).length);
1127 assertEquals(1, (function([]) {}).length);
1128 assertEquals(1, (function({x}) {}).length);
1129 assertEquals(1, (function({}, ...a) {}).length);
1130 assertEquals(1, (function({x}, {y} = {}) {}).length);
1131 assertEquals(1, (function({x}, {y} = {}, ...a) {}).length);
1132 assertEquals(2, (function(x, {y}, {z} = {}) {}).length);
1133 assertEquals(2, (function({x}, {}, {z} = {}, ...a) {}).length);
1134 assertEquals(1, (function(x, {y} = {}, {z}) {}).length);
1135 assertEquals(1, (function({x}, {y} = {}, {z}, ...a) {}).length);
1136 assertEquals(1, (function(x, {y} = {}, {z}, {v} = {}) {}).length);
1137 assertEquals(1, (function({x}, {y} = {}, {z}, {v} = {}, ...a) {}).length);
1138})();
1139
1140
1141(function TestDirectiveThrows() {
1142 "use strict";
1143
1144 assertThrows(function(){ eval("function({}){'use strict';}") }, SyntaxError);
1145 assertThrows(function(){ eval("({}) => {'use strict';}") }, SyntaxError);
1146 assertThrows(
1147 function(){ eval("(class{foo({}) {'use strict';}});") }, SyntaxError);
1148
1149 assertThrows(
1150 function(){ eval("function(a, {}){'use strict';}") }, SyntaxError);
1151 assertThrows(function(){ eval("(a, {}) => {'use strict';}") }, SyntaxError);
1152 assertThrows(
1153 function(){ eval("(class{foo(a, {}) {'use strict';}});") }, SyntaxError);
1154})();
1155
1156
1157(function TestLegacyConstDestructuringInForLoop() {
1158 var result;
1159 for (const {foo} of [{foo: 1}]) { result = foo; }
1160 assertEquals(1, result);
1161})();
1162
1163
1164(function TestCatch() {
1165 "use strict";
1166
1167 // For testing proper scoping.
1168 var foo = "hello", bar = "world", baz = 42;
1169
1170 try {
1171 throw {foo: 1, bar: 2};
1172 } catch ({foo, bar, baz = 3}) {
1173 assertEquals(1, foo);
1174 assertEquals(2, bar);
1175 assertEquals(3, baz);
1176 }
1177
1178 try {
1179 throw [1, 2, 3];
1180 } catch ([foo, ...bar]) {
1181 assertEquals(1, foo);
1182 assertEquals([2, 3], bar);
1183 }
1184
1185 assertEquals("hello", foo);
1186 assertEquals("world", bar);
1187 assertEquals(42, baz);
Ben Murdochda12d292016-06-02 14:46:10 +01001188
1189 assertEquals(undefined, eval('try {throw {foo: 1, bar: 2}} catch({foo}) {}'));
1190 assertEquals(undefined, eval('try {throw [1, 2, 3]} catch([x]) {}'));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001191})();