OLD | NEW |
---|---|
(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 } | |
OLD | NEW |