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

Side by Side Diff: test/stream_events_test.dart

Issue 1149563010: Add new features to package:async. (Closed) Base URL: https://github.com/dart-lang/async@master
Patch Set: more docs and tests. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (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 library async.stream_events_test;
6
7 import "dart:async";
8
9 import "package:async/async.dart" show StreamEvents;
10 import "package:test/test.dart";
11
12 main() {
Søren Gjesse 2015/06/11 07:57:07 Add check of isDone.
Lasse Reichstein Nielsen 2015/06/12 13:04:23 Acknowledged.
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
13 group("next", () {
14 test("simple", () async {
15 var e = new StreamEvents<int>(createStream());
16 for (int i = 1; i <= 4; i++) {
17 expect(await e.next, i);
18 }
19 expect(e.next, throws);
nweiz 2015/06/12 01:24:27 throwsStateError. In general, check that the excep
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
20 });
21
22 test("request mutiple", () async {
nweiz 2015/06/12 01:24:28 "mutiple" -> "multiple"
Lasse Reichstein Nielsen 2015/06/15 15:46:24 Done.
23 var e = new StreamEvents<int>(createStream());
24 var r = await Future.wait(new Iterable.generate(4, (n) => e.next));
Søren Gjesse 2015/06/11 07:57:07 n -> _
nweiz 2015/06/12 01:24:27 Explicitly writing out the [e.next] calls would be
Lasse Reichstein Nielsen 2015/06/12 13:04:23 Acknowledged.
Lasse Reichstein Nielsen 2015/06/15 15:46:25 It's also shorter. Until I start using longer name
25 expect(r, [1, 2, 3, 4]);
26 await e.close();
nweiz 2015/06/12 01:24:27 Is there any reason to explicitly close the stream
Lasse Reichstein Nielsen 2015/06/15 15:46:25 True. It's good style, and I'd like to encourage i
27 });
28
29 test("error", () async {
30 var e = new StreamEvents<int>(createErrorStream());
31 expect(await e.next, 1);
32 expect(await e.next, 2);
33 expect(e.next, throws);
34 expect(await e.next, 4);
35 await e.close();
36 });
37 });
nweiz 2015/06/12 01:24:28 Test that the underlying subscription is paused wh
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
38
39 group("skip", () {
40 test("simple-2", () async {
nweiz 2015/06/12 01:24:27 This name isn't very descriptive.
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
41 var e = new StreamEvents<int>(createStream());
42 expect(await e.next, 1);
43 expect(await e.skip(2), 0);
44 expect(await e.next, 4);
45 await e.close();
46 });
47
48 test("negative/bad throws", () async {
49 var e = new StreamEvents<int>(createStream());
50 expect(() => e.skip(-1), throws);
51 expect(() => e.skip("not a number"), throws);
nweiz 2015/06/12 01:24:27 I don't think it's necessary to test type errors.
Lasse Reichstein Nielsen 2015/06/15 15:46:24 Done.
52 expect(await e.next, 1); // Did not consume event.
53 expect(() => e.skip(-1), throws);
54 expect(() => e.skip("not a number"), throws);
55 expect(await e.next, 2); // Did not consume event.
56 await e.close();
57 });
58
59 test("0 works", () async {
60 var e = new StreamEvents<int>(createStream());
61 expect(e.skip(0), completion(0));
62 expect(e.next, completion(1));
63 expect(e.skip(0), completion(0));
64 expect(e.next, completion(2));
65 expect(e.skip(0), completion(0));
66 expect(e.next, completion(3));
67 expect(e.skip(0), completion(0));
68 expect(e.next, completion(4));
69 expect(e.skip(0), completion(0));
70 expect(e.skip(5), completion(5));
71 expect(e.next, throws);
72 await e.close();
73 });
74
75 test("too large", () async {
76 var e = new StreamEvents<int>(createStream());
77 expect(await e.skip(6), 2);
78 await e.close();
79 });
80
81 test("too large later", () async {
82 var e = new StreamEvents<int>(createStream());
83 expect(await e.next, 1);
84 expect(await e.next, 2);
85 expect(await e.skip(6), 4);
86 await e.close();
87 });
88
89 test("error", () async {
90 var e = new StreamEvents<int>(createErrorStream());
91 expect(e.skip(4), throws);
92 expect(await e.next, 4);
93 await e.close();
94 });
95 });
96
97 group("take", () {
98 test("simple-2", () async {
99 var e = new StreamEvents<int>(createStream());
100 expect(await e.next, 1);
101 expect(await e.take(2), [2, 3]);
102 expect(await e.next, 4);
103 await e.close();
104 });
105
106 test("0 works", () async {
107 var e = new StreamEvents<int>(createStream());
108 expect(e.take(0), completion([]));
109 expect(e.next, completion(1));
110 expect(e.take(0), completion([]));
111 expect(e.next, completion(2));
112 expect(e.take(0), completion([]));
113 expect(e.next, completion(3));
114 expect(e.take(0), completion([]));
115 expect(e.next, completion(4));
116 expect(e.take(0), completion([]));
117 expect(e.take(5), completion([]));
118 expect(e.next, throws);
119 await e.close();
120 });
121
122 test("negative/bad throws", () async {
123 var e = new StreamEvents<int>(createStream());
124 expect(() => e.take(-1), throws);
125 expect(() => e.take("not a number"), throws);
126 expect(await e.next, 1); // Did not consume event.
127 expect(() => e.take(-1), throws);
128 expect(() => e.take("not a number"), throws);
129 expect(await e.next, 2); // Did not consume event.
130 await e.close();
131 });
132
133 test("too large", () async {
134 var e = new StreamEvents<int>(createStream());
135 expect(await e.take(6), [1, 2, 3, 4]);
136 await e.close();
137 });
138
139 test("too large later", () async {
140 var e = new StreamEvents<int>(createStream());
141 expect(await e.next, 1);
142 expect(await e.next, 2);
143 expect(await e.take(6), [3, 4]);
144 await e.close();
145 });
146
147 test("error", () async {
148 var e = new StreamEvents<int>(createErrorStream());
149 expect(e.take(4), throws);
150 expect(await e.next, 4);
151 await e.close();
152 });
153 });
154
155 group("rest", () {
156 test("simple", () async {
157 var e = new StreamEvents<int>(createStream());
158 expect(await e.next, 1);
159 expect(await e.rest.toList(), [2, 3, 4]);
160 });
161
162 test("at start", () async {
163 var e = new StreamEvents<int>(createStream());
164 expect(await e.rest.toList(), [1, 2, 3, 4]);
165 });
166
167 test("at end", () async {
168 var e = new StreamEvents<int>(createStream());
169 expect(await e.next, 1);
170 expect(await e.next, 2);
171 expect(await e.next, 3);
172 expect(await e.next, 4);
173 expect(await e.rest.toList(), []);
174 });
175
176 test("after end", () async {
177 var e = new StreamEvents<int>(createStream());
178 expect(await e.next, 1);
179 expect(await e.next, 2);
180 expect(await e.next, 3);
181 expect(await e.next, 4);
182 expect(e.next, throws);
183 expect(await e.rest.toList(), []);
184 });
185
186 test("error", () async {
187 var e = new StreamEvents<int>(createErrorStream());
188 expect(await e.next, 1);
189 var r = e.rest;
190 var e2 = new StreamEvents(r);
191 expect(await e2.next, 2);
192 expect(e2.next, throws);
193 expect(await e2.next, 4);
194 });
195
196 test("closes", () async {
197 var e = new StreamEvents<int>(createStream());
198 var stream = e.rest;
199 expect(() => e.next, throws);
200 expect(() => e.skip(1), throws);
201 expect(() => e.take(1), throws);
202 expect(() => e.rest, throws);
203 expect(() => e.close(), throws);
204 });
205 });
nweiz 2015/06/12 01:24:27 Also test forwarding pause/cancel to the underlyin
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
206
207 group("close", () {
208 test("anything throws", () async {
209 var e = new StreamEvents<int>(createStream());
210 await e.close();
211 expect(() => e.next, throws);
212 expect(() => e.skip(1), throws);
213 expect(() => e.take(1), throws);
214 expect(() => e.rest, throws);
215 expect(() => e.close(), throws);
216 });
217 });
nweiz 2015/06/12 01:24:27 Ensure that it cancels the underlying subscription
Lasse Reichstein Nielsen 2015/06/15 15:46:24 Done.
218
219 test("mixed", () async {
220 var e = new StreamEvents<int>(createLongStream());
221 nextTest(n) {
222 for (int i = 0; i < 10; i++) {
223 expect(e.next, completion(n + i));
224 }
225 }
226 skipTest(n) {
227 expect(e.skip(10), completion(0));
228 }
229 takeTest(n) {
230 expect(e.take(10), completion(new List.generate(10, (i) => n + i)));
231 }
232 var tests = [nextTest, skipTest, takeTest];
Søren Gjesse 2015/06/11 07:57:07 assert(tests.length * tests.length + 20 == 200) or
233 int counter = 0;
234 for (int i = 0; i < tests.length; i++) {
235 for (int j = 0; j < tests.length; j++) {
236 tests[i](counter);
237 tests[j](counter + 10);
238 counter += 20;
239 }
240 }
241 expect(e.rest.toList(),
242 completion(new List.generate(20, (i) => counter + i)));
nweiz 2015/06/12 01:24:27 It's hard for me to follow what's going on here...
Lasse Reichstein Nielsen 2015/06/15 15:46:25 Done.
243 });
244 }
245
246 const MS = const Duration(milliseconds: 1);
247 Future sleep(int n) => new Future.delayed(MS * n);
248
249 Stream<int> createStream() async* {
250 yield 1;
251 await sleep(20);
252 yield 2;
253 await sleep(10);
254 yield 3;
255 await sleep(15);
256 yield 4;
257 }
258
259 Stream<int> createErrorStream() {
260 StreamController controller = new StreamController<int>();
261 () async{
Søren Gjesse 2015/06/11 07:57:07 Space after async.
Lasse Reichstein Nielsen 2015/06/12 13:04:23 Done.
262 controller.add(1);
263 await sleep(20);
264 controller.add(2);
265 await sleep(10);
266 controller.addError("To err is divine!");
267 await sleep(15);
268 controller.add(4);
269 }();
270 return controller.stream;
271 }
272
273 Stream<int> createLongStream() async* {
274 for (int i = 0; i < 200; i++) yield i;
275 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698