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 import 'dart:async'; |
| 6 |
| 7 import 'package:unittest/src/declarer.dart'; |
| 8 import 'package:unittest/src/suite.dart'; |
| 9 import 'package:unittest/unittest.dart'; |
| 10 |
| 11 Declarer _declarer; |
| 12 Suite _suite; |
| 13 |
| 14 void main() { |
| 15 setUp(() { |
| 16 _declarer = new Declarer(); |
| 17 _suite = new Suite("suite", []); |
| 18 }); |
| 19 |
| 20 group(".test()", () { |
| 21 test("declares a test with a description and body", () { |
| 22 var bodyRun = false; |
| 23 _declarer.test("description", () { |
| 24 bodyRun = true; |
| 25 }); |
| 26 |
| 27 expect(_declarer.tests, hasLength(1)); |
| 28 expect(_declarer.tests.single.name, equals("description")); |
| 29 |
| 30 return _runTest(0).then(expectAsync((_) { |
| 31 expect(bodyRun, isTrue); |
| 32 }, max: 1)); |
| 33 }); |
| 34 |
| 35 test("declares multiple tests", () { |
| 36 _declarer.test("description 1", () {}); |
| 37 _declarer.test("description 2", () {}); |
| 38 _declarer.test("description 3", () {}); |
| 39 |
| 40 expect(_declarer.tests, hasLength(3)); |
| 41 expect(_declarer.tests[0].name, equals("description 1")); |
| 42 expect(_declarer.tests[1].name, equals("description 2")); |
| 43 expect(_declarer.tests[2].name, equals("description 3")); |
| 44 }); |
| 45 }); |
| 46 |
| 47 group(".setUp()", () { |
| 48 test("is run before all tests", () { |
| 49 var setUpRun = false; |
| 50 _declarer.setUp(() => setUpRun = true); |
| 51 |
| 52 _declarer.test("description 1", expectAsync(() { |
| 53 expect(setUpRun, isTrue); |
| 54 setUpRun = false; |
| 55 }, max: 1)); |
| 56 |
| 57 _declarer.test("description 2", expectAsync(() { |
| 58 expect(setUpRun, isTrue); |
| 59 setUpRun = false; |
| 60 }, max: 1)); |
| 61 |
| 62 return _runTest(0).then((_) => _runTest(1)); |
| 63 }); |
| 64 |
| 65 test("can return a Future", () { |
| 66 var setUpRun = false; |
| 67 _declarer.setUp(() { |
| 68 return new Future(() => setUpRun = true); |
| 69 }); |
| 70 |
| 71 _declarer.test("description", expectAsync(() { |
| 72 expect(setUpRun, isTrue); |
| 73 }, max: 1)); |
| 74 |
| 75 return _runTest(0); |
| 76 }); |
| 77 |
| 78 test("can't be called multiple times", () { |
| 79 _declarer.setUp(() {}); |
| 80 expect(() => _declarer.setUp(() {}), throwsStateError); |
| 81 }); |
| 82 }); |
| 83 |
| 84 group(".tearDown()", () { |
| 85 test("is run after all tests", () { |
| 86 var tearDownRun; |
| 87 _declarer.setUp(() => tearDownRun = false); |
| 88 _declarer.tearDown(() => tearDownRun = true); |
| 89 |
| 90 _declarer.test("description 1", expectAsync(() { |
| 91 expect(tearDownRun, isFalse); |
| 92 }, max: 1)); |
| 93 |
| 94 _declarer.test("description 2", expectAsync(() { |
| 95 expect(tearDownRun, isFalse); |
| 96 }, max: 1)); |
| 97 |
| 98 return _runTest(0).then((_) { |
| 99 expect(tearDownRun, isTrue); |
| 100 return _runTest(1); |
| 101 }).then((_) => expect(tearDownRun, isTrue)); |
| 102 }); |
| 103 |
| 104 test("can return a Future", () { |
| 105 var tearDownRun = false; |
| 106 _declarer.tearDown(() { |
| 107 return new Future(() => tearDownRun = true); |
| 108 }); |
| 109 |
| 110 _declarer.test("description", expectAsync(() { |
| 111 expect(tearDownRun, isFalse); |
| 112 }, max: 1)); |
| 113 |
| 114 return _runTest(0).then((_) => expect(tearDownRun, isTrue)); |
| 115 }); |
| 116 |
| 117 test("can't be called multiple times", () { |
| 118 _declarer.tearDown(() {}); |
| 119 expect(() => _declarer.tearDown(() {}), throwsStateError); |
| 120 }); |
| 121 }); |
| 122 |
| 123 group("in a group,", () { |
| 124 test("tests inherit the group's description", () { |
| 125 _declarer.group("group", () { |
| 126 _declarer.test("description", () {}); |
| 127 }); |
| 128 |
| 129 expect(_declarer.tests, hasLength(1)); |
| 130 expect(_declarer.tests.single.name, "group description"); |
| 131 }); |
| 132 |
| 133 group(".setUp()", () { |
| 134 test("is scoped to the group", () { |
| 135 var setUpRun = false; |
| 136 _declarer.group("group", () { |
| 137 _declarer.setUp(() => setUpRun = true); |
| 138 |
| 139 _declarer.test("description 1", expectAsync(() { |
| 140 expect(setUpRun, isTrue); |
| 141 setUpRun = false; |
| 142 }, max: 1)); |
| 143 }); |
| 144 |
| 145 _declarer.test("description 2", expectAsync(() { |
| 146 expect(setUpRun, isFalse); |
| 147 setUpRun = false; |
| 148 }, max: 1)); |
| 149 |
| 150 return _runTest(0).then((_) => _runTest(1)); |
| 151 }); |
| 152 |
| 153 test("runs from the outside in", () { |
| 154 var outerSetUpRun = false; |
| 155 var middleSetUpRun = false; |
| 156 var innerSetUpRun = false; |
| 157 _declarer.setUp(expectAsync(() { |
| 158 expect(middleSetUpRun, isFalse); |
| 159 expect(innerSetUpRun, isFalse); |
| 160 outerSetUpRun = true; |
| 161 }, max: 1)); |
| 162 |
| 163 _declarer.group("middle", () { |
| 164 _declarer.setUp(expectAsync(() { |
| 165 expect(outerSetUpRun, isTrue); |
| 166 expect(innerSetUpRun, isFalse); |
| 167 middleSetUpRun = true; |
| 168 }, max: 1)); |
| 169 |
| 170 _declarer.group("inner", () { |
| 171 _declarer.setUp(expectAsync(() { |
| 172 expect(outerSetUpRun, isTrue); |
| 173 expect(middleSetUpRun, isTrue); |
| 174 innerSetUpRun = true; |
| 175 }, max: 1)); |
| 176 |
| 177 _declarer.test("description", expectAsync(() { |
| 178 expect(outerSetUpRun, isTrue); |
| 179 expect(middleSetUpRun, isTrue); |
| 180 expect(innerSetUpRun, isTrue); |
| 181 }, max: 1)); |
| 182 }); |
| 183 }); |
| 184 |
| 185 return _runTest(0); |
| 186 }); |
| 187 |
| 188 test("handles Futures when chained", () { |
| 189 var outerSetUpRun = false; |
| 190 var innerSetUpRun = false; |
| 191 _declarer.setUp(expectAsync(() { |
| 192 expect(innerSetUpRun, isFalse); |
| 193 return new Future(() => outerSetUpRun = true); |
| 194 }, max: 1)); |
| 195 |
| 196 _declarer.group("inner", () { |
| 197 _declarer.setUp(expectAsync(() { |
| 198 expect(outerSetUpRun, isTrue); |
| 199 return new Future(() => innerSetUpRun = true); |
| 200 }, max: 1)); |
| 201 |
| 202 _declarer.test("description", expectAsync(() { |
| 203 expect(outerSetUpRun, isTrue); |
| 204 expect(innerSetUpRun, isTrue); |
| 205 }, max: 1)); |
| 206 }); |
| 207 |
| 208 return _runTest(0); |
| 209 }); |
| 210 |
| 211 test("can't be called multiple times", () { |
| 212 _declarer.group("group", () { |
| 213 _declarer.setUp(() {}); |
| 214 expect(() => _declarer.setUp(() {}), throwsStateError); |
| 215 }); |
| 216 }); |
| 217 }); |
| 218 |
| 219 group(".tearDown()", () { |
| 220 test("is scoped to the group", () { |
| 221 var tearDownRun; |
| 222 _declarer.setUp(() => tearDownRun = false); |
| 223 |
| 224 _declarer.group("group", () { |
| 225 _declarer.tearDown(() => tearDownRun = true); |
| 226 |
| 227 _declarer.test("description 1", expectAsync(() { |
| 228 expect(tearDownRun, isFalse); |
| 229 }, max: 1)); |
| 230 }); |
| 231 |
| 232 _declarer.test("description 2", expectAsync(() { |
| 233 expect(tearDownRun, isFalse); |
| 234 }, max: 1)); |
| 235 |
| 236 return _runTest(0).then((_) { |
| 237 expect(tearDownRun, isTrue); |
| 238 return _runTest(1); |
| 239 }).then((_) => expect(tearDownRun, isFalse)); |
| 240 }); |
| 241 |
| 242 test("runs from the inside out", () { |
| 243 var innerTearDownRun = false; |
| 244 var middleTearDownRun = false; |
| 245 var outerTearDownRun = false; |
| 246 _declarer.tearDown(expectAsync(() { |
| 247 expect(innerTearDownRun, isTrue); |
| 248 expect(middleTearDownRun, isTrue); |
| 249 outerTearDownRun = true; |
| 250 }, max: 1)); |
| 251 |
| 252 _declarer.group("middle", () { |
| 253 _declarer.tearDown(expectAsync(() { |
| 254 expect(innerTearDownRun, isTrue); |
| 255 expect(outerTearDownRun, isFalse); |
| 256 middleTearDownRun = true; |
| 257 }, max: 1)); |
| 258 |
| 259 _declarer.group("inner", () { |
| 260 _declarer.tearDown(expectAsync(() { |
| 261 expect(outerTearDownRun, isFalse); |
| 262 expect(middleTearDownRun, isFalse); |
| 263 innerTearDownRun = true; |
| 264 }, max: 1)); |
| 265 |
| 266 _declarer.test("description", expectAsync(() { |
| 267 expect(outerTearDownRun, isFalse); |
| 268 expect(middleTearDownRun, isFalse); |
| 269 expect(innerTearDownRun, isFalse); |
| 270 }, max: 1)); |
| 271 }); |
| 272 }); |
| 273 |
| 274 return _runTest(0).then((_) { |
| 275 expect(innerTearDownRun, isTrue); |
| 276 expect(middleTearDownRun, isTrue); |
| 277 expect(outerTearDownRun, isTrue); |
| 278 }); |
| 279 }); |
| 280 |
| 281 test("handles Futures when chained", () { |
| 282 var outerTearDownRun = false; |
| 283 var innerTearDownRun = false; |
| 284 _declarer.tearDown(expectAsync(() { |
| 285 expect(innerTearDownRun, isTrue); |
| 286 return new Future(() => outerTearDownRun = true); |
| 287 }, max: 1)); |
| 288 |
| 289 _declarer.group("inner", () { |
| 290 _declarer.tearDown(expectAsync(() { |
| 291 expect(outerTearDownRun, isFalse); |
| 292 return new Future(() => innerTearDownRun = true); |
| 293 }, max: 1)); |
| 294 |
| 295 _declarer.test("description", expectAsync(() { |
| 296 expect(outerTearDownRun, isFalse); |
| 297 expect(innerTearDownRun, isFalse); |
| 298 }, max: 1)); |
| 299 }); |
| 300 |
| 301 return _runTest(0).then((_) { |
| 302 expect(innerTearDownRun, isTrue); |
| 303 expect(outerTearDownRun, isTrue); |
| 304 }); |
| 305 }); |
| 306 |
| 307 test("can't be called multiple times", () { |
| 308 _declarer.group("group", () { |
| 309 _declarer.tearDown(() {}); |
| 310 expect(() => _declarer.tearDown(() {}), throwsStateError); |
| 311 }); |
| 312 }); |
| 313 }); |
| 314 }); |
| 315 } |
| 316 |
| 317 /// Runs the test at [index] defined on [_declarer]. |
| 318 /// |
| 319 /// This automatically sets up an `onError` listener to ensure that the test |
| 320 /// doesn't throw any invisible exceptions. |
| 321 Future _runTest(int index) { |
| 322 var liveTest = _declarer.tests[index].load(_suite); |
| 323 liveTest.onError.listen(expectAsync((_) {}, |
| 324 count: 0, reason: "No errors expected for test #$index.")); |
| 325 return liveTest.run(); |
| 326 } |
OLD | NEW |