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 unittest.declarer; |
| 6 |
| 7 import 'dart:collection'; |
| 8 |
| 9 import 'group.dart'; |
| 10 import 'invoker.dart'; |
| 11 import 'test.dart'; |
| 12 |
| 13 /// A class that manages the state of tests as they're declared. |
| 14 /// |
| 15 /// This is in charge of tracking the current group, set-up, and tear-down |
| 16 /// functions. It produces a list of runnable [tests]. |
| 17 class Declarer { |
| 18 /// The current group. |
| 19 var _group = new Group.root(); |
| 20 |
| 21 /// The list of tests that have been defined. |
| 22 List<Test> get tests => new UnmodifiableListView<Test>(_tests); |
| 23 final _tests = new List<Test>(); |
| 24 |
| 25 Declarer(); |
| 26 |
| 27 /// Defines a test case with the given description and body. |
| 28 /// |
| 29 /// The description will be added to the descriptions of any surrounding |
| 30 /// [group]s. |
| 31 void test(String description, body()) { |
| 32 // TODO(nweiz): Once tests have begun running, throw an error if [test] is |
| 33 // called. |
| 34 var prefix = _group.description; |
| 35 if (prefix != null) description = "$prefix $description"; |
| 36 |
| 37 var group = _group; |
| 38 _tests.add(new LocalTest(description, () { |
| 39 // TODO(nweiz): It might be useful to throw an error here if a test starts |
| 40 // running while other tests from the same declarer are also running, |
| 41 // since they might share closurized state. |
| 42 return group.runSetUp().then((_) => body()); |
| 43 }, tearDown: group.runTearDown)); |
| 44 } |
| 45 |
| 46 /// Creates a group of tests. |
| 47 /// |
| 48 /// A group's description is included in the descriptions of any tests or |
| 49 /// sub-groups it contains. [setUp] and [tearDown] are also scoped to the |
| 50 /// containing group. |
| 51 void group(String description, void body()) { |
| 52 var oldGroup = _group; |
| 53 _group = new Group(oldGroup, description); |
| 54 try { |
| 55 body(); |
| 56 } finally { |
| 57 _group = oldGroup; |
| 58 } |
| 59 } |
| 60 |
| 61 /// Registers a function to be run before tests. |
| 62 /// |
| 63 /// This function will be called before each test is run. [callback] may be |
| 64 /// asynchronous; if so, it must return a [Future]. |
| 65 /// |
| 66 /// If this is called within a [group], it applies only to tests in that |
| 67 /// group. [callback] will be run after any set-up callbacks in parent groups |
| 68 /// or at the top level. |
| 69 void setUp(callback()) { |
| 70 if (_group.setUp != null) { |
| 71 throw new StateError("setUp() may not be called multiple times for the " |
| 72 "same group."); |
| 73 } |
| 74 |
| 75 _group.setUp = callback; |
| 76 } |
| 77 |
| 78 /// Registers a function to be run after tests. |
| 79 /// |
| 80 /// This function will be called after each test is run. [callback] may be |
| 81 /// asynchronous; if so, it must return a [Future]. |
| 82 /// |
| 83 /// If this is called within a [group], it applies only to tests in that |
| 84 /// group. [callback] will be run before any tear-down callbacks in parent |
| 85 /// groups or at the top level. |
| 86 void tearDown(callback()) { |
| 87 if (_group.tearDown != null) { |
| 88 throw new StateError("tearDown() may not be called multiple times for " |
| 89 "the same group."); |
| 90 } |
| 91 |
| 92 _group.tearDown = callback; |
| 93 } |
| 94 } |
OLD | NEW |