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

Unified Diff: pkg/testing/lib/src/multitest.dart

Issue 2624373003: Move package:testing to SDK. (Closed)
Patch Set: Created 3 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/testing/lib/src/log.dart ('k') | pkg/testing/lib/src/run.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/testing/lib/src/multitest.dart
diff --git a/pkg/testing/lib/src/multitest.dart b/pkg/testing/lib/src/multitest.dart
new file mode 100644
index 0000000000000000000000000000000000000000..4679633922f1f2e97e14429022fb4a1d9935df7d
--- /dev/null
+++ b/pkg/testing/lib/src/multitest.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library testing.multitest;
+
+import 'dart:async' show
+ Stream,
+ StreamTransformer;
+
+import 'dart:io' show
+ Directory,
+ File;
+
+import 'log.dart' show
+ splitLines;
+
+import 'test_description.dart' show
+ TestDescription;
+
+class MultitestTransformer
+ implements StreamTransformer<TestDescription, TestDescription> {
+ static const String multitestMarker = "///";
+
+ static const List<String> validOutcomesList = const <String>[
+ 'ok',
+ 'compile-time error',
+ 'runtime error',
+ 'static type warning',
+ 'dynamic type error',
+ 'checked mode compile-time error',
+ ];
+
+ static final Set<String> validOutcomes =
+ new Set<String>.from(validOutcomesList);
+
+ Stream<TestDescription> bind(Stream<TestDescription> stream) async* {
+ List<String> errors = <String>[];
+ reportError(String error) {
+ errors.add(error);
+ print(error);
+ }
+ nextTest: await for (TestDescription test in stream) {
+ String contents = await test.file.readAsString();
+ if (!contents.contains(multitestMarker)) {
+ yield test;
+ continue nextTest;
+ }
+ // Note: this is modified in the loop below.
+ List<String> linesWithoutAnnotations = <String>[];
+ Map<String, List<String>> testsAsLines = <String, List<String>>{
+ "none": linesWithoutAnnotations,
+ };
+ Map<String, Set<String>> outcomes = <String, Set<String>>{
+ "none": new Set<String>(),
+ };
+ int lineNumber = 0;
+ for (String line in splitLines(contents)) {
+ lineNumber++;
+ int index = line.indexOf(multitestMarker);
+ String subtestName;
+ List<String> subtestOutcomesList;
+ if (index != -1) {
+ String annotationText =
+ line.substring(index + multitestMarker.length).trim();
+ index = annotationText.indexOf(":");
+ if (index != -1) {
+ subtestName = annotationText.substring(0, index).trim();
+ subtestOutcomesList = annotationText.substring(index + 1).split(",")
+ .map((s) => s.trim()).toList();
+ if (subtestName == "none") {
+ reportError(test.formatError(
+ "$lineNumber: $subtestName can't be used as test name."));
+ continue nextTest;
+ }
+ if (subtestOutcomesList.isEmpty) {
+ reportError(test.formatError(
+ "$lineNumber: Expected <testname>:<outcomes>"));
+ continue nextTest;
+ }
+ }
+ }
+ if (subtestName != null) {
+ List<String> lines = testsAsLines.putIfAbsent(subtestName,
+ () => new List<String>.from(linesWithoutAnnotations));
+ lines.add(line);
+ Set<String> subtestOutcomes = outcomes.putIfAbsent(subtestName,
+ () => new Set<String>());
+ if (subtestOutcomesList.length != 1 ||
+ subtestOutcomesList.single != "continued") {
+ for (String outcome in subtestOutcomesList) {
+ if (validOutcomes.contains(outcome)) {
+ subtestOutcomes.add(outcome);
+ } else {
+ reportError(test.formatError(
+ "$lineNumber: '$outcome' isn't a recognized outcome."));
+ continue nextTest;
+ }
+ }
+ }
+ } else {
+ for (List<String> lines in testsAsLines.values) {
+ // This will also modify [linesWithoutAnnotations].
+ lines.add(line);
+ }
+ }
+ }
+ Uri root = Uri.base.resolve("generated/");
+ Directory generated = new Directory.fromUri(root.resolve(test.shortName));
+ generated = await generated.create(recursive: true);
+ for (String name in testsAsLines.keys) {
+ List<String> lines = testsAsLines[name];
+ Uri uri = generated.uri.resolve("${name}_generated.dart");
+ TestDescription subtest =
+ new TestDescription(root, new File.fromUri(uri));
+ await subtest.file.writeAsString(lines.join(""));
+ yield subtest;
+ }
+ }
+ if (errors.isNotEmpty) {
+ throw "Error: ${errors.join("\n")}";
+ }
+ }
+}
« no previous file with comments | « pkg/testing/lib/src/log.dart ('k') | pkg/testing/lib/src/run.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698