Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Side by Side Diff: pkg/unittest/unittest.dart

Issue 10897016: Testrunner for 3rd parties. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/unittest/test_case.dart ('k') | utils/testrunner/configuration.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 /** 5 /**
6 * A library for writing dart unit tests. 6 * A library for writing dart unit tests.
7 * 7 *
8 * To import this library, specify the relative path to 8 * To import this library, specify the relative path to
9 * pkg/unittest/unittest.dart. 9 * pkg/unittest/unittest.dart.
10 * 10 *
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 #source('matcher.dart'); 149 #source('matcher.dart');
150 #source('mock.dart'); 150 #source('mock.dart');
151 #source('numeric_matchers.dart'); 151 #source('numeric_matchers.dart');
152 #source('operator_matchers.dart'); 152 #source('operator_matchers.dart');
153 #source('string_matchers.dart'); 153 #source('string_matchers.dart');
154 #source('test_case.dart'); 154 #source('test_case.dart');
155 155
156 /** [Configuration] used by the unittest library. */ 156 /** [Configuration] used by the unittest library. */
157 Configuration _config = null; 157 Configuration _config = null;
158 158
159 Configuration get config => _config;
160
159 /** 161 /**
160 * Set the [Configuration] used by the unittest library. Returns any 162 * Set the [Configuration] used by the unittest library. Returns any
161 * previous configuration. 163 * previous configuration.
164 * TODO: consider deprecating in favor of a setter now we have a getter.
162 */ 165 */
163 Configuration configure(Configuration config) { 166 Configuration configure(Configuration config) {
164 Configuration _oldConfig = _config; 167 Configuration _oldConfig = _config;
165 _config = config; 168 _config = config;
166 return _oldConfig; 169 return _oldConfig;
167 } 170 }
168 171
169 void logMessage(String message) => _config.log(message); 172 void logMessage(String message) => _config.log(message);
170 173
171 /** 174 /**
172 * Description text of the current test group. If multiple groups are nested, 175 * Description text of the current test group. If multiple groups are nested,
173 * this will contain all of their text concatenated. 176 * this will contain all of their text concatenated.
174 */ 177 */
175 String _currentGroup = ''; 178 String _currentGroup = '';
176 179
180 /** Separator used between group names and test names. */
181 String groupSep = ' ';
182
177 /** Tests executed in this suite. */ 183 /** Tests executed in this suite. */
178 List<TestCase> _tests; 184 List<TestCase> _tests;
179 185
180 /** Get the list of tests. */ 186 /** Get the list of tests. */
181 get testCases() => _tests; 187 get testCases => _tests;
182 188
183 /** 189 /**
184 * Callback used to run tests. Entrypoints can replace this with their own 190 * Callback used to run tests. Entrypoints can replace this with their own
185 * if they want. 191 * if they want.
186 */ 192 */
187 Function _testRunner; 193 Function _testRunner;
188 194
189 /** Setup function called before each test in a group */ 195 /** Setup function called before each test in a group */
190 Function _testSetup; 196 Function _testSetup;
191 197
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 if (result == false) { 235 if (result == false) {
230 _fail('Exception:\n$e\ndid not match expectation.'); 236 _fail('Exception:\n$e\ndid not match expectation.');
231 } 237 }
232 } 238 }
233 } 239 }
234 240
235 if (threw != true) _fail('An expected exception was not thrown.'); 241 if (threw != true) _fail('An expected exception was not thrown.');
236 } 242 }
237 243
238 /** 244 /**
239 * The regexp pattern filter which constrains which tests to run
240 * based on their descriptions.
241 */
242
243 String filter = null;
244
245 /**
246 * Creates a new test case with the given description and body. The 245 * Creates a new test case with the given description and body. The
247 * description will include the descriptions of any surrounding group() 246 * description will include the descriptions of any surrounding group()
248 * calls. 247 * calls.
249 */ 248 */
250 void test(String spec, TestFunction body) { 249 void test(String spec, TestFunction body) {
251 ensureInitialized(); 250 ensureInitialized();
252
253 _tests.add(new TestCase(_tests.length + 1, _fullSpec(spec), body, 0)); 251 _tests.add(new TestCase(_tests.length + 1, _fullSpec(spec), body, 0));
254 } 252 }
255 253
256 /** 254 /**
257 * (Deprecated) Creates a new async test case with the given description 255 * (Deprecated) Creates a new async test case with the given description
258 * and body. The description will include the descriptions of any surrounding 256 * and body. The description will include the descriptions of any surrounding
259 * group() calls. 257 * group() calls.
260 */ 258 */
261 // TODO(sigmund): deprecate this API 259 // TODO(sigmund): deprecate this API
262 void asyncTest(String spec, int callbacks, TestFunction body) { 260 void asyncTest(String spec, int callbacks, TestFunction body) {
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 Function protectAsync2(Function callback) { 553 Function protectAsync2(Function callback) {
556 return new _SpreadArgsHelper.optionalCalls(callback).invoke2; 554 return new _SpreadArgsHelper.optionalCalls(callback).invoke2;
557 } 555 }
558 556
559 /** 557 /**
560 * Creates a new named group of tests. Calls to group() or test() within the 558 * Creates a new named group of tests. Calls to group() or test() within the
561 * body of the function passed to this will inherit this group's description. 559 * body of the function passed to this will inherit this group's description.
562 */ 560 */
563 void group(String description, void body()) { 561 void group(String description, void body()) {
564 ensureInitialized(); 562 ensureInitialized();
565
566 // Concatenate the new group. 563 // Concatenate the new group.
567 final parentGroup = _currentGroup; 564 final parentGroup = _currentGroup;
568 if (_currentGroup != '') { 565 if (_currentGroup != '') {
569 // Add a space. 566 // Add a space.
570 _currentGroup = '$_currentGroup $description'; 567 _currentGroup = '$_currentGroup$groupSep$description';
571 } else { 568 } else {
572 // The first group. 569 // The first group.
573 _currentGroup = description; 570 _currentGroup = description;
574 } 571 }
575 572
576 // Groups can be nested, so we need to preserve the current 573 // Groups can be nested, so we need to preserve the current
577 // settings for test setup/teardown. 574 // settings for test setup/teardown.
578 Function parentSetup = _testSetup; 575 Function parentSetup = _testSetup;
579 Function parentTeardown = _testTeardown; 576 Function parentTeardown = _testTeardown;
580 577
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 }); 683 });
687 port.toSendPort().send(null, null); 684 port.toSendPort().send(null, null);
688 } 685 }
689 686
690 rerunTests() { 687 rerunTests() {
691 _uncaughtErrorMessage = null; 688 _uncaughtErrorMessage = null;
692 _initialized = true; // We don't want to reset the test array. 689 _initialized = true; // We don't want to reset the test array.
693 runTests(); 690 runTests();
694 } 691 }
695 692
693 /**
694 * Filter the tests. [testFilter] can be a [RegExp], a [String] or a
695 * predicate function. This is different to enabling/disabling tests
696 * in that it removes the tests completely.
697 */
698 void filterTests(testFilter) {
699 var filterFunction;
700 if (testFilter is String) {
701 RegExp re = new RegExp(testFilter);
702 filterFunction = (t) => re.hasMatch(t.description);
703 } else if (testFilter is RegExp) {
704 filterFunction = (t) => testFilter.hasMatch(t.description);
705 } else if (testFilter is Function) {
706 filterFunction = testFilter;
707 }
708 _tests = _tests.filter(filterFunction);
709 }
710
696 /** Runs all queued tests, one at a time. */ 711 /** Runs all queued tests, one at a time. */
697 runTests() { 712 runTests() {
698 _currentTest = 0; 713 _currentTest = 0;
699 _currentGroup = ''; 714 _currentGroup = '';
700 715
701 // If we are soloing a test, remove all the others. 716 // If we are soloing a test, remove all the others.
702 if (_soloTest != null) { 717 if (_soloTest != null) {
703 _tests = _tests.filter((t) => t == _soloTest); 718 filterTests((t) => t == _soloTest);
704 }
705
706 if (filter != null) {
707 RegExp re = new RegExp(filter);
708 _tests = _tests.filter((t) => re.hasMatch(t.description));
709 } 719 }
710 720
711 _config.onStart(); 721 _config.onStart();
712 722
713 _defer(() { 723 _defer(() {
714 _testRunner(); 724 _testRunner();
715 }); 725 });
716 } 726 }
717 727
718 /** 728 /**
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 case _ERROR: testsErrors_++; break; 799 case _ERROR: testsErrors_++; break;
790 } 800 }
791 } 801 }
792 _config.onDone(testsPassed_, testsFailed_, testsErrors_, _tests, 802 _config.onDone(testsPassed_, testsFailed_, testsErrors_, _tests,
793 _uncaughtErrorMessage); 803 _uncaughtErrorMessage);
794 _initialized = false; 804 _initialized = false;
795 } 805 }
796 806
797 String _fullSpec(String spec) { 807 String _fullSpec(String spec) {
798 if (spec === null) return '$_currentGroup'; 808 if (spec === null) return '$_currentGroup';
799 return _currentGroup != '' ? '$_currentGroup $spec' : spec; 809 return _currentGroup != '' ? '$_currentGroup$groupSep$spec' : spec;
800 } 810 }
801 811
802 void _fail(String message) { 812 void _fail(String message) {
803 throw new ExpectException(message); 813 throw new ExpectException(message);
804 } 814 }
805 815
806 /** 816 /**
807 * Lazily initializes the test library if not already initialized. 817 * Lazily initializes the test library if not already initialized.
808 */ 818 */
809 ensureInitialized() { 819 ensureInitialized() {
810 if (_initialized) return; 820 if (_initialized) {
821 return;
822 }
811 _initialized = true; 823 _initialized = true;
812 824
813 _tests = <TestCase>[]; 825 _tests = <TestCase>[];
814 _testRunner = _nextBatch; 826 _testRunner = _nextBatch;
815 _uncaughtErrorMessage = null; 827 _uncaughtErrorMessage = null;
816 828
817 if (_config == null) { 829 if (_config == null) {
818 _config = new Configuration(); 830 _config = new Configuration();
819 } 831 }
820 _config.onInit(); 832 _config.onInit();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 } 864 }
853 865
854 /** Enable a test by ID. */ 866 /** Enable a test by ID. */
855 void enableTest(int testId) => _setTestEnabledState(testId, true); 867 void enableTest(int testId) => _setTestEnabledState(testId, true);
856 868
857 /** Disable a test by ID. */ 869 /** Disable a test by ID. */
858 void disableTest(int testId) => _setTestEnabledState(testId, false); 870 void disableTest(int testId) => _setTestEnabledState(testId, false);
859 871
860 /** Signature for a test function. */ 872 /** Signature for a test function. */
861 typedef void TestFunction(); 873 typedef void TestFunction();
OLDNEW
« no previous file with comments | « pkg/unittest/test_case.dart ('k') | utils/testrunner/configuration.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698