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

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: [async-iteration] add support for for-await-of loops in Async Functions 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/runtime/runtime-internal.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
14 function async(iterable, features = kNext, log = []) {
15 // Helper to turn a synchronous iterable into an asynchronous iterable,
16 // without using the [Async-from-Sync Iterator].
17 let it = iterable[Symbol.iterator]();
18 let methods = {
19 next(sentValue) {
20 return new Promise(function(resolve, reject) {
21 let {value, done} = it.next(sentValue);
22 Promise.resolve(value).then(function(value) {
23 log.push('.next() -> resolved ' + value);
24 resolve({value, done});
25 }, function(value) {
26 log.push('.next() -> rejected ' + value);
27 reject(value);
28 });
29 });
30 },
31
32 throw(sentValue) {
33 return new Promise(function(resolve, reject) {
34 let throwMethod = it.throw;
35 if (typeof throwMethod !== 'function') {
36 log.push('.throw(' + sentValue + ')');
37 return reject(sentValue);
38 }
39
40 let {value, done} = throwMethod.call(it, sentValue);
41 Promise.resolve(value).then(function(value) {
42 log.push('.throw() -> resolved ' + value);
43 resolve({ value, done });
44 }, function(value) {
45 log.push('.throw() -> rejected ' + value);
46 reject(value);
47 });
48 });
49 },
50
51 return(sentValue) {
52 return new Promise(function(resolve, reject) {
53 let returnMethod = it.return;
54 if (typeof returnMethod !== 'function') {
55 log.push('.return(' + sentValue + ')');
56 return resolve({value: sentValue, done: true});
57 }
58
59 let {value, done} = returnMethod.call(it, sentValue);
60 Promise.resolve(value).then(function(value) {
61 log.push('.return() -> resolved ' + value);
62 resolve({ value, done });
63 }, function(value) {
64 log.push('.return() -> rejected ' + value);
65 reject(value);
66 });
67 });
68 }
69 };
70
71
72 return {
73 [Symbol.asyncIterator]() {
74 log.push('[Symbol.asyncIterator]()')
75 return this;
76 },
77
78 next: (features & kNext) ? methods.next : undefined,
79 throw: (features & kThrow) ? methods.throw : undefined,
80 return: (features & kReturn) ? methods.return : undefined
81 };
82 }
83
84 let testDone;
85 let test;
86 async function testBindingIdentifierVarDeclarationStatement() {
87 let sum = 0;
88 testDone = false;
89 for await (var value of async([100, 200, 300, 400, 500])) sum += value;
90 testDone = true;
91 return sum;
92 }
93
94 test = testBindingIdentifierVarDeclarationStatement();
95 assertFalse(testDone);
96 assertEquals(1500, await test);
97 assertTrue(testDone);
98
99 async function testBindingIdentifierVarDeclarationBlockStatement() {
100 let sum = 0;
101 testDone = false;
102 for await (var value of async([100, 200, 300, 400, 500])) {
103 'use strict';
104 let strict = (function() { return this === undefined; })();
105 assertFalse(strict);
106 sum += value;
107 }
108 testDone = true;
109 return sum;
110 }
111
112 test = testBindingIdentifierVarDeclarationBlockStatement();
113 assertFalse(testDone);
114 assertEquals(1500, await test);
115 assertTrue(testDone);
116
117 async function testObjectBindingPatternVarDeclarationStatement() {
118 let sum = 0, keys = [];
119 let collection = [
120 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
121 {key: 'last', value: 40}
122 ];
123 testDone = false;
124 for await (var {key = 'unknown', value} of async(collection))
125 keys.push(key), sum += value;
126 testDone = true;
127 return {keys, sum};
128 }
129
130 test = testObjectBindingPatternVarDeclarationStatement();
131 assertFalse(testDone);
132 assertEquals(
133 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
134 assertTrue(testDone);
135
136 async function testObjectBindingPatternVarDeclarationBlockStatement() {
137 let sum = 0, keys = [];
138 let collection = [
139 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
140 {key: 'last', value: 40}
141 ];
142 testDone = false;
143 for await (var {key = 'unknown', value} of async(collection)) {
144 'use strict';
145 let strict = (function() { return this === undefined; })();
146 assertFalse(strict);
147 keys.push(key);
148 sum += value;
149 }
150 testDone = true;
151 return {keys, sum};
152 }
153
154 test = testObjectBindingPatternVarDeclarationBlockStatement();
155 assertFalse(testDone);
156 assertEquals(
157 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
158 assertTrue(testDone);
159
160 async function testArrayBindingPatternVarDeclarationStatement() {
161 let sum = 0, keys = [];
162 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
163 testDone = false;
164 for await (var [key = 'unknown', value] of async(collection))
165 keys.push(key), sum += value;
166 testDone = true;
167 return {keys, sum};
168 }
169
170 test = testArrayBindingPatternVarDeclarationStatement();
171 assertFalse(testDone);
172 assertEquals(
173 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
174 assertTrue(testDone);
175
176 async function testArrayBindingPatternVarDeclarationBlockStatement() {
177 let sum = 0, keys = [];
178 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
179 testDone = false;
180 for await (var [key = 'unknown', value] of async(collection)) {
181 'use strict';
182 let strict = (function() { return this === undefined; })();
183 assertFalse(strict);
184 keys.push(key);
185 sum += value;
186 }
187 testDone = true;
188 return {keys, sum};
189 }
190
191 test = testArrayBindingPatternVarDeclarationBlockStatement();
192 assertFalse(testDone);
193 assertEquals(
194 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
195 assertTrue(testDone);
196
197 // --------------------------------------------------------------------------
198
199 async function testBindingIdentifierLetDeclarationStatement() {
200 let sum = 0;
201 testDone = false;
202 for await (let value of async([100, 200, 300, 400, 500])) sum += value;
203 testDone = true;
204 return sum;
205 }
206
207 test = testBindingIdentifierLetDeclarationStatement();
208 assertFalse(testDone);
209 assertEquals(1500, await test);
210 assertTrue(testDone);
211
212 async function testBindingIdentifierLetDeclarationBlockStatement() {
213 let sum = 0;
214 testDone = false;
215 for await (let value of async([100, 200, 300, 400, 500])) {
216 'use strict';
217 let strict = (function() { return this === undefined; })();
218 assertFalse(strict);
219 sum += value;
220 }
221 testDone = true;
222 return sum;
223 }
224
225 test = testBindingIdentifierLetDeclarationBlockStatement();
226 assertFalse(testDone);
227 assertEquals(1500, await test);
228 assertTrue(testDone);
229
230 async function testObjectBindingPatternLetDeclarationStatement() {
231 let sum = 0, keys = [];
232 let collection = [
233 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
234 {key: 'last', value: 40}
235 ];
236 testDone = false;
237 for await (let {key = 'unknown', value} of async(collection))
238 keys.push(key), sum += value;
239 testDone = true;
240 return {keys, sum};
241 }
242
243 test = testObjectBindingPatternLetDeclarationStatement();
244 assertFalse(testDone);
245 assertEquals(
246 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
247 assertTrue(testDone);
248
249 async function testObjectBindingPatternLetDeclarationBlockStatement() {
250 let sum = 0, keys = [];
251 let collection = [
252 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
253 {key: 'last', value: 40}
254 ];
255 testDone = false;
256 for await (let {key = 'unknown', value} of async(collection)) {
257 'use strict';
258 let strict = (function() { return this === undefined; })();
259 assertFalse(strict);
260 keys.push(key);
261 sum += value;
262 }
263 testDone = true;
264 return {keys, sum};
265 }
266
267 test = testObjectBindingPatternLetDeclarationBlockStatement();
268 assertFalse(testDone);
269 assertEquals(
270 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
271 assertTrue(testDone);
272
273 async function testObjectBindingPatternTDZLetDeclarationStatement() {
274 // See https://codereview.chromium.org/1218543003
275 let sum = 0;
276 testDone = false;
277 let value = { value: 1 };
278 try {
279 for await (let {value} of async([value])) sum += value;
280 } catch (error) {
281 testDone = true;
282 throw { sum, error, toString() { return 'TestError' } };
283 }
284 assertUnreachable('Awaited promise should be rejected');
285 }
286
287 test = testObjectBindingPatternTDZLetDeclarationStatement();
288 assertTrue(testDone); // Promise rejected before first Await
289 try {
290 await test;
291 assertUnreachable('Awaited promise should be rejected');
292 } catch (e) {
293 assertEquals('TestError', e.toString());
294 assertEquals(0, e.sum);
295 assertInstanceof(e.error, ReferenceError);
296 }
297
298 async function testObjectBindingPatternTDZLetDeclarationBlockStatement() {
299 // See https://codereview.chromium.org/1218543003
300 let sum = 0;
301 testDone = false;
302 let value = { value: 1 };
303 try {
304 for await (let {value} of async([value])) {
305 sum += value;
306 }
307 } catch (error) {
308 testDone = true;
309 throw { sum, error, toString() { return 'TestError' } };
310 }
311 assertUnreachable('Awaited promise should be rejected');
312 }
313
314 test = testObjectBindingPatternTDZLetDeclarationBlockStatement();
315 assertTrue(testDone); // Promise rejected before first Await
316 try {
317 await test;
318 assertUnreachable('Awaited promise should be rejected');
319 } catch (e) {
320 assertEquals('TestError', e.toString());
321 assertEquals(0, e.sum);
322 assertInstanceof(e.error, ReferenceError);
323 }
324
325 async function testArrayBindingPatternLetDeclarationStatement() {
326 let sum = 0, keys = [];
327 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
328 testDone = false;
329 for await (let [key = 'unknown', value] of async(collection))
330 keys.push(key), sum += value;
331 testDone = true;
332 return {keys, sum};
333 }
334
335 test = testArrayBindingPatternLetDeclarationStatement();
336 assertFalse(testDone);
337 assertEquals(
338 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
339 assertTrue(testDone);
340
341 async function testArrayBindingPatternLetDeclarationBlockStatement() {
342 let sum = 0, keys = [];
343 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
344 testDone = false;
345 for await (let [key = 'unknown', value] of async(collection)) {
346 'use strict';
347 let strict = (function() { return this === undefined; })();
348 assertFalse(strict);
349 keys.push(key);
350 sum += value;
351 }
352 testDone = true;
353 return {keys, sum};
354 }
355
356 test = testArrayBindingPatternLetDeclarationBlockStatement();
357 assertFalse(testDone);
358 assertEquals(
359 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
360 assertTrue(testDone);
361
362 async function testArrayBindingPatternTDZLetDeclarationStatement() {
363 // See https://codereview.chromium.org/1218543003
364 let sum = 0;
365 testDone = false;
366 let value = [1];
367 try {
368 for await (let [value] of async([value])) sum += value;
369 } catch (error) {
370 testDone = true;
371 throw { sum, error, toString() { return 'TestError' } };
372 }
373 assertUnreachable('Awaited promise should be rejected');
374 }
375
376 test = testArrayBindingPatternTDZLetDeclarationStatement();
377 assertTrue(testDone); // Promise rejected before first Await
378 try {
379 await test;
380 assertUnreachable('Awaited promise should be rejected');
381 } catch (e) {
382 assertEquals('TestError', e.toString());
383 assertEquals(0, e.sum);
384 assertInstanceof(e.error, ReferenceError);
385 }
386
387 async function testArrayBindingPatternTDZLetDeclarationBlockStatement() {
388 // See https://codereview.chromium.org/1218543003
389 let sum = 0;
390 testDone = false;
391 let value = [1];
392 try {
393 for await (let [value] of async([value])) {
394 sum += value;
395 }
396 } catch (error) {
397 testDone = true;
398 throw { sum, error, toString() { return 'TestError' } };
399 }
400 assertUnreachable('Awaited promise should be rejected');
401 }
402
403 test = testArrayBindingPatternTDZLetDeclarationBlockStatement();
404 assertTrue(testDone); // Promise rejected before first Await
405 try {
406 await test;
407 assertUnreachable('Awaited promise should be rejected');
408 } catch (e) {
409 assertEquals('TestError', e.toString());
410 assertEquals(0, e.sum);
411 assertInstanceof(e.error, ReferenceError);
412 }
413
414 // --------------------------------------------------------------------------
415
416 async function testBindingIdentifierConstDeclarationStatement() {
417 let sum = 0;
418 testDone = false;
419 for await (let value of async([100, 200, 300, 400, 500])) sum += value;
420 testDone = true;
421 return sum;
422 }
423
424 test = testBindingIdentifierConstDeclarationStatement();
425 assertFalse(testDone);
426 assertEquals(1500, await test);
427 assertTrue(testDone);
428
429 async function testBindingIdentifierConstDeclarationBlockStatement() {
430 let sum = 0;
431 testDone = false;
432 for await (const value of async([100, 200, 300, 400, 500])) {
433 'use strict';
434 // Ensure strict mode applies to block with use-strict-directive
435 let strict = (function() { return this === undefined; })();
436 assertFalse(strict);
437 sum += value;
438 }
439 testDone = true;
440 return sum;
441 }
442
443 test = testBindingIdentifierConstDeclarationBlockStatement();
444 assertFalse(testDone);
445 assertEquals(1500, await test);
446 assertTrue(testDone);
447
448 async function testObjectBindingPatternConstDeclarationStatement() {
449 let sum = 0, keys = [];
450 let collection = [
451 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
452 {key: 'last', value: 40}
453 ];
454 testDone = false;
455 for await (const {key = 'unknown', value} of async(collection))
456 keys.push(key), sum += value;
457 testDone = true;
458 return {keys, sum};
459 }
460
461 test = testObjectBindingPatternConstDeclarationStatement();
462 assertFalse(testDone);
463 assertEquals(
464 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
465 assertTrue(testDone);
466
467 async function testObjectBindingPatternConstDeclarationBlockStatement() {
468 let sum = 0, keys = [];
469 let collection = [
470 {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
471 {key: 'last', value: 40}
472 ];
473 testDone = false;
474 for await (const {key = 'unknown', value} of async(collection)) {
475 'use strict';
476 let strict = (function() { return this === undefined; })();
477 assertFalse(strict);
478 keys.push(key);
479 sum += value;
480 }
481 testDone = true;
482 return {keys, sum};
483 }
484
485 test = testObjectBindingPatternConstDeclarationBlockStatement();
486 assertFalse(testDone);
487 assertEquals(
488 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
489 assertTrue(testDone);
490
491 async function testObjectBindingPatternTDZConstDeclarationStatement() {
492 // See https://codereview.chromium.org/1218543003
493 let sum = 0;
494 testDone = false;
495 const value = { value: 1 };
496 try {
497 for await (const {value} of async([value])) sum += value;
498 } catch (error) {
499 testDone = true;
500 throw { sum, error, toString() { return 'TestError' } };
501 }
502 assertUnreachable('Awaited promise should be rejected');
503 }
504
505 test = testObjectBindingPatternTDZConstDeclarationStatement();
506 assertTrue(testDone); // Promise rejected before first Await
507 try {
508 await test;
509 assertUnreachable('Awaited promise should be rejected');
510 } catch (e) {
511 assertEquals('TestError', e.toString());
512 assertEquals(0, e.sum);
513 assertInstanceof(e.error, ReferenceError);
514 }
515
516 async function testObjectBindingPatternTDZConstDeclarationBlockStatement() {
517 // See https://codereview.chromium.org/1218543003
518 let sum = 0;
519 testDone = false;
520 const value = { value: 1 };
521 try {
522 for await (const {value} of async([value])) {
523 sum += value;
524 }
525 } catch (error) {
526 testDone = true;
527 throw { sum, error, toString() { return 'TestError' } };
528 }
529 assertUnreachable('Awaited promise should be rejected');
530 }
531
532 test = testObjectBindingPatternTDZConstDeclarationBlockStatement();
533 assertTrue(testDone); // Promise rejected before first Await
534 try {
535 await test;
536 assertUnreachable('Awaited promise should be rejected');
537 } catch (e) {
538 assertEquals('TestError', e.toString());
539 assertEquals(0, e.sum);
540 assertInstanceof(e.error, ReferenceError);
541 }
542
543 async function testArrayBindingPatternConstDeclarationStatement() {
544 let sum = 0, keys = [];
545 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
546 testDone = false;
547 for await (const [key = 'unknown', value] of async(collection))
548 keys.push(key), sum += value;
549 testDone = true;
550 return {keys, sum};
551 }
552
553 test = testArrayBindingPatternConstDeclarationStatement();
554 assertFalse(testDone);
555 assertEquals(
556 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
557 assertTrue(testDone);
558
559 async function testArrayBindingPatternConstDeclarationBlockStatement() {
560 let sum = 0, keys = [];
561 let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
562 testDone = false;
563 for await (const [key = 'unknown', value] of async(collection)) {
564 'use strict';
565 let strict = (function() { return this === undefined; })();
566 assertFalse(strict);
567 keys.push(key);
568 sum += value;
569 }
570 testDone = true;
571 return {keys, sum};
572 }
573
574 test = testArrayBindingPatternLetDeclarationBlockStatement();
575 assertFalse(testDone);
576 assertEquals(
577 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
578 assertTrue(testDone);
579
580 async function testArrayBindingPatternTDZConstDeclarationStatement() {
581 // See https://codereview.chromium.org/1218543003
582 let sum = 0;
583 testDone = false;
584 const value = [1];
585 try {
586 for await (const [value] of async([value])) sum += value;
587 } catch (error) {
588 testDone = true;
589 throw { sum, error, toString() { return 'TestError' } };
590 }
591 assertUnreachable('Awaited promise should be rejected');
592 }
593
594 test = testArrayBindingPatternTDZConstDeclarationStatement();
595 assertTrue(testDone); // Promise rejected before first Await
596 try {
597 await test;
598 assertUnreachable('Awaited promise should be rejected');
599 } catch (e) {
600 assertEquals('TestError', e.toString());
601 assertEquals(0, e.sum);
602 assertInstanceof(e.error, ReferenceError);
603 }
604
605 async function testArrayBindingPatternTDZConstDeclarationBlockStatement() {
606 // See https://codereview.chromium.org/1218543003
607 let sum = 0;
608 testDone = false;
609 const value = [1];
610 try {
611 for await (const [value] of async([value])) {
612 sum += value;
613 }
614 } catch (error) {
615 testDone = true;
616 throw { sum, error, toString() { return 'TestError' } };
617 }
618 assertUnreachable('Awaited promise should be rejected');
619 }
620
621 test = testArrayBindingPatternTDZConstDeclarationBlockStatement();
622 assertTrue(testDone); // Promise rejected before first Await
623 try {
624 await test;
625 assertUnreachable('Awaited promise should be rejected');
626 } catch (e) {
627 assertEquals('TestError', e.toString());
628 assertEquals(0, e.sum);
629 assertInstanceof(e.error, ReferenceError);
630 }
631
632 // --------------------------------------------------------------------------
633
634 async function testBindingIdentifierLHSStatement() {
635 let sum = 0;
636 let value;
637 testDone = false;
638 for await (value of async([100, 200, 300, 400, 500])) sum += value;
639 testDone = true;
640 return sum;
641 }
642
643 test = testBindingIdentifierLHSStatement();
644 assertFalse(testDone);
645 assertEquals(1500, await test);
646 assertTrue(testDone);
647
648 async function testBindingIdentifierLHSBlockStatement() {
649 let sum = 0;
650 let value;
651 testDone = false;
652 for await (value of async([100, 200, 300, 400, 500])) {
653 'use strict';
654 let strict = (function() { return this === undefined; })();
655 assertFalse(strict);
656 sum += value;
657 }
658 testDone = true;
659 return sum;
660 }
661
662 test = testBindingIdentifierLHSStatement();
663 assertFalse(testDone);
664 assertEquals(1500, await test);
665 assertTrue(testDone);
666
667 async function testObjectBindingPatternLHSStatement() {
668 let sum = 0;
669 let keys = [];
670 let value;
671 let key;
672 let collection = [
673 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
674 {key: 'last', value: 4}
675 ];
676 testDone = false;
677 for await ({key = 'unknown', value} of async(collection))
678 keys.push(key), sum += value;
679 testDone = true;
680 return {keys, sum};
681 }
682
683 test = testObjectBindingPatternLHSStatement();
684 assertFalse(testDone);
685 assertEquals(
686 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
687 assertTrue(testDone);
688
689 async function testObjectBindingPatternLHSBlockStatement() {
690 let sum = 0;
691 let keys = [];
692 let value;
693 let key;
694 let collection = [
695 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
696 {key: 'last', value: 4}
697 ];
698 testDone = false;
699 for await ({key = 'unknown', value} of async(collection)) {
700 'use strict';
701 let strict = (function() { return this === undefined; })();
702 assertFalse(strict);
703 keys.push(key);
704 sum += value;
705 }
706 testDone = true;
707 return {keys, sum};
708 }
709
710 test = testObjectBindingPatternLHSBlockStatement();
711 assertFalse(testDone);
712 assertEquals(
713 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
714 assertTrue(testDone);
715
716 async function testArrayBindingPatternLHSStatement() {
717 let sum = 0;
718 let keys = [];
719 let value;
720 let key;
721 let collection = [['first', 1], [undefined, 2], [, 3], ['last', 4]];
722 testDone = false;
723 for await ([key = 'unknown', value] of async(collection)) {
724 'use strict';
725 let strict = (function() { return this === undefined; })();
726 assertFalse(strict);
727 keys.push(key);
728 sum += value;
729 }
730 testDone = true;
731 return {keys, sum};
732 }
733
734 test = testArrayBindingPatternLHSStatement();
735 assertFalse(testDone);
736 assertEquals(
737 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
738 assertTrue(testDone);
739
740 async function testArrayBindingPatternLHSBlockStatement() {
741 let sum = 0;
742 let keys = [];
743 let value;
744 let key;
745 let collection = [
746 {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
747 {key: 'last', value: 4}
748 ];
749 testDone = false;
750 for await ({key = 'unknown', value} of async(collection)) {
751 'use strict';
752 let strict = (function() { return this === undefined; })();
753 assertFalse(strict);
754 keys.push(key);
755 sum += value;
756 }
757 testDone = true;
758 return {keys, sum};
759 }
760
761 test = testArrayBindingPatternLHSBlockStatement();
762 assertFalse(testDone);
763 assertEquals(
764 {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
765 assertTrue(testDone);
766
767 // --------------------------------------------------------------------------
768
769 async function testBreakStatementReturnMethodNotPresent() {
770 let log = [];
771 let collection = [1, 2, 3, 4, 5];
772 let sum = 0;
773 let i = 0;
774 testDone = false;
775 for await (var x of async(collection, kNext, log)) {
776 sum += x;
777 if (++i === 3) break;
778 }
779 testDone = true;
780 return { sum, log };
781 }
782
783 test = testBreakStatementReturnMethodNotPresent();
784 assertFalse(testDone);
785 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
786 '.next() -> resolved 1',
787 '.next() -> resolved 2',
788 '.next() -> resolved 3']},
789 await test);
790 assertTrue(testDone);
791
792 async function testBreakStatementReturnMethodPresent() {
793 let log = [];
794 let collection = [1, 2, 3, 4, 5];
795 let sum = 0;
796 let i = 0;
797 testDone = false;
798 for await (var x of async(collection, kNext|kReturn, log)) {
799 sum += x;
800 if (++i === 2) break;
801 }
802 testDone = true;
803 return { sum, log };
804 }
805
806 test = testBreakStatementReturnMethodPresent();
807 assertFalse(testDone);
808 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
809 '.next() -> resolved 1',
810 '.next() -> resolved 2',
811 '.return(undefined)']},
812 await test);
813 assertTrue(testDone);
814
815 async function testReturnStatementReturnMethodNotPresent() {
816 let log = [];
817 let collection = [1, 2, 3, 4, 5];
818 let sum = 0;
819 let i = 0;
820 testDone = false;
821 for await (var x of async(collection, kNext, log)) {
822 sum += x;
823 if (++i === 3) {
824 testDone = true;
825 return { sum, log };
826 }
827 }
828 }
829
830 test = testReturnStatementReturnMethodNotPresent();
831 assertFalse(testDone);
832 assertEquals({sum: 6, log: ['[Symbol.asyncIterator]()',
833 '.next() -> resolved 1',
834 '.next() -> resolved 2',
835 '.next() -> resolved 3']},
836 await test);
837 assertTrue(testDone);
838
839 async function testReturnStatementReturnMethodPresent() {
840 let log = [];
841 let collection = [1, 2, 3, 4, 5];
842 let sum = 0;
843 let i = 0;
844 testDone = false;
845 for await (var x of async(collection, kNext|kReturn, log)) {
846 sum += x;
847 if (++i === 2) {
848 testDone = true;
849 return { sum, log };
850 }
851 }
852 }
853
854 test = testReturnStatementReturnMethodPresent();
855 assertFalse(testDone);
856 assertEquals({sum: 3, log: ['[Symbol.asyncIterator]()',
857 '.next() -> resolved 1',
858 '.next() -> resolved 2',
859 '.return(undefined)']},
860 await test);
861 assertTrue(testDone);
862
863 async function testThrowStatementReturnMethodNotPresent() {
864 let log = [];
865 let collection = [1, 2, 3, 4, 5];
866 let sum = 0;
867 let i = 0;
868 testDone = false;
869 for await (var x of async(collection, kNext|kThrow, log)) {
870 sum += x;
871 if (++i === 3) {
872 testDone = true;
873 throw { sum, log, toString() { return 'TestError'; } };
874 }
875 }
876 return { sum, log };
877 }
878
879 test = testThrowStatementReturnMethodNotPresent();
880 assertFalse(testDone);
881 try {
882 await test;
883 assertUnreachable('Awaited Promise should be rejected');
884 } catch (e) {
885 assertEquals('TestError', e.toString());
886 assertEquals(6, e.sum);
887 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
888 '.next() -> resolved 2', '.next() -> resolved 3'
889 ], e.log);
890 assertTrue(testDone);
891 }
892
893 async function testThrowStatementReturnMethodPresent() {
894 let log = [];
895 let collection = [1, 2, 3, 4, 5];
896 let sum = 0;
897 let i = 0;
898 testDone = false;
899 for await (var x of async(collection, kNext|kThrow|kReturn, log)) {
900 sum += x;
901 if (++i === 2) {
902 testDone = true;
903 throw { sum, log, toString() { return 'TestError2'; } };
904 }
905 }
906 return { sum, log };
907 }
908
909 test = testThrowStatementReturnMethodPresent();
910 assertFalse(testDone);
911 try {
912 await test;
913 assertUnreachable('Awaited Promise should be rejected');
914 } catch (e) {
915 assertEquals('TestError2', e.toString());
916 assertEquals(3, e.sum);
917 assertEquals(['[Symbol.asyncIterator]()', '.next() -> resolved 1',
918 '.next() -> resolved 2', '.return(undefined)'
919 ], e.log);
920 assertTrue(testDone);
921 }
922
923 })().then(undefined, function(error) {
924 testFailed = true;
925 testFailure = error;
926 });
927
928 %RunMicrotasks();
929
930 if (testFailed) {
931 throw testFailure;
932 }
OLDNEW
« src/runtime/runtime-internal.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