OLD | NEW |
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 test.runner.reporter.compact; | 5 library test.runner.reporter.compact; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import '../../backend/live_test.dart'; | 10 import '../../backend/live_test.dart'; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 /// A stopwatch that tracks the duration of the full run. | 45 /// A stopwatch that tracks the duration of the full run. |
46 final _stopwatch = new Stopwatch(); | 46 final _stopwatch = new Stopwatch(); |
47 | 47 |
48 /// 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. |
49 final _passed = new Set<LiveTest>(); | 49 final _passed = new Set<LiveTest>(); |
50 | 50 |
51 /// 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. |
52 final _failed = new Set<LiveTest>(); | 52 final _failed = new Set<LiveTest>(); |
53 | 53 |
| 54 /// Whether [close] has been called. |
| 55 bool _closed = false; |
| 56 |
54 /// The size of [_passed] last time a progress notification was printed. | 57 /// The size of [_passed] last time a progress notification was printed. |
55 int _lastProgressPassed; | 58 int _lastProgressPassed; |
56 | 59 |
57 /// The size of [_failed] last time a progress notification was printed. | 60 /// The size of [_failed] last time a progress notification was printed. |
58 int _lastProgressFailed; | 61 int _lastProgressFailed; |
59 | 62 |
60 /// The message printed for the last progress notification. | 63 /// The message printed for the last progress notification. |
61 String _lastProgressMessage; | 64 String _lastProgressMessage; |
62 | 65 |
| 66 // Whether a newline has been printed since the last progress line. |
| 67 var _printedNewline = true; |
| 68 |
63 /// Creates a [ConsoleReporter] that will run all tests in [suites]. | 69 /// Creates a [ConsoleReporter] that will run all tests in [suites]. |
64 /// | 70 /// |
65 /// If [color] is `true`, this will use terminal colors; if it's `false`, it | 71 /// If [color] is `true`, this will use terminal colors; if it's `false`, it |
66 /// won't. | 72 /// won't. |
67 CompactReporter(Iterable<Suite> suites, {bool color: true}) | 73 CompactReporter(Iterable<Suite> suites, {bool color: true}) |
68 : _multiplePaths = suites.map((suite) => suite.path).toSet().length > 1, | 74 : _multiplePaths = suites.map((suite) => suite.path).toSet().length > 1, |
69 _multiplePlatforms = | 75 _multiplePlatforms = |
70 suites.map((suite) => suite.platform).toSet().length > 1, | 76 suites.map((suite) => suite.platform).toSet().length > 1, |
71 _engine = new Engine(suites), | 77 _engine = new Engine(suites), |
72 _green = color ? '\u001b[32m' : '', | 78 _green = color ? '\u001b[32m' : '', |
73 _red = color ? '\u001b[31m' : '', | 79 _red = color ? '\u001b[31m' : '', |
74 _noColor = color ? '\u001b[0m' : '' { | 80 _noColor = color ? '\u001b[0m' : '' { |
75 // Whether a newline has been printed since the last progress line. | |
76 var printedNewline = false; | |
77 _engine.onTestStarted.listen((liveTest) { | 81 _engine.onTestStarted.listen((liveTest) { |
78 _progressLine(_description(liveTest)); | 82 _progressLine(_description(liveTest)); |
| 83 _printedNewline = false; |
| 84 |
79 liveTest.onStateChange.listen((state) { | 85 liveTest.onStateChange.listen((state) { |
80 if (state.status != Status.complete) return; | 86 if (state.status != Status.complete) return; |
81 if (state.result == Result.success) { | 87 if (state.result == Result.success) { |
82 _passed.add(liveTest); | 88 _passed.add(liveTest); |
83 } else { | 89 } else { |
84 _passed.remove(liveTest); | 90 _passed.remove(liveTest); |
85 _failed.add(liveTest); | 91 _failed.add(liveTest); |
86 } | 92 } |
87 _progressLine(_description(liveTest)); | 93 _progressLine(_description(liveTest)); |
88 printedNewline = false; | 94 _printedNewline = false; |
89 }); | 95 }); |
90 | 96 |
91 liveTest.onError.listen((error) { | 97 liveTest.onError.listen((error) { |
92 if (liveTest.state.status != Status.complete) return; | 98 if (liveTest.state.status != Status.complete) return; |
93 | 99 |
94 _progressLine(_description(liveTest)); | 100 _progressLine(_description(liveTest)); |
95 if (!printedNewline) print(''); | 101 if (!_printedNewline) print(''); |
96 printedNewline = true; | 102 _printedNewline = true; |
97 | 103 |
98 print(indent(error.error.toString())); | 104 print(indent(error.error.toString())); |
99 print(indent(terseChain(error.stackTrace).toString())); | 105 print(indent(terseChain(error.stackTrace).toString())); |
100 }); | 106 }); |
101 | 107 |
102 liveTest.onPrint.listen((line) { | 108 liveTest.onPrint.listen((line) { |
103 _progressLine(_description(liveTest)); | 109 _progressLine(_description(liveTest)); |
104 if (!printedNewline) print(''); | 110 if (!_printedNewline) print(''); |
105 printedNewline = true; | 111 _printedNewline = true; |
106 | 112 |
107 print(line); | 113 print(line); |
108 }); | 114 }); |
109 }); | 115 }); |
110 } | 116 } |
111 | 117 |
112 /// Runs all tests in all provided suites. | 118 /// Runs all tests in all provided suites. |
113 /// | 119 /// |
114 /// This returns `true` if all tests succeed, and `false` otherwise. It will | 120 /// This returns `true` if all tests succeed, and `false` otherwise. It will |
115 /// only return once all tests have finished running. | 121 /// only return once all tests have finished running. |
116 Future<bool> run() { | 122 Future<bool> run() { |
117 if (_stopwatch.isRunning) { | 123 if (_stopwatch.isRunning) { |
118 throw new StateError("CompactReporter.run() may not be called more than " | 124 throw new StateError("CompactReporter.run() may not be called more than " |
119 "once."); | 125 "once."); |
120 } | 126 } |
121 | 127 |
122 if (_engine.liveTests.isEmpty) { | 128 if (_engine.liveTests.isEmpty) { |
123 print("No tests ran."); | 129 print("No tests ran."); |
124 return new Future.value(true); | 130 return new Future.value(true); |
125 } | 131 } |
126 | 132 |
127 _stopwatch.start(); | 133 _stopwatch.start(); |
128 return _engine.run().then((success) { | 134 return _engine.run().then((success) { |
| 135 if (_closed) return false; |
| 136 |
129 if (success) { | 137 if (success) { |
130 _progressLine("All tests passed!"); | 138 _progressLine("All tests passed!"); |
131 print(''); | 139 print(''); |
132 } else { | 140 } else { |
133 _progressLine('Some tests failed.', color: _red); | 141 _progressLine('Some tests failed.', color: _red); |
134 print(''); | 142 print(''); |
135 } | 143 } |
136 | 144 |
137 return success; | 145 return success; |
138 }); | 146 }); |
139 } | 147 } |
140 | 148 |
141 /// Signals that the caller is done with any test output and the reporter | 149 /// Signals that the caller is done with any test output and the reporter |
142 /// should release any resources it has allocated. | 150 /// should release any resources it has allocated. |
143 Future close() => _engine.close(); | 151 Future close() { |
| 152 if (!_printedNewline) print(""); |
| 153 _printedNewline = true; |
| 154 _closed = true; |
| 155 return _engine.close(); |
| 156 } |
144 | 157 |
145 /// Prints a line representing the current state of the tests. | 158 /// Prints a line representing the current state of the tests. |
146 /// | 159 /// |
147 /// [message] goes after the progress report, and may be truncated to fit the | 160 /// [message] goes after the progress report, and may be truncated to fit the |
148 /// entire line within [_lineLength]. If [color] is passed, it's used as the | 161 /// entire line within [_lineLength]. If [color] is passed, it's used as the |
149 /// color for [message]. | 162 /// color for [message]. |
150 bool _progressLine(String message, {String color}) { | 163 bool _progressLine(String message, {String color}) { |
151 // Print nothing if nothing has changed since the last progress line. | 164 // Print nothing if nothing has changed since the last progress line. |
152 if (_passed.length == _lastProgressPassed && | 165 if (_passed.length == _lastProgressPassed && |
153 _failed.length == _lastProgressFailed && | 166 _failed.length == _lastProgressFailed && |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 name = "${liveTest.suite.path}: $name"; | 226 name = "${liveTest.suite.path}: $name"; |
214 } | 227 } |
215 | 228 |
216 if (_multiplePlatforms && liveTest.suite.platform != null) { | 229 if (_multiplePlatforms && liveTest.suite.platform != null) { |
217 name = "[${liveTest.suite.platform}] $name"; | 230 name = "[${liveTest.suite.platform}] $name"; |
218 } | 231 } |
219 | 232 |
220 return name; | 233 return name; |
221 } | 234 } |
222 } | 235 } |
OLD | NEW |