OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library async_start_test; | 5 library async_start_test; |
6 | 6 |
7 import "package:unittest/unittest.dart"; | 7 import "package:unittest/unittest.dart"; |
8 import "dart:async"; | 8 import "dart:async"; |
9 | 9 |
10 main() { | 10 main() { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 }); | 141 }); |
142 | 142 |
143 test("labeled", () { | 143 test("labeled", () { |
144 f() async* { | 144 f() async* { |
145 label1: yield 0; | 145 label1: yield 0; |
146 } | 146 } |
147 return expectList(f(), [0]); | 147 return expectList(f(), [0]); |
148 }); | 148 }); |
149 | 149 |
150 // VM issue 2238 | 150 // VM issue 2238 |
151 test("labeled 2", () { /// 01: ok | 151 test("labeled 2", () { // /// 01: ok |
152 f() async* { /// 01: continued | 152 f() async* { // /// 01: continued |
153 label1: label2: yield 0; /// 01: continued | 153 label1: label2: yield 0; // /// 01: continued |
154 } /// 01: continued | 154 } // /// 01: continued |
155 return expectList(f(), [0]); /// 01: continued | 155 return expectList(f(), [0]); // /// 01: continued |
156 }); /// 01: continued | 156 }); // /// 01: continued |
157 | 157 |
158 test("for-loop", () { | 158 test("for-loop", () { |
159 f() async* { | 159 f() async* { |
160 for (int i = 0; i < 3; i++) yield i; | 160 for (int i = 0; i < 3; i++) yield i; |
161 } | 161 } |
162 return expectList(f(), [0, 1, 2]); | 162 return expectList(f(), [0, 1, 2]); |
163 }); | 163 }); |
164 | 164 |
165 test("for-in-loop", () { | 165 test("for-in-loop", () { |
166 f() async* { | 166 f() async* { |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 done.complete(); | 703 done.complete(); |
704 } | 704 } |
705 }, onDone: () { | 705 }, onDone: () { |
706 fail("Unexpected done!"); | 706 fail("Unexpected done!"); |
707 }); | 707 }); |
708 return done.future.whenComplete(() { | 708 return done.future.whenComplete(() { |
709 expect(list.length == 18 || list.length == 19, isTrue); | 709 expect(list.length == 18 || list.length == 19, isTrue); |
710 }); | 710 }); |
711 }); | 711 }); |
712 | 712 |
713 test("canceling while paused at yield", () { /// 02: ok | 713 test("canceling while paused at yield", () { // /// 02: ok |
714 var list = []; /// 02: contin
ued | 714 var list = []; // /// 02: cont
inued |
715 var sync = new Sync(); /// 02: contin
ued | 715 var sync = new Sync(); // /// 02: cont
inued |
716 f() async* { /// 02: contin
ued | 716 f() async* { // /// 02: cont
inued |
717 list.add("*1"); /// 02: contin
ued | 717 list.add("*1"); // /// 02: cont
inued |
718 yield 1; /// 02: contin
ued | 718 yield 1; // /// 02: cont
inued |
719 await sync.wait(); /// 02: contin
ued | 719 await sync.wait(); // /// 02: cont
inued |
720 sync.release(); /// 02: contin
ued | 720 sync.release(); // /// 02: cont
inued |
721 list.add("*2"); /// 02: contin
ued | 721 list.add("*2"); // /// 02: cont
inued |
722 yield 2; /// 02: contin
ued | 722 yield 2; // /// 02: cont
inued |
723 list.add("*3"); /// 02: contin
ued | 723 list.add("*3"); // /// 02: cont
inued |
724 }; /// 02: contin
ued | 724 }; // /// 02: cont
inued |
725 var stream = f(); /// 02: contin
ued | 725 var stream = f(); // /// 02: cont
inued |
726 // TODO(jmesserly): added workaround for: | 726 // TODO(jmesserly): added workaround for: |
727 // https://github.com/dart-lang/dev_compiler/issues/269 | 727 // https://github.com/dart-lang/dev_compiler/issues/269 |
728 var sub = stream.listen((x) => list.add(x)); ///
02: continued | 728 var sub = stream.listen((x) => list.add(x)); // //
/ 02: continued |
729 return sync.wait().whenComplete(() { /// 02: contin
ued | 729 return sync.wait().whenComplete(() { // /// 02: cont
inued |
730 expect(list, equals(["*1", 1])); /// 02: contin
ued | 730 expect(list, equals(["*1", 1])); // /// 02: cont
inued |
731 sub.pause(); /// 02: contin
ued | 731 sub.pause(); // /// 02: cont
inued |
732 return sync.wait(); /// 02: contin
ued | 732 return sync.wait(); // /// 02: cont
inued |
733 }).whenComplete(() { /// 02: contin
ued | 733 }).whenComplete(() { // /// 02: cont
inued |
734 expect(list, equals(["*1", 1, "*2"])); /// 02: contin
ued | 734 expect(list, equals(["*1", 1, "*2"])); // /// 02: cont
inued |
735 sub.cancel(); /// 02: contin
ued | 735 sub.cancel(); // /// 02: cont
inued |
736 return new Future.delayed(MS * 200, () { /// 02: contin
ued | 736 return new Future.delayed(MS * 200, () { // /// 02: cont
inued |
737 // Should not have yielded 2 or added *3 while paused. /// 02: contin
ued | 737 // Should not have yielded 2 or added *3 while paused. // /// 02: cont
inued |
738 expect(list, equals(["*1", 1, "*2"])); /// 02: contin
ued | 738 expect(list, equals(["*1", 1, "*2"])); // /// 02: cont
inued |
739 }); /// 02: contin
ued | 739 }); // /// 02: cont
inued |
740 }); /// 02: contin
ued | 740 }); // /// 02: cont
inued |
741 }); /// 02: contin
ued | 741 }); // /// 02: cont
inued |
742 }); | 742 }); |
743 | 743 |
744 group("await for", () { | 744 group("await for", () { |
745 mkStream(int n) async* { | 745 mkStream(int n) async* { |
746 for (int i = 0; i < n; i++) yield i; | 746 for (int i = 0; i < n; i++) yield i; |
747 } | 747 } |
748 | 748 |
749 test("simple stream", () { | 749 test("simple stream", () { |
750 f(s) async { | 750 f(s) async { |
751 var r = 0; | 751 var r = 0; |
752 await for(var v in s) r += v; | 752 await for(var v in s) r += v; |
753 return r; | 753 return r; |
754 } | 754 } |
755 return f(mkStream(5)).then((v) { | 755 return f(mkStream(5)).then((v) { |
756 expect(v, equals(10)); | 756 expect(v, equals(10)); |
757 }); | 757 }); |
758 }); | 758 }); |
759 | 759 |
760 test("simple stream, await", () { | 760 test("simple stream, await", () { |
761 f(s) async { | 761 f(s) async { |
762 var r = 0; | 762 var r = 0; |
763 await for(var v in s) r += await new Future.microtask(() => v); | 763 await for(var v in s) r += await new Future.microtask(() => v); |
764 return r; | 764 return r; |
765 } | 765 } |
766 return f(mkStream(5)).then((v) { | 766 return f(mkStream(5)).then((v) { |
767 expect(v, equals(10)); | 767 expect(v, equals(10)); |
768 }); | 768 }); |
769 }); | 769 }); |
770 | 770 |
771 test("simple stream - take", () { /// 03: ok | 771 test("simple stream - take", () { // /// 03: ok |
772 f(s) async { /// 03: continued | 772 f(s) async { // /// 03: continued |
773 var r = 0; /// 03: continued | 773 var r = 0; // /// 03: continued |
774 await for(var v in s.take(5)) r += v; /// 03: continued | 774 await for(var v in s.take(5)) r += v; // /// 03: continued |
775 return r; /// 03: continued | 775 return r; // /// 03: continued |
776 } /// 03: continued | 776 } // /// 03: continued |
777 return f(mkStream(10)).then((v) { /// 03: continued | 777 return f(mkStream(10)).then((v) { // /// 03: continued |
778 expect(v, equals(10)); /// 03: continued | 778 expect(v, equals(10)); // /// 03: continued |
779 }); /// 03: continued | 779 }); // /// 03: continued |
780 }); /// 03: continued | 780 }); // /// 03: continued |
781 | 781 |
782 test("simple stream reyield", () { | 782 test("simple stream reyield", () { |
783 f(s) async* { | 783 f(s) async* { |
784 var r = 0; | 784 var r = 0; |
785 await for(var v in s) yield r += v; | 785 await for(var v in s) yield r += v; |
786 } | 786 } |
787 return expectList(f(mkStream(5)), [0, 1, 3, 6, 10]); | 787 return expectList(f(mkStream(5)), [0, 1, 3, 6, 10]); |
788 }); | 788 }); |
789 | 789 |
790 test("simple stream, await, reyield", () { | 790 test("simple stream, await, reyield", () { |
791 f(s) async* { | 791 f(s) async* { |
792 var r = 0; | 792 var r = 0; |
793 await for(var v in s) yield r += await new Future.microtask(() => v); | 793 await for(var v in s) yield r += await new Future.microtask(() => v); |
794 } | 794 } |
795 return expectList(f(mkStream(5)), [0, 1, 3, 6, 10]); | 795 return expectList(f(mkStream(5)), [0, 1, 3, 6, 10]); |
796 }); | 796 }); |
797 | 797 |
798 test("simple stream - take, reyield", () { /// 04: ok | 798 test("simple stream - take, reyield", () { // /// 04: ok |
799 f(s) async* { /// 04: continued | 799 f(s) async* { // /// 04: continue
d |
800 var r = 0; /// 04: continued | 800 var r = 0; // /// 04: continue
d |
801 await for(var v in s.take(5)) yield r += v; /// 04: continued | 801 await for(var v in s.take(5)) yield r += v; // /// 04: continue
d |
802 } /// 04: continued | 802 } // /// 04: continue
d |
803 return expectList(f(mkStream(10)), [0, 1, 3, 6, 10]); /// 04: continued | 803 return expectList(f(mkStream(10)), [0, 1, 3, 6, 10]); // /// 04: continue
d |
804 }); /// 04: continued | 804 }); // /// 04: continue
d |
805 | 805 |
806 test("nested", () { | 806 test("nested", () { |
807 f() async { | 807 f() async { |
808 var r = 0; | 808 var r = 0; |
809 await for (var i in mkStream(5)) { | 809 await for (var i in mkStream(5)) { |
810 await for (var j in mkStream(3)) { | 810 await for (var j in mkStream(3)) { |
811 r += i * j; | 811 r += i * j; |
812 } | 812 } |
813 } | 813 } |
814 return r; | 814 return r; |
(...skipping 27 matching lines...) Expand all Loading... |
842 r += await new Future.microtask(() => ai * j); | 842 r += await new Future.microtask(() => ai * j); |
843 } | 843 } |
844 } | 844 } |
845 return r; | 845 return r; |
846 } | 846 } |
847 return f().then((v) { | 847 return f().then((v) { |
848 expect(v, equals((1 + 2 + 3 + 4) * (1 + 2))); | 848 expect(v, equals((1 + 2 + 3 + 4) * (1 + 2))); |
849 }); | 849 }); |
850 }); | 850 }); |
851 | 851 |
852 test("await pauses loop", () { /// 05: ok | 852 test("await pauses loop", () { // /// 05: o
k |
853 var sc; /// 05: con
tinued | 853 var sc; // /// 05: c
ontinued |
854 var i = 0; /// 05: con
tinued | 854 var i = 0; // /// 05: c
ontinued |
855 void send() { /// 05: con
tinued | 855 void send() { // /// 05: c
ontinued |
856 if (i == 5) { /// 05: con
tinued | 856 if (i == 5) { // /// 05: c
ontinued |
857 sc.close(); /// 05: con
tinued | 857 sc.close(); // /// 05: c
ontinued |
858 } else { /// 05: con
tinued | 858 } else { // /// 05: c
ontinued |
859 sc.add(i++); /// 05: con
tinued | 859 sc.add(i++); // /// 05: c
ontinued |
860 } /// 05: con
tinued | 860 } // /// 05: c
ontinued |
861 } /// 05: con
tinued | 861 } // /// 05: c
ontinued |
862 sc = new StreamController(onListen: send, onResume: send); /// 05: con
tinued | 862 sc = new StreamController(onListen: send, onResume: send); // /// 05: c
ontinued |
863 f(s) async { /// 05: con
tinued | 863 f(s) async { // /// 05: c
ontinued |
864 var r = 0; /// 05: con
tinued | 864 var r = 0; // /// 05: c
ontinued |
865 await for (var i in s) { /// 05: con
tinued | 865 await for (var i in s) { // /// 05: c
ontinued |
866 r += await new Future.delayed(MS * 10, () => i); /// 05: con
tinued | 866 r += await new Future.delayed(MS * 10, () => i); // /// 05: c
ontinued |
867 } /// 05: con
tinued | 867 } // /// 05: c
ontinued |
868 return r; /// 05: con
tinued | 868 return r; // /// 05: c
ontinued |
869 } /// 05: con
tinued | 869 } // /// 05: c
ontinued |
870 return f(sc.stream).then((v) { /// 05: con
tinued | 870 return f(sc.stream).then((v) { // /// 05: c
ontinued |
871 expect(v, equals(10)); /// 05: con
tinued | 871 expect(v, equals(10)); // /// 05: c
ontinued |
872 }); /// 05: con
tinued | 872 }); // /// 05: c
ontinued |
873 }); /// 05: con
tinued | 873 }); // /// 05: c
ontinued |
874 }); | 874 }); |
875 } | 875 } |
876 | 876 |
877 // Obscuring identity function. | 877 // Obscuring identity function. |
878 id(x) { | 878 id(x) { |
879 try { | 879 try { |
880 if (x != null) throw x; | 880 if (x != null) throw x; |
881 } catch (e) { | 881 } catch (e) { |
882 return e; | 882 return e; |
883 } | 883 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 } | 921 } |
922 | 922 |
923 // Release whoever is currently waiting. | 923 // Release whoever is currently waiting. |
924 void release([v]) { | 924 void release([v]) { |
925 if (_completer != null) { | 925 if (_completer != null) { |
926 _completer.complete(v); | 926 _completer.complete(v); |
927 _completer = null; | 927 _completer = null; |
928 } | 928 } |
929 } | 929 } |
930 } | 930 } |
OLD | NEW |