| Index: lib/src/executable.dart
|
| diff --git a/lib/src/executable.dart b/lib/src/executable.dart
|
| index 65ff6f821df613fe24b28d47b13d042646e38591..a36cf74d1440298cf6f0184bad957f014a0dfeea 100644
|
| --- a/lib/src/executable.dart
|
| +++ b/lib/src/executable.dart
|
| @@ -9,7 +9,6 @@ library test.executable;
|
|
|
| import 'dart:async';
|
| import 'dart:io';
|
| -import 'dart:isolate';
|
| import 'dart:math' as math;
|
|
|
| import 'package:args/args.dart';
|
| @@ -19,6 +18,7 @@ import 'package:yaml/yaml.dart';
|
| import 'backend/test_platform.dart';
|
| import 'runner/reporter/compact.dart';
|
| import 'runner/load_exception.dart';
|
| +import 'runner/load_exception_suite.dart';
|
| import 'runner/loader.dart';
|
| import 'util/exit_codes.dart' as exit_codes;
|
| import 'util/io.dart';
|
| @@ -151,6 +151,17 @@ transformers:
|
| }
|
| }
|
|
|
| + var paths = options.rest;
|
| + if (paths.isEmpty) {
|
| + if (!new Directory("test").existsSync()) {
|
| + _printUsage('No test files were passed and the default "test/" '
|
| + "directory doesn't exist.");
|
| + exitCode = exit_codes.data;
|
| + return;
|
| + }
|
| + paths = ["test"];
|
| + }
|
| +
|
| var signalSubscription;
|
| var closed = false;
|
| signalSubscription = _signals.listen((_) {
|
| @@ -159,23 +170,20 @@ transformers:
|
| loader.close();
|
| });
|
|
|
| - new Future.sync(() {
|
| - var paths = options.rest;
|
| - if (paths.isEmpty) {
|
| - if (!new Directory("test").existsSync()) {
|
| - throw new LoadException("test",
|
| - "No test files were passed and the default directory doesn't "
|
| - "exist.");
|
| - }
|
| - paths = ["test"];
|
| + mergeStreams(paths.map((path) {
|
| + if (new Directory(path).existsSync()) return loader.loadDir(path);
|
| + if (new File(path).existsSync()) return loader.loadFile(path);
|
| + return new Stream.fromFuture(new Future.error(
|
| + new LoadException(path, 'Does not exist.'),
|
| + new Trace.current()));
|
| + })).transform(new StreamTransformer.fromHandlers(
|
| + handleError: (error, stackTrace, sink) {
|
| + if (error is! LoadException) {
|
| + sink.addError(error, stackTrace);
|
| + } else {
|
| + sink.add(new LoadExceptionSuite(error));
|
| }
|
| -
|
| - return Future.wait(paths.map((path) {
|
| - if (new Directory(path).existsSync()) return loader.loadDir(path);
|
| - if (new File(path).existsSync()) return loader.loadFile(path);
|
| - throw new LoadException(path, 'Does not exist.');
|
| - }));
|
| - }).then((suites) {
|
| + })).toList().then((suites) {
|
| if (closed) return null;
|
| suites = flatten(suites);
|
|
|
| @@ -193,6 +201,8 @@ transformers:
|
|
|
| if (pattern != null) {
|
| suites = suites.map((suite) {
|
| + // Don't ever filter out load errors.
|
| + if (suite is LoadExceptionSuite) return suite;
|
| return suite.change(
|
| tests: suite.tests.where((test) => test.name.contains(pattern)));
|
| }).toList();
|
| @@ -201,7 +211,7 @@ transformers:
|
| stderr.write('No tests match ');
|
|
|
| if (pattern is RegExp) {
|
| - stderr.write('regular expression "${pattern.pattern}".');
|
| + stderr.writeln('regular expression "${pattern.pattern}".');
|
| } else {
|
| stderr.writeln('"$pattern".');
|
| }
|
| @@ -239,29 +249,13 @@ transformers:
|
| return reporter.close();
|
| });
|
| }).whenComplete(signalSubscription.cancel).catchError((error, stackTrace) {
|
| - if (error is LoadException) {
|
| - stderr.writeln(error.toString(color: color));
|
| -
|
| - // Only print stack traces for load errors that come from the user's
|
| - if (error.innerError is! IOException &&
|
| - error.innerError is! IsolateSpawnException &&
|
| - error.innerError is! FormatException &&
|
| - error.innerError is! String) {
|
| - stderr.write(terseChain(stackTrace));
|
| - }
|
| -
|
| - exitCode = error.innerError is IOException
|
| - ? exit_codes.io
|
| - : exit_codes.data;
|
| - } else {
|
| - stderr.writeln(getErrorMessage(error));
|
| - stderr.writeln(new Trace.from(stackTrace).terse);
|
| - stderr.writeln(
|
| - "This is an unexpected error. Please file an issue at "
|
| - "http://github.com/dart-lang/test\n"
|
| - "with the stack trace and instructions for reproducing the error.");
|
| - exitCode = exit_codes.software;
|
| - }
|
| + stderr.writeln(getErrorMessage(error));
|
| + stderr.writeln(new Trace.from(stackTrace).terse);
|
| + stderr.writeln(
|
| + "This is an unexpected error. Please file an issue at "
|
| + "http://github.com/dart-lang/test\n"
|
| + "with the stack trace and instructions for reproducing the error.");
|
| + exitCode = exit_codes.software;
|
| }).whenComplete(() {
|
| return loader.close().then((_) {
|
| // If we're on a Dart version that doesn't support Isolate.kill(), we have
|
|
|