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

Side by Side Diff: tests/language/async_await_test.dart

Issue 968963002: Add some async/await tests. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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 (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import "package:unittest/unittest.dart";
6 import "dart:async";
7
8 mkStream() {
9 var c;
10 int i = 0;
11 next() {
12 c.add(i++);
13 if (i == 10) {
14 c.close();
15 } else {
16 scheduleMicrotask(next);
17 }
18 }
19 c = new StreamController(onListen: () {
20 scheduleMicrotask(next);
21 });
22 return c.stream;
23 }
24
25 main() {
26 group("basic", () {
27 test("async works", () {
28 f() async { return id(42); }
29 return f().then((v) {
30 expect(v, equals(42));
31 });
32 });
33
34 test("async waits", () {
35 // Calling an "async" function won't do anything immediately.
36 var result = [];
37 f() async {
38 result.add(1);
39 return id(42);
40 };
41 var future = f();
42 result.add(0);
43 return future.whenComplete(() {
44 expect(result, equals([0, 1]));
45 });
46 });
47
48 test("async throws", () {
49 f() async {
50 throw "err";
51 return id(42);
52 }
53 return f().then((_) { fail("Didn't throw"); },
54 onError: (e, s) { expect(e, equals("err")); });
Søren Gjesse 2015/03/03 08:08:41 Indentation.
Lasse Reichstein Nielsen 2015/03/03 11:22:42 I made an abstraction for "throwsErr".
55 });
56
57 test("await future", () {
58 f() async {
59 var v = await new Future.value(42);
60 expect(v, equals(42));
61 };
62 return f();
63 });
64
65 test("await value", () {
66 f() async {
67 var v = await id(42);
68 expect(v, equals(42));
69 };
70 return f();
71 });
72
73 test("await null", () {
74 f() async {
75 var v = await null;
76 expect(v, equals(null));
77 };
78 return f();
79 });
80
81 // test("await throw", () {
82 // f() async {
83 // await (throw "err"); // Check grammar: Are parentheses necessary?
84 // return id(42);
85 // }
86 // return f().then((_) { fail("Didn't throw"); },
87 // onError: (e, s) { expect(e, equals("err")); });
88 // });
89
90 test("throw before await", () {
91 f() async {
92 var x = throw "err";
93 await x; // Check grammar: Are parentheses necessary?
Søren Gjesse 2015/03/03 08:08:41 Add test for await local without a throw. Add tes
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Ah, await of different expression types! Good idea
94 return id(42);
95 }
96 return f().then((_) { fail("Didn't throw"); },
97 onError: (e, s) { expect(e, equals("err")); });
98 });
99
100 test("async await error", () {
101 f() async {
102 await new Future.error("err");
103 return id(42);
104 }
105 return f().then((_) { fail("Didn't throw"); },
106 onError: (e, s) { expect(e, equals("err")); });
107 });
108
109 test("async flattens futures", () {
110 f() async {
111 return new Future.value(42); // Not awaited.
112 };
113 return f().then((v) {
114 expect(v, equals(42)); // And not a Future with value id(42).
Søren Gjesse 2015/03/03 08:08:41 id(42) -> 42. Did you intend to use id(42) above?
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Nope.
Søren Gjesse 2015/03/03 11:39:56 What I ment was that the comment should not have i
115 });
116 });
117
118 test("async flattens futures, error", () {
119 f() async {
120 return new Future.error("err"); // Not awaited.
121 };
122 return f().then((_) { fail("Didn't throw"); },
123 onError: (e, s) { expect(e, equals("err")); });
124 });
125
126 test("await for", () {
127 f(s) async {
128 int i = 0;
129 await for (int v in s) {
130 i += v;
131 }
132 return i;
133 }
134 return f(mkStream()).then((v) {
135 expect(v, equals(45)); // 0 + 1 + ... + 9
136 });
137 });
138
139 test("await for empty", () {
140 f(s) async {
141 int v = 0;
142 await for (int i in s) {
143 v += i;
144 }
145 return v;
146 }
147 var s = (new StreamController()..close()).stream;
148 return f(s).then((v) {
149 expect(v, equals(0)); // 0 + 1 + ... + 9
Søren Gjesse 2015/03/03 08:08:41 Remove comment.
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Done.
150 });
151 });
152 });
153
154 group("for", () {
155 test("await in for-loop", () {
156 f() async {
157 int v = 0;
158 for (int i = 0; i < 10; i++) {
159 v += await new Future.value(42);
160 }
161 return v;
162 }
163 return f().then((v) {
164 expect(v, equals(10 * id(42)));
165 });
166 });
167
168 test("await in for-init", () {
169 f() async {
170 int v = 0;
171 for (int i = await new Future.value(42); i >= 0; i -= 10) {
172 v += 10;
173 }
174 return v;
175 }
176 return f().then((v) {
177 expect(v, equals(10 * 5));
178 });
179 });
180
181 test("await in for-test", () {
182 f() async {
183 int v = 0;
184 for (int i = 0; i < await new Future.value(42); i += 10) {
185 v += 10;
186 }
187 return v;
188 }
189 return f().then((v) {
190 expect(v, equals(10 * 5));
191 });
192 });
193
194 test("await in for-incr", () {
195 f() async {
196 int v = 0;
197 for (int i = 0; i < 100; i += await new Future.value(42)) {
198 v += 10;
199 }
200 return v;
201 }
202 return f().then((v) {
203 expect(v, equals(10 * 3));
204 });
205 });
206
207 test("await err in for-loop", () {
208 f() async {
209 int v = 0;
210 for (int i = 0; i < 10; i++) {
211 v += await new Future.error("err");
212 }
213 return v;
214 }
215 return f().then((v) { fail("didn't throw"); },
216 onError: (e) { expect(e, equals("err")); });
217 });
218
219 test("await err in for-init", () {
220 f() async {
221 int v = 0;
222 for (int i = await new Future.error("err"); i >= 0; i -= 10) {
223 v += 10;
224 }
225 return v;
226 }
227 return f().then((v) { fail("didn't throw"); },
228 onError: (e) { expect(e, equals("err")); });
229 });
230
231 test("await err in for-test", () {
232 f() async {
233 int v = 0;
234 for (int i = 0; i < await new Future.error("err"); i += 10) {
235 v += 10;
236 }
237 return v;
238 }
239 return f().then((v) { fail("didn't throw"); },
240 onError: (e) { expect(e, equals("err")); });
241 });
242
243 test("await err in for-incr", () {
244 f() async {
245 int v = 0;
246 for (int i = 0; i < 100; i += await new Future.error("err")) {
247 v += 10;
248 }
249 return v;
250 }
251 return f().then((v) { fail("didn't throw"); },
252 onError: (e) { expect(e, equals("err")); });
253 });
254
255 test("await in empty for-loop", () {
256 f() async {
257 int v = 0;
258 for (int i = 0; i > 0; i += 1) {
259 v += await new Future.value(42);
260 }
261 return v;
262 }
263 return f().then((v) {
264 expect(v, equals(0));
265 });
266 });
267
268 test("await in empty for-loop 2", () {
269 f() async {
270 int v = 0;
271 for (int i = 0; i > 0; i += await new Future.value(1)) {
272 v += 1;
273 }
274 return v;
275 }
276 return f().then((v) {
277 expect(v, equals(0));
278 });
279 });
280
281 test("break before await in for-loop", () {
282 f() async {
283 int v = 0;
284 for (int i = 0; i < 10; i += 1) {
285 if (i == 2) break;
286 v += await new Future.value(42);
287 }
288 return v;
289 }
290 return f().then((v) {
291 expect(v, equals(42 * 2));
292 });
293 });
294
295 test("break before await in for-loop 2", () {
296 f() async {
297 int v = 0;
298 for (int i = 0; i < 10; i += await new Future.value(1)) {
299 if (i == 2) break;
300 v += id(42);
301 }
302 return v;
303 }
304 return f().then((v) {
305 expect(v, equals(42 * 2));
306 });
307 });
Søren Gjesse 2015/03/03 08:08:41 How about for tests with continue (same for while)
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Sure, why not!
308 });
309
310 group("while", () {
311 test("await in while-loop", () {
312 f() async {
313 int v = 0;
314 int i = 0;
315 while (i < 10) {
316 v += await new Future.value(42);
317 i++;
318 }
319 return v;
320 }
321 return f().then((v) {
322 expect(v, equals(10 * id(42)));
323 });
324 });
325
326 test("await in while-test", () {
327 f() async {
328 int v = 0;
329 int i = 0;
330 while (i < await new Future.value(42)) {
331 v += 10;
332 i += 10;
333 }
334 return v;
335 }
336 return f().then((v) {
337 expect(v, equals(10 * 5));
338 });
339 });
340
341 test("await err in while-loop", () {
342 f() async {
343 int v = 0;
344 int i = 0;
345 while (i < 10) {
346 v += await new Future.error("err");
347 i++;
348 }
349 return v;
350 }
351 return f().then((v) { fail("didn't throw"); },
352 onError: (e) { expect(e, equals("err")); });
353 });
354
355 test("await err in while-test", () {
356 f() async {
357 int v = 0;
358 int i = 0;
359 while (i < await new Future.error("err")) {
360 v += 10;
361 i += 10;
362 }
363 return v;
364 }
365 return f().then((v) { fail("didn't throw"); },
366 onError: (e) { expect(e, equals("err")); });
367 });
368
369 test("break before await in while", () {
370 f() async {
371 int v = 0;
372 int i = 0;
373 while (i < 10) {
374 if (i == 2) break;
375 v += await new Future.value(42);
376 i += 1;
377 }
378 return v;
379 }
380 return f().then((v) {
381 expect(v, equals(42 * 2));
382 });
383 });
384 });
385
386 group("do-while", () {
387 test("await in do-while-loop", () {
388 f() async {
389 int v = 0;
390 int i = 0;
391 do {
392 v += await new Future.value(42);
393 i++;
394 } while (i < 10);
395 return v;
396 }
397 return f().then((v) {
398 expect(v, equals(10 * id(42)));
399 });
400 });
401
402 test("await in do-while-test", () {
403 f() async {
404 int v = 0;
405 int i = 0;
406 do {
407 v += 10;
408 i += 10;
409 } while (i < await new Future.value(42));
410 return v;
411 }
412 return f().then((v) {
413 expect(v, equals(10 * 5));
414 });
415 });
416
417 test("await err in do-while-loop", () {
418 f() async {
419 int v = 0;
420 int i = 0;
421 do {
422 v += await new Future.error("err");
423 i++;
424 } while (i < 10);
425 return v;
426 }
427 return f().then((v) { fail("didn't throw"); },
428 onError: (e) { expect(e, equals("err")); });
429 });
430
431 test("await err in do-while-test", () {
432 f() async {
433 int v = 0;
434 int i = 0;
435 do {
436 v += 10;
437 i += 10;
438 } while (i < await new Future.error("err"));
439 return v;
440 }
441 return f().then((v) { fail("didn't throw"); },
442 onError: (e) { expect(e, equals("err")); });
443 });
444
445 test("break before await in do-while", () {
446 f() async {
447 int v = 0;
448 int i = 0;
449 do {
450 if (i == 2) break;
451 v += await new Future.value(42);
452 i += 1;
453 } while (i < 10);
454 return v;
455 }
456 return f().then((v) {
457 expect(v, equals(42 * 2));
458 });
459 });
460 });
461
462 group("for-in", () {
463 test("await in for-in", () {
464 f() async {
465 var v = 0;
466 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) {
467 v += await fut;
468 }
469 return v;
470 }
471 return f().then((v) {
472 expect(v, equals(6));
473 });
474 });
475
476 test("await in for-in iterable", () {
477 f() async {
478 var v = 0;
479 for (var i in await new Future.value([1, 2, 3])) {
480 v += i;
481 }
482 return v;
483 }
484 return f().then((v) {
485 expect(v, equals(6));
486 });
487 });
488
489 test("await err in for-in", () {
490 f() async {
491 var v = 0;
492 for (var fut in [1, 2, 3].map((v) => (v != 1)
493 ? new Future.value(v)
494 : new Future.error("err"))) {
495 v += await fut;
496 }
497 return v;
498 }
499 return f().then((v) { fail("didn't throw"); },
500 onError: (e) { expect(e, equals("err")); });
501 });
502
503 test("await err in for-in iterable", () {
504 f() async {
505 var v = 0;
506 for (var i in await new Future.error("err")) {
507 v += i;
508 }
509 return v;
510 }
511 return f().then((v) { fail("didn't throw"); },
512 onError: (e) { expect(e, equals("err")); });
513 });
514
515 test("break before await in for-in", () {
516 f() async {
517 var v = 0;
518 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) {
519 if (v == 3) break;
520 v += await fut;
521 }
522 return v;
523 }
524 return f().then((v) {
525 expect(v, equals(3));
526 });
527 });
528 });
529
530 group("try-catch", () {
531 test("try-no-catch", () {
532 f() async {
533 try {
534 return await id(42);
535 } catch(e) {
536 return 37;
537 }
538 }
539 return f().then((v) {
540 expect(v, equals(42));
541 });
542 });
543
544 test("await in body", () {
545 f() async {
546 try {
547 await new Future.error(42);
548 } catch(e) {
549 return e;
550 }
551 }
552 return f().then((v) {
553 expect(v, equals(42));
554 });
555 });
556
557 test("throw before await in body", () {
558 int i = id(0);
559 f() async {
560 try {
561 if (i >= 0) throw id(42);
562 return await new Future.value(10);
563 } catch(e) {
564 return e;
565 }
566 }
567 return f().then((v) {
568 expect(v, equals(42));
569 });
570 });
571
572 test("try-catch await in catch", () {
573 f() async {
574 try {
575 throw id(42);
576 } catch(e) {
577 return await new Future.value(e);
578 }
579 }
580 return f().then((v) {
581 expect(v, equals(42));
582 });
583 });
584
585 test("try-catch await error in catch", () {
586 f() async {
587 try {
588 throw id(42);
589 } catch(e) {
590 await new Future.error("err");
591 }
592 }
593 return f().then((v) { fail("didn't throw"); },
594 onError: (e) { expect(e, equals("err")); });
595 });
596
597 test("try-catch-rethrow", () {
598 f() async {
599 try {
600 await new Future.error("err");
601 } catch(e) {
602 if (e == id(42)) return;
603 rethrow;
604 }
605 }
606 return f().then((v) { fail("didn't throw"); },
607 onError: (e) { expect(e, equals("err")); });
608 });
609 });
610
611 group("try-finally", () {
612 test("await in body", () {
613 f() async {
614 try {
615 return await new Future.value(42);
616 } finally {
617 // Don't do anything.
618 }
619 }
620 return f().then((v) {
621 expect(v, equals(42));
622 });
623 });
624
625 test("await in finally", () {
626 var x = 0;
627 f() async {
628 try {
629 return id(42);
630 } finally {
631 x = await new Future.value(37);
632 }
633 }
634 return f().then((v) {
635 expect(v, equals(42));
636 expect(x, equals(37));
637 });
638 });
639
640 test("await err in body", () {
641 f() async {
642 try {
643 return await new Future.error("err");
644 } finally {
645 // Don't do anything.
646 }
647 }
648 return f().then((v) { fail("didn't throw"); },
649 onError: (e) { expect(e, equals("err")); });
650 });
651
652 test("await err in finally", () {
653 f() async {
654 try {
655 return id(42);
656 } finally {
657 await new Future.error("err");
658 }
659 }
660 return f().then((v) { fail("didn't throw"); },
661 onError: (e) { expect(e, equals("err")); });
662 });
663
664 test("await err in both", () {
665 f() async {
666 try {
667 await new Future.error("not err");
668 } finally {
669 await new Future.error("err");
670 }
671 }
672 return f().then((v) { fail("didn't throw"); },
673 onError: (e) { expect(e, equals("err")); });
674 });
675
676 test("await err in body, override in finally", () {
677 f() async {
678 try {
679 return await new Future.error("err");
680 } finally {
681 return id(42);
682 }
683 }
684 return f().then((v) {
685 expect(v, equals(42));
686 });
687 });
688
689 test("await in body, override in finally", () {
690 f() async {
691 label: try {
692 return await new Future.value(37);
693 } finally {
694 break label;
695 }
696 return id(42);
697 }
698 return f().then((v) {
699 expect(v, equals(42));
700 });
701 });
702
703 test("await, override in finally", () {
704 var x = 0;
705 f() async {
706 label: try {
707 return 87;
708 } finally {
709 x = await new Future.value(37);
710 break label;
711 }
712 return id(42);
713 }
714 return f().then((v) {
715 expect(v, equals(42));
716 expect(x, equals(37));
717 });
718 });
719
720 test("throw in body, await, override in finally 3", () {
721 var x = 0;
722 f() async {
723 label: try {
724 throw "err";
725 } finally {
726 x = await new Future.value(37);
727 break label;
728 }
729 return id(42);
730 }
731 return f().then((v) {
732 expect(v, equals(42));
733 expect(x, equals(37));
734 });
735 });
736
737 test("await err in body, override in finally 2", () {
738 f() async {
739 label: try {
740 return await new Future.error("err");
741 } finally {
742 break label;
743 }
744 return id(42);
745 }
746 return f().then((v) {
747 expect(v, equals(42));
748 });
749 });
750
751 test("await in body, no-exit in finally", () {
752 f() async {
753 for (int i = 0; i < 10; i++) {
754 try {
755 return await i;
756 } finally {
757 continue;
758 }
759 }
760 return id(42);
761 }
762 return f().then((v) {
763 expect(v, equals(42));
764 });
765 });
766
767 test("no-exit after await in finally", () {
768 f() async {
769 int i = 0;
770 for (; i < 10; i++) {
771 try {
772 break;
773 } finally {
774 await new Future.value(42);
775 continue;
776 }
777 }
778 return id(i);
779 }
780 return f().then((v) {
781 expect(v, equals(10));
782 });
783 });
784
785 test("exit after continue, await in finally", () {
786 f() async {
787 int i = 0;
788 for (; i < 10; i++) {
789 try {
790 continue;
791 } finally {
792 await new Future.value(42);
793 break;
794 }
795 }
796 return id(i);
797 }
798 return f().then((v) {
799 expect(v, equals(0));
800 });
801 });
802
803 test("no-exit before await in finally 2", () {
804 f() async {
805 for (int i = 0; i < 10; i++) {
806 try {
807 return i;
808 } finally {
809 if (i >= 0) continue;
810 await new Future.value(42);
811 }
812 }
813 return id(42);
814 }
815 return f().then((v) {
816 expect(v, equals(42));
817 });
818 });
819
820 test("no-exit after await in finally", () {
821 f() async {
822 for (int i = 0; i < 10; i++) {
823 try {
824 return i;
825 } finally {
826 await new Future.value(42);
827 continue;
828 }
829 }
830 return id(42);
831 }
832 return f().then((v) {
833 expect(v, equals(42));
834 });
835 });
836
837 test("nested finallies", () {
838 var x = 0;
839 f() async {
840 try {
841 try {
842 return 42;
843 } finally {
844 x = await new Future.value(37);
845 }
846 } finally {
847 x += await new Future.value(37);
848 }
849 }
850 return f().then((v) {
851 expect(v, equals(42));
852 expect(x, equals(74));
853 });
854 });
855
856 test("nested finallies 2", () {
857 var x = 0;
858 f() async {
859 label: try {
860 try {
861 break label;
862 } finally {
863 x = await new Future.value(37);
864 }
865 } finally {
866 x += await new Future.value(37);
867 }
868 return 42;
869 }
870 return f().then((v) {
871 expect(v, equals(42));
872 expect(x, equals(74));
873 });
874 });
875
876 test("nested finallies 3", () {
877 var x = 0;
878 f() async {
879 label: try {
880 try {
881 break label;
882 } finally {
883 return await new Future.value(42);
884 }
885 } finally {
886 break label;
887 }
888 return 42;
889 }
890 return f().then((v) {
891 expect(v, equals(42));
892 });
893 });
894
895 test("nested finallies, throw", () {
896 var x = 0;
897 f() async {
898 try {
899 try {
900 throw "err";
901 } finally {
902 x = await new Future.value(37);
903 }
904 } finally {
905 x += await new Future.value(37);
906 }
907 }
908 return f().then((v) { fail("didn't throw"); },
909 onError: (e) { expect(e, equals("err")); });
Søren Gjesse 2015/03/03 08:08:41 Also checck x is 74.
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Done.
910 });
911 });
912
913 group("try-catch-finally", () {
914 test("await in body", () {
915 f() async {
916 try {
917 return await new Future.value(42);
918 } catch (e) {
919 throw null;
920 } finally {
921 if (id(42) == id(10)) return 10;
922 }
923 }
924 return f().then((v) {
925 expect(v, equals(42));
926 });
927 });
928
929 test("await in catch, not hit", () {
930 f() async {
931 try {
932 return id(42);
933 } catch (e) {
934 await new Future.error("err");
935 } finally {
936 if (id(42) == id(10)) return 10;
937 }
938 }
939 return f().then((v) {
940 expect(v, equals(42));
941 });
942 });
943
944 test("await in catch, hit", () {
945 f() async {
946 try {
947 return throw id(42);
948 } catch (e) {
949 return await new Future.value(e);
950 } finally {
951 if (id(42) == id(10)) return 10;
952 }
953 }
954 return f().then((v) {
955 expect(v, equals(42));
956 });
957 });
958
959 test("await in finally", () {
960 var x = 0;
961 f() async {
962 try {
963 return id(42);
964 } catch (e) {
965 throw null;
966 } finally {
967 x = await new Future.value(37);
968 if (id(42) == id(10)) return 10;
969 }
970 }
971 return f().then((v) {
972 expect(v, equals(42));
973 expect(x, equals(37));
974 });
975 });
976 });
977 }
978
979
980 // Attempt to obfuscates value to avoid too much constant folding.
981 id(v) {
Søren Gjesse 2015/03/03 08:08:41 Maybe move this up to mkStream (or move mkStream d
Lasse Reichstein Nielsen 2015/03/03 11:22:42 Moving mkStream down. I have added many more helpe
982 try {
983 throw v;
984 } catch (e) {
985 return e;
986 }
987 return null;
988 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698