Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: test/mjsunit/harmony/for-await-of.js

Issue 2637403008: [async-iteration] add support for for-await-of loops in Async Functions (Closed)
Patch Set: remove changes to ParserTarget / PreParserTarget Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/parsing/parser.cc ('K') | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 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.
4
5 // Flags: --harmony-async-iteration --allow-natives-syntax
6
7 let testFailed = false;
8 let testFailure;
9 (async function() {
10 const kNext = 1;
11 const kThrow = 2;
12 const kReturn = 4;
13 const kReturnPrimitive = kReturn | 32;
14
15 function async(iterable, features = kNext, log = []) {
16 // Helper to turn a synchronous iterable into an asynchronous iterable,
17 // without using the [Async-from-Sync Iterator].
18 let it = iterable[Symbol.iterator]();
19 let methods = {
20 next(sentValue) {
21 return new Promise(function(resolve, reject) {
22 let {value, done} = it.next(sentValue);
23 Promise.resolve(value).then(function(value) {
24 log.push('.next() -> resolved ' + value);
25 resolve({value, done});
26 }, function(value) {
27 log.push('.next() -> rejected ' + value);
28 reject(value);
29 });
30 });
31 },
32
33 throw(sentValue) {
34 return new Promise(function(resolve, reject) {
35 let throwMethod = it.throw;
36 if (typeof throwMethod !== 'function') {
37 log.push('.throw(' + sentValue + ')');
38 return reject(sentValue);
39 }
40
41 let {value, done} = throwMethod.call(it, sentValue);
42 Promise.resolve(value).then(function(value) {
43 log.push('.throw() -> resolved ' + value);
44 resolve({ value, done });
45 }, function(value) {
46 log.push('.throw() -> rejected ' + value);
47 reject(value);
48 });
49 });
50 },
51
52 return(sentValue) {
53 return new Promise(function(resolve, reject) {
54 let returnMethod = it.return;
55 if (typeof returnMethod !== 'function') {
56 log.push('.return(' + sentValue + ')');
57 if ((features & kReturnPrimitive) === kReturnPrimitive)
58 return resolve(sentValue);
59 return resolve({value: sentValue, done: true});
60 }
61
62 let {value, done} = returnMethod.call(it, sentValue);
63 Promise.resolve(value).then(function(value) {
64 log.push('.return() -> resolved ' + value);
65 if ((features & kReturnPrimitive) === kReturnPrimitive)
66 return resolve(value);
67 resolve({ value, done });
68 }, function(value) {
69 log.push('.return() -> rejected ' + value);
70 reject(value);
71 });
72 });
73 }
74 };
75
76
77 return {
78 [Symbol.asyncIterator]() {
79 log.push('[Symbol.asyncIterator]()')
80 return this;
81 },
82
83 next: (features & kNext) ? methods.next : undefined,
84 throw: (features & kThrow) ? methods.throw : undefined,
85 return: (features & kReturn) ? methods.return : undefined
86 };
87 }
88
89 let testDone;
90 let test;
91 async function testBindingIdentifierVarDeclarationStatement() {
92 let sum = 0;
93 testDone = false;
94 for await (var value of async([100, 200, 300, 400, 500])) sum += value;
95 testDone = true;
96 return sum;
97 }
98
99 test = testBindingIdentifierVarDeclarationStatement();
100 assertFalse(testDone);
101 assertEquals(1500, await test);
102 assertTrue(testDone);
103
104 async function testBindingIdentifierVarDeclarationBlockStatement() {
105 let sum = 0;
106 testDone = false;
107 for await (var value of async([100, 200, 300, 400, 500])) {
108 'use strict';
109 let strict = (function() { return this === undefined; })();
110 assertFalse(strict);
111 sum += value;
112 }
113 testDone = true;
114 return sum;
115 }
116
117 test = testBindingIdentifierVarDeclarationBlockStatement();
118 assertFalse(testDone);
119 assertEquals(1500, await test);
120 assertTrue(testDone);
121
122 async function testObjectBindingPatternVarDeclarationStatement() {
123 let sum = 0, keys = [];
124 let collection = [
125 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
126 {key: 'last', value: 40}
127 ];
128 testDone = false;
129 for await (var {key = 'unknown', value} of async(collection))
130 keys.push(key), sum += value;
131 testDone = true;
132 return {keys, sum};
133 }
134
135 test = testObjectBindingPatternVarDeclarationStatement();
136 assertFalse(testDone);
137 assertEquals(
138 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
139 assertTrue(testDone);
140
141 async function testObjectBindingPatternVarDeclarationBlockStatement() {
142 let sum = 0, keys = [];
143 let collection = [
144 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
145 {key: 'last', value: 40}
146 ];
147 testDone = false;
148 for await (var {key = 'unknown', value} of async(collection)) {
149 'use strict';
150 let strict = (function() { return this === undefined; })();
151 assertFalse(strict);
152 keys.push(key);
153 sum += value;
154 }
155 testDone = true;
156 return {keys, sum};
157 }
158
159 test = testObjectBindingPatternVarDeclarationBlockStatement();
160 assertFalse(testDone);
161 assertEquals(
162 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
163 assertTrue(testDone);
164
165 async function testArrayBindingPatternVarDeclarationStatement() {
166 let sum = 0, keys = [];
167 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
168 testDone = false;
169 for await (var [key = 'unknown', value] of async(collection))
170 keys.push(key), sum += value;
171 testDone = true;
172 return {keys, sum};
173 }
174
175 test = testArrayBindingPatternVarDeclarationStatement();
176 assertFalse(testDone);
177 assertEquals(
178 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
179 assertTrue(testDone);
180
181 async function testArrayBindingPatternVarDeclarationBlockStatement() {
182 let sum = 0, keys = [];
183 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
184 testDone = false;
185 for await (var [key = 'unknown', value] of async(collection)) {
186 'use strict';
187 let strict = (function() { return this === undefined; })();
188 assertFalse(strict);
189 keys.push(key);
190 sum += value;
191 }
192 testDone = true;
193 return {keys, sum};
194 }
195
196 test = testArrayBindingPatternVarDeclarationBlockStatement();
197 assertFalse(testDone);
198 assertEquals(
199 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
200 assertTrue(testDone);
201
202 // --------------------------------------------------------------------------
203
204 async function testBindingIdentifierLetDeclarationStatement() {
205 let sum = 0;
206 testDone = false;
207 for await (let value of async([100, 200, 300, 400, 500])) sum += value;
208 testDone = true;
209 return sum;
210 }
211
212 test = testBindingIdentifierLetDeclarationStatement();
213 assertFalse(testDone);
214 assertEquals(1500, await test);
215 assertTrue(testDone);
216
217 async function testBindingIdentifierLetDeclarationBlockStatement() {
218 let sum = 0;
219 testDone = false;
220 for await (let value of async([100, 200, 300, 400, 500])) {
221 'use strict';
222 let strict = (function() { return this === undefined; })();
223 assertFalse(strict);
224 sum += value;
225 }
226 testDone = true;
227 return sum;
228 }
229
230 test = testBindingIdentifierLetDeclarationBlockStatement();
231 assertFalse(testDone);
232 assertEquals(1500, await test);
233 assertTrue(testDone);
234
235 async function testObjectBindingPatternLetDeclarationStatement() {
236 let sum = 0, keys = [];
237 let collection = [
238 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
239 {key: 'last', value: 40}
240 ];
241 testDone = false;
242 for await (let {key = 'unknown', value} of async(collection))
243 keys.push(key), sum += value;
244 testDone = true;
245 return {keys, sum};
246 }
247
248 test = testObjectBindingPatternLetDeclarationStatement();
249 assertFalse(testDone);
250 assertEquals(
251 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
252 assertTrue(testDone);
253
254 async function testObjectBindingPatternLetDeclarationBlockStatement() {
255 let sum = 0, keys = [];
256 let collection = [
257 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
258 {key: 'last', value: 40}
259 ];
260 testDone = false;
261 for await (let {key = 'unknown', value} of async(collection)) {
262 'use strict';
263 let strict = (function() { return this === undefined; })();
264 assertFalse(strict);
265 keys.push(key);
266 sum += value;
267 }
268 testDone = true;
269 return {keys, sum};
270 }
271
272 test = testObjectBindingPatternLetDeclarationBlockStatement();
273 assertFalse(testDone);
274 assertEquals(
275 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
276 assertTrue(testDone);
277
278 async function testObjectBindingPatternTDZLetDeclarationStatement() {
279 // See https://codereview.chromium.org/1218543003
280 let sum = 0;
281 testDone = false;
282 let value = { value: 1 };
283 try {
284 for await (let {value} of async([value])) sum += value;
285 } catch (error) {
286 testDone = true;
287 throw { sum, error, toString() { return 'TestError' } };
288 }
289 assertUnreachable('Awaited promise should be rejected');
290 }
291
292 test = testObjectBindingPatternTDZLetDeclarationStatement();
293 assertTrue(testDone); // Promise rejected before first Await
294 try {
295 await test;
296 assertUnreachable('Awaited promise should be rejected');
297 } catch (e) {
298 assertEquals('TestError', e.toString());
299 assertEquals(0, e.sum);
300 assertInstanceof(e.error, ReferenceError);
301 }
302
303 async function testObjectBindingPatternTDZLetDeclarationBlockStatement() {
304 // See https://codereview.chromium.org/1218543003
305 let sum = 0;
306 testDone = false;
307 let value = { value: 1 };
308 try {
309 for await (let {value} of async([value])) {
310 sum += value;
311 }
312 } catch (error) {
313 testDone = true;
314 throw { sum, error, toString() { return 'TestError' } };
315 }
316 assertUnreachable('Awaited promise should be rejected');
317 }
318
319 test = testObjectBindingPatternTDZLetDeclarationBlockStatement();
320 assertTrue(testDone); // Promise rejected before first Await
321 try {
322 await test;
323 assertUnreachable('Awaited promise should be rejected');
324 } catch (e) {
325 assertEquals('TestError', e.toString());
326 assertEquals(0, e.sum);
327 assertInstanceof(e.error, ReferenceError);
328 }
329
330 async function testArrayBindingPatternLetDeclarationStatement() {
331 let sum = 0, keys = [];
332 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
333 testDone = false;
334 for await (let [key = 'unknown', value] of async(collection))
335 keys.push(key), sum += value;
336 testDone = true;
337 return {keys, sum};
338 }
339
340 test = testArrayBindingPatternLetDeclarationStatement();
341 assertFalse(testDone);
342 assertEquals(
343 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
344 assertTrue(testDone);
345
346 async function testArrayBindingPatternLetDeclarationBlockStatement() {
347 let sum = 0, keys = [];
348 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
349 testDone = false;
350 for await (let [key = 'unknown', value] of async(collection)) {
351 'use strict';
352 let strict = (function() { return this === undefined; })();
353 assertFalse(strict);
354 keys.push(key);
355 sum += value;
356 }
357 testDone = true;
358 return {keys, sum};
359 }
360
361 test = testArrayBindingPatternLetDeclarationBlockStatement();
362 assertFalse(testDone);
363 assertEquals(
364 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
365 assertTrue(testDone);
366
367 async function testArrayBindingPatternTDZLetDeclarationStatement() {
368 // See https://codereview.chromium.org/1218543003
369 let sum = 0;
370 testDone = false;
371 let value = [1];
372 try {
373 for await (let [value] of async([value])) sum += value;
374 } catch (error) {
375 testDone = true;
376 throw { sum, error, toString() { return 'TestError' } };
377 }
378 assertUnreachable('Awaited promise should be rejected');
379 }
380
381 test = testArrayBindingPatternTDZLetDeclarationStatement();
382 assertTrue(testDone); // Promise rejected before first Await
383 try {
384 await test;
385 assertUnreachable('Awaited promise should be rejected');
386 } catch (e) {
387 assertEquals('TestError', e.toString());
388 assertEquals(0, e.sum);
389 assertInstanceof(e.error, ReferenceError);
390 }
391
392 async function testArrayBindingPatternTDZLetDeclarationBlockStatement() {
393 // See https://codereview.chromium.org/1218543003
394 let sum = 0;
395 testDone = false;
396 let value = [1];
397 try {
398 for await (let [value] of async([value])) {
399 sum += value;
400 }
401 } catch (error) {
402 testDone = true;
403 throw { sum, error, toString() { return 'TestError' } };
404 }
405 assertUnreachable('Awaited promise should be rejected');
406 }
407
408 test = testArrayBindingPatternTDZLetDeclarationBlockStatement();
409 assertTrue(testDone); // Promise rejected before first Await
410 try {
411 await test;
412 assertUnreachable('Awaited promise should be rejected');
413 } catch (e) {
414 assertEquals('TestError', e.toString());
415 assertEquals(0, e.sum);
416 assertInstanceof(e.error, ReferenceError);
417 }
418
419 // --------------------------------------------------------------------------
420
421 async function testBindingIdentifierConstDeclarationStatement() {
422 let sum = 0;
423 testDone = false;
424 for await (let value of async([100, 200, 300, 400, 500])) sum += value;
425 testDone = true;
426 return sum;
427 }
428
429 test = testBindingIdentifierConstDeclarationStatement();
430 assertFalse(testDone);
431 assertEquals(1500, await test);
432 assertTrue(testDone);
433
434 async function testBindingIdentifierConstDeclarationBlockStatement() {
435 let sum = 0;
436 testDone = false;
437 for await (const value of async([100, 200, 300, 400, 500])) {
438 'use strict';
439 let strict = (function() { return this === undefined; })();
440 assertFalse(strict);
441 sum += value;
442 }
443 testDone = true;
444 return sum;
445 }
446
447 test = testBindingIdentifierConstDeclarationBlockStatement();
448 assertFalse(testDone);
449 assertEquals(1500, await test);
450 assertTrue(testDone);
451
452 async function testObjectBindingPatternConstDeclarationStatement() {
453 let sum = 0, keys = [];
454 let collection = [
455 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
456 {key: 'last', value: 40}
457 ];
458 testDone = false;
459 for await (const {key = 'unknown', value} of async(collection))
460 keys.push(key), sum += value;
461 testDone = true;
462 return {keys, sum};
463 }
464
465 test = testObjectBindingPatternConstDeclarationStatement();
466 assertFalse(testDone);
467 assertEquals(
468 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
469 assertTrue(testDone);
470
471 async function testObjectBindingPatternConstDeclarationBlockStatement() {
472 let sum = 0, keys = [];
473 let collection = [
474 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
475 {key: 'last', value: 40}
476 ];
477 testDone = false;
478 for await (const {key = 'unknown', value} of async(collection)) {
479 'use strict';
480 let strict = (function() { return this === undefined; })();
481 assertFalse(strict);
482 keys.push(key);
483 sum += value;
484 }
485 testDone = true;
486 return {keys, sum};
487 }
488
489 test = testObjectBindingPatternConstDeclarationBlockStatement();
490 assertFalse(testDone);
491 assertEquals(
492 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
493 assertTrue(testDone);
494
495 async function testObjectBindingPatternTDZConstDeclarationStatement() {
496 // See https://codereview.chromium.org/1218543003
497 let sum = 0;
498 testDone = false;
499 const value = { value: 1 };
500 try {
501 for await (const {value} of async([value])) sum += value;
502 } catch (error) {
503 testDone = true;
504 throw { sum, error, toString() { return 'TestError' } };
505 }
506 assertUnreachable('Awaited promise should be rejected');
507 }
508
509 test = testObjectBindingPatternTDZConstDeclarationStatement();
510 assertTrue(testDone); // Promise rejected before first Await
511 try {
512 await test;
513 assertUnreachable('Awaited promise should be rejected');
514 } catch (e) {
515 assertEquals('TestError', e.toString());
516 assertEquals(0, e.sum);
517 assertInstanceof(e.error, ReferenceError);
518 }
519
520 async function testObjectBindingPatternTDZConstDeclarationBlockStatement() {
521 // See https://codereview.chromium.org/1218543003
522 let sum = 0;
523 testDone = false;
524 const value = { value: 1 };
525 try {
526 for await (const {value} of async([value])) {
527 sum += value;
528 }
529 } catch (error) {
530 testDone = true;
531 throw { sum, error, toString() { return 'TestError' } };
532 }
533 assertUnreachable('Awaited promise should be rejected');
534 }
535
536 test = testObjectBindingPatternTDZConstDeclarationBlockStatement();
537 assertTrue(testDone); // Promise rejected before first Await
538 try {
539 await test;
540 assertUnreachable('Awaited promise should be rejected');
541 } catch (e) {
542 assertEquals('TestError', e.toString());
543 assertEquals(0, e.sum);
544 assertInstanceof(e.error, ReferenceError);
545 }
546
547 async function testArrayBindingPatternConstDeclarationStatement() {
548 let sum = 0, keys = [];
549 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
550 testDone = false;
551 for await (const [key = 'unknown', value] of async(collection))
552 keys.push(key), sum += value;
553 testDone = true;
554 return {keys, sum};
555 }
556
557 test = testArrayBindingPatternConstDeclarationStatement();
558 assertFalse(testDone);
559 assertEquals(
560 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
561 assertTrue(testDone);
562
563 async function testArrayBindingPatternConstDeclarationBlockStatement() {
564 let sum = 0, keys = [];
565 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
566 testDone = false;
567 for await (const [key = 'unknown', value] of async(collection)) {
568 'use strict';
569 let strict = (function() { return this === undefined; })();
570 assertFalse(strict);
571 keys.push(key);
572 sum += value;
573 }
574 testDone = true;
575 return {keys, sum};
576 }
577
578 test = testArrayBindingPatternLetDeclarationBlockStatement();
579 assertFalse(testDone);
580 assertEquals(
581 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
582 assertTrue(testDone);
583
584 async function testArrayBindingPatternTDZConstDeclarationStatement() {
585 // See https://codereview.chromium.org/1218543003
586 let sum = 0;
587 testDone = false;
588 const value = [1];
589 try {
590 for await (const [value] of async([value])) sum += value;
591 } catch (error) {
592 testDone = true;
593 throw { sum, error, toString() { return 'TestError' } };
594 }
595 assertUnreachable('Awaited promise should be rejected');
596 }
597
598 test = testArrayBindingPatternTDZConstDeclarationStatement();
599 assertTrue(testDone); // Promise rejected before first Await
600 try {
601 await test;
602 assertUnreachable('Awaited promise should be rejected');
603 } catch (e) {
604 assertEquals('TestError', e.toString());
605 assertEquals(0, e.sum);
606 assertInstanceof(e.error, ReferenceError);
607 }
608
609 async function testArrayBindingPatternTDZConstDeclarationBlockStatement() {
610 // See https://codereview.chromium.org/1218543003
611 let sum = 0;
612 testDone = false;
613 const value = [1];
614 try {
615 for await (const [value] of async([value])) {
616 sum += value;
617 }
618 } catch (error) {
619 testDone = true;
620 throw { sum, error, toString() { return 'TestError' } };
621 }
622 assertUnreachable('Awaited promise should be rejected');
623 }
624
625 test = testArrayBindingPatternTDZConstDeclarationBlockStatement();
626 assertTrue(testDone); // Promise rejected before first Await
627 try {
628 await test;
629 assertUnreachable('Awaited promise should be rejected');
630 } catch (e) {
631 assertEquals('TestError', e.toString());
632 assertEquals(0, e.sum);
633 assertInstanceof(e.error, ReferenceError);
634 }
635
636 // --------------------------------------------------------------------------
637
638 async function testBindingIdentifierLHSStatement() {
639 let sum = 0;
640 let value;
641 testDone = false;
642 for await (value of async([100, 200, 300, 400, 500])) sum += value;
643 testDone = true;
644 return sum;
645 }
646
647 test = testBindingIdentifierLHSStatement();
648 assertFalse(testDone);
649 assertEquals(1500, await test);
650 assertTrue(testDone);
651
652 async function testBindingIdentifierLHSBlockStatement() {
653 let sum = 0;
654 let value;
655 testDone = false;
656 for await (value of async([100, 200, 300, 400, 500])) {
657 'use strict';
658 let strict = (function() { return this === undefined; })();
659 assertFalse(strict);
660 sum += value;
661 }
662 testDone = true;
663 return sum;
664 }
665
666 test = testBindingIdentifierLHSStatement();
667 assertFalse(testDone);
668 assertEquals(1500, await test);
669 assertTrue(testDone);
670
671 async function testObjectBindingPatternLHSStatement() {
672 let sum = 0;
673 let keys = [];
674 let value;
675 let key;
676 let collection = [
677 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
678 {key: 'last', value: 4}
679 ];
680 testDone = false;
681 for await ({key = 'unknown', value} of async(collection))
682 keys.push(key), sum += value;
683 testDone = true;
684 return {keys, sum};
685 }
686
687 test = testObjectBindingPatternLHSStatement();
688 assertFalse(testDone);
689 assertEquals(
690 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
691 assertTrue(testDone);
692
693 async function testObjectBindingPatternLHSBlockStatement() {
694 let sum = 0;
695 let keys = [];
696 let value;
697 let key;
698 let collection = [
699 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
700 {key: 'last', value: 4}
701 ];
702 testDone = false;
703 for await ({key = 'unknown', value} of async(collection)) {
704 'use strict';
705 let strict = (function() { return this === undefined; })();
706 assertFalse(strict);
707 keys.push(key);
708 sum += value;
709 }
710 testDone = true;
711 return {keys, sum};
712 }
713
714 test = testObjectBindingPatternLHSBlockStatement();
715 assertFalse(testDone);
716 assertEquals(
717 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
718 assertTrue(testDone);
719
720 async function testArrayBindingPatternLHSStatement() {
721 let sum = 0;
722 let keys = [];
723 let value;
724 let key;
725 let collection = [['first', 1], [undefined, 2], [, 3], ['last', 4]];
726 testDone = false;
727 for await ([key = 'unknown', value] of async(collection)) {
728 'use strict';
729 let strict = (function() { return this === undefined; })();
730 assertFalse(strict);
731 keys.push(key);
732 sum += value;
733 }
734 testDone = true;
735 return {keys, sum};
736 }
737
738 test = testArrayBindingPatternLHSStatement();
739 assertFalse(testDone);
740 assertEquals(
741 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
742 assertTrue(testDone);
743
744 async function testArrayBindingPatternLHSBlockStatement() {
745 let sum = 0;
746 let keys = [];
747 let value;
748 let key;
749 let collection = [
750 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
751 {key: 'last', value: 4}
752 ];
753 testDone = false;
754 for await ({key = 'unknown', value} of async(collection)) {
755 'use strict';
756 let strict = (function() { return this === undefined; })();
757 assertFalse(strict);
758 keys.push(key);
759 sum += value;
760 }
761 testDone = true;
762 return {keys, sum};
763 }
764
765 test = testArrayBindingPatternLHSBlockStatement();
766 assertFalse(testDone);
767 assertEquals(
768 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
769 assertTrue(testDone);
770
771 // --------------------------------------------------------------------------
772
773 async function testBreakStatementReturnMethodNotPresent() {
774 let log = [];
775 let collection = [1, 2, 3, 4, 5];
776 let sum = 0;
777 let i = 0;
778 testDone = false;
779 for await (var x of async(collection, kNext, log)) {
780 sum += x;
781 if (++i === 3) break;
782 }
783 testDone = true;
784 return { sum, log };
785 }
786
787 test = testBreakStatementReturnMethodNotPresent();
788 assertFalse(testDone);
789 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
790 '.next() -> resolved 1',
791 '.next() -> resolved 2',
792 '.next() -> resolved 3']},
793 await test);
794 assertTrue(testDone);
795
796 async function testBreakStatementReturnMethodPresent() {
797 let log = [];
798 let collection = [1, 2, 3, 4, 5];
799 let sum = 0;
800 let i = 0;
801 testDone = false;
802 for await (var x of async(collection, kNext|kReturn, log)) {
803 sum += x;
804 if (++i === 2) break;
805 }
806 testDone = true;
807 return { sum, log };
808 }
809
810 test = testBreakStatementReturnMethodPresent();
811 assertFalse(testDone);
812 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
813 '.next() -> resolved 1',
814 '.next() -> resolved 2',
815 '.return(undefined)']},
816 await test);
817 assertTrue(testDone);
818
819 async function testBreakStatementReturnMethodAwaitIterResult() {
820 let log = [];
821 let collection = [1, 2, 3, 4, 5];
822 let sync_iter = collection[Symbol.iterator]();
823 sync_iter.return = function() {
824 return {
825 value: new Promise(function(resolve, reject) {
826 Promise.resolve().then(function() {
827 resolve('break!');
828 });
829 }),
830 done: true
831 };
832 };
833
834 let sum = 0;
835 let i = 0;
836 testDone = false;
837 for await (var x of async(sync_iter, kNext|kReturn, log)) {
838 sum += x;
839 if (++i === 2) break;
840 }
841 testDone = true;
842 return { sum, log };
843 }
844
845 test = testBreakStatementReturnMethodAwaitIterResult();
846 assertFalse(testDone);
847 assertEquals({sum: 3,
848 log: ['[Symbol.asyncIterator]()',
849 '.next() -> resolved 1',
850 '.next() -> resolved 2',
851 '.return() -> resolved break!' ]},
852 await test);
853 assertTrue(testDone);
854
855 async function testBreakStatementReturnMethodAwaitRejection(log) {
856 let collection = [1, 2, 3, 4, 5];
857 let sync_iter = collection[Symbol.iterator]();
858 let sum = 0;
859 sync_iter.return = function() {
860 return {
861 value: new Promise(function(resolve, reject) {
862 Promise.resolve().then(function() {
863 testDone = true;
864 reject('break! ' + sum);
865 });
866 }),
867 done: true
868 };
869 };
870
871 let i = 0;
872 testDone = false;
873 for await (var x of async(sync_iter, kNext|kReturn, log)) {
874 sum += x;
875 if (++i === 2) break;
876 }
877 return { sum, log };
878 }
879
880 let log = [];
881 test = testBreakStatementReturnMethodAwaitRejection(log);
882 assertFalse(testDone);
883 try {
884 await test;
885 assertUnreachable('Promise should be rejected');
886 } catch (e) {
887 assertEquals(log, ['[Symbol.asyncIterator]()',
888 '.next() -> resolved 1',
889 '.next() -> resolved 2',
890 '.return() -> rejected break! 3']);
891 assertTrue(testDone);
892 assertEquals('break! 3', e);
893 }
894
895 async function testBreakStatementReturnMethodPrimitiveValue(log) {
896 let collection = [1, 2, 3, 4, 5];
897 let sync_iter = collection[Symbol.iterator]();
898 sync_iter.return = function() {
899 testDone = true;
900 return { value: 'break! primitive!', done: true };
901 }
902 let sum = 0;
903 let i = 0;
904 testDone = false;
905 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
906 sum += x;
907 if (++i === 2) break;
908 }
909 return { sum, log };
910 }
911 log = [];
912 test = testBreakStatementReturnMethodPrimitiveValue(log);
913 assertFalse(testDone);
914 try {
915 await test;
916 assertUnreachable('Promise should be rejected');
917 } catch (e) {
918 assertEquals(['[Symbol.asyncIterator]()',
919 '.next() -> resolved 1',
920 '.next() -> resolved 2',
921 '.return() -> resolved break! primitive!'],
922 log);
923 assertInstanceof(e, TypeError);
924 assertTrue(testDone);
925 }
926
927 async function testReturnStatementReturnMethodNotPresent() {
928 let log = [];
929 let collection = [1, 2, 3, 4, 5];
930 let sum = 0;
931 let i = 0;
932 testDone = false;
933 for await (var x of async(collection, kNext, log)) {
934 sum += x;
935 if (++i === 3) {
936 testDone = true;
937 return { sum, log };
938 }
939 }
940 }
941
942 test = testReturnStatementReturnMethodNotPresent();
943 assertFalse(testDone);
944 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
945 '.next() -> resolved 1',
946 '.next() -> resolved 2',
947 '.next() -> resolved 3']},
948 await test);
949 assertTrue(testDone);
950
951 async function testReturnStatementReturnMethodPresent() {
952 let log = [];
953 let collection = [1, 2, 3, 4, 5];
954 let sum = 0;
955 let i = 0;
956 testDone = false;
957 for await (var x of async(collection, kNext|kReturn, log)) {
958 sum += x;
959 if (++i === 2) {
960 testDone = true;
961 return { sum, log };
962 }
963 }
964 }
965
966 test = testReturnStatementReturnMethodPresent();
967 assertFalse(testDone);
968 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
969 '.next() -> resolved 1',
970 '.next() -> resolved 2',
971 '.return(undefined)']},
972 await test);
973 assertTrue(testDone);
974
975 async function testReturnStatementReturnMethodAwaitIterResult() {
976 let log = [];
977 let collection = [1, 2, 3, 4, 5];
978 let sync_iter = collection[Symbol.iterator]();
979 sync_iter.return = function() {
980 return {
981 value: new Promise(function(resolve, reject) {
982 // TODO(caitp): This does not work with the current implementation of
983 // return statements in AsyncFunctions, which desugar to simply
984 // resolving the internal .promise variable, without waiting for
985 // IteratorClose to do its work.
986 //Promise.resolve().then(function() {
987 testDone = true;
988 resolve('return!');
989 //});
990 }),
991 done: true
992 };
993 };
994
995 let sum = 0;
996 let i = 0;
997 testDone = false;
998 for await (var x of async(sync_iter, kNext|kReturn, log)) {
999 sum += x;
1000 if (++i === 2) return { sum, log };
1001 }
1002 }
1003
1004 test = testReturnStatementReturnMethodAwaitIterResult();
1005 assertFalse(testDone);
1006 assertEquals({sum: 3,
1007 log: ['[Symbol.asyncIterator]()',
1008 '.next() -> resolved 1',
1009 '.next() -> resolved 2',
1010 '.return() -> resolved return!' ]},
1011 await test);
1012 assertTrue(testDone);
1013
1014 async function testReturnStatementReturnMethodAwaitRejection(log) {
1015 let collection = [1, 2, 3, 4, 5];
1016 let sync_iter = collection[Symbol.iterator]();
1017 let sum = 0;
1018 sync_iter.return = function() {
1019 return {
1020 value: new Promise(function(resolve, reject) {
1021 Promise.resolve().then(function() {
1022 testDone = true;
1023 reject('return! ' + sum);
1024 });
1025 }),
1026 done: true
1027 };
1028 };
1029
1030 let i = 0;
1031 testDone = false;
1032 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1033 sum += x;
1034 if (++i === 2) return { sum, log };
1035 }
1036 }
1037
1038 // TODO(caitp): This does not work with the current implementation of return
1039 // statements in AsyncFunctions, which desugar to simply resolving. This
1040 // prevents the rejection in IteratorClose from taking any effect.
1041 //
1042 // log = [];
1043 // test = testReturnStatementReturnMethodAwaitRejection(log);
1044 // assertFalse(testDone);
1045 // try {
1046 // await test;
1047 // assertUnreachable('Promise should be rejected');
1048 // } catch (e) {
1049 // assertEquals('return! 3', e);
1050 // assertEquals(['[Symbol.asyncIterator]()',
1051 // '.next() -> resolved 1',
1052 // '.next() -> resolved 2',
1053 // '.return() -> rejected return! 3'],
1054 // log);
1055 // assertTrue(testDone);
1056 // }
1057
1058 async function testReturnStatementReturnMethodPrimitiveValue(log) {
1059 let collection = [1, 2, 3, 4, 5];
1060 let sync_iter = collection[Symbol.iterator]();
1061 sync_iter.return = function() {
1062 testDone = true;
1063 return { value: 'return! primitive!', done: true };
1064 }
1065 let sum = 0;
1066 let i = 0;
1067 testDone = false;
1068 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
1069 sum += x;
1070 if (++i === 2) break;
1071 }
1072 return { sum, log };
1073 }
1074 log = [];
1075 test = testReturnStatementReturnMethodPrimitiveValue(log);
1076 assertFalse(testDone);
1077 try {
1078 await test;
1079 assertUnreachable('Promise should be rejected');
1080 } catch (e) {
1081 assertEquals(['[Symbol.asyncIterator]()',
1082 '.next() -> resolved 1',
1083 '.next() -> resolved 2',
1084 '.return() -> resolved return! primitive!'],
1085 log);
1086 assertInstanceof(e, TypeError);
1087 assertTrue(testDone);
1088 }
1089
1090 async function testThrowStatementReturnMethodNotPresent() {
1091 let log = [];
1092 let collection = [1, 2, 3, 4, 5];
1093 let sum = 0;
1094 let i = 0;
1095 testDone = false;
1096 for await (var x of async(collection, kNext|kThrow, log)) {
1097 sum += x;
1098 if (++i === 3) {
1099 testDone = true;
1100 throw { sum, log, toString() { return 'TestError'; } };
1101 }
1102 }
1103 return { sum, log };
1104 }
1105
1106 test = testThrowStatementReturnMethodNotPresent();
1107 assertFalse(testDone);
1108 try {
1109 await test;
1110 assertUnreachable('Awaited Promise should be rejected');
1111 } catch (e) {
1112 assertEquals('TestError', e.toString());
1113 assertEquals(6, e.sum);
1114 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1115 '.next() -> resolved 2', '.next() -> resolved 3'
1116 ], e.log);
1117 assertTrue(testDone);
1118 }
1119
1120 async function testThrowStatementReturnMethodPresent() {
1121 let log = [];
1122 let collection = [1, 2, 3, 4, 5];
1123 let sum = 0;
1124 let i = 0;
1125 testDone = false;
1126 for await (var x of async(collection, kNext|kThrow|kReturn, log)) {
1127 sum += x;
1128 if (++i === 2) {
1129 testDone = true;
1130 throw { sum, log, toString() { return 'TestError2'; } };
1131 }
1132 }
1133 return { sum, log };
1134 }
1135
1136 test = testThrowStatementReturnMethodPresent();
1137 assertFalse(testDone);
1138 try {
1139 await test;
1140 assertUnreachable('Awaited Promise should be rejected');
1141 } catch (e) {
1142 assertEquals('TestError2', e.toString());
1143 assertEquals(3, e.sum);
1144 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1145 '.next() -> resolved 2', '.return(undefined)'
1146 ], e.log);
1147 assertTrue(testDone);
1148 }
1149
1150 async function testThrowStatementReturnMethodAwaitIterResult(log) {
1151 let collection = [1, 2, 3, 4, 5];
1152 let sync_iter = collection[Symbol.iterator]();
1153 sync_iter.return = function() {
1154 return {
1155 value: new Promise(function(resolve, reject) {
1156 Promise.resolve().then(function() {
1157 testDone = true;
1158 resolve('throw!');
1159 });
1160 }),
1161 done: true
1162 };
1163 };
1164
1165 let sum = 0;
1166 let i = 0;
1167 testDone = false;
1168 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1169 sum += x;
1170 if (++i === 2) throw 'Boo!!';
1171 }
1172 }
1173
1174 log = [];
1175 test = testThrowStatementReturnMethodAwaitIterResult(log);
1176 assertFalse(testDone);
1177
1178 try {
1179 await test;
1180 assertUnreachable('Awaited Promise should be rejected');
1181 } catch (e) {
1182 assertEquals('Boo!!', e);
1183 assertEquals(['[Symbol.asyncIterator]()',
1184 '.next() -> resolved 1',
1185 '.next() -> resolved 2',
1186 '.return() -> resolved throw!' ], log);
1187 assertTrue(testDone);
1188 }
1189
1190 async function testThrowStatementReturnMethodAwaitRejection(log) {
1191 let collection = [1, 2, 3, 4, 5];
1192 let sync_iter = collection[Symbol.iterator]();
1193 let sum = 0;
1194 sync_iter.return = function() {
1195 return {
1196 value: new Promise(function(resolve, reject) {
1197 Promise.resolve().then(function() {
1198 testDone = true;
1199 reject('return! ' + sum);
1200 });
1201 }),
1202 done: true
1203 };
1204 };
1205
1206 let i = 0;
1207 testDone = false;
1208 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1209 sum += x;
1210 if (++i === 2) throw 'Boo!!';
1211 }
1212 }
1213
1214 log = [];
1215 test = testThrowStatementReturnMethodAwaitRejection(log);
1216 assertFalse(testDone);
1217 try {
1218 await test;
1219 assertUnreachable('Promise should be rejected');
1220 } catch (e) {
1221 assertEquals('return! 3', e);
1222 assertEquals(['[Symbol.asyncIterator]()',
1223 '.next() -> resolved 1',
1224 '.next() -> resolved 2',
1225 '.return() -> rejected return! 3'],
1226 log);
1227 assertTrue(testDone);
1228 }
1229
1230 async function testThrowStatementReturnMethodPrimitiveValue(log) {
1231 let collection = [1, 2, 3, 4, 5];
1232 let sync_iter = collection[Symbol.iterator]();
1233 sync_iter.return = function() {
1234 testDone = true;
1235 return { value: 'return! primitive!', done: true };
1236 }
1237 let sum = 0;
1238 let i = 0;
1239 testDone = false;
1240 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
1241 sum += x;
1242 if (++i === 2) throw 'Boo!!';
1243 }
1244 }
1245 log = [];
1246 test = testThrowStatementReturnMethodPrimitiveValue(log);
1247 assertFalse(testDone);
1248 try {
1249 await test;
1250 assertUnreachable('Promise should be rejected');
1251 } catch (e) {
1252 assertEquals(['[Symbol.asyncIterator]()',
1253 '.next() -> resolved 1',
1254 '.next() -> resolved 2',
1255 '.return() -> resolved return! primitive!'],
1256 log);
1257
1258 // AsyncIteratorClose does not require Throw completions to be of type
1259 // Object
1260 assertEquals(e, 'Boo!!');
1261 assertTrue(testDone);
1262 }
1263 })().catch(function(error) {
1264 testFailed = true;
1265 testFailure = error;
1266 });
1267
1268 %RunMicrotasks();
1269
1270 if (testFailed) {
1271 throw testFailure;
1272 }
OLDNEW
« src/parsing/parser.cc ('K') | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698