Chromium Code Reviews| 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 |