OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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 import 'dart:async'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:fake_async/fake_async.dart'; | 7 import 'package:fake_async/fake_async.dart'; |
8 import 'package:unittest/src/backend/invoker.dart'; | 8 import 'package:unittest/src/backend/invoker.dart'; |
| 9 import 'package:unittest/src/backend/metadata.dart'; |
9 import 'package:unittest/src/backend/state.dart'; | 10 import 'package:unittest/src/backend/state.dart'; |
10 import 'package:unittest/src/backend/suite.dart'; | 11 import 'package:unittest/src/backend/suite.dart'; |
11 import 'package:unittest/unittest.dart'; | 12 import 'package:unittest/unittest.dart'; |
12 | 13 |
13 import '../utils.dart'; | 14 import '../utils.dart'; |
14 | 15 |
15 void main() { | 16 void main() { |
16 var suite; | 17 var suite; |
17 setUp(() { | 18 setUp(() { |
18 lastState = null; | 19 lastState = null; |
19 suite = new Suite([]); | 20 suite = new Suite([]); |
20 }); | 21 }); |
21 | 22 |
22 group("Invoker.current", () { | 23 group("Invoker.current", () { |
23 var invoker = Invoker.current; | 24 var invoker = Invoker.current; |
24 test("returns null outside of a test body", () { | 25 test("returns null outside of a test body", () { |
25 expect(invoker, isNull); | 26 expect(invoker, isNull); |
26 }); | 27 }); |
27 | 28 |
28 test("returns the current invoker in a test body", () { | 29 test("returns the current invoker in a test body", () { |
29 var invoker; | 30 var invoker; |
30 var liveTest = new LocalTest("test", () { | 31 var liveTest = _localTest(() { |
31 invoker = Invoker.current; | 32 invoker = Invoker.current; |
32 }).load(suite); | 33 }).load(suite); |
33 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 34 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
34 | 35 |
35 return liveTest.run().then((_) { | 36 return liveTest.run().then((_) { |
36 expect(invoker.liveTest, equals(liveTest)); | 37 expect(invoker.liveTest, equals(liveTest)); |
37 }); | 38 }); |
38 }); | 39 }); |
39 | 40 |
40 test("returns the current invoker in a test body after the test completes", | 41 test("returns the current invoker in a test body after the test completes", |
41 () { | 42 () { |
42 var status; | 43 var status; |
43 var completer = new Completer(); | 44 var completer = new Completer(); |
44 var liveTest = new LocalTest("test", () { | 45 var liveTest = _localTest(() { |
45 // Use [new Future] in particular to wait longer than a microtask for | 46 // Use [new Future] in particular to wait longer than a microtask for |
46 // the test to complete. | 47 // the test to complete. |
47 new Future(() { | 48 new Future(() { |
48 status = Invoker.current.liveTest.state.status; | 49 status = Invoker.current.liveTest.state.status; |
49 completer.complete(Invoker.current); | 50 completer.complete(Invoker.current); |
50 }); | 51 }); |
51 }).load(suite); | 52 }).load(suite); |
52 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 53 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
53 | 54 |
54 expect(liveTest.run(), completes); | 55 expect(liveTest.run(), completes); |
55 return completer.future.then((invoker) { | 56 return completer.future.then((invoker) { |
56 expect(invoker.liveTest, equals(liveTest)); | 57 expect(invoker.liveTest, equals(liveTest)); |
57 expect(status, equals(Status.complete)); | 58 expect(status, equals(Status.complete)); |
58 }); | 59 }); |
59 }); | 60 }); |
60 | 61 |
61 test("returns the current invoker in a tearDown body", () { | 62 test("returns the current invoker in a tearDown body", () { |
62 var invoker; | 63 var invoker; |
63 var liveTest = new LocalTest("test", () {}, tearDown: () { | 64 var liveTest = _localTest(() {}, tearDown: () { |
64 invoker = Invoker.current; | 65 invoker = Invoker.current; |
65 }).load(suite); | 66 }).load(suite); |
66 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 67 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
67 | 68 |
68 return liveTest.run().then((_) { | 69 return liveTest.run().then((_) { |
69 expect(invoker.liveTest, equals(liveTest)); | 70 expect(invoker.liveTest, equals(liveTest)); |
70 }); | 71 }); |
71 }); | 72 }); |
72 | 73 |
73 test("returns the current invoker in a tearDown body after the test " | 74 test("returns the current invoker in a tearDown body after the test " |
74 "completes", () { | 75 "completes", () { |
75 var status; | 76 var status; |
76 var completer = new Completer(); | 77 var completer = new Completer(); |
77 var liveTest = new LocalTest("test", () {}, tearDown: () { | 78 var liveTest = _localTest(() {}, tearDown: () { |
78 // Use [new Future] in particular to wait longer than a microtask for | 79 // Use [new Future] in particular to wait longer than a microtask for |
79 // the test to complete. | 80 // the test to complete. |
80 new Future(() { | 81 new Future(() { |
81 status = Invoker.current.liveTest.state.status; | 82 status = Invoker.current.liveTest.state.status; |
82 completer.complete(Invoker.current); | 83 completer.complete(Invoker.current); |
83 }); | 84 }); |
84 }).load(suite); | 85 }).load(suite); |
85 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 86 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
86 | 87 |
87 expect(liveTest.run(), completes); | 88 expect(liveTest.run(), completes); |
88 return completer.future.then((invoker) { | 89 return completer.future.then((invoker) { |
89 expect(invoker.liveTest, equals(liveTest)); | 90 expect(invoker.liveTest, equals(liveTest)); |
90 expect(status, equals(Status.complete)); | 91 expect(status, equals(Status.complete)); |
91 }); | 92 }); |
92 }); | 93 }); |
93 }); | 94 }); |
94 | 95 |
95 group("in a successful test,", () { | 96 group("in a successful test,", () { |
96 test("the state changes from pending to running to complete", () { | 97 test("the state changes from pending to running to complete", () { |
97 var stateInTest; | 98 var stateInTest; |
98 var stateInTearDown; | 99 var stateInTearDown; |
99 var liveTest; | 100 var liveTest; |
100 liveTest = new LocalTest("test", () { | 101 liveTest = _localTest(() { |
101 stateInTest = liveTest.state; | 102 stateInTest = liveTest.state; |
102 }, tearDown: () { | 103 }, tearDown: () { |
103 stateInTearDown = liveTest.state; | 104 stateInTearDown = liveTest.state; |
104 }).load(suite); | 105 }).load(suite); |
105 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 106 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
106 | 107 |
107 expect(liveTest.state.status, equals(Status.pending)); | 108 expect(liveTest.state.status, equals(Status.pending)); |
108 expect(liveTest.state.result, equals(Result.success)); | 109 expect(liveTest.state.result, equals(Result.success)); |
109 | 110 |
110 var future = liveTest.run(); | 111 var future = liveTest.run(); |
111 | 112 |
112 expect(liveTest.state.status, equals(Status.running)); | 113 expect(liveTest.state.status, equals(Status.running)); |
113 expect(liveTest.state.result, equals(Result.success)); | 114 expect(liveTest.state.result, equals(Result.success)); |
114 | 115 |
115 return future.then((_) { | 116 return future.then((_) { |
116 expect(stateInTest.status, equals(Status.running)); | 117 expect(stateInTest.status, equals(Status.running)); |
117 expect(stateInTest.result, equals(Result.success)); | 118 expect(stateInTest.result, equals(Result.success)); |
118 | 119 |
119 expect(stateInTearDown.status, equals(Status.running)); | 120 expect(stateInTearDown.status, equals(Status.running)); |
120 expect(stateInTearDown.result, equals(Result.success)); | 121 expect(stateInTearDown.result, equals(Result.success)); |
121 | 122 |
122 expect(liveTest.state.status, equals(Status.complete)); | 123 expect(liveTest.state.status, equals(Status.complete)); |
123 expect(liveTest.state.result, equals(Result.success)); | 124 expect(liveTest.state.result, equals(Result.success)); |
124 }); | 125 }); |
125 }); | 126 }); |
126 | 127 |
127 test("onStateChange fires for each state change", () { | 128 test("onStateChange fires for each state change", () { |
128 var liveTest = new LocalTest("test", () {}).load(suite); | 129 var liveTest = _localTest(() {}).load(suite); |
129 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 130 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
130 | 131 |
131 var first = true; | 132 var first = true; |
132 liveTest.onStateChange.listen(expectAsync((state) { | 133 liveTest.onStateChange.listen(expectAsync((state) { |
133 if (first) { | 134 if (first) { |
134 expect(state.status, equals(Status.running)); | 135 expect(state.status, equals(Status.running)); |
135 first = false; | 136 first = false; |
136 } else { | 137 } else { |
137 expect(state.status, equals(Status.complete)); | 138 expect(state.status, equals(Status.complete)); |
138 } | 139 } |
139 expect(state.result, equals(Result.success)); | 140 expect(state.result, equals(Result.success)); |
140 }, count: 2, max: 2)); | 141 }, count: 2, max: 2)); |
141 | 142 |
142 return liveTest.run(); | 143 return liveTest.run(); |
143 }); | 144 }); |
144 | 145 |
145 test("onComplete completes once the test body and tearDown are done", () { | 146 test("onComplete completes once the test body and tearDown are done", () { |
146 var testRun = false; | 147 var testRun = false; |
147 var tearDownRun = false; | 148 var tearDownRun = false; |
148 var liveTest = new LocalTest("test", () { | 149 var liveTest = _localTest(() { |
149 testRun = true; | 150 testRun = true; |
150 }, tearDown: () { | 151 }, tearDown: () { |
151 tearDownRun = true; | 152 tearDownRun = true; |
152 }).load(suite); | 153 }).load(suite); |
153 | 154 |
154 expect(liveTest.onComplete.then((_) { | 155 expect(liveTest.onComplete.then((_) { |
155 expect(testRun, isTrue); | 156 expect(testRun, isTrue); |
156 expect(tearDownRun, isTrue); | 157 expect(tearDownRun, isTrue); |
157 }), completes); | 158 }), completes); |
158 | 159 |
159 return liveTest.run(); | 160 return liveTest.run(); |
160 }); | 161 }); |
161 }); | 162 }); |
162 | 163 |
163 group("in a test with failures,", () { | 164 group("in a test with failures,", () { |
164 test("a synchronous throw is reported and causes the test to fail", () { | 165 test("a synchronous throw is reported and causes the test to fail", () { |
165 var liveTest = new LocalTest("test", () { | 166 var liveTest = _localTest(() { |
166 throw new TestFailure('oh no'); | 167 throw new TestFailure('oh no'); |
167 }).load(suite); | 168 }).load(suite); |
168 | 169 |
169 expectSingleFailure(liveTest); | 170 expectSingleFailure(liveTest); |
170 return liveTest.run(); | 171 return liveTest.run(); |
171 }); | 172 }); |
172 | 173 |
173 test("a synchronous reported failure causes the test to fail", () { | 174 test("a synchronous reported failure causes the test to fail", () { |
174 var liveTest = new LocalTest("test", () { | 175 var liveTest = _localTest(() { |
175 Invoker.current.handleError(new TestFailure("oh no")); | 176 Invoker.current.handleError(new TestFailure("oh no")); |
176 }).load(suite); | 177 }).load(suite); |
177 | 178 |
178 expectSingleFailure(liveTest); | 179 expectSingleFailure(liveTest); |
179 return liveTest.run(); | 180 return liveTest.run(); |
180 }); | 181 }); |
181 | 182 |
182 test("a failure reported asynchronously during the test causes it to fail", | 183 test("a failure reported asynchronously during the test causes it to fail", |
183 () { | 184 () { |
184 var liveTest = new LocalTest("test", () { | 185 var liveTest = _localTest(() { |
185 Invoker.current.addOutstandingCallback(); | 186 Invoker.current.addOutstandingCallback(); |
186 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); | 187 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); |
187 }).load(suite); | 188 }).load(suite); |
188 | 189 |
189 expectSingleFailure(liveTest); | 190 expectSingleFailure(liveTest); |
190 return liveTest.run(); | 191 return liveTest.run(); |
191 }); | 192 }); |
192 | 193 |
193 test("a failure thrown asynchronously during the test causes it to fail", | 194 test("a failure thrown asynchronously during the test causes it to fail", |
194 () { | 195 () { |
195 var liveTest = new LocalTest("test", () { | 196 var liveTest = _localTest(() { |
196 Invoker.current.addOutstandingCallback(); | 197 Invoker.current.addOutstandingCallback(); |
197 new Future(() => throw new TestFailure("oh no")); | 198 new Future(() => throw new TestFailure("oh no")); |
198 }).load(suite); | 199 }).load(suite); |
199 | 200 |
200 expectSingleFailure(liveTest); | 201 expectSingleFailure(liveTest); |
201 return liveTest.run(); | 202 return liveTest.run(); |
202 }); | 203 }); |
203 | 204 |
204 test("a failure reported asynchronously after the test causes it to error", | 205 test("a failure reported asynchronously after the test causes it to error", |
205 () { | 206 () { |
206 var liveTest = new LocalTest("test", () { | 207 var liveTest = _localTest(() { |
207 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); | 208 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); |
208 }).load(suite); | 209 }).load(suite); |
209 | 210 |
210 expectStates(liveTest, [ | 211 expectStates(liveTest, [ |
211 const State(Status.running, Result.success), | 212 const State(Status.running, Result.success), |
212 const State(Status.complete, Result.success), | 213 const State(Status.complete, Result.success), |
213 const State(Status.complete, Result.failure), | 214 const State(Status.complete, Result.failure), |
214 const State(Status.complete, Result.error) | 215 const State(Status.complete, Result.error) |
215 ]); | 216 ]); |
216 | 217 |
217 expectErrors(liveTest, [(error) { | 218 expectErrors(liveTest, [(error) { |
218 expect(lastState, equals(const State(Status.complete, Result.failure))); | 219 expect(lastState, equals(const State(Status.complete, Result.failure))); |
219 expect(error, isTestFailure("oh no")); | 220 expect(error, isTestFailure("oh no")); |
220 }, (error) { | 221 }, (error) { |
221 expect(lastState, equals(const State(Status.complete, Result.error))); | 222 expect(lastState, equals(const State(Status.complete, Result.error))); |
222 expect(error, equals( | 223 expect(error, equals( |
223 "This test failed after it had already completed. Make sure to " | 224 "This test failed after it had already completed. Make sure to " |
224 "use [expectAsync]\n" | 225 "use [expectAsync]\n" |
225 "or the [completes] matcher when testing async code.")); | 226 "or the [completes] matcher when testing async code.")); |
226 }]); | 227 }]); |
227 | 228 |
228 return liveTest.run(); | 229 return liveTest.run(); |
229 }); | 230 }); |
230 | 231 |
231 test("multiple asynchronous failures are reported", () { | 232 test("multiple asynchronous failures are reported", () { |
232 var liveTest = new LocalTest("test", () { | 233 var liveTest = _localTest(() { |
233 Invoker.current.addOutstandingCallback(); | 234 Invoker.current.addOutstandingCallback(); |
234 new Future(() => throw new TestFailure("one")); | 235 new Future(() => throw new TestFailure("one")); |
235 new Future(() => throw new TestFailure("two")); | 236 new Future(() => throw new TestFailure("two")); |
236 new Future(() => throw new TestFailure("three")); | 237 new Future(() => throw new TestFailure("three")); |
237 new Future(() => throw new TestFailure("four")); | 238 new Future(() => throw new TestFailure("four")); |
238 }).load(suite); | 239 }).load(suite); |
239 | 240 |
240 expectStates(liveTest, [ | 241 expectStates(liveTest, [ |
241 const State(Status.running, Result.success), | 242 const State(Status.running, Result.success), |
242 const State(Status.complete, Result.failure) | 243 const State(Status.complete, Result.failure) |
243 ]); | 244 ]); |
244 | 245 |
245 expectErrors(liveTest, [(error) { | 246 expectErrors(liveTest, [(error) { |
246 expect(lastState.status, equals(Status.complete)); | 247 expect(lastState.status, equals(Status.complete)); |
247 expect(error, isTestFailure("one")); | 248 expect(error, isTestFailure("one")); |
248 }, (error) { | 249 }, (error) { |
249 expect(error, isTestFailure("two")); | 250 expect(error, isTestFailure("two")); |
250 }, (error) { | 251 }, (error) { |
251 expect(error, isTestFailure("three")); | 252 expect(error, isTestFailure("three")); |
252 }, (error) { | 253 }, (error) { |
253 expect(error, isTestFailure("four")); | 254 expect(error, isTestFailure("four")); |
254 }]); | 255 }]); |
255 | 256 |
256 return liveTest.run(); | 257 return liveTest.run(); |
257 }); | 258 }); |
258 | 259 |
259 test("a failure after an error doesn't change the state of the test", () { | 260 test("a failure after an error doesn't change the state of the test", () { |
260 var liveTest = new LocalTest("test", () { | 261 var liveTest = _localTest(() { |
261 new Future(() => throw new TestFailure("fail")); | 262 new Future(() => throw new TestFailure("fail")); |
262 throw "error"; | 263 throw "error"; |
263 }).load(suite); | 264 }).load(suite); |
264 | 265 |
265 expectStates(liveTest, [ | 266 expectStates(liveTest, [ |
266 const State(Status.running, Result.success), | 267 const State(Status.running, Result.success), |
267 const State(Status.complete, Result.error) | 268 const State(Status.complete, Result.error) |
268 ]); | 269 ]); |
269 | 270 |
270 expectErrors(liveTest, [(error) { | 271 expectErrors(liveTest, [(error) { |
271 expect(lastState, equals(const State(Status.complete, Result.error))); | 272 expect(lastState, equals(const State(Status.complete, Result.error))); |
272 expect(error, equals("error")); | 273 expect(error, equals("error")); |
273 }, (error) { | 274 }, (error) { |
274 expect(error, isTestFailure("fail")); | 275 expect(error, isTestFailure("fail")); |
275 }]); | 276 }]); |
276 | 277 |
277 return liveTest.run(); | 278 return liveTest.run(); |
278 }); | 279 }); |
279 | 280 |
280 test("tearDown is run after an asynchronous failure", () { | 281 test("tearDown is run after an asynchronous failure", () { |
281 var stateDuringTearDown; | 282 var stateDuringTearDown; |
282 var liveTest; | 283 var liveTest; |
283 liveTest = new LocalTest("test", () { | 284 liveTest = _localTest(() { |
284 Invoker.current.addOutstandingCallback(); | 285 Invoker.current.addOutstandingCallback(); |
285 new Future(() => throw new TestFailure("oh no")); | 286 new Future(() => throw new TestFailure("oh no")); |
286 }, tearDown: () { | 287 }, tearDown: () { |
287 stateDuringTearDown = liveTest.state; | 288 stateDuringTearDown = liveTest.state; |
288 }).load(suite); | 289 }).load(suite); |
289 | 290 |
290 expectSingleFailure(liveTest); | 291 expectSingleFailure(liveTest); |
291 return liveTest.run().then((_) { | 292 return liveTest.run().then((_) { |
292 expect(stateDuringTearDown, | 293 expect(stateDuringTearDown, |
293 equals(const State(Status.complete, Result.failure))); | 294 equals(const State(Status.complete, Result.failure))); |
294 }); | 295 }); |
295 }); | 296 }); |
296 }); | 297 }); |
297 | 298 |
298 group("in a test with errors,", () { | 299 group("in a test with errors,", () { |
299 test("a synchronous throw is reported and causes the test to error", () { | 300 test("a synchronous throw is reported and causes the test to error", () { |
300 var liveTest = new LocalTest("test", () { | 301 var liveTest = _localTest(() { |
301 throw 'oh no'; | 302 throw 'oh no'; |
302 }).load(suite); | 303 }).load(suite); |
303 | 304 |
304 expectSingleError(liveTest); | 305 expectSingleError(liveTest); |
305 return liveTest.run(); | 306 return liveTest.run(); |
306 }); | 307 }); |
307 | 308 |
308 test("a synchronous reported error causes the test to error", () { | 309 test("a synchronous reported error causes the test to error", () { |
309 var liveTest = new LocalTest("test", () { | 310 var liveTest = _localTest(() { |
310 Invoker.current.handleError("oh no"); | 311 Invoker.current.handleError("oh no"); |
311 }).load(suite); | 312 }).load(suite); |
312 | 313 |
313 expectSingleError(liveTest); | 314 expectSingleError(liveTest); |
314 return liveTest.run(); | 315 return liveTest.run(); |
315 }); | 316 }); |
316 | 317 |
317 test("an error reported asynchronously during the test causes it to error", | 318 test("an error reported asynchronously during the test causes it to error", |
318 () { | 319 () { |
319 var liveTest = new LocalTest("test", () { | 320 var liveTest = _localTest(() { |
320 Invoker.current.addOutstandingCallback(); | 321 Invoker.current.addOutstandingCallback(); |
321 new Future(() => Invoker.current.handleError("oh no")); | 322 new Future(() => Invoker.current.handleError("oh no")); |
322 }).load(suite); | 323 }).load(suite); |
323 | 324 |
324 expectSingleError(liveTest); | 325 expectSingleError(liveTest); |
325 return liveTest.run(); | 326 return liveTest.run(); |
326 }); | 327 }); |
327 | 328 |
328 test("an error thrown asynchronously during the test causes it to error", | 329 test("an error thrown asynchronously during the test causes it to error", |
329 () { | 330 () { |
330 var liveTest = new LocalTest("test", () { | 331 var liveTest = _localTest(() { |
331 Invoker.current.addOutstandingCallback(); | 332 Invoker.current.addOutstandingCallback(); |
332 new Future(() => throw "oh no"); | 333 new Future(() => throw "oh no"); |
333 }).load(suite); | 334 }).load(suite); |
334 | 335 |
335 expectSingleError(liveTest); | 336 expectSingleError(liveTest); |
336 return liveTest.run(); | 337 return liveTest.run(); |
337 }); | 338 }); |
338 | 339 |
339 test("an error reported asynchronously after the test causes it to error", | 340 test("an error reported asynchronously after the test causes it to error", |
340 () { | 341 () { |
341 var liveTest = new LocalTest("test", () { | 342 var liveTest = _localTest(() { |
342 new Future(() => Invoker.current.handleError("oh no")); | 343 new Future(() => Invoker.current.handleError("oh no")); |
343 }).load(suite); | 344 }).load(suite); |
344 | 345 |
345 expectStates(liveTest, [ | 346 expectStates(liveTest, [ |
346 const State(Status.running, Result.success), | 347 const State(Status.running, Result.success), |
347 const State(Status.complete, Result.success), | 348 const State(Status.complete, Result.success), |
348 const State(Status.complete, Result.error) | 349 const State(Status.complete, Result.error) |
349 ]); | 350 ]); |
350 | 351 |
351 expectErrors(liveTest, [(error) { | 352 expectErrors(liveTest, [(error) { |
352 expect(lastState, equals(const State(Status.complete, Result.error))); | 353 expect(lastState, equals(const State(Status.complete, Result.error))); |
353 expect(error, equals("oh no")); | 354 expect(error, equals("oh no")); |
354 }, (error) { | 355 }, (error) { |
355 expect(error, equals( | 356 expect(error, equals( |
356 "This test failed after it had already completed. Make sure to " | 357 "This test failed after it had already completed. Make sure to " |
357 "use [expectAsync]\n" | 358 "use [expectAsync]\n" |
358 "or the [completes] matcher when testing async code.")); | 359 "or the [completes] matcher when testing async code.")); |
359 }]); | 360 }]); |
360 | 361 |
361 return liveTest.run(); | 362 return liveTest.run(); |
362 }); | 363 }); |
363 | 364 |
364 test("multiple asynchronous errors are reported", () { | 365 test("multiple asynchronous errors are reported", () { |
365 var liveTest = new LocalTest("test", () { | 366 var liveTest = _localTest(() { |
366 Invoker.current.addOutstandingCallback(); | 367 Invoker.current.addOutstandingCallback(); |
367 new Future(() => throw "one"); | 368 new Future(() => throw "one"); |
368 new Future(() => throw "two"); | 369 new Future(() => throw "two"); |
369 new Future(() => throw "three"); | 370 new Future(() => throw "three"); |
370 new Future(() => throw "four"); | 371 new Future(() => throw "four"); |
371 }).load(suite); | 372 }).load(suite); |
372 | 373 |
373 expectStates(liveTest, [ | 374 expectStates(liveTest, [ |
374 const State(Status.running, Result.success), | 375 const State(Status.running, Result.success), |
375 const State(Status.complete, Result.error) | 376 const State(Status.complete, Result.error) |
376 ]); | 377 ]); |
377 | 378 |
378 expectErrors(liveTest, [(error) { | 379 expectErrors(liveTest, [(error) { |
379 expect(lastState.status, equals(Status.complete)); | 380 expect(lastState.status, equals(Status.complete)); |
380 expect(error, equals("one")); | 381 expect(error, equals("one")); |
381 }, (error) { | 382 }, (error) { |
382 expect(error, equals("two")); | 383 expect(error, equals("two")); |
383 }, (error) { | 384 }, (error) { |
384 expect(error, equals("three")); | 385 expect(error, equals("three")); |
385 }, (error) { | 386 }, (error) { |
386 expect(error, equals("four")); | 387 expect(error, equals("four")); |
387 }]); | 388 }]); |
388 | 389 |
389 return liveTest.run(); | 390 return liveTest.run(); |
390 }); | 391 }); |
391 | 392 |
392 test("an error after a failure changes the state of the test", () { | 393 test("an error after a failure changes the state of the test", () { |
393 var liveTest = new LocalTest("test", () { | 394 var liveTest = _localTest(() { |
394 new Future(() => throw "error"); | 395 new Future(() => throw "error"); |
395 throw new TestFailure("fail"); | 396 throw new TestFailure("fail"); |
396 }).load(suite); | 397 }).load(suite); |
397 | 398 |
398 expectStates(liveTest, [ | 399 expectStates(liveTest, [ |
399 const State(Status.running, Result.success), | 400 const State(Status.running, Result.success), |
400 const State(Status.complete, Result.failure), | 401 const State(Status.complete, Result.failure), |
401 const State(Status.complete, Result.error) | 402 const State(Status.complete, Result.error) |
402 ]); | 403 ]); |
403 | 404 |
404 expectErrors(liveTest, [(error) { | 405 expectErrors(liveTest, [(error) { |
405 expect(lastState, equals(const State(Status.complete, Result.failure))); | 406 expect(lastState, equals(const State(Status.complete, Result.failure))); |
406 expect(error, isTestFailure("fail")); | 407 expect(error, isTestFailure("fail")); |
407 }, (error) { | 408 }, (error) { |
408 expect(lastState, equals(const State(Status.complete, Result.error))); | 409 expect(lastState, equals(const State(Status.complete, Result.error))); |
409 expect(error, equals("error")); | 410 expect(error, equals("error")); |
410 }]); | 411 }]); |
411 | 412 |
412 return liveTest.run(); | 413 return liveTest.run(); |
413 }); | 414 }); |
414 | 415 |
415 test("tearDown is run after an asynchronous error", () { | 416 test("tearDown is run after an asynchronous error", () { |
416 var stateDuringTearDown; | 417 var stateDuringTearDown; |
417 var liveTest; | 418 var liveTest; |
418 liveTest = new LocalTest("test", () { | 419 liveTest = _localTest(() { |
419 Invoker.current.addOutstandingCallback(); | 420 Invoker.current.addOutstandingCallback(); |
420 new Future(() => throw "oh no"); | 421 new Future(() => throw "oh no"); |
421 }, tearDown: () { | 422 }, tearDown: () { |
422 stateDuringTearDown = liveTest.state; | 423 stateDuringTearDown = liveTest.state; |
423 }).load(suite); | 424 }).load(suite); |
424 | 425 |
425 expectSingleError(liveTest); | 426 expectSingleError(liveTest); |
426 return liveTest.run().then((_) { | 427 return liveTest.run().then((_) { |
427 expect(stateDuringTearDown, | 428 expect(stateDuringTearDown, |
428 equals(const State(Status.complete, Result.error))); | 429 equals(const State(Status.complete, Result.error))); |
429 }); | 430 }); |
430 }); | 431 }); |
431 }); | 432 }); |
432 | 433 |
433 test("a test doesn't complete until there are no outstanding callbacks", | 434 test("a test doesn't complete until there are no outstanding callbacks", |
434 () { | 435 () { |
435 var outstandingCallbackRemoved = false; | 436 var outstandingCallbackRemoved = false; |
436 var liveTest = new LocalTest("test", () { | 437 var liveTest = _localTest(() { |
437 Invoker.current.addOutstandingCallback(); | 438 Invoker.current.addOutstandingCallback(); |
438 | 439 |
439 // Pump the event queue to make sure the test isn't coincidentally | 440 // Pump the event queue to make sure the test isn't coincidentally |
440 // completing after the outstanding callback is removed. | 441 // completing after the outstanding callback is removed. |
441 pumpEventQueue().then((_) { | 442 pumpEventQueue().then((_) { |
442 outstandingCallbackRemoved = true; | 443 outstandingCallbackRemoved = true; |
443 Invoker.current.removeOutstandingCallback(); | 444 Invoker.current.removeOutstandingCallback(); |
444 }); | 445 }); |
445 }).load(suite); | 446 }).load(suite); |
446 | 447 |
447 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 448 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
448 | 449 |
449 return liveTest.run().then((_) { | 450 return liveTest.run().then((_) { |
450 expect(outstandingCallbackRemoved, isTrue); | 451 expect(outstandingCallbackRemoved, isTrue); |
451 }); | 452 }); |
452 }); | 453 }); |
453 | 454 |
454 test("a test's tearDown isn't run until there are no outstanding callbacks", | 455 test("a test's tearDown isn't run until there are no outstanding callbacks", |
455 () { | 456 () { |
456 var outstandingCallbackRemoved = false; | 457 var outstandingCallbackRemoved = false; |
457 var outstandingCallbackRemovedBeforeTeardown = false; | 458 var outstandingCallbackRemovedBeforeTeardown = false; |
458 var liveTest = new LocalTest("test", () { | 459 var liveTest = _localTest(() { |
459 Invoker.current.addOutstandingCallback(); | 460 Invoker.current.addOutstandingCallback(); |
460 pumpEventQueue().then((_) { | 461 pumpEventQueue().then((_) { |
461 outstandingCallbackRemoved = true; | 462 outstandingCallbackRemoved = true; |
462 Invoker.current.removeOutstandingCallback(); | 463 Invoker.current.removeOutstandingCallback(); |
463 }); | 464 }); |
464 }, tearDown: () { | 465 }, tearDown: () { |
465 outstandingCallbackRemovedBeforeTeardown = outstandingCallbackRemoved; | 466 outstandingCallbackRemovedBeforeTeardown = outstandingCallbackRemoved; |
466 }).load(suite); | 467 }).load(suite); |
467 | 468 |
468 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 469 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
469 | 470 |
470 return liveTest.run().then((_) { | 471 return liveTest.run().then((_) { |
471 expect(outstandingCallbackRemovedBeforeTeardown, isTrue); | 472 expect(outstandingCallbackRemovedBeforeTeardown, isTrue); |
472 }); | 473 }); |
473 }); | 474 }); |
474 | 475 |
475 test("a test times out after 30 seconds", () { | 476 test("a test times out after 30 seconds", () { |
476 new FakeAsync().run((async) { | 477 new FakeAsync().run((async) { |
477 var liveTest = new LocalTest("test", () { | 478 var liveTest = _localTest(() { |
478 Invoker.current.addOutstandingCallback(); | 479 Invoker.current.addOutstandingCallback(); |
479 }).load(suite); | 480 }).load(suite); |
480 | 481 |
481 expectStates(liveTest, [ | 482 expectStates(liveTest, [ |
482 const State(Status.running, Result.success), | 483 const State(Status.running, Result.success), |
483 const State(Status.complete, Result.error) | 484 const State(Status.complete, Result.error) |
484 ]); | 485 ]); |
485 | 486 |
486 expectErrors(liveTest, [(error) { | 487 expectErrors(liveTest, [(error) { |
487 expect(lastState.status, equals(Status.complete)); | 488 expect(lastState.status, equals(Status.complete)); |
488 expect(error, new isInstanceOf<TimeoutException>()); | 489 expect(error, new isInstanceOf<TimeoutException>()); |
489 }]); | 490 }]); |
490 | 491 |
491 liveTest.run(); | 492 liveTest.run(); |
492 async.elapse(new Duration(seconds: 30)); | 493 async.elapse(new Duration(seconds: 30)); |
493 }); | 494 }); |
494 }); | 495 }); |
495 } | 496 } |
| 497 |
| 498 LocalTest _localTest(body(), {tearDown()}) => |
| 499 new LocalTest("test", new Metadata(), body, tearDown: tearDown); |
OLD | NEW |