| Index: pkg/testing/lib/src/run.dart
|
| diff --git a/pkg/testing/lib/src/run.dart b/pkg/testing/lib/src/run.dart
|
| index c6bf90271c2a795b245ff840b024043cd5f94e84..600865f4f0529ecee23069dfa6548393c0f547ca 100644
|
| --- a/pkg/testing/lib/src/run.dart
|
| +++ b/pkg/testing/lib/src/run.dart
|
| @@ -119,7 +119,8 @@ Future<Null> run(
|
| TestRoot root = await computeTestRoot(configurationPath, Uri.base);
|
| List<Suite> suites = root.suites.where(
|
| (Suite suite) => suiteNames.contains(suite.name)).toList();
|
| - SuiteRunner runner = new SuiteRunner(suites, <String, String>{}, null);
|
| + SuiteRunner runner = new SuiteRunner(suites, <String, String>{}, null,
|
| + new Set<String>(), new Set<String>());
|
| String program = await runner.generateDartProgram();
|
| await runner.analyze(root.packages);
|
| if (program != null) {
|
| @@ -158,40 +159,51 @@ class SuiteRunner {
|
|
|
| final List<String> selectors;
|
|
|
| - List<Uri> testUris;
|
| + final Set<String> selectedSuites;
|
|
|
| - SuiteRunner(this.suites, this.environment, Iterable<String> selectors)
|
| + final Set<String> skippedSuites;
|
| +
|
| + final List<Uri> testUris = <Uri>[];
|
| +
|
| + SuiteRunner(this.suites, this.environment, Iterable<String> selectors,
|
| + this.selectedSuites, this.skippedSuites)
|
| : selectors = selectors.toList(growable: false);
|
|
|
| + bool shouldRunSuite(Suite suite) {
|
| + return !skippedSuites.contains(suite.name) &&
|
| + (selectedSuites.isEmpty || selectedSuites.contains(suite.name));
|
| + }
|
| +
|
| Future<String> generateDartProgram() async {
|
| - List<TestDescription> descriptions = await list().toList();
|
| - testUris = <Uri>[];
|
| + testUris.clear();
|
| StringBuffer imports = new StringBuffer();
|
| StringBuffer dart = new StringBuffer();
|
| StringBuffer chain = new StringBuffer();
|
| + bool hasRunnableTests = false;
|
|
|
| - for (TestDescription description in descriptions) {
|
| - testUris.add(await Isolate.resolvePackageUri(description.uri));
|
| + await for (TestDescription description in listDescriptions()) {
|
| + hasRunnableTests = true;
|
| description.writeImportOn(imports);
|
| description.writeClosureOn(dart);
|
| }
|
|
|
| - for (Chain suite in suites.where((Suite suite) => suite is Chain)) {
|
| - testUris.add(await Isolate.resolvePackageUri(suite.source));
|
| + await for (Chain suite in listChainSuites()) {
|
| + hasRunnableTests = true;
|
| suite.writeImportOn(imports);
|
| suite.writeClosureOn(chain);
|
| }
|
|
|
| - bool hasTestDartSuite = false;
|
| - for (TestDart suite in suites.where((Suite suite) => suite is TestDart)) {
|
| - if (!hasTestDartSuite) {
|
| + bool isFirstTestDartSuite = true;
|
| + for (TestDart suite in listTestDartSuites()) {
|
| + hasRunnableTests = true;
|
| + if (!isFirstTestDartSuite) {
|
| suite.writeFirstImportOn(imports);
|
| }
|
| - hasTestDartSuite = true;
|
| + isFirstTestDartSuite = true;
|
| suite.writeRunCommandOn(chain);
|
| }
|
|
|
| - if (testUris.isEmpty && !hasTestDartSuite) return null;
|
| + if (hasRunnableTests) return null;
|
|
|
| return """
|
| library testing.generated;
|
| @@ -220,22 +232,45 @@ Future<Null> main() async {
|
| """;
|
| }
|
|
|
| - Future<Null> analyze(Uri packages) async {
|
| - for (Analyze suite in suites.where((Suite suite) => suite is Analyze)) {
|
| + Future<bool> analyze(Uri packages) async {
|
| + bool hasAnalyzerSuites = false;
|
| + for (Analyze suite in listAnalyzerSuites()) {
|
| + hasAnalyzerSuites = true;
|
| await suite.run(packages, testUris);
|
| }
|
| + return hasAnalyzerSuites;
|
| }
|
|
|
| - Stream<TestDescription> list() async* {
|
| + Stream<TestDescription> listDescriptions() async* {
|
| for (Dart suite in suites.where((Suite suite) => suite is Dart)) {
|
| await for (TestDescription description in
|
| listTests(<Uri>[suite.uri], pattern: "")) {
|
| - String path = description.file.uri.path;
|
| - if (suite.exclude.any((RegExp r) => path.contains(r))) continue;
|
| - if (suite.pattern.any((RegExp r) => path.contains(r))) {
|
| - yield description;
|
| + testUris.add(await Isolate.resolvePackageUri(description.uri));
|
| + if (shouldRunSuite(suite)) {
|
| + String path = description.file.uri.path;
|
| + if (suite.exclude.any((RegExp r) => path.contains(r))) continue;
|
| + if (suite.pattern.any((RegExp r) => path.contains(r))) {
|
| + yield description;
|
| + }
|
| }
|
| }
|
| }
|
| }
|
| +
|
| + Stream<Chain> listChainSuites() async* {
|
| + for (Chain suite in suites.where((Suite suite) => suite is Chain)) {
|
| + testUris.add(await Isolate.resolvePackageUri(suite.source));
|
| + if (shouldRunSuite(suite)) {
|
| + yield suite;
|
| + }
|
| + }
|
| + }
|
| +
|
| + Iterable<Suite> listTestDartSuites() {
|
| + return suites.where((Suite suite) => suite is TestDart);
|
| + }
|
| +
|
| + Iterable<Suite> listAnalyzerSuites() {
|
| + return suites.where((Suite suite) => suite is Analyze);
|
| + }
|
| }
|
|
|