OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 // Test the basic StreamController and StreamController.singleSubscription. | 5 // Test the basic StreamController and StreamController.singleSubscription. |
6 library stream_controller_test; | 6 library stream_controller_test; |
7 | 7 |
8 import "package:expect/expect.dart"; | 8 import "package:expect/expect.dart"; |
9 import "package:async_helper/async_helper.dart"; | 9 import "package:async_helper/async_helper.dart"; |
10 import 'dart:async'; | 10 import 'dart:async'; |
11 import 'event_helper.dart'; | 11 import 'event_helper.dart'; |
12 | 12 |
13 const MS = const Duration(milliseconds: 1); | 13 const MS = const Duration(milliseconds: 1); |
14 | 14 |
15 fail(e) { Expect.fail("Unexepected error: $e"); } | 15 fail(e) { Expect.fail("Unexepected error: $e"); } |
16 | 16 |
17 void testMultiController() { | 17 void testMultiController() { |
18 // Test normal flow. | 18 // Test normal flow. |
19 var c = new StreamController(sync: true); | 19 { |
20 Events expectedEvents = new Events() | 20 var c = new StreamController(sync: true); |
21 ..add(42) | 21 Events expectedEvents = new Events() |
22 ..add("dibs") | 22 ..add(42) |
23 ..error("error!") | 23 ..add("dibs") |
24 ..error("error too!") | 24 ..error("error!") |
25 ..close(); | 25 ..error("error too!") |
26 CaptureEvents actualEvents = new Events.capture(c.stream.asBroadcastStream()); | 26 ..close(); |
27 expectedEvents.replay(c); | 27 CaptureEvents actualEvents = |
28 Expect.listEquals(expectedEvents.events, actualEvents.events); | 28 new Events.capture(c.stream.asBroadcastStream()); |
| 29 expectedEvents.replay(c); |
| 30 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 31 } |
29 | 32 |
30 // Test automatic unsubscription on error. | 33 // Test automatic unsubscription on error. |
31 c = new StreamController(sync: true); | 34 { |
32 expectedEvents = new Events()..add(42)..error("error"); | 35 var c = new StreamController(sync: true); |
33 actualEvents = new Events.capture(c.stream.asBroadcastStream(), | 36 var expectedEvents = new Events()..add(42)..error("error"); |
34 cancelOnError: true); | 37 var actualEvents = new Events.capture(c.stream.asBroadcastStream(), |
35 Events sentEvents = | 38 cancelOnError: true); |
36 new Events()..add(42)..error("error")..add("Are you there?"); | 39 Events sentEvents = |
37 sentEvents.replay(c); | 40 new Events()..add(42)..error("error")..add("Are you there?"); |
38 Expect.listEquals(expectedEvents.events, actualEvents.events); | 41 sentEvents.replay(c); |
| 42 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 43 } |
39 | 44 |
40 // Test manual unsubscription. | 45 // Test manual unsubscription. |
41 c = new StreamController(sync: true); | 46 { |
42 expectedEvents = new Events()..add(42)..error("error")..add(37); | 47 var c = new StreamController(sync: true); |
43 actualEvents = new Events.capture(c.stream.asBroadcastStream(), | 48 var expectedEvents = new Events()..add(42)..error("error")..add(37); |
44 cancelOnError: false); | 49 var actualEvents = new Events.capture(c.stream.asBroadcastStream(), |
45 expectedEvents.replay(c); | 50 cancelOnError: false); |
46 actualEvents.subscription.cancel(); | 51 expectedEvents.replay(c); |
47 c.add("Are you there"); // Not sent to actualEvents. | 52 actualEvents.subscription.cancel(); |
48 Expect.listEquals(expectedEvents.events, actualEvents.events); | 53 c.add("Are you there"); // Not sent to actualEvents. |
| 54 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 55 } |
49 | 56 |
50 // Test filter. | 57 // Test filter. |
51 c = new StreamController(sync: true); | 58 { |
52 expectedEvents = new Events() | 59 var c = new StreamController(sync: true); |
53 ..add("a string")..add("another string")..close(); | 60 var expectedEvents = new Events() |
54 sentEvents = new Events() | 61 ..add("a string")..add("another string")..close(); |
55 ..add("a string")..add(42)..add("another string")..close(); | 62 var sentEvents = new Events() |
56 actualEvents = new Events.capture(c.stream | 63 ..add("a string")..add(42)..add("another string")..close(); |
57 .asBroadcastStream() | 64 var actualEvents = new Events.capture(c.stream |
58 .where((v) => v is String)); | 65 .asBroadcastStream() |
59 sentEvents.replay(c); | 66 .where((v) => v is String)); |
60 Expect.listEquals(expectedEvents.events, actualEvents.events); | 67 sentEvents.replay(c); |
| 68 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 69 } |
61 | 70 |
62 // Test map. | 71 // Test map. |
63 c = new StreamController(sync: true); | 72 { |
64 expectedEvents = new Events()..add("abab")..error("error")..close(); | 73 var c = new StreamController(sync: true); |
65 sentEvents = new Events()..add("ab")..error("error")..close(); | 74 var expectedEvents = new Events()..add("abab")..error("error")..close(); |
66 actualEvents = new Events.capture(c.stream | 75 var sentEvents = new Events()..add("ab")..error("error")..close(); |
67 .asBroadcastStream() | 76 var actualEvents = new Events.capture(c.stream |
68 .map((v) => "$v$v")); | 77 .asBroadcastStream() |
69 sentEvents.replay(c); | 78 .map((v) => "$v$v")); |
70 Expect.listEquals(expectedEvents.events, actualEvents.events); | 79 sentEvents.replay(c); |
| 80 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 81 } |
71 | 82 |
72 // Test handleError. | 83 // Test handleError. |
73 c = new StreamController(sync: true); | 84 { |
74 expectedEvents = new Events()..add("ab")..error("[foo]"); | 85 var c = new StreamController(sync: true); |
75 sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close(); | 86 var expectedEvents = new Events()..add("ab")..error("[foo]"); |
76 actualEvents = new Events.capture(c.stream | 87 var sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close(); |
77 .asBroadcastStream() | 88 var actualEvents = new Events.capture(c.stream |
78 .handleError((error) { | 89 .asBroadcastStream() |
79 if (error is String) { | 90 .handleError((error) { |
80 // TODO(floitsch): this test originally changed the stacktrace. | 91 if (error is String) { |
81 throw "[${error}]"; | 92 // TODO(floitsch): this test originally changed the stacktrace. |
82 } | 93 throw "[${error}]"; |
83 }), cancelOnError: true); | 94 } |
84 sentEvents.replay(c); | 95 }), cancelOnError: true); |
85 Expect.listEquals(expectedEvents.events, actualEvents.events); | 96 sentEvents.replay(c); |
| 97 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 98 } |
86 | 99 |
87 // reduce is tested asynchronously and therefore not in this file. | 100 // reduce is tested asynchronously and therefore not in this file. |
88 | 101 |
89 // Test expand | 102 // Test expand |
90 c = new StreamController(sync: true); | 103 { |
91 sentEvents = new Events()..add(3)..add(2)..add(4)..close(); | 104 var c = new StreamController(sync: true); |
92 expectedEvents = new Events()..add(1)..add(2)..add(3) | 105 var sentEvents = new Events()..add(3)..add(2)..add(4)..close(); |
93 ..add(1)..add(2) | 106 var expectedEvents = new Events()..add(1)..add(2)..add(3) |
94 ..add(1)..add(2)..add(3)..add(4) | 107 ..add(1)..add(2) |
95 ..close(); | 108 ..add(1)..add(2)..add(3)..add(4) |
96 actualEvents = new Events.capture(c.stream.asBroadcastStream().expand((v) { | 109 ..close(); |
97 var l = []; | 110 var actualEvents = |
98 for (int i = 0; i < v; i++) l.add(i + 1); | 111 new Events.capture(c.stream.asBroadcastStream().expand((v) { |
99 return l; | 112 var l = []; |
100 })); | 113 for (int i = 0; i < v; i++) l.add(i + 1); |
101 sentEvents.replay(c); | 114 return l; |
102 Expect.listEquals(expectedEvents.events, actualEvents.events); | 115 })); |
| 116 sentEvents.replay(c); |
| 117 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 118 } |
103 | 119 |
104 // Test transform. | 120 // Test transform. |
105 c = new StreamController(sync: true); | 121 { |
106 sentEvents = new Events()..add("a")..error(42)..add("b")..close(); | 122 var c = new StreamController(sync: true); |
107 expectedEvents = | 123 var sentEvents = new Events()..add("a")..error(42)..add("b")..close(); |
108 new Events()..error("a")..add(42)..error("b")..add("foo")..close(); | 124 var actualEvents = |
109 actualEvents = new Events.capture(c.stream.asBroadcastStream().transform( | 125 new Events.capture(c.stream.asBroadcastStream().transform( |
110 new StreamTransformer.fromHandlers( | 126 new StreamTransformer.fromHandlers( |
111 handleData: (v, s) { s.addError(v); }, | 127 handleData: (v, s) { s.addError(v); }, |
112 handleError: (e, st, s) { s.add(e); }, | 128 handleError: (e, st, s) { s.add(e); }, |
113 handleDone: (s) { | 129 handleDone: (s) { |
114 s.add("foo"); | 130 s.add("foo"); |
115 s.close(); | 131 s.close(); |
116 }))); | 132 }))); |
117 sentEvents.replay(c); | 133 sentEvents.replay(c); |
118 Expect.listEquals(expectedEvents.events, actualEvents.events); | 134 // The close-call automatically calls `cancel` which returns a Future. |
| 135 // This means that the done-event is delayed by one microtask. |
| 136 var expectedEvents = |
| 137 new Events()..error("a")..add(42)..error("b")..add("foo"); |
| 138 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 139 expectedEvents.close(); |
| 140 var savedEvents = expectedEvents; |
| 141 asyncStart(); |
| 142 scheduleMicrotask(() { |
| 143 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 144 asyncEnd(); |
| 145 }); |
| 146 } |
119 | 147 |
120 // Test multiple filters. | 148 // Test multiple filters. |
121 c = new StreamController(sync: true); | 149 { |
122 sentEvents = new Events()..add(42) | 150 var c = new StreamController(sync: true); |
123 ..add("snugglefluffy") | 151 var sentEvents = new Events()..add(42) |
124 ..add(7) | 152 ..add("snugglefluffy") |
125 ..add("42") | 153 ..add(7) |
126 ..error("not FormatException") // Unsubscribes. | 154 ..add("42") |
127 ..close(); | 155 ..error("not FormatException") // Unsubscribes. |
128 expectedEvents = new Events()..add(42)..error("not FormatException"); | 156 ..close(); |
129 actualEvents = new Events.capture( | 157 var expectedEvents = new Events()..add(42)..error("not FormatException"); |
130 c.stream.asBroadcastStream().where((v) => v is String) | 158 var actualEvents = new Events.capture( |
131 .map((v) => int.parse(v)) | 159 c.stream.asBroadcastStream().where((v) => v is String) |
132 .handleError((error) { | 160 .map((v) => int.parse(v)) |
133 if (error is! FormatException) throw error; | 161 .handleError((error) { |
134 }) | 162 if (error is! FormatException) throw error; |
135 .where((v) => v > 10), | 163 }) |
136 cancelOnError: true); | 164 .where((v) => v > 10), |
137 sentEvents.replay(c); | 165 cancelOnError: true); |
138 Expect.listEquals(expectedEvents.events, actualEvents.events); | 166 sentEvents.replay(c); |
| 167 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 168 } |
139 | 169 |
140 // Test subscription changes while firing. | 170 // Test subscription changes while firing. |
141 c = new StreamController(sync: true); | 171 { |
142 var sink = c.sink; | 172 var c = new StreamController(sync: true); |
143 var stream = c.stream.asBroadcastStream(); | 173 var sink = c.sink; |
144 var counter = 0; | 174 var stream = c.stream.asBroadcastStream(); |
145 var subscription = stream.listen(null); | 175 var counter = 0; |
146 subscription.onData((data) { | 176 var subscription = stream.listen(null); |
147 counter += data; | 177 subscription.onData((data) { |
148 subscription.cancel(); | 178 counter += data; |
149 stream.listen((data) { | 179 subscription.cancel(); |
150 counter += 10 * data; | 180 stream.listen((data) { |
| 181 counter += 10 * data; |
| 182 }); |
| 183 var subscription2 = stream.listen(null); |
| 184 subscription2.onData((data) { |
| 185 counter += 100 * data; |
| 186 if (data == 4) subscription2.cancel(); |
| 187 }); |
151 }); | 188 }); |
152 var subscription2 = stream.listen(null); | 189 sink.add(1); // seen by stream 1 |
153 subscription2.onData((data) { | 190 sink.add(2); // seen by stream 10 and 100 |
154 counter += 100 * data; | 191 sink.add(3); // -"- |
155 if (data == 4) subscription2.cancel(); | 192 sink.add(4); // -"- |
156 }); | 193 sink.add(5); // seen by stream 10 |
157 }); | 194 Expect.equals(1 + 20 + 200 + 30 + 300 + 40 + 400 + 50, counter); |
158 sink.add(1); // seen by stream 1 | 195 } |
159 sink.add(2); // seen by stream 10 and 100 | |
160 sink.add(3); // -"- | |
161 sink.add(4); // -"- | |
162 sink.add(5); // seen by stream 10 | |
163 Expect.equals(1 + 20 + 200 + 30 + 300 + 40 + 400 + 50, counter); | |
164 } | 196 } |
165 | 197 |
166 testSingleController() { | 198 testSingleController() { |
167 // Test normal flow. | 199 // Test normal flow. |
168 var c = new StreamController(sync: true); | 200 { |
169 Events expectedEvents = new Events() | 201 var c = new StreamController(sync: true); |
170 ..add(42) | 202 Events expectedEvents = new Events() |
171 ..add("dibs") | 203 ..add(42) |
172 ..error("error!") | 204 ..add("dibs") |
173 ..error("error too!") | 205 ..error("error!") |
174 ..close(); | 206 ..error("error too!") |
175 CaptureEvents actualEvents = new Events.capture(c.stream); | 207 ..close(); |
176 expectedEvents.replay(c); | 208 CaptureEvents actualEvents = new Events.capture(c.stream); |
177 Expect.listEquals(expectedEvents.events, actualEvents.events); | 209 expectedEvents.replay(c); |
| 210 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 211 } |
178 | 212 |
179 // Test automatic unsubscription on error. | 213 // Test automatic unsubscription on error. |
180 c = new StreamController(sync: true); | 214 { |
181 expectedEvents = new Events()..add(42)..error("error"); | 215 var c = new StreamController(sync: true); |
182 actualEvents = new Events.capture(c.stream, cancelOnError: true); | 216 var expectedEvents = new Events()..add(42)..error("error"); |
183 Events sentEvents = | 217 var actualEvents = new Events.capture(c.stream, cancelOnError: true); |
184 new Events()..add(42)..error("error")..add("Are you there?"); | 218 Events sentEvents = |
185 sentEvents.replay(c); | 219 new Events()..add(42)..error("error")..add("Are you there?"); |
186 Expect.listEquals(expectedEvents.events, actualEvents.events); | 220 sentEvents.replay(c); |
| 221 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 222 } |
187 | 223 |
188 // Test manual unsubscription. | 224 // Test manual unsubscription. |
189 c = new StreamController(sync: true); | 225 { |
190 expectedEvents = new Events()..add(42)..error("error")..add(37); | 226 var c = new StreamController(sync: true); |
191 actualEvents = new Events.capture(c.stream, cancelOnError: false); | 227 var expectedEvents = new Events()..add(42)..error("error")..add(37); |
192 expectedEvents.replay(c); | 228 var actualEvents = new Events.capture(c.stream, cancelOnError: false); |
193 actualEvents.subscription.cancel(); | 229 expectedEvents.replay(c); |
194 c.add("Are you there"); // Not sent to actualEvents. | 230 actualEvents.subscription.cancel(); |
195 Expect.listEquals(expectedEvents.events, actualEvents.events); | 231 c.add("Are you there"); // Not sent to actualEvents. |
| 232 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 233 } |
196 | 234 |
197 // Test filter. | 235 // Test filter. |
198 c = new StreamController(sync: true); | 236 { |
199 expectedEvents = new Events() | 237 var c = new StreamController(sync: true); |
200 ..add("a string")..add("another string")..close(); | 238 var expectedEvents = new Events() |
201 sentEvents = new Events() | 239 ..add("a string")..add("another string")..close(); |
202 ..add("a string")..add(42)..add("another string")..close(); | 240 var sentEvents = new Events() |
203 actualEvents = new Events.capture(c.stream.where((v) => v is String)); | 241 ..add("a string")..add(42)..add("another string")..close(); |
204 sentEvents.replay(c); | 242 var actualEvents = new Events.capture(c.stream.where((v) => v is String)); |
205 Expect.listEquals(expectedEvents.events, actualEvents.events); | 243 sentEvents.replay(c); |
| 244 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 245 } |
206 | 246 |
207 // Test map. | 247 // Test map. |
208 c = new StreamController(sync: true); | 248 { |
209 expectedEvents = new Events()..add("abab")..error("error")..close(); | 249 var c = new StreamController(sync: true); |
210 sentEvents = new Events()..add("ab")..error("error")..close(); | 250 var expectedEvents = new Events()..add("abab")..error("error")..close(); |
211 actualEvents = new Events.capture(c.stream.map((v) => "$v$v")); | 251 var sentEvents = new Events()..add("ab")..error("error")..close(); |
212 sentEvents.replay(c); | 252 var actualEvents = new Events.capture(c.stream.map((v) => "$v$v")); |
213 Expect.listEquals(expectedEvents.events, actualEvents.events); | 253 sentEvents.replay(c); |
| 254 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 255 } |
214 | 256 |
215 // Test handleError. | 257 // Test handleError. |
216 c = new StreamController(sync: true); | 258 { |
217 expectedEvents = new Events()..add("ab")..error("[foo]"); | 259 var c = new StreamController(sync: true); |
218 sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close(); | 260 var expectedEvents = new Events()..add("ab")..error("[foo]"); |
219 actualEvents = new Events.capture(c.stream.handleError((error) { | 261 var sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close(); |
220 if (error is String) { | 262 var actualEvents = new Events.capture(c.stream.handleError((error) { |
221 // TODO(floitsch): this error originally changed the stack trace. | 263 if (error is String) { |
222 throw "[${error}]"; | 264 // TODO(floitsch): this error originally changed the stack trace. |
223 } | 265 throw "[${error}]"; |
224 }), cancelOnError: true); | 266 } |
225 sentEvents.replay(c); | 267 }), cancelOnError: true); |
226 Expect.listEquals(expectedEvents.events, actualEvents.events); | 268 sentEvents.replay(c); |
| 269 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 270 } |
227 | 271 |
228 // reduce is tested asynchronously and therefore not in this file. | 272 // reduce is tested asynchronously and therefore not in this file. |
229 | 273 |
230 // Test expand | 274 // Test expand |
231 c = new StreamController(sync: true); | 275 { |
232 sentEvents = new Events()..add(3)..add(2)..add(4)..close(); | 276 var c = new StreamController(sync: true); |
233 expectedEvents = new Events()..add(1)..add(2)..add(3) | 277 var sentEvents = new Events()..add(3)..add(2)..add(4)..close(); |
234 ..add(1)..add(2) | 278 var expectedEvents = new Events()..add(1)..add(2)..add(3) |
235 ..add(1)..add(2)..add(3)..add(4) | 279 ..add(1)..add(2) |
236 ..close(); | 280 ..add(1)..add(2)..add(3)..add(4) |
237 actualEvents = new Events.capture(c.stream.expand((v) { | 281 ..close(); |
238 var l = []; | 282 var actualEvents = new Events.capture(c.stream.expand((v) { |
239 for (int i = 0; i < v; i++) l.add(i + 1); | 283 var l = []; |
240 return l; | 284 for (int i = 0; i < v; i++) l.add(i + 1); |
241 })); | 285 return l; |
242 sentEvents.replay(c); | 286 })); |
243 Expect.listEquals(expectedEvents.events, actualEvents.events); | 287 sentEvents.replay(c); |
| 288 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 289 } |
244 | 290 |
245 // test contains. | 291 // test contains. |
246 { | 292 { |
247 c = new StreamController(sync: true); | 293 var c = new StreamController(sync: true); |
248 // Error after match is not important. | 294 // Error after match is not important. |
249 sentEvents = new Events()..add("a")..add("x")..error("FAIL")..close(); | 295 var sentEvents = new Events()..add("a")..add("x")..error("FAIL")..close(); |
250 Future<bool> contains = c.stream.contains("x"); | 296 Future<bool> contains = c.stream.contains("x"); |
251 contains.then((var c) { | 297 contains.then((var c) { |
252 Expect.isTrue(c); | 298 Expect.isTrue(c); |
253 }); | 299 }); |
254 sentEvents.replay(c); | 300 sentEvents.replay(c); |
255 } | 301 } |
256 | 302 |
257 { | 303 { |
258 c = new StreamController(sync: true); | 304 var c = new StreamController(sync: true); |
259 // Not matching is ok. | 305 // Not matching is ok. |
260 sentEvents = new Events()..add("a")..add("x")..add("b")..close(); | 306 var sentEvents = new Events()..add("a")..add("x")..add("b")..close(); |
261 Future<bool> contains = c.stream.contains("y"); | 307 Future<bool> contains = c.stream.contains("y"); |
262 contains.then((var c) { | 308 contains.then((var c) { |
263 Expect.isFalse(c); | 309 Expect.isFalse(c); |
264 }); | 310 }); |
265 sentEvents.replay(c); | 311 sentEvents.replay(c); |
266 } | 312 } |
267 | 313 |
268 { | 314 { |
269 c = new StreamController(sync: true); | 315 var c = new StreamController(sync: true); |
270 // Error before match makes future err. | 316 // Error before match makes future err. |
271 sentEvents = new Events()..add("a")..error("FAIL")..add("b")..close(); | 317 var sentEvents = new Events()..add("a")..error("FAIL")..add("b")..close(); |
272 Future<bool> contains = c.stream.contains("b"); | 318 Future<bool> contains = c.stream.contains("b"); |
273 contains.then((var c) { | 319 contains.then((var c) { |
274 Expect.fail("no value expected"); | 320 Expect.fail("no value expected"); |
275 }).catchError((error) { | 321 }).catchError((error) { |
276 Expect.equals("FAIL", error); | 322 Expect.equals("FAIL", error); |
277 }); | 323 }); |
278 sentEvents.replay(c); | 324 sentEvents.replay(c); |
279 } | 325 } |
280 | 326 |
281 // Test transform. | 327 // Test transform. |
282 c = new StreamController(sync: true); | 328 { |
283 sentEvents = new Events()..add("a")..error(42)..add("b")..close(); | 329 var c = new StreamController(sync: true); |
284 expectedEvents = | 330 var sentEvents = new Events()..add("a")..error(42)..add("b")..close(); |
285 new Events()..error("a")..add(42)..error("b")..add("foo")..close(); | 331 var actualEvents = new Events.capture(c.stream.transform( |
286 actualEvents = new Events.capture(c.stream.transform( | 332 new StreamTransformer.fromHandlers( |
287 new StreamTransformer.fromHandlers( | 333 handleData: (v, s) { s.addError(v); }, |
288 handleData: (v, s) { s.addError(v); }, | 334 handleError: (e, st, s) { s.add(e); }, |
289 handleError: (e, st, s) { s.add(e); }, | 335 handleDone: (s) { |
290 handleDone: (s) { | 336 s.add("foo"); |
291 s.add("foo"); | 337 s.close(); |
292 s.close(); | 338 }))); |
293 }))); | 339 sentEvents.replay(c); |
294 sentEvents.replay(c); | 340 // The close-call automatically calls `cancel` which returns a Future. |
295 Expect.listEquals(expectedEvents.events, actualEvents.events); | 341 // This means that the done-event is delayed by one microtask. |
| 342 var expectedEvents = |
| 343 new Events()..error("a")..add(42)..error("b")..add("foo"); |
| 344 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 345 asyncStart(); |
| 346 scheduleMicrotask(() { |
| 347 expectedEvents.close(); |
| 348 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 349 asyncEnd(); |
| 350 }); |
| 351 } |
296 | 352 |
297 // Test multiple filters. | 353 // Test multiple filters. |
298 c = new StreamController(sync: true); | 354 { |
299 sentEvents = new Events()..add(42) | 355 var c = new StreamController(sync: true); |
300 ..add("snugglefluffy") | 356 var sentEvents = new Events()..add(42) |
301 ..add(7) | 357 ..add("snugglefluffy") |
302 ..add("42") | 358 ..add(7) |
303 ..error("not FormatException") // Unsubscribes. | 359 ..add("42") |
304 ..close(); | 360 ..error("not FormatException") // Unsubscribes. |
305 expectedEvents = new Events()..add(42)..error("not FormatException"); | 361 ..close(); |
306 actualEvents = new Events.capture( | 362 var expectedEvents = new Events()..add(42)..error("not FormatException"); |
307 c.stream.where((v) => v is String) | 363 var actualEvents = new Events.capture( |
308 .map((v) => int.parse(v)) | 364 c.stream.where((v) => v is String) |
309 .handleError((error) { | 365 .map((v) => int.parse(v)) |
310 if (error is! FormatException) throw error; | 366 .handleError((error) { |
311 }) | 367 if (error is! FormatException) throw error; |
312 .where((v) => v > 10), | 368 }) |
313 cancelOnError: true); | 369 .where((v) => v > 10), |
314 sentEvents.replay(c); | 370 cancelOnError: true); |
315 Expect.listEquals(expectedEvents.events, actualEvents.events); | 371 sentEvents.replay(c); |
| 372 Expect.listEquals(expectedEvents.events, actualEvents.events); |
| 373 } |
316 | 374 |
317 // Test that only one subscription is allowed. | 375 // Test that only one subscription is allowed. |
318 c = new StreamController(sync: true); | 376 { |
319 var sink = c.sink; | 377 var c = new StreamController(sync: true); |
320 var stream = c.stream; | 378 var sink = c.sink; |
321 var counter = 0; | 379 var stream = c.stream; |
322 var subscription = stream.listen((data) { counter += data; }); | 380 var counter = 0; |
323 Expect.throws(() => stream.listen(null), (e) => e is StateError); | 381 var subscription = stream.listen((data) { counter += data; }); |
324 sink.add(1); | 382 Expect.throws(() => stream.listen(null), (e) => e is StateError); |
325 Expect.equals(1, counter); | 383 sink.add(1); |
326 c.close(); | 384 Expect.equals(1, counter); |
| 385 c.close(); |
| 386 } |
327 } | 387 } |
328 | 388 |
329 testExtraMethods() { | 389 testExtraMethods() { |
330 Events sentEvents = new Events()..add(1)..add(2)..add(3)..close(); | 390 Events sentEvents = new Events()..add(1)..add(2)..add(3)..close(); |
331 | 391 |
332 var c = new StreamController(sync: true); | 392 var c = new StreamController(sync: true); |
333 Events expectedEvents = new Events()..add(3)..close(); | 393 Events expectedEvents = new Events()..add(3)..close(); |
334 Events actualEvents = new Events.capture(c.stream.skip(2)); | 394 Events actualEvents = new Events.capture(c.stream.skip(2)); |
335 sentEvents.replay(c); | 395 sentEvents.replay(c); |
336 Expect.listEquals(expectedEvents.events, actualEvents.events); | 396 Expect.listEquals(expectedEvents.events, actualEvents.events); |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 testAsBroadcastListenAfterClose(); | 967 testAsBroadcastListenAfterClose(); |
908 testAsBroadcastListenAfterClosePaused(); | 968 testAsBroadcastListenAfterClosePaused(); |
909 testEventInListen(); | 969 testEventInListen(); |
910 testSyncControllerNotReentrant(); | 970 testSyncControllerNotReentrant(); |
911 testSettingCallbacks(); | 971 testSettingCallbacks(); |
912 testSettingNullCallbacks(); | 972 testSettingNullCallbacks(); |
913 testBroadcastSettingCallbacks(); | 973 testBroadcastSettingCallbacks(); |
914 testBroadcastSettingNullCallbacks(); | 974 testBroadcastSettingNullCallbacks(); |
915 asyncEnd(); | 975 asyncEnd(); |
916 } | 976 } |
OLD | NEW |