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

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: Rebase now that try/finally is fixed Created 3 years, 10 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
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 let threwEarly = false;
273 test = testObjectBindingPatternLetDeclarationBlockStatement();
274 assertFalse(testDone);
275 assertEquals(
276 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
277 assertTrue(testDone);
278
279 async function testObjectBindingPatternTDZLetDeclarationStatement() {
280 // See https://codereview.chromium.org/1218543003
281 let sum = 0;
282 testDone = false;
283 let value = { value: 1 };
284 try {
285 for await (let {value} of async([value])) sum += value;
286 } catch (error) {
287 threwEarly = true;
288 throw { sum, error, toString() { return 'TestError' } };
289 }
290 }
291
292 test = testObjectBindingPatternTDZLetDeclarationStatement();
293 assertTrue(threwEarly, 'Async function promise should be rejected');
294 try {
295 await test;
296 } catch (e) {
297 assertEquals('TestError', e.toString());
298 assertEquals(0, e.sum);
299 assertInstanceof(e.error, ReferenceError);
300 testDone = true;
301 }
302 assertTrue(testDone, 'Awaited promise should be rejected');
303
304 async function testObjectBindingPatternTDZLetDeclarationBlockStatement() {
305 // See https://codereview.chromium.org/1218543003
306 let sum = 0;
307 testDone = false;
308 let value = { value: 1 };
309 try {
310 for await (let {value} of async([value])) {
311 sum += value;
312 }
313 } catch (error) {
314 threwEarly = true;
315 throw { sum, error, toString() { return 'TestError' } };
316 }
317 }
318
319 threwEarly = false;
320 test = testObjectBindingPatternTDZLetDeclarationBlockStatement();
321 assertTrue(threwEarly, 'Async function promise should be rejected');
322 try {
323 await test;
324 } catch (e) {
325 assertEquals('TestError', e.toString());
326 assertEquals(0, e.sum);
327 assertInstanceof(e.error, ReferenceError);
328 testDone = true;
329 }
330 assertTrue(testDone, 'Awaited promise should be rejected');
331
332 async function testArrayBindingPatternLetDeclarationStatement() {
333 let sum = 0, keys = [];
334 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
335 testDone = false;
336 for await (let [key = 'unknown', value] of async(collection))
337 keys.push(key), sum += value;
338 testDone = true;
339 return {keys, sum};
340 }
341
342 test = testArrayBindingPatternLetDeclarationStatement();
343 assertFalse(testDone);
344 assertEquals(
345 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
346 assertTrue(testDone);
347
348 async function testArrayBindingPatternLetDeclarationBlockStatement() {
349 let sum = 0, keys = [];
350 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
351 testDone = false;
352 for await (let [key = 'unknown', value] of async(collection)) {
353 'use strict';
354 let strict = (function() { return this === undefined; })();
355 assertFalse(strict);
356 keys.push(key);
357 sum += value;
358 }
359 testDone = true;
360 return {keys, sum};
361 }
362
363 test = testArrayBindingPatternLetDeclarationBlockStatement();
364 assertFalse(testDone);
365 assertEquals(
366 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
367 assertTrue(testDone);
368
369 async function testArrayBindingPatternTDZLetDeclarationStatement() {
370 // See https://codereview.chromium.org/1218543003
371 let sum = 0;
372 testDone = false;
373 let value = [1];
374 try {
375 for await (let [value] of async([value])) sum += value;
376 } catch (error) {
377 threwEarly = true;
378 throw { sum, error, toString() { return 'TestError' } };
379 }
380 }
381
382 threwEarly = false;
383 test = testArrayBindingPatternTDZLetDeclarationStatement();
384 assertTrue(threwEarly, 'Async function promise should be rejected');
385 try {
386 await test;
387 } catch (e) {
388 assertEquals('TestError', e.toString());
389 assertEquals(0, e.sum);
390 assertInstanceof(e.error, ReferenceError);
391 testDone = true;
392 }
393 assertTrue(testDone, 'Awaited promise should be rejected');
394
395 async function testArrayBindingPatternTDZLetDeclarationBlockStatement() {
396 // See https://codereview.chromium.org/1218543003
397 let sum = 0;
398 testDone = false;
399 let value = [1];
400 try {
401 for await (let [value] of async([value])) {
402 sum += value;
403 }
404 } catch (error) {
405 threwEarly = true;
406 throw { sum, error, toString() { return 'TestError' } };
407 }
408 }
409
410 threwEarly = false;
411 test = testArrayBindingPatternTDZLetDeclarationBlockStatement();
412 assertTrue(threwEarly, 'Async function promise should be rejected');
413 try {
414 await test;
415 } catch (e) {
416 assertEquals('TestError', e.toString());
417 assertEquals(0, e.sum);
418 assertInstanceof(e.error, ReferenceError);
419 testDone = true;
420 }
421 assertTrue(testDone, 'Awaited promise should be rejected');
422
423 // --------------------------------------------------------------------------
424
425 async function testBindingIdentifierConstDeclarationStatement() {
426 let sum = 0;
427 testDone = false;
428 for await (let value of async([100, 200, 300, 400, 500])) sum += value;
429 testDone = true;
430 return sum;
431 }
432
433 test = testBindingIdentifierConstDeclarationStatement();
434 assertFalse(testDone);
435 assertEquals(1500, await test);
436 assertTrue(testDone);
437
438 async function testBindingIdentifierConstDeclarationBlockStatement() {
439 let sum = 0;
440 testDone = false;
441 for await (const value of async([100, 200, 300, 400, 500])) {
442 'use strict';
443 let strict = (function() { return this === undefined; })();
444 assertFalse(strict);
445 sum += value;
446 }
447 testDone = true;
448 return sum;
449 }
450
451 test = testBindingIdentifierConstDeclarationBlockStatement();
452 assertFalse(testDone);
453 assertEquals(1500, await test);
454 assertTrue(testDone);
455
456 async function testObjectBindingPatternConstDeclarationStatement() {
457 let sum = 0, keys = [];
458 let collection = [
459 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
460 {key: 'last', value: 40}
461 ];
462 testDone = false;
463 for await (const {key = 'unknown', value} of async(collection))
464 keys.push(key), sum += value;
465 testDone = true;
466 return {keys, sum};
467 }
468
469 test = testObjectBindingPatternConstDeclarationStatement();
470 assertFalse(testDone);
471 assertEquals(
472 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
473 assertTrue(testDone);
474
475 async function testObjectBindingPatternConstDeclarationBlockStatement() {
476 let sum = 0, keys = [];
477 let collection = [
478 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
479 {key: 'last', value: 40}
480 ];
481 testDone = false;
482 for await (const {key = 'unknown', value} of async(collection)) {
483 'use strict';
484 let strict = (function() { return this === undefined; })();
485 assertFalse(strict);
486 keys.push(key);
487 sum += value;
488 }
489 testDone = true;
490 return {keys, sum};
491 }
492
493 test = testObjectBindingPatternConstDeclarationBlockStatement();
494 assertFalse(testDone);
495 assertEquals(
496 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
497 assertTrue(testDone);
498
499 async function testObjectBindingPatternTDZConstDeclarationStatement() {
500 // See https://codereview.chromium.org/1218543003
501 let sum = 0;
502 testDone = false;
503 const value = { value: 1 };
504 try {
505 for await (const {value} of async([value])) sum += value;
506 } catch (error) {
507 threwEarly = true;
508 throw { sum, error, toString() { return 'TestError' } };
509 }
510 }
511
512 threwEarly = false;
513 test = testObjectBindingPatternTDZConstDeclarationStatement();
514 assertTrue(threwEarly, 'Async function promise should be rejected');
515 try {
516 await test;
517 } catch (e) {
518 assertEquals('TestError', e.toString());
519 assertEquals(0, e.sum);
520 assertInstanceof(e.error, ReferenceError);
521 testDone = true;
522 }
523 assertTrue(testDone, 'Awaited promise should be rejected');
524
525 async function testObjectBindingPatternTDZConstDeclarationBlockStatement() {
526 // See https://codereview.chromium.org/1218543003
527 let sum = 0;
528 testDone = false;
529 const value = { value: 1 };
530 try {
531 for await (const {value} of async([value])) {
532 sum += value;
533 }
534 } catch (error) {
535 threwEarly = true;
536 throw { sum, error, toString() { return 'TestError' } };
537 }
538 }
539
540 threwEarly = false;
541 test = testObjectBindingPatternTDZConstDeclarationBlockStatement();
542 assertTrue(threwEarly, 'Async function promise should be rejected');
543 try {
544 await test;
545 } catch (e) {
546 assertEquals('TestError', e.toString());
547 assertEquals(0, e.sum);
548 assertInstanceof(e.error, ReferenceError);
549 testDone = true;
550 }
551 assertTrue(testDone, 'Awaited promise should be rejected');
552
553 async function testArrayBindingPatternConstDeclarationStatement() {
554 let sum = 0, keys = [];
555 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
556 testDone = false;
557 for await (const [key = 'unknown', value] of async(collection))
558 keys.push(key), sum += value;
559 testDone = true;
560 return {keys, sum};
561 }
562
563 test = testArrayBindingPatternConstDeclarationStatement();
564 assertFalse(testDone);
565 assertEquals(
566 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
567 assertTrue(testDone);
568
569 async function testArrayBindingPatternConstDeclarationBlockStatement() {
570 let sum = 0, keys = [];
571 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
572 testDone = false;
573 for await (const [key = 'unknown', value] of async(collection)) {
574 'use strict';
575 let strict = (function() { return this === undefined; })();
576 assertFalse(strict);
577 keys.push(key);
578 sum += value;
579 }
580 testDone = true;
581 return {keys, sum};
582 }
583
584 test = testArrayBindingPatternLetDeclarationBlockStatement();
585 assertFalse(testDone);
586 assertEquals(
587 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
588 assertTrue(testDone);
589
590 async function testArrayBindingPatternTDZConstDeclarationStatement() {
591 // See https://codereview.chromium.org/1218543003
592 let sum = 0;
593 testDone = false;
594 const value = [1];
595 try {
596 for await (const [value] of async([value])) sum += value;
597 } catch (error) {
598 threwEarly = true;
599 throw { sum, error, toString() { return 'TestError' } };
600 }
601 }
602
603 threwEarly = false;
604 test = testArrayBindingPatternTDZConstDeclarationStatement();
605 assertTrue(threwEarly, 'Async function promise should be rejected');
606 try {
607 await test;
608 } catch (e) {
609 assertEquals('TestError', e.toString());
610 assertEquals(0, e.sum);
611 assertInstanceof(e.error, ReferenceError);
612 testDone = true;
613 }
614 assertTrue(testDone, 'Awaited promise should be rejected');
615
616 async function testArrayBindingPatternTDZConstDeclarationBlockStatement() {
617 // See https://codereview.chromium.org/1218543003
618 let sum = 0;
619 testDone = false;
620 const value = [1];
621 try {
622 for await (const [value] of async([value])) {
623 sum += value;
624 }
625 } catch (error) {
626 threwEarly = true;
627 throw { sum, error, toString() { return 'TestError' } };
628 }
629 }
630
631 threwEarly = false;
632 test = testArrayBindingPatternTDZConstDeclarationBlockStatement();
633 assertTrue(threwEarly, 'Async function promise should be rejected');
634 try {
635 await test;
636 } catch (e) {
637 assertEquals('TestError', e.toString());
638 assertEquals(0, e.sum);
639 assertInstanceof(e.error, ReferenceError);
640 testDone = true;
641 }
642 assertTrue(testDone, 'Awaited promise should be rejected');
643
644 // --------------------------------------------------------------------------
645
646 async function testBindingIdentifierLHSStatement() {
647 let sum = 0;
648 let value;
649 testDone = false;
650 for await (value of async([100, 200, 300, 400, 500])) sum += value;
651 testDone = true;
652 return sum;
653 }
654
655 test = testBindingIdentifierLHSStatement();
656 assertFalse(testDone);
657 assertEquals(1500, await test);
658 assertTrue(testDone);
659
660 async function testBindingIdentifierLHSBlockStatement() {
661 let sum = 0;
662 let value;
663 testDone = false;
664 for await (value of async([100, 200, 300, 400, 500])) {
665 'use strict';
666 let strict = (function() { return this === undefined; })();
667 assertFalse(strict);
668 sum += value;
669 }
670 testDone = true;
671 return sum;
672 }
673
674 test = testBindingIdentifierLHSStatement();
675 assertFalse(testDone);
676 assertEquals(1500, await test);
677 assertTrue(testDone);
678
679 async function testObjectBindingPatternLHSStatement() {
680 let sum = 0;
681 let keys = [];
682 let value;
683 let key;
684 let collection = [
685 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
686 {key: 'last', value: 4}
687 ];
688 testDone = false;
689 for await ({key = 'unknown', value} of async(collection))
690 keys.push(key), sum += value;
691 testDone = true;
692 return {keys, sum};
693 }
694
695 test = testObjectBindingPatternLHSStatement();
696 assertFalse(testDone);
697 assertEquals(
698 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
699 assertTrue(testDone);
700
701 async function testObjectBindingPatternLHSBlockStatement() {
702 let sum = 0;
703 let keys = [];
704 let value;
705 let key;
706 let collection = [
707 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
708 {key: 'last', value: 4}
709 ];
710 testDone = false;
711 for await ({key = 'unknown', value} of async(collection)) {
712 'use strict';
713 let strict = (function() { return this === undefined; })();
714 assertFalse(strict);
715 keys.push(key);
716 sum += value;
717 }
718 testDone = true;
719 return {keys, sum};
720 }
721
722 test = testObjectBindingPatternLHSBlockStatement();
723 assertFalse(testDone);
724 assertEquals(
725 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
726 assertTrue(testDone);
727
728 async function testArrayBindingPatternLHSStatement() {
729 let sum = 0;
730 let keys = [];
731 let value;
732 let key;
733 let collection = [['first', 1], [undefined, 2], [, 3], ['last', 4]];
734 testDone = false;
735 for await ([key = 'unknown', value] of async(collection)) {
736 'use strict';
737 let strict = (function() { return this === undefined; })();
738 assertFalse(strict);
739 keys.push(key);
740 sum += value;
741 }
742 testDone = true;
743 return {keys, sum};
744 }
745
746 test = testArrayBindingPatternLHSStatement();
747 assertFalse(testDone);
748 assertEquals(
749 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
750 assertTrue(testDone);
751
752 async function testArrayBindingPatternLHSBlockStatement() {
753 let sum = 0;
754 let keys = [];
755 let value;
756 let key;
757 let collection = [
758 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
759 {key: 'last', value: 4}
760 ];
761 testDone = false;
762 for await ({key = 'unknown', value} of async(collection)) {
763 'use strict';
764 let strict = (function() { return this === undefined; })();
765 assertFalse(strict);
766 keys.push(key);
767 sum += value;
768 }
769 testDone = true;
770 return {keys, sum};
771 }
772
773 test = testArrayBindingPatternLHSBlockStatement();
774 assertFalse(testDone);
775 assertEquals(
776 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
777 assertTrue(testDone);
778
779 // --------------------------------------------------------------------------
780
781 async function testBreakStatementReturnMethodNotPresent() {
782 let log = [];
783 let collection = [1, 2, 3, 4, 5];
784 let sum = 0;
785 let i = 0;
786 testDone = false;
787 for await (var x of async(collection, kNext, log)) {
788 sum += x;
789 if (++i === 3) break;
790 }
791 testDone = true;
792 return { sum, log };
793 }
794
795 test = testBreakStatementReturnMethodNotPresent();
796 assertFalse(testDone);
797 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
798 '.next() -> resolved 1',
799 '.next() -> resolved 2',
800 '.next() -> resolved 3']},
801 await test);
802 assertTrue(testDone);
803
804 async function testBreakStatementReturnMethodPresent() {
805 let log = [];
806 let collection = [1, 2, 3, 4, 5];
807 let sum = 0;
808 let i = 0;
809 testDone = false;
810 for await (var x of async(collection, kNext|kReturn, log)) {
811 sum += x;
812 if (++i === 2) break;
813 }
814 testDone = true;
815 return { sum, log };
816 }
817
818 test = testBreakStatementReturnMethodPresent();
819 assertFalse(testDone);
820 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
821 '.next() -> resolved 1',
822 '.next() -> resolved 2',
823 '.return(undefined)']},
824 await test);
825 assertTrue(testDone);
826
827 async function testBreakStatementReturnMethodAwaitIterResult() {
828 let log = [];
829 let collection = [1, 2, 3, 4, 5];
830 let sync_iter = collection[Symbol.iterator]();
831 sync_iter.return = function() {
832 return {
833 value: new Promise(function(resolve, reject) {
834 Promise.resolve().then(function() {
835 resolve('break!');
836 });
837 }),
838 done: true
839 };
840 };
841
842 let sum = 0;
843 let i = 0;
844 testDone = false;
845 for await (var x of async(sync_iter, kNext|kReturn, log)) {
846 sum += x;
847 if (++i === 2) break;
848 }
849 testDone = true;
850 return { sum, log };
851 }
852
853 test = testBreakStatementReturnMethodAwaitIterResult();
854 assertFalse(testDone);
855 assertEquals({sum: 3,
856 log: ['[Symbol.asyncIterator]()',
857 '.next() -> resolved 1',
858 '.next() -> resolved 2',
859 '.return() -> resolved break!' ]},
860 await test);
861 assertTrue(testDone);
862
863 async function testBreakStatementReturnMethodAwaitRejection(log) {
864 let collection = [1, 2, 3, 4, 5];
865 let sync_iter = collection[Symbol.iterator]();
866 let sum = 0;
867 sync_iter.return = function() {
868 return {
869 value: new Promise(function(resolve, reject) {
870 Promise.resolve().then(function() {
871 reject('break! ' + sum);
872 });
873 }),
874 done: true
875 };
876 };
877
878 let i = 0;
879 testDone = false;
880 for await (var x of async(sync_iter, kNext|kReturn, log)) {
881 sum += x;
882 if (++i === 2) break;
883 }
884 return { sum, log };
885 }
886
887 let log = [];
888 test = testBreakStatementReturnMethodAwaitRejection(log);
889 assertFalse(testDone);
890 try {
891 await test;
892 } catch (e) {
893 assertEquals(log, ['[Symbol.asyncIterator]()',
894 '.next() -> resolved 1',
895 '.next() -> resolved 2',
896 '.return() -> rejected break! 3']);
897 assertEquals('break! 3', e);
898 testDone = true;
899 }
900 assertTrue(testDone, 'Promise should be rejected');
901
902 async function testBreakStatementReturnMethodPrimitiveValue(log) {
903 let collection = [1, 2, 3, 4, 5];
904 let sync_iter = collection[Symbol.iterator]();
905 sync_iter.return = function() {
906 return { value: 'break! primitive!', done: true };
907 }
908 let sum = 0;
909 let i = 0;
910 testDone = false;
911 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
912 sum += x;
913 if (++i === 2) break;
914 }
915 return { sum, log };
916 }
917 log = [];
918 test = testBreakStatementReturnMethodPrimitiveValue(log);
919 assertFalse(testDone);
920 try {
921 await test;
922 } catch (e) {
923 assertEquals(['[Symbol.asyncIterator]()',
924 '.next() -> resolved 1',
925 '.next() -> resolved 2',
926 '.return() -> resolved break! primitive!'],
927 log);
928 assertInstanceof(e, TypeError);
929 testDone = true;
930 }
931 assertTrue(testDone, 'Promise should be rejected');
932
933 async function testReturnStatementReturnMethodNotPresent() {
934 let log = [];
935 let collection = [1, 2, 3, 4, 5];
936 let sum = 0;
937 let i = 0;
938 testDone = false;
939 for await (var x of async(collection, kNext, log)) {
940 sum += x;
941 if (++i === 3) {
942 testDone = true;
943 return { sum, log };
944 }
945 }
946 }
947
948 test = testReturnStatementReturnMethodNotPresent();
949 assertFalse(testDone);
950 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
951 '.next() -> resolved 1',
952 '.next() -> resolved 2',
953 '.next() -> resolved 3']},
954 await test);
955 assertTrue(testDone);
956
957 async function testReturnStatementReturnMethodPresent() {
958 let log = [];
959 let collection = [1, 2, 3, 4, 5];
960 let sum = 0;
961 let i = 0;
962 testDone = false;
963 for await (var x of async(collection, kNext|kReturn, log)) {
964 sum += x;
965 if (++i === 2) {
966 testDone = true;
967 return { sum, log };
968 }
969 }
970 }
971
972 test = testReturnStatementReturnMethodPresent();
973 assertFalse(testDone);
974 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
975 '.next() -> resolved 1',
976 '.next() -> resolved 2',
977 '.return(undefined)']},
978 await test);
979 assertTrue(testDone);
980
981 async function testReturnStatementReturnMethodAwaitIterResult() {
982 let log = [];
983 let collection = [1, 2, 3, 4, 5];
984 let sync_iter = collection[Symbol.iterator]();
985 sync_iter.return = function() {
986 return {
987 value: new Promise(function(resolve, reject) {
988 // TODO(caitp): This does not work with the current implementation of
989 // return statements in AsyncFunctions, which desugar to simply
990 // resolving the internal .promise variable, without waiting for
991 // IteratorClose to do its work.
992 //Promise.resolve().then(function() {
993 testDone = true;
994 resolve('return!');
995 //});
996 }),
997 done: true
998 };
999 };
1000
1001 let sum = 0;
1002 let i = 0;
1003 testDone = false;
1004 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1005 sum += x;
1006 if (++i === 2) return { sum, log };
1007 }
1008 }
1009
1010 test = testReturnStatementReturnMethodAwaitIterResult();
1011 assertFalse(testDone);
1012 assertEquals({sum: 3,
1013 log: ['[Symbol.asyncIterator]()',
1014 '.next() -> resolved 1',
1015 '.next() -> resolved 2',
1016 '.return() -> resolved return!' ]},
1017 await test);
1018 assertTrue(testDone);
1019
1020 async function testReturnStatementReturnMethodAwaitRejection(log) {
1021 let collection = [1, 2, 3, 4, 5];
1022 let sync_iter = collection[Symbol.iterator]();
1023 let sum = 0;
1024 sync_iter.return = function() {
1025 return {
1026 value: new Promise(function(resolve, reject) {
1027 Promise.resolve().then(function() {
1028 reject('return! ' + sum);
1029 });
1030 }),
1031 done: true
1032 };
1033 };
1034
1035 let i = 0;
1036 testDone = false;
1037 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1038 sum += x;
1039 if (++i === 2) return { sum, log };
1040 }
1041 }
1042
1043 // TODO(caitp): This does not work with the current implementation of return
1044 // statements in AsyncFunctions, which desugar to simply resolving. This
1045 // prevents the rejection in IteratorClose from taking any effect.
1046 //
1047 // log = [];
1048 // test = testReturnStatementReturnMethodAwaitRejection(log);
1049 // assertFalse(testDone);
1050 // try {
1051 // await test;
1052 // } catch (e) {
1053 // assertEquals('return! 3', e);
1054 // assertEquals(['[Symbol.asyncIterator]()',
1055 // '.next() -> resolved 1',
1056 // '.next() -> resolved 2',
1057 // '.return() -> rejected return! 3'],
1058 // log);
1059 // testDone = true;
1060 // }
1061 // assertTrue(testDone, 'Promise should be rejected');
1062
1063 async function testReturnStatementReturnMethodPrimitiveValue(log) {
1064 let collection = [1, 2, 3, 4, 5];
1065 let sync_iter = collection[Symbol.iterator]();
1066 sync_iter.return = function() {
1067 return { value: 'return! primitive!', done: true };
1068 }
1069 let sum = 0;
1070 let i = 0;
1071 testDone = false;
1072 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
1073 sum += x;
1074 if (++i === 2) break;
1075 }
1076 return { sum, log };
1077 }
1078 log = [];
1079 test = testReturnStatementReturnMethodPrimitiveValue(log);
1080 assertFalse(testDone);
1081 try {
1082 await test;
1083 } catch (e) {
1084 assertEquals(['[Symbol.asyncIterator]()',
1085 '.next() -> resolved 1',
1086 '.next() -> resolved 2',
1087 '.return() -> resolved return! primitive!'],
1088 log);
1089 assertInstanceof(e, TypeError);
1090 testDone = true;
1091 }
1092 assertTrue(testDone, 'Promise should be rejected');
1093
1094 async function testThrowStatementReturnMethodNotPresent() {
1095 let log = [];
1096 let collection = [1, 2, 3, 4, 5];
1097 let sum = 0;
1098 let i = 0;
1099 testDone = false;
1100 for await (var x of async(collection, kNext|kThrow, log)) {
1101 sum += x;
1102 if (++i === 3) {
1103 throw { sum, log, toString() { return 'TestError'; } };
1104 }
1105 }
1106 return { sum, log };
1107 }
1108
1109 test = testThrowStatementReturnMethodNotPresent();
1110 assertFalse(testDone);
1111 try {
1112 await test;
1113 } catch (e) {
1114 assertEquals('TestError', e.toString());
1115 assertEquals(6, e.sum);
1116 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1117 '.next() -> resolved 2', '.next() -> resolved 3'
1118 ], e.log);
1119 testDone = true;
1120 }
1121 assertTrue(testDone, 'Awaited Promise should be rejected');
1122
1123 async function testThrowStatementReturnMethodPresent() {
1124 let log = [];
1125 let collection = [1, 2, 3, 4, 5];
1126 let sum = 0;
1127 let i = 0;
1128 testDone = false;
1129 for await (var x of async(collection, kNext|kThrow|kReturn, log)) {
1130 sum += x;
1131 if (++i === 2) {
1132 throw { sum, log, toString() { return 'TestError2'; } };
1133 }
1134 }
1135 return { sum, log };
1136 }
1137
1138 test = testThrowStatementReturnMethodPresent();
1139 assertFalse(testDone);
1140 try {
1141 await test;
1142 } catch (e) {
1143 assertEquals('TestError2', e.toString());
1144 assertEquals(3, e.sum);
1145 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1146 '.next() -> resolved 2', '.return(undefined)'
1147 ], e.log);
1148 testDone = true;
1149 }
1150 assertTrue(testDone, 'Awaited Promise should be rejected');
1151
1152 async function testThrowStatementReturnMethodAwaitIterResult(log) {
1153 let collection = [1, 2, 3, 4, 5];
1154 let sync_iter = collection[Symbol.iterator]();
1155 sync_iter.return = function() {
1156 return {
1157 value: new Promise(function(resolve, reject) {
1158 Promise.resolve().then(function() {
1159 testDone = true;
1160 resolve('throw!');
1161 });
1162 }),
1163 done: true
1164 };
1165 };
1166
1167 let sum = 0;
1168 let i = 0;
1169 testDone = false;
1170 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1171 sum += x;
1172 if (++i === 2) throw 'Boo!!';
1173 }
1174 }
1175
1176 log = [];
1177 test = testThrowStatementReturnMethodAwaitIterResult(log);
1178 assertFalse(testDone);
1179
1180 try {
1181 await test;
1182 } catch (e) {
1183 assertEquals('Boo!!', e);
1184 assertEquals(['[Symbol.asyncIterator]()',
1185 '.next() -> resolved 1',
1186 '.next() -> resolved 2',
1187 '.return() -> resolved throw!' ], log);
1188 testDone = true;
1189 }
1190 assertTrue(testDone, 'Awaited Promise should be rejected');
1191
1192 async function testThrowStatementReturnMethodAwaitRejection(log) {
1193 let collection = [1, 2, 3, 4, 5];
1194 let sync_iter = collection[Symbol.iterator]();
1195 let sum = 0;
1196 sync_iter.return = function() {
1197 return {
1198 value: new Promise(function(resolve, reject) {
1199 Promise.resolve().then(function() {
1200 reject('return! ' + sum);
1201 });
1202 }),
1203 done: true
1204 };
1205 };
1206
1207 let i = 0;
1208 testDone = false;
1209 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1210 sum += x;
1211 if (++i === 2) throw 'Boo!!';
1212 }
1213 }
1214
1215 log = [];
1216 test = testThrowStatementReturnMethodAwaitRejection(log);
1217 assertFalse(testDone);
1218 try {
1219 await test;
1220 } catch (e) {
1221 assertEquals('Boo!!', e);
1222 assertEquals(['[Symbol.asyncIterator]()',
1223 '.next() -> resolved 1',
1224 '.next() -> resolved 2',
1225 '.return() -> rejected return! 3'],
1226 log);
1227 testDone = true;
1228 }
1229 assertTrue(testDone, 'Promise should be rejected');
1230
1231 async function testThrowStatementReturnMethodPrimitiveValue(log) {
1232 let collection = [1, 2, 3, 4, 5];
1233 let sync_iter = collection[Symbol.iterator]();
1234 sync_iter.return = function() {
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 } catch (e) {
1251 assertEquals(['[Symbol.asyncIterator]()',
1252 '.next() -> resolved 1',
1253 '.next() -> resolved 2',
1254 '.return() -> resolved return! primitive!'],
1255 log);
1256
1257 // AsyncIteratorClose does not require Throw completions to be of type
1258 // Object
1259 assertEquals('Boo!!', e);
1260 testDone = true;
1261 }
1262 assertTrue(testDone, 'Promise should be rejected');
1263 })().catch(function(error) {
1264 testFailed = true;
1265 testFailure = error;
1266 });
1267
1268 %RunMicrotasks();
1269
1270 if (testFailed) {
1271 throw testFailure;
1272 }
OLDNEW
« src/interpreter/constant-array-builder.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