Index: test/declarer_test.dart |
diff --git a/test/declarer_test.dart b/test/declarer_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..13211be29b80b3c086f79557d94bde161f7239bb |
--- /dev/null |
+++ b/test/declarer_test.dart |
@@ -0,0 +1,326 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'dart:async'; |
+ |
+import 'package:unittest/src/declarer.dart'; |
+import 'package:unittest/src/suite.dart'; |
+import 'package:unittest/unittest.dart'; |
+ |
+Declarer _declarer; |
+Suite _suite; |
+ |
+void main() { |
+ setUp(() { |
+ _declarer = new Declarer(); |
+ _suite = new Suite("suite", []); |
+ }); |
+ |
+ group(".test()", () { |
+ test("declares a test with a description and body", () { |
+ var bodyRun = false; |
+ _declarer.test("description", () { |
+ bodyRun = true; |
+ }); |
+ |
+ expect(_declarer.tests, hasLength(1)); |
+ expect(_declarer.tests.single.name, equals("description")); |
+ |
+ return _runTest(0).then(expectAsync((_) { |
+ expect(bodyRun, isTrue); |
+ }, max: 1)); |
+ }); |
+ |
+ test("declares multiple tests", () { |
+ _declarer.test("description 1", () {}); |
+ _declarer.test("description 2", () {}); |
+ _declarer.test("description 3", () {}); |
+ |
+ expect(_declarer.tests, hasLength(3)); |
+ expect(_declarer.tests[0].name, equals("description 1")); |
+ expect(_declarer.tests[1].name, equals("description 2")); |
+ expect(_declarer.tests[2].name, equals("description 3")); |
+ }); |
+ }); |
+ |
+ group(".setUp()", () { |
+ test("is run before all tests", () { |
+ var setUpRun = false; |
+ _declarer.setUp(() => setUpRun = true); |
+ |
+ _declarer.test("description 1", expectAsync(() { |
+ expect(setUpRun, isTrue); |
+ setUpRun = false; |
+ }, max: 1)); |
+ |
+ _declarer.test("description 2", expectAsync(() { |
+ expect(setUpRun, isTrue); |
+ setUpRun = false; |
+ }, max: 1)); |
+ |
+ return _runTest(0).then((_) => _runTest(1)); |
+ }); |
+ |
+ test("can return a Future", () { |
+ var setUpRun = false; |
+ _declarer.setUp(() { |
+ return new Future(() => setUpRun = true); |
+ }); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(setUpRun, isTrue); |
+ }, max: 1)); |
+ |
+ return _runTest(0); |
+ }); |
+ |
+ test("can't be called multiple times", () { |
+ _declarer.setUp(() {}); |
+ expect(() => _declarer.setUp(() {}), throwsStateError); |
+ }); |
+ }); |
+ |
+ group(".tearDown()", () { |
+ test("is run after all tests", () { |
+ var tearDownRun; |
+ _declarer.setUp(() => tearDownRun = false); |
+ _declarer.tearDown(() => tearDownRun = true); |
+ |
+ _declarer.test("description 1", expectAsync(() { |
+ expect(tearDownRun, isFalse); |
+ }, max: 1)); |
+ |
+ _declarer.test("description 2", expectAsync(() { |
+ expect(tearDownRun, isFalse); |
+ }, max: 1)); |
+ |
+ return _runTest(0).then((_) { |
+ expect(tearDownRun, isTrue); |
+ return _runTest(1); |
+ }).then((_) => expect(tearDownRun, isTrue)); |
+ }); |
+ |
+ test("can return a Future", () { |
+ var tearDownRun = false; |
+ _declarer.tearDown(() { |
+ return new Future(() => tearDownRun = true); |
+ }); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(tearDownRun, isFalse); |
+ }, max: 1)); |
+ |
+ return _runTest(0).then((_) => expect(tearDownRun, isTrue)); |
+ }); |
+ |
+ test("can't be called multiple times", () { |
+ _declarer.tearDown(() {}); |
+ expect(() => _declarer.tearDown(() {}), throwsStateError); |
+ }); |
+ }); |
+ |
+ group("in a group,", () { |
+ test("tests inherit the group's description", () { |
+ _declarer.group("group", () { |
+ _declarer.test("description", () {}); |
+ }); |
+ |
+ expect(_declarer.tests, hasLength(1)); |
+ expect(_declarer.tests.single.name, "group description"); |
+ }); |
+ |
+ group(".setUp()", () { |
+ test("is scoped to the group", () { |
+ var setUpRun = false; |
+ _declarer.group("group", () { |
+ _declarer.setUp(() => setUpRun = true); |
+ |
+ _declarer.test("description 1", expectAsync(() { |
+ expect(setUpRun, isTrue); |
+ setUpRun = false; |
+ }, max: 1)); |
+ }); |
+ |
+ _declarer.test("description 2", expectAsync(() { |
+ expect(setUpRun, isFalse); |
+ setUpRun = false; |
+ }, max: 1)); |
+ |
+ return _runTest(0).then((_) => _runTest(1)); |
+ }); |
+ |
+ test("runs from the outside in", () { |
+ var outerSetUpRun = false; |
+ var middleSetUpRun = false; |
+ var innerSetUpRun = false; |
+ _declarer.setUp(expectAsync(() { |
+ expect(middleSetUpRun, isFalse); |
+ expect(innerSetUpRun, isFalse); |
+ outerSetUpRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.group("middle", () { |
+ _declarer.setUp(expectAsync(() { |
+ expect(outerSetUpRun, isTrue); |
+ expect(innerSetUpRun, isFalse); |
+ middleSetUpRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.group("inner", () { |
+ _declarer.setUp(expectAsync(() { |
+ expect(outerSetUpRun, isTrue); |
+ expect(middleSetUpRun, isTrue); |
+ innerSetUpRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(outerSetUpRun, isTrue); |
+ expect(middleSetUpRun, isTrue); |
+ expect(innerSetUpRun, isTrue); |
+ }, max: 1)); |
+ }); |
+ }); |
+ |
+ return _runTest(0); |
+ }); |
+ |
+ test("handles Futures when chained", () { |
+ var outerSetUpRun = false; |
+ var innerSetUpRun = false; |
+ _declarer.setUp(expectAsync(() { |
+ expect(innerSetUpRun, isFalse); |
+ return new Future(() => outerSetUpRun = true); |
+ }, max: 1)); |
+ |
+ _declarer.group("inner", () { |
+ _declarer.setUp(expectAsync(() { |
+ expect(outerSetUpRun, isTrue); |
+ return new Future(() => innerSetUpRun = true); |
+ }, max: 1)); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(outerSetUpRun, isTrue); |
+ expect(innerSetUpRun, isTrue); |
+ }, max: 1)); |
+ }); |
+ |
+ return _runTest(0); |
+ }); |
+ |
+ test("can't be called multiple times", () { |
+ _declarer.group("group", () { |
+ _declarer.setUp(() {}); |
+ expect(() => _declarer.setUp(() {}), throwsStateError); |
+ }); |
+ }); |
+ }); |
+ |
+ group(".tearDown()", () { |
+ test("is scoped to the group", () { |
+ var tearDownRun; |
+ _declarer.setUp(() => tearDownRun = false); |
+ |
+ _declarer.group("group", () { |
+ _declarer.tearDown(() => tearDownRun = true); |
+ |
+ _declarer.test("description 1", expectAsync(() { |
+ expect(tearDownRun, isFalse); |
+ }, max: 1)); |
+ }); |
+ |
+ _declarer.test("description 2", expectAsync(() { |
+ expect(tearDownRun, isFalse); |
+ }, max: 1)); |
+ |
+ return _runTest(0).then((_) { |
+ expect(tearDownRun, isTrue); |
+ return _runTest(1); |
+ }).then((_) => expect(tearDownRun, isFalse)); |
+ }); |
+ |
+ test("runs from the inside out", () { |
+ var innerTearDownRun = false; |
+ var middleTearDownRun = false; |
+ var outerTearDownRun = false; |
+ _declarer.tearDown(expectAsync(() { |
+ expect(innerTearDownRun, isTrue); |
+ expect(middleTearDownRun, isTrue); |
+ outerTearDownRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.group("middle", () { |
+ _declarer.tearDown(expectAsync(() { |
+ expect(innerTearDownRun, isTrue); |
+ expect(outerTearDownRun, isFalse); |
+ middleTearDownRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.group("inner", () { |
+ _declarer.tearDown(expectAsync(() { |
+ expect(outerTearDownRun, isFalse); |
+ expect(middleTearDownRun, isFalse); |
+ innerTearDownRun = true; |
+ }, max: 1)); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(outerTearDownRun, isFalse); |
+ expect(middleTearDownRun, isFalse); |
+ expect(innerTearDownRun, isFalse); |
+ }, max: 1)); |
+ }); |
+ }); |
+ |
+ return _runTest(0).then((_) { |
+ expect(innerTearDownRun, isTrue); |
+ expect(middleTearDownRun, isTrue); |
+ expect(outerTearDownRun, isTrue); |
+ }); |
+ }); |
+ |
+ test("handles Futures when chained", () { |
+ var outerTearDownRun = false; |
+ var innerTearDownRun = false; |
+ _declarer.tearDown(expectAsync(() { |
+ expect(innerTearDownRun, isTrue); |
+ return new Future(() => outerTearDownRun = true); |
+ }, max: 1)); |
+ |
+ _declarer.group("inner", () { |
+ _declarer.tearDown(expectAsync(() { |
+ expect(outerTearDownRun, isFalse); |
+ return new Future(() => innerTearDownRun = true); |
+ }, max: 1)); |
+ |
+ _declarer.test("description", expectAsync(() { |
+ expect(outerTearDownRun, isFalse); |
+ expect(innerTearDownRun, isFalse); |
+ }, max: 1)); |
+ }); |
+ |
+ return _runTest(0).then((_) { |
+ expect(innerTearDownRun, isTrue); |
+ expect(outerTearDownRun, isTrue); |
+ }); |
+ }); |
+ |
+ test("can't be called multiple times", () { |
+ _declarer.group("group", () { |
+ _declarer.tearDown(() {}); |
+ expect(() => _declarer.tearDown(() {}), throwsStateError); |
+ }); |
+ }); |
+ }); |
+ }); |
+} |
+ |
+/// Runs the test at [index] defined on [_declarer]. |
+/// |
+/// This automatically sets up an `onError` listener to ensure that the test |
+/// doesn't throw any invisible exceptions. |
+Future _runTest(int index) { |
+ var liveTest = _declarer.tests[index].load(_suite); |
+ liveTest.onError.listen(expectAsync((_) {}, |
+ count: 0, reason: "No errors expected for test #$index.")); |
+ return liveTest.run(); |
+} |