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

Side by Side Diff: tests/lib/async/stream_controller_test.dart

Issue 2202533003: Return futures on Stream.cancel when possible. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Don't make Pipe.cancel wait for the null future. Created 4 years, 3 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
« no previous file with comments | « sdk/lib/async/stream_transformers.dart ('k') | tests/lib/async/stream_periodic_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 expectedEvents =
109 actualEvents = new Events.capture(c.stream.asBroadcastStream().transform( 125 new Events()..error("a")..add(42)..error("b")..add("foo")..close();
110 new StreamTransformer.fromHandlers( 126 var actualEvents =
111 handleData: (v, s) { s.addError(v); }, 127 new Events.capture(c.stream.asBroadcastStream().transform(
112 handleError: (e, st, s) { s.add(e); }, 128 new StreamTransformer.fromHandlers(
113 handleDone: (s) { 129 handleData: (v, s) { s.addError(v); },
114 s.add("foo"); 130 handleError: (e, st, s) { s.add(e); },
115 s.close(); 131 handleDone: (s) {
116 }))); 132 s.add("foo");
117 sentEvents.replay(c); 133 s.close();
118 Expect.listEquals(expectedEvents.events, actualEvents.events); 134 })));
135 sentEvents.replay(c);
136 Expect.listEquals(expectedEvents.events, actualEvents.events);
137 }
119 138
120 // Test multiple filters. 139 // Test multiple filters.
121 c = new StreamController(sync: true); 140 {
122 sentEvents = new Events()..add(42) 141 var c = new StreamController(sync: true);
123 ..add("snugglefluffy") 142 var sentEvents = new Events()..add(42)
124 ..add(7) 143 ..add("snugglefluffy")
125 ..add("42") 144 ..add(7)
126 ..error("not FormatException") // Unsubscribes. 145 ..add("42")
127 ..close(); 146 ..error("not FormatException") // Unsubscribes.
128 expectedEvents = new Events()..add(42)..error("not FormatException"); 147 ..close();
129 actualEvents = new Events.capture( 148 var expectedEvents = new Events()..add(42)..error("not FormatException");
130 c.stream.asBroadcastStream().where((v) => v is String) 149 var actualEvents = new Events.capture(
131 .map((v) => int.parse(v)) 150 c.stream.asBroadcastStream().where((v) => v is String)
132 .handleError((error) { 151 .map((v) => int.parse(v))
133 if (error is! FormatException) throw error; 152 .handleError((error) {
134 }) 153 if (error is! FormatException) throw error;
135 .where((v) => v > 10), 154 })
136 cancelOnError: true); 155 .where((v) => v > 10),
137 sentEvents.replay(c); 156 cancelOnError: true);
138 Expect.listEquals(expectedEvents.events, actualEvents.events); 157 sentEvents.replay(c);
158 Expect.listEquals(expectedEvents.events, actualEvents.events);
159 }
139 160
140 // Test subscription changes while firing. 161 // Test subscription changes while firing.
141 c = new StreamController(sync: true); 162 {
142 var sink = c.sink; 163 var c = new StreamController(sync: true);
143 var stream = c.stream.asBroadcastStream(); 164 var sink = c.sink;
144 var counter = 0; 165 var stream = c.stream.asBroadcastStream();
145 var subscription = stream.listen(null); 166 var counter = 0;
146 subscription.onData((data) { 167 var subscription = stream.listen(null);
147 counter += data; 168 subscription.onData((data) {
148 subscription.cancel(); 169 counter += data;
149 stream.listen((data) { 170 subscription.cancel();
150 counter += 10 * data; 171 stream.listen((data) {
172 counter += 10 * data;
173 });
174 var subscription2 = stream.listen(null);
175 subscription2.onData((data) {
176 counter += 100 * data;
177 if (data == 4) subscription2.cancel();
178 });
151 }); 179 });
152 var subscription2 = stream.listen(null); 180 sink.add(1); // seen by stream 1
153 subscription2.onData((data) { 181 sink.add(2); // seen by stream 10 and 100
154 counter += 100 * data; 182 sink.add(3); // -"-
155 if (data == 4) subscription2.cancel(); 183 sink.add(4); // -"-
156 }); 184 sink.add(5); // seen by stream 10
157 }); 185 Expect.equals(1 + 20 + 200 + 30 + 300 + 40 + 400 + 50, counter);
158 sink.add(1); // seen by stream 1 186 }
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 } 187 }
165 188
166 testSingleController() { 189 testSingleController() {
167 // Test normal flow. 190 // Test normal flow.
168 var c = new StreamController(sync: true); 191 {
169 Events expectedEvents = new Events() 192 var c = new StreamController(sync: true);
170 ..add(42) 193 Events expectedEvents = new Events()
171 ..add("dibs") 194 ..add(42)
172 ..error("error!") 195 ..add("dibs")
173 ..error("error too!") 196 ..error("error!")
174 ..close(); 197 ..error("error too!")
175 CaptureEvents actualEvents = new Events.capture(c.stream); 198 ..close();
176 expectedEvents.replay(c); 199 CaptureEvents actualEvents = new Events.capture(c.stream);
177 Expect.listEquals(expectedEvents.events, actualEvents.events); 200 expectedEvents.replay(c);
201 Expect.listEquals(expectedEvents.events, actualEvents.events);
202 }
178 203
179 // Test automatic unsubscription on error. 204 // Test automatic unsubscription on error.
180 c = new StreamController(sync: true); 205 {
181 expectedEvents = new Events()..add(42)..error("error"); 206 var c = new StreamController(sync: true);
182 actualEvents = new Events.capture(c.stream, cancelOnError: true); 207 var expectedEvents = new Events()..add(42)..error("error");
183 Events sentEvents = 208 var actualEvents = new Events.capture(c.stream, cancelOnError: true);
184 new Events()..add(42)..error("error")..add("Are you there?"); 209 Events sentEvents =
185 sentEvents.replay(c); 210 new Events()..add(42)..error("error")..add("Are you there?");
186 Expect.listEquals(expectedEvents.events, actualEvents.events); 211 sentEvents.replay(c);
212 Expect.listEquals(expectedEvents.events, actualEvents.events);
213 }
187 214
188 // Test manual unsubscription. 215 // Test manual unsubscription.
189 c = new StreamController(sync: true); 216 {
190 expectedEvents = new Events()..add(42)..error("error")..add(37); 217 var c = new StreamController(sync: true);
191 actualEvents = new Events.capture(c.stream, cancelOnError: false); 218 var expectedEvents = new Events()..add(42)..error("error")..add(37);
192 expectedEvents.replay(c); 219 var actualEvents = new Events.capture(c.stream, cancelOnError: false);
193 actualEvents.subscription.cancel(); 220 expectedEvents.replay(c);
194 c.add("Are you there"); // Not sent to actualEvents. 221 actualEvents.subscription.cancel();
195 Expect.listEquals(expectedEvents.events, actualEvents.events); 222 c.add("Are you there"); // Not sent to actualEvents.
223 Expect.listEquals(expectedEvents.events, actualEvents.events);
224 }
196 225
197 // Test filter. 226 // Test filter.
198 c = new StreamController(sync: true); 227 {
199 expectedEvents = new Events() 228 var c = new StreamController(sync: true);
200 ..add("a string")..add("another string")..close(); 229 var expectedEvents = new Events()
201 sentEvents = new Events() 230 ..add("a string")..add("another string")..close();
202 ..add("a string")..add(42)..add("another string")..close(); 231 var sentEvents = new Events()
203 actualEvents = new Events.capture(c.stream.where((v) => v is String)); 232 ..add("a string")..add(42)..add("another string")..close();
204 sentEvents.replay(c); 233 var actualEvents = new Events.capture(c.stream.where((v) => v is String));
205 Expect.listEquals(expectedEvents.events, actualEvents.events); 234 sentEvents.replay(c);
235 Expect.listEquals(expectedEvents.events, actualEvents.events);
236 }
206 237
207 // Test map. 238 // Test map.
208 c = new StreamController(sync: true); 239 {
209 expectedEvents = new Events()..add("abab")..error("error")..close(); 240 var c = new StreamController(sync: true);
210 sentEvents = new Events()..add("ab")..error("error")..close(); 241 var expectedEvents = new Events()..add("abab")..error("error")..close();
211 actualEvents = new Events.capture(c.stream.map((v) => "$v$v")); 242 var sentEvents = new Events()..add("ab")..error("error")..close();
212 sentEvents.replay(c); 243 var actualEvents = new Events.capture(c.stream.map((v) => "$v$v"));
213 Expect.listEquals(expectedEvents.events, actualEvents.events); 244 sentEvents.replay(c);
245 Expect.listEquals(expectedEvents.events, actualEvents.events);
246 }
214 247
215 // Test handleError. 248 // Test handleError.
216 c = new StreamController(sync: true); 249 {
217 expectedEvents = new Events()..add("ab")..error("[foo]"); 250 var c = new StreamController(sync: true);
218 sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close(); 251 var expectedEvents = new Events()..add("ab")..error("[foo]");
219 actualEvents = new Events.capture(c.stream.handleError((error) { 252 var sentEvents = new Events()..add("ab")..error("foo")..add("ab")..close();
220 if (error is String) { 253 var actualEvents = new Events.capture(c.stream.handleError((error) {
221 // TODO(floitsch): this error originally changed the stack trace. 254 if (error is String) {
222 throw "[${error}]"; 255 // TODO(floitsch): this error originally changed the stack trace.
223 } 256 throw "[${error}]";
224 }), cancelOnError: true); 257 }
225 sentEvents.replay(c); 258 }), cancelOnError: true);
226 Expect.listEquals(expectedEvents.events, actualEvents.events); 259 sentEvents.replay(c);
260 Expect.listEquals(expectedEvents.events, actualEvents.events);
261 }
227 262
228 // reduce is tested asynchronously and therefore not in this file. 263 // reduce is tested asynchronously and therefore not in this file.
229 264
230 // Test expand 265 // Test expand
231 c = new StreamController(sync: true); 266 {
232 sentEvents = new Events()..add(3)..add(2)..add(4)..close(); 267 var c = new StreamController(sync: true);
233 expectedEvents = new Events()..add(1)..add(2)..add(3) 268 var sentEvents = new Events()..add(3)..add(2)..add(4)..close();
234 ..add(1)..add(2) 269 var expectedEvents = new Events()..add(1)..add(2)..add(3)
235 ..add(1)..add(2)..add(3)..add(4) 270 ..add(1)..add(2)
236 ..close(); 271 ..add(1)..add(2)..add(3)..add(4)
237 actualEvents = new Events.capture(c.stream.expand((v) { 272 ..close();
238 var l = []; 273 var actualEvents = new Events.capture(c.stream.expand((v) {
239 for (int i = 0; i < v; i++) l.add(i + 1); 274 var l = [];
240 return l; 275 for (int i = 0; i < v; i++) l.add(i + 1);
241 })); 276 return l;
242 sentEvents.replay(c); 277 }));
243 Expect.listEquals(expectedEvents.events, actualEvents.events); 278 sentEvents.replay(c);
279 Expect.listEquals(expectedEvents.events, actualEvents.events);
280 }
244 281
245 // test contains. 282 // test contains.
246 { 283 {
247 c = new StreamController(sync: true); 284 var c = new StreamController(sync: true);
248 // Error after match is not important. 285 // Error after match is not important.
249 sentEvents = new Events()..add("a")..add("x")..error("FAIL")..close(); 286 var sentEvents = new Events()..add("a")..add("x")..error("FAIL")..close();
250 Future<bool> contains = c.stream.contains("x"); 287 Future<bool> contains = c.stream.contains("x");
251 contains.then((var c) { 288 contains.then((var c) {
252 Expect.isTrue(c); 289 Expect.isTrue(c);
253 }); 290 });
254 sentEvents.replay(c); 291 sentEvents.replay(c);
255 } 292 }
256 293
257 { 294 {
258 c = new StreamController(sync: true); 295 var c = new StreamController(sync: true);
259 // Not matching is ok. 296 // Not matching is ok.
260 sentEvents = new Events()..add("a")..add("x")..add("b")..close(); 297 var sentEvents = new Events()..add("a")..add("x")..add("b")..close();
261 Future<bool> contains = c.stream.contains("y"); 298 Future<bool> contains = c.stream.contains("y");
262 contains.then((var c) { 299 contains.then((var c) {
263 Expect.isFalse(c); 300 Expect.isFalse(c);
264 }); 301 });
265 sentEvents.replay(c); 302 sentEvents.replay(c);
266 } 303 }
267 304
268 { 305 {
269 c = new StreamController(sync: true); 306 var c = new StreamController(sync: true);
270 // Error before match makes future err. 307 // Error before match makes future err.
271 sentEvents = new Events()..add("a")..error("FAIL")..add("b")..close(); 308 var sentEvents = new Events()..add("a")..error("FAIL")..add("b")..close();
272 Future<bool> contains = c.stream.contains("b"); 309 Future<bool> contains = c.stream.contains("b");
273 contains.then((var c) { 310 contains.then((var c) {
274 Expect.fail("no value expected"); 311 Expect.fail("no value expected");
275 }).catchError((error) { 312 }).catchError((error) {
276 Expect.equals("FAIL", error); 313 Expect.equals("FAIL", error);
277 }); 314 });
278 sentEvents.replay(c); 315 sentEvents.replay(c);
279 } 316 }
280 317
281 // Test transform. 318 // Test transform.
282 c = new StreamController(sync: true); 319 {
283 sentEvents = new Events()..add("a")..error(42)..add("b")..close(); 320 var c = new StreamController(sync: true);
284 expectedEvents = 321 var sentEvents = new Events()..add("a")..error(42)..add("b")..close();
285 new Events()..error("a")..add(42)..error("b")..add("foo")..close(); 322 var expectedEvents =
286 actualEvents = new Events.capture(c.stream.transform( 323 new Events()..error("a")..add(42)..error("b")..add("foo")..close();
287 new StreamTransformer.fromHandlers( 324 var actualEvents = new Events.capture(c.stream.transform(
288 handleData: (v, s) { s.addError(v); }, 325 new StreamTransformer.fromHandlers(
289 handleError: (e, st, s) { s.add(e); }, 326 handleData: (v, s) { s.addError(v); },
290 handleDone: (s) { 327 handleError: (e, st, s) { s.add(e); },
291 s.add("foo"); 328 handleDone: (s) {
292 s.close(); 329 s.add("foo");
293 }))); 330 s.close();
294 sentEvents.replay(c); 331 })));
295 Expect.listEquals(expectedEvents.events, actualEvents.events); 332 sentEvents.replay(c);
333 Expect.listEquals(expectedEvents.events, actualEvents.events);
334 }
296 335
297 // Test multiple filters. 336 // Test multiple filters.
298 c = new StreamController(sync: true); 337 {
299 sentEvents = new Events()..add(42) 338 var c = new StreamController(sync: true);
300 ..add("snugglefluffy") 339 var sentEvents = new Events()..add(42)
301 ..add(7) 340 ..add("snugglefluffy")
302 ..add("42") 341 ..add(7)
303 ..error("not FormatException") // Unsubscribes. 342 ..add("42")
304 ..close(); 343 ..error("not FormatException") // Unsubscribes.
305 expectedEvents = new Events()..add(42)..error("not FormatException"); 344 ..close();
306 actualEvents = new Events.capture( 345 var expectedEvents = new Events()..add(42)..error("not FormatException");
307 c.stream.where((v) => v is String) 346 var actualEvents = new Events.capture(
308 .map((v) => int.parse(v)) 347 c.stream.where((v) => v is String)
309 .handleError((error) { 348 .map((v) => int.parse(v))
310 if (error is! FormatException) throw error; 349 .handleError((error) {
311 }) 350 if (error is! FormatException) throw error;
312 .where((v) => v > 10), 351 })
313 cancelOnError: true); 352 .where((v) => v > 10),
314 sentEvents.replay(c); 353 cancelOnError: true);
315 Expect.listEquals(expectedEvents.events, actualEvents.events); 354 sentEvents.replay(c);
355 Expect.listEquals(expectedEvents.events, actualEvents.events);
356 }
316 357
317 // Test that only one subscription is allowed. 358 // Test that only one subscription is allowed.
318 c = new StreamController(sync: true); 359 {
319 var sink = c.sink; 360 var c = new StreamController(sync: true);
320 var stream = c.stream; 361 var sink = c.sink;
321 var counter = 0; 362 var stream = c.stream;
322 var subscription = stream.listen((data) { counter += data; }); 363 var counter = 0;
323 Expect.throws(() => stream.listen(null), (e) => e is StateError); 364 var subscription = stream.listen((data) { counter += data; });
324 sink.add(1); 365 Expect.throws(() => stream.listen(null), (e) => e is StateError);
325 Expect.equals(1, counter); 366 sink.add(1);
326 c.close(); 367 Expect.equals(1, counter);
368 c.close();
369 }
327 } 370 }
328 371
329 testExtraMethods() { 372 testExtraMethods() {
330 Events sentEvents = new Events()..add(1)..add(2)..add(3)..close(); 373 Events sentEvents = new Events()..add(1)..add(2)..add(3)..close();
331 374
332 var c = new StreamController(sync: true); 375 var c = new StreamController(sync: true);
333 Events expectedEvents = new Events()..add(3)..close(); 376 Events expectedEvents = new Events()..add(3)..close();
334 Events actualEvents = new Events.capture(c.stream.skip(2)); 377 Events actualEvents = new Events.capture(c.stream.skip(2));
335 sentEvents.replay(c); 378 sentEvents.replay(c);
336 Expect.listEquals(expectedEvents.events, actualEvents.events); 379 Expect.listEquals(expectedEvents.events, actualEvents.events);
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 testAsBroadcastListenAfterClose(); 950 testAsBroadcastListenAfterClose();
908 testAsBroadcastListenAfterClosePaused(); 951 testAsBroadcastListenAfterClosePaused();
909 testEventInListen(); 952 testEventInListen();
910 testSyncControllerNotReentrant(); 953 testSyncControllerNotReentrant();
911 testSettingCallbacks(); 954 testSettingCallbacks();
912 testSettingNullCallbacks(); 955 testSettingNullCallbacks();
913 testBroadcastSettingCallbacks(); 956 testBroadcastSettingCallbacks();
914 testBroadcastSettingNullCallbacks(); 957 testBroadcastSettingNullCallbacks();
915 asyncEnd(); 958 asyncEnd();
916 } 959 }
OLDNEW
« no previous file with comments | « sdk/lib/async/stream_transformers.dart ('k') | tests/lib/async/stream_periodic_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698