| 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 import 'dart:isolate'; |
| 9 | 10 |
| 10 import '../../backend/live_test.dart'; | 11 import '../../backend/live_test.dart'; |
| 11 import '../../backend/state.dart'; | 12 import '../../backend/state.dart'; |
| 12 import '../../backend/suite.dart'; | 13 import '../../backend/suite.dart'; |
| 13 import '../../utils.dart'; | 14 import '../../utils.dart'; |
| 14 import '../engine.dart'; | 15 import '../engine.dart'; |
| 16 import '../load_exception.dart'; |
| 15 | 17 |
| 16 /// The maximum console line length. | 18 /// The maximum console line length. |
| 17 /// | 19 /// |
| 18 /// Lines longer than this will be cropped. | 20 /// Lines longer than this will be cropped. |
| 19 const _lineLength = 100; | 21 const _lineLength = 100; |
| 20 | 22 |
| 21 /// A reporter that prints test results to the console in a single | 23 /// A reporter that prints test results to the console in a single |
| 22 /// continuously-updating line. | 24 /// continuously-updating line. |
| 23 class CompactReporter { | 25 class CompactReporter { |
| 26 /// Whether the reporter should emit terminal color escapes. |
| 27 final bool _color; |
| 28 |
| 24 /// The terminal escape for green text, or the empty string if this is Windows | 29 /// The terminal escape for green text, or the empty string if this is Windows |
| 25 /// or not outputting to a terminal. | 30 /// or not outputting to a terminal. |
| 26 final String _green; | 31 final String _green; |
| 27 | 32 |
| 28 /// The terminal escape for red text, or the empty string if this is Windows | 33 /// The terminal escape for red text, or the empty string if this is Windows |
| 29 /// or not outputting to a terminal. | 34 /// or not outputting to a terminal. |
| 30 final String _red; | 35 final String _red; |
| 31 | 36 |
| 32 /// The terminal escape for removing test coloring, or the empty string if | 37 /// The terminal escape for removing test coloring, or the empty string if |
| 33 /// this is Windows or not outputting to a terminal. | 38 /// this is Windows or not outputting to a terminal. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 | 76 |
| 72 /// Creates a [ConsoleReporter] that will run all tests in [suites]. | 77 /// Creates a [ConsoleReporter] that will run all tests in [suites]. |
| 73 /// | 78 /// |
| 74 /// If [color] is `true`, this will use terminal colors; if it's `false`, it | 79 /// If [color] is `true`, this will use terminal colors; if it's `false`, it |
| 75 /// won't. | 80 /// won't. |
| 76 CompactReporter(Iterable<Suite> suites, {int concurrency, bool color: true}) | 81 CompactReporter(Iterable<Suite> suites, {int concurrency, bool color: true}) |
| 77 : _multiplePaths = suites.map((suite) => suite.path).toSet().length > 1, | 82 : _multiplePaths = suites.map((suite) => suite.path).toSet().length > 1, |
| 78 _multiplePlatforms = | 83 _multiplePlatforms = |
| 79 suites.map((suite) => suite.platform).toSet().length > 1, | 84 suites.map((suite) => suite.platform).toSet().length > 1, |
| 80 _engine = new Engine(suites, concurrency: concurrency), | 85 _engine = new Engine(suites, concurrency: concurrency), |
| 86 _color = color, |
| 81 _green = color ? '\u001b[32m' : '', | 87 _green = color ? '\u001b[32m' : '', |
| 82 _red = color ? '\u001b[31m' : '', | 88 _red = color ? '\u001b[31m' : '', |
| 83 _noColor = color ? '\u001b[0m' : '' { | 89 _noColor = color ? '\u001b[0m' : '' { |
| 84 _engine.onTestStarted.listen((liveTest) { | 90 _engine.onTestStarted.listen((liveTest) { |
| 85 if (_active.isEmpty) _progressLine(_description(liveTest)); | 91 if (_active.isEmpty) _progressLine(_description(liveTest)); |
| 86 _active.add(liveTest); | 92 _active.add(liveTest); |
| 87 _printedNewline = false; | 93 _printedNewline = false; |
| 88 | 94 |
| 89 liveTest.onStateChange.listen((state) { | 95 liveTest.onStateChange.listen((state) { |
| 90 if (state.status != Status.complete) return; | 96 if (state.status != Status.complete) return; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 107 _printedNewline = false; | 113 _printedNewline = false; |
| 108 }); | 114 }); |
| 109 | 115 |
| 110 liveTest.onError.listen((error) { | 116 liveTest.onError.listen((error) { |
| 111 if (liveTest.state.status != Status.complete) return; | 117 if (liveTest.state.status != Status.complete) return; |
| 112 | 118 |
| 113 _progressLine(_description(liveTest)); | 119 _progressLine(_description(liveTest)); |
| 114 if (!_printedNewline) print(''); | 120 if (!_printedNewline) print(''); |
| 115 _printedNewline = true; | 121 _printedNewline = true; |
| 116 | 122 |
| 117 print(indent(error.error.toString())); | 123 if (error.error is! LoadException) { |
| 118 print(indent(terseChain(error.stackTrace).toString())); | 124 print(indent(error.error.toString())); |
| 125 print(indent(terseChain(error.stackTrace).toString())); |
| 126 return; |
| 127 } |
| 128 |
| 129 print(indent(error.error.toString(color: _color))); |
| 130 |
| 131 // Only print stack traces for load errors that come from the user's cod
e. |
| 132 if (error.error.innerError is! IOException && |
| 133 error.error.innerError is! IsolateSpawnException && |
| 134 error.error.innerError is! FormatException && |
| 135 error.error.innerError is! String) { |
| 136 print(indent(terseChain(error.stackTrace).toString())); |
| 137 } |
| 119 }); | 138 }); |
| 120 | 139 |
| 121 liveTest.onPrint.listen((line) { | 140 liveTest.onPrint.listen((line) { |
| 122 _progressLine(_description(liveTest)); | 141 _progressLine(_description(liveTest)); |
| 123 if (!_printedNewline) print(''); | 142 if (!_printedNewline) print(''); |
| 124 _printedNewline = true; | 143 _printedNewline = true; |
| 125 | 144 |
| 126 print(line); | 145 print(line); |
| 127 }); | 146 }); |
| 128 }); | 147 }); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 name = "${liveTest.suite.path}: $name"; | 258 name = "${liveTest.suite.path}: $name"; |
| 240 } | 259 } |
| 241 | 260 |
| 242 if (_multiplePlatforms && liveTest.suite.platform != null) { | 261 if (_multiplePlatforms && liveTest.suite.platform != null) { |
| 243 name = "[${liveTest.suite.platform}] $name"; | 262 name = "[${liveTest.suite.platform}] $name"; |
| 244 } | 263 } |
| 245 | 264 |
| 246 return name; | 265 return name; |
| 247 } | 266 } |
| 248 } | 267 } |
| OLD | NEW |