| 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:test/src/backend/invoker.dart'; | 8 import 'package:test/src/backend/invoker.dart'; |
| 9 import 'package:test/src/backend/metadata.dart'; | 9 import 'package:test/src/backend/metadata.dart'; |
| 10 import 'package:test/src/backend/state.dart'; | 10 import 'package:test/src/backend/state.dart'; |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 }, tearDown: () { | 422 }, tearDown: () { |
| 423 stateDuringTearDown = liveTest.state; | 423 stateDuringTearDown = liveTest.state; |
| 424 }).load(suite); | 424 }).load(suite); |
| 425 | 425 |
| 426 expectSingleError(liveTest); | 426 expectSingleError(liveTest); |
| 427 return liveTest.run().then((_) { | 427 return liveTest.run().then((_) { |
| 428 expect(stateDuringTearDown, | 428 expect(stateDuringTearDown, |
| 429 equals(const State(Status.complete, Result.error))); | 429 equals(const State(Status.complete, Result.error))); |
| 430 }); | 430 }); |
| 431 }); | 431 }); |
| 432 |
| 433 test("an asynchronous error in tearDown causes the test to error", () { |
| 434 var liveTest = _localTest(() {}, tearDown: () { |
| 435 Invoker.current.addOutstandingCallback(); |
| 436 new Future(() => throw "oh no"); |
| 437 }).load(suite); |
| 438 |
| 439 expectSingleError(liveTest); |
| 440 return liveTest.run(); |
| 441 }); |
| 442 |
| 443 test("an error reported in the test body after tearDown begins running " |
| 444 "doesn't stop tearDown", () { |
| 445 var tearDownComplete = false;; |
| 446 var completer = new Completer(); |
| 447 |
| 448 var liveTest; |
| 449 liveTest = _localTest(() { |
| 450 completer.future.then((_) => throw "not again"); |
| 451 throw "oh no"; |
| 452 }, tearDown: () { |
| 453 completer.complete(); |
| 454 |
| 455 // Pump the event queue so that we will run the following code after the |
| 456 // test body has thrown a second error. |
| 457 Invoker.current.addOutstandingCallback(); |
| 458 pumpEventQueue().then((_) { |
| 459 Invoker.current.removeOutstandingCallback(); |
| 460 tearDownComplete = true; |
| 461 }); |
| 462 }).load(suite); |
| 463 |
| 464 expectStates(liveTest, [ |
| 465 const State(Status.running, Result.success), |
| 466 const State(Status.complete, Result.error) |
| 467 ]); |
| 468 |
| 469 expectErrors(liveTest, [ |
| 470 (error) { |
| 471 expect(lastState.status, equals(Status.complete)); |
| 472 expect(error, equals("oh no")); |
| 473 }, |
| 474 (error) => expect(error, equals("not again")) |
| 475 ]); |
| 476 |
| 477 return liveTest.run().then((_) { |
| 478 expect(tearDownComplete, isTrue); |
| 479 }); |
| 480 }); |
| 432 }); | 481 }); |
| 433 | 482 |
| 434 test("a test doesn't complete until there are no outstanding callbacks", | 483 test("a test doesn't complete until there are no outstanding callbacks", |
| 435 () { | 484 () { |
| 436 var outstandingCallbackRemoved = false; | 485 var outstandingCallbackRemoved = false; |
| 437 var liveTest = _localTest(() { | 486 var liveTest = _localTest(() { |
| 438 Invoker.current.addOutstandingCallback(); | 487 Invoker.current.addOutstandingCallback(); |
| 439 | 488 |
| 440 // Pump the event queue to make sure the test isn't coincidentally | 489 // Pump the event queue to make sure the test isn't coincidentally |
| 441 // completing after the outstanding callback is removed. | 490 // completing after the outstanding callback is removed. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 466 outstandingCallbackRemovedBeforeTeardown = outstandingCallbackRemoved; | 515 outstandingCallbackRemovedBeforeTeardown = outstandingCallbackRemoved; |
| 467 }).load(suite); | 516 }).load(suite); |
| 468 | 517 |
| 469 liveTest.onError.listen(expectAsync((_) {}, count: 0)); | 518 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
| 470 | 519 |
| 471 return liveTest.run().then((_) { | 520 return liveTest.run().then((_) { |
| 472 expect(outstandingCallbackRemovedBeforeTeardown, isTrue); | 521 expect(outstandingCallbackRemovedBeforeTeardown, isTrue); |
| 473 }); | 522 }); |
| 474 }); | 523 }); |
| 475 | 524 |
| 525 test("a test's tearDown doesn't complete until there are no outstanding " |
| 526 "callbacks", () { |
| 527 var outstandingCallbackRemoved = false; |
| 528 var liveTest = _localTest(() {}, tearDown: () { |
| 529 Invoker.current.addOutstandingCallback(); |
| 530 |
| 531 // Pump the event queue to make sure the test isn't coincidentally |
| 532 // completing after the outstanding callback is removed. |
| 533 pumpEventQueue().then((_) { |
| 534 outstandingCallbackRemoved = true; |
| 535 Invoker.current.removeOutstandingCallback(); |
| 536 }); |
| 537 }).load(suite); |
| 538 |
| 539 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
| 540 |
| 541 return liveTest.run().then((_) { |
| 542 expect(outstandingCallbackRemoved, isTrue); |
| 543 }); |
| 544 }); |
| 545 |
| 546 test("a test body's outstanding callbacks can't complete its tearDown", () { |
| 547 var outstandingCallbackRemoved = false; |
| 548 var completer = new Completer(); |
| 549 var liveTest = _localTest(() { |
| 550 // Once the tearDown runs, remove an outstanding callback to see if it |
| 551 // causes the tearDown to complete. |
| 552 completer.future.then((_) { |
| 553 Invoker.current.removeOutstandingCallback(); |
| 554 }); |
| 555 }, tearDown: () { |
| 556 Invoker.current.addOutstandingCallback(); |
| 557 |
| 558 // This will cause the test BODY to remove an outstanding callback, which |
| 559 // shouldn't cause the test to complete. |
| 560 completer.complete(); |
| 561 |
| 562 pumpEventQueue().then((_) { |
| 563 outstandingCallbackRemoved = true; |
| 564 Invoker.current.removeOutstandingCallback(); |
| 565 }); |
| 566 }).load(suite); |
| 567 |
| 568 liveTest.onError.listen(expectAsync((_) {}, count: 0)); |
| 569 |
| 570 return liveTest.run().then((_) { |
| 571 expect(outstandingCallbackRemoved, isTrue); |
| 572 }); |
| 573 }); |
| 574 |
| 476 test("a test's prints are captured and reported", () { | 575 test("a test's prints are captured and reported", () { |
| 477 expect(() { | 576 expect(() { |
| 478 var liveTest = _localTest(() { | 577 var liveTest = _localTest(() { |
| 479 print("Hello,"); | 578 print("Hello,"); |
| 480 return new Future(() => print("world!")); | 579 return new Future(() => print("world!")); |
| 481 }).load(suite); | 580 }).load(suite); |
| 482 | 581 |
| 483 expect(liveTest.onPrint.take(2).toList(), | 582 expect(liveTest.onPrint.take(2).toList(), |
| 484 completion(equals(["Hello,", "world!"]))); | 583 completion(equals(["Hello,", "world!"]))); |
| 485 | 584 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 async.elapse(new Duration(seconds: 15)); | 651 async.elapse(new Duration(seconds: 15)); |
| 553 }); | 652 }); |
| 554 }); | 653 }); |
| 555 }); | 654 }); |
| 556 } | 655 } |
| 557 | 656 |
| 558 LocalTest _localTest(body(), {tearDown(), Metadata metadata}) { | 657 LocalTest _localTest(body(), {tearDown(), Metadata metadata}) { |
| 559 if (metadata == null) metadata = new Metadata(); | 658 if (metadata == null) metadata = new Metadata(); |
| 560 return new LocalTest("test", metadata, body, tearDown: tearDown); | 659 return new LocalTest("test", metadata, body, tearDown: tearDown); |
| 561 } | 660 } |
| OLD | NEW |