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

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 that comment 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
« no previous file with comments | « 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 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 Promise.resolve().then(function() {
989 testDone = true;
990 resolve('return!');
991 });
992 }),
993 done: true
994 };
995 };
996
997 let sum = 0;
998 let i = 0;
999 testDone = false;
1000 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1001 sum += x;
1002 if (++i === 2) return { sum, log };
1003 }
1004 }
1005
1006 test = testReturnStatementReturnMethodAwaitIterResult();
1007 assertFalse(testDone);
1008 assertEquals({sum: 3,
1009 log: ['[Symbol.asyncIterator]()',
1010 '.next() -> resolved 1',
1011 '.next() -> resolved 2',
1012 '.return() -> resolved return!' ]},
1013 await test);
1014 assertTrue(testDone);
1015
1016 async function testReturnStatementReturnMethodAwaitRejection(log) {
1017 let collection = [1, 2, 3, 4, 5];
1018 let sync_iter = collection[Symbol.iterator]();
1019 let sum = 0;
1020 sync_iter.return = function() {
1021 return {
1022 value: new Promise(function(resolve, reject) {
1023 Promise.resolve().then(function() {
1024 reject('return! ' + sum);
1025 });
1026 }),
1027 done: true
1028 };
1029 };
1030
1031 let i = 0;
1032 testDone = false;
1033 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1034 sum += x;
1035 if (++i === 2) return { sum, log };
1036 }
1037 }
1038
1039 log = [];
1040 test = testReturnStatementReturnMethodAwaitRejection(log);
1041 assertFalse(testDone);
1042 try {
1043 await test;
1044 } catch (e) {
1045 assertEquals('return! 3', e);
1046 assertEquals(['[Symbol.asyncIterator]()',
1047 '.next() -> resolved 1',
1048 '.next() -> resolved 2',
1049 '.return() -> rejected return! 3'],
1050 log);
1051 testDone = true;
1052 }
1053 assertTrue(testDone, 'Promise should be rejected');
1054
1055 async function testReturnStatementReturnMethodPrimitiveValue(log) {
1056 let collection = [1, 2, 3, 4, 5];
1057 let sync_iter = collection[Symbol.iterator]();
1058 sync_iter.return = function() {
1059 return { value: 'return! primitive!', done: true };
1060 }
1061 let sum = 0;
1062 let i = 0;
1063 testDone = false;
1064 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
1065 sum += x;
1066 if (++i === 2) break;
1067 }
1068 return { sum, log };
1069 }
1070 log = [];
1071 test = testReturnStatementReturnMethodPrimitiveValue(log);
1072 assertFalse(testDone);
1073 try {
1074 await test;
1075 } catch (e) {
1076 assertEquals(['[Symbol.asyncIterator]()',
1077 '.next() -> resolved 1',
1078 '.next() -> resolved 2',
1079 '.return() -> resolved return! primitive!'],
1080 log);
1081 assertInstanceof(e, TypeError);
1082 testDone = true;
1083 }
1084 assertTrue(testDone, 'Promise should be rejected');
1085
1086 async function testThrowStatementReturnMethodNotPresent() {
1087 let log = [];
1088 let collection = [1, 2, 3, 4, 5];
1089 let sum = 0;
1090 let i = 0;
1091 testDone = false;
1092 for await (var x of async(collection, kNext|kThrow, log)) {
1093 sum += x;
1094 if (++i === 3) {
1095 throw { sum, log, toString() { return 'TestError'; } };
1096 }
1097 }
1098 return { sum, log };
1099 }
1100
1101 test = testThrowStatementReturnMethodNotPresent();
1102 assertFalse(testDone);
1103 try {
1104 await test;
1105 } catch (e) {
1106 assertEquals('TestError', e.toString());
1107 assertEquals(6, e.sum);
1108 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1109 '.next() -> resolved 2', '.next() -> resolved 3'
1110 ], e.log);
1111 testDone = true;
1112 }
1113 assertTrue(testDone, 'Awaited Promise should be rejected');
1114
1115 async function testThrowStatementReturnMethodPresent() {
1116 let log = [];
1117 let collection = [1, 2, 3, 4, 5];
1118 let sum = 0;
1119 let i = 0;
1120 testDone = false;
1121 for await (var x of async(collection, kNext|kThrow|kReturn, log)) {
1122 sum += x;
1123 if (++i === 2) {
1124 throw { sum, log, toString() { return 'TestError2'; } };
1125 }
1126 }
1127 return { sum, log };
1128 }
1129
1130 test = testThrowStatementReturnMethodPresent();
1131 assertFalse(testDone);
1132 try {
1133 await test;
1134 } catch (e) {
1135 assertEquals('TestError2', e.toString());
1136 assertEquals(3, e.sum);
1137 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
1138 '.next() -> resolved 2', '.return(undefined)'
1139 ], e.log);
1140 testDone = true;
1141 }
1142 assertTrue(testDone, 'Awaited Promise should be rejected');
1143
1144 async function testThrowStatementReturnMethodAwaitIterResult(log) {
1145 let collection = [1, 2, 3, 4, 5];
1146 let sync_iter = collection[Symbol.iterator]();
1147 sync_iter.return = function() {
1148 return {
1149 value: new Promise(function(resolve, reject) {
1150 Promise.resolve().then(function() {
1151 testDone = true;
1152 resolve('throw!');
1153 });
1154 }),
1155 done: true
1156 };
1157 };
1158
1159 let sum = 0;
1160 let i = 0;
1161 testDone = false;
1162 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1163 sum += x;
1164 if (++i === 2) throw 'Boo!!';
1165 }
1166 }
1167
1168 log = [];
1169 test = testThrowStatementReturnMethodAwaitIterResult(log);
1170 assertFalse(testDone);
1171
1172 try {
1173 await test;
1174 } catch (e) {
1175 assertEquals('Boo!!', e);
1176 assertEquals(['[Symbol.asyncIterator]()',
1177 '.next() -> resolved 1',
1178 '.next() -> resolved 2',
1179 '.return() -> resolved throw!' ], log);
1180 testDone = true;
1181 }
1182 assertTrue(testDone, 'Awaited Promise should be rejected');
1183
1184 async function testThrowStatementReturnMethodAwaitRejection(log) {
1185 let collection = [1, 2, 3, 4, 5];
1186 let sync_iter = collection[Symbol.iterator]();
1187 let sum = 0;
1188 sync_iter.return = function() {
1189 return {
1190 value: new Promise(function(resolve, reject) {
1191 Promise.resolve().then(function() {
1192 reject('return! ' + sum);
1193 });
1194 }),
1195 done: true
1196 };
1197 };
1198
1199 let i = 0;
1200 testDone = false;
1201 for await (var x of async(sync_iter, kNext|kReturn, log)) {
1202 sum += x;
1203 if (++i === 2) throw 'Boo!!';
1204 }
1205 }
1206
1207 log = [];
1208 test = testThrowStatementReturnMethodAwaitRejection(log);
1209 assertFalse(testDone);
1210 try {
1211 await test;
1212 } catch (e) {
1213 assertEquals('Boo!!', e);
1214 assertEquals(['[Symbol.asyncIterator]()',
1215 '.next() -> resolved 1',
1216 '.next() -> resolved 2',
1217 '.return() -> rejected return! 3'],
1218 log);
1219 testDone = true;
1220 }
1221 assertTrue(testDone, 'Promise should be rejected');
1222
1223 async function testThrowStatementReturnMethodPrimitiveValue(log) {
1224 let collection = [1, 2, 3, 4, 5];
1225 let sync_iter = collection[Symbol.iterator]();
1226 sync_iter.return = function() {
1227 return { value: 'return! primitive!', done: true };
1228 }
1229 let sum = 0;
1230 let i = 0;
1231 testDone = false;
1232 for await (var x of async(sync_iter, kNext|kReturnPrimitive, log)) {
1233 sum += x;
1234 if (++i === 2) throw 'Boo!!';
1235 }
1236 }
1237 log = [];
1238 test = testThrowStatementReturnMethodPrimitiveValue(log);
1239 assertFalse(testDone);
1240 try {
1241 await test;
1242 } catch (e) {
1243 assertEquals(['[Symbol.asyncIterator]()',
1244 '.next() -> resolved 1',
1245 '.next() -> resolved 2',
1246 '.return() -> resolved return! primitive!'],
1247 log);
1248
1249 // AsyncIteratorClose does not require Throw completions to be of type
1250 // Object
1251 assertEquals('Boo!!', e);
1252 testDone = true;
1253 }
1254 assertTrue(testDone, 'Promise should be rejected');
1255 })().catch(function(error) {
1256 testFailed = true;
1257 testFailure = error;
1258 });
1259
1260 %RunMicrotasks();
1261
1262 if (testFailed) {
1263 throw testFailure;
1264 }
OLDNEW
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698