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

Side by Side Diff: lib/src/console_reporter.dart

Issue 933083002: Add a test runner executable. (Closed) Base URL: git@github.com:dart-lang/unittest@master
Patch Set: fix loader_test? Created 5 years, 10 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
OLDNEW
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 library unittest.console_reporter; 5 library unittest.console_reporter;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:io'; 8 import 'dart:io';
9 9
10 import 'package:stack_trace/stack_trace.dart';
kevmoo 2015/02/19 01:54:08 unused import
11
10 import 'engine.dart'; 12 import 'engine.dart';
11 import 'io.dart'; 13 import 'io.dart';
12 import 'live_test.dart'; 14 import 'live_test.dart';
13 import 'state.dart'; 15 import 'state.dart';
14 import 'suite.dart'; 16 import 'suite.dart';
15 import 'utils.dart'; 17 import 'utils.dart';
16 18
17 /// The terminal escape for green text, or the empty string if this is Windows 19 /// The terminal escape for green text, or the empty string if this is Windows
18 /// or not outputting to a terminal. 20 /// or not outputting to a terminal.
19 final _green = getSpecial('\u001b[32m'); 21 final _green = getSpecial('\u001b[32m');
(...skipping 22 matching lines...) Expand all
42 44
43 /// A stopwatch that tracks the duration of the full run. 45 /// A stopwatch that tracks the duration of the full run.
44 final _stopwatch = new Stopwatch(); 46 final _stopwatch = new Stopwatch();
45 47
46 /// The set of tests that have completed and been marked as passing. 48 /// The set of tests that have completed and been marked as passing.
47 final _passed = new Set<LiveTest>(); 49 final _passed = new Set<LiveTest>();
48 50
49 /// The set of tests that have completed and been marked as failing or error. 51 /// The set of tests that have completed and been marked as failing or error.
50 final _failed = new Set<LiveTest>(); 52 final _failed = new Set<LiveTest>();
51 53
54 /// The size of [_passed] last time a progress notification was printed.
55 int _lastProgressPassed;
56
57 /// The size of [_failed] last time a progress notification was printed.
58 int _lastProgressFailed;
59
60 /// The message printed for the last progress notification.
61 String _lastProgressMessage;
62
52 /// Creates a [ConsoleReporter] that will run all tests in [suites]. 63 /// Creates a [ConsoleReporter] that will run all tests in [suites].
53 ConsoleReporter(Iterable<Suite> suites) 64 ConsoleReporter(Iterable<Suite> suites)
54 : _multipleSuites = suites.length > 1, 65 : _multipleSuites = suites.length > 1,
55 _engine = new Engine(suites) { 66 _engine = new Engine(suites) {
56 67
57 _engine.onTestStarted.listen((liveTest) { 68 _engine.onTestStarted.listen((liveTest) {
58 _progressLine(_description(liveTest)); 69 _progressLine(_description(liveTest));
59 liveTest.onStateChange.listen((state) { 70 liveTest.onStateChange.listen((state) {
60 if (state.status != Status.complete) return; 71 if (state.status != Status.complete) return;
61 if (state.result == Result.success) { 72 if (state.result == Result.success) {
62 _passed.add(liveTest); 73 _passed.add(liveTest);
63 } else { 74 } else {
64 _passed.remove(liveTest); 75 _passed.remove(liveTest);
65 _failed.add(liveTest); 76 _failed.add(liveTest);
66 } 77 }
67 _progressLine(_description(liveTest)); 78 _progressLine(_description(liveTest));
68 }); 79 });
69 80
70 liveTest.onError.listen((error) { 81 liveTest.onError.listen((error) {
71 if (liveTest.state.status != Status.complete) return; 82 if (liveTest.state.status != Status.complete) return;
72 83
73 // TODO(nweiz): don't re-print the progress line if a test has multiple
74 // errors in a row.
75 _progressLine(_description(liveTest)); 84 _progressLine(_description(liveTest));
76 print(''); 85 print('');
77 print(indent("${error.error}\n${error.stackTrace}")); 86 print(indent(error.error.toString()));
87 print(indent(terseChain(error.stackTrace).toString()));
78 }); 88 });
79 }); 89 });
80 } 90 }
81 91
82 /// Runs all tests in all provided suites. 92 /// Runs all tests in all provided suites.
83 /// 93 ///
84 /// This returns `true` if all tests succeed, and `false` otherwise. It will 94 /// This returns `true` if all tests succeed, and `false` otherwise. It will
85 /// only return once all tests have finished running. 95 /// only return once all tests have finished running.
86 Future<bool> run() { 96 Future<bool> run() {
87 if (_stopwatch.isRunning) { 97 if (_stopwatch.isRunning) {
88 throw new StateError("ConsoleReporter.run() may not be called more than " 98 throw new StateError("ConsoleReporter.run() may not be called more than "
89 "once."); 99 "once.");
90 } 100 }
91 101
102 if (_engine.liveTests.isEmpty) {
103 print("No tests ran.");
104 return new Future.value(true);
105 }
106
92 _stopwatch.start(); 107 _stopwatch.start();
93 return _engine.run().then((success) { 108 return _engine.run().then((success) {
94 if (_engine.liveTests.isEmpty) { 109 if (success) {
95 print("\nNo tests ran.");
96 } else if (success) {
97 _progressLine("All tests passed!"); 110 _progressLine("All tests passed!");
98 print(''); 111 print('');
99 } else { 112 } else {
100 _progressLine('Some tests failed.', color: _red); 113 _progressLine('Some tests failed.', color: _red);
101 print(''); 114 print('');
102 } 115 }
103 116
104 return success; 117 return success;
105 }); 118 });
106 } 119 }
107 120
121 /// Signals that the caller is done with any test output and the reporter
122 /// should release any resources it has allocated.
123 Future close() => _engine.close();
124
108 /// Prints a line representing the current state of the tests. 125 /// Prints a line representing the current state of the tests.
109 /// 126 ///
110 /// [message] goes after the progress report, and may be truncated to fit the 127 /// [message] goes after the progress report, and may be truncated to fit the
111 /// entire line within [_lineLength]. If [color] is passed, it's used as the 128 /// entire line within [_lineLength]. If [color] is passed, it's used as the
112 /// color for [message]. 129 /// color for [message].
113 void _progressLine(String message, {String color}) { 130 void _progressLine(String message, {String color}) {
131 // Print nothing if nothing has changed since the last progress line.
132 if (_passed.length == _lastProgressPassed &&
133 _failed.length == _lastProgressFailed &&
134 message == _lastProgressMessage) {
135 return;
136 }
137
138 _lastProgressPassed = _passed.length;
139 _lastProgressFailed = _failed.length;
140 _lastProgressMessage = message;
141
114 if (color == null) color = ''; 142 if (color == null) color = '';
115 var duration = _stopwatch.elapsed; 143 var duration = _stopwatch.elapsed;
116 var buffer = new StringBuffer(); 144 var buffer = new StringBuffer();
117 145
118 // \r moves back to the beginning of the current line. 146 // \r moves back to the beginning of the current line.
119 buffer.write('\r${_timeString(duration)} '); 147 buffer.write('\r${_timeString(duration)} ');
120 buffer.write(_green); 148 buffer.write(_green);
121 buffer.write('+'); 149 buffer.write('+');
122 buffer.write(_passed.length); 150 buffer.write(_passed.length);
123 buffer.write(_noColor); 151 buffer.write(_noColor);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 224
197 /// Returns a description of [liveTest]. 225 /// Returns a description of [liveTest].
198 /// 226 ///
199 /// This differs from the test's own description in that it may also include 227 /// This differs from the test's own description in that it may also include
200 /// the suite's name. 228 /// the suite's name.
201 String _description(LiveTest liveTest) { 229 String _description(LiveTest liveTest) {
202 if (_multipleSuites) return "${liveTest.suite.name}: ${liveTest.test.name}"; 230 if (_multipleSuites) return "${liveTest.suite.name}: ${liveTest.test.name}";
203 return liveTest.test.name; 231 return liveTest.test.name;
204 } 232 }
205 } 233 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698