| Index: sdk/lib/_internal/pub/test/test_pub.dart
|
| diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
|
| index 2ed23a93fde1968fe1f59f9de7d1a513d72e76ca..7b5cb58ae10237e7dce846002e2e598b1a478e33 100644
|
| --- a/sdk/lib/_internal/pub/test/test_pub.dart
|
| +++ b/sdk/lib/_internal/pub/test/test_pub.dart
|
| @@ -383,10 +383,12 @@ void scheduleSymlink(String target, String symlink) {
|
| /// Runs Pub with [args] and validates that its results match [output] (or
|
| /// [outputJson]), [error], and [exitCode].
|
| ///
|
| +/// [output] and [error] can be [String]s, [RegExp]s, or [Matcher]s.
|
| +///
|
| /// If [outputJson] is given, validates that pub outputs stringified JSON
|
| /// matching that object, which can be a literal JSON object or any other
|
| /// [Matcher].
|
| -void schedulePub({List args, Pattern output, Pattern error, outputJson,
|
| +void schedulePub({List args, output, error, outputJson,
|
| Future<Uri> tokenEndpoint, int exitCode: exit_codes.SUCCESS}) {
|
| // Cannot pass both output and outputJson.
|
| assert(output == null || outputJson == null);
|
| @@ -737,71 +739,61 @@ Map packageVersionApiMap(Map pubspec, {bool full: false}) {
|
| return map;
|
| }
|
|
|
| -/// Compares the [actual] output from running pub with [expected]. For [String]
|
| -/// patterns, ignores leading and trailing whitespace differences and tries to
|
| -/// report the offending difference in a nice way. For other [Pattern]s, just
|
| -/// reports whether the output contained the pattern.
|
| -void _validateOutput(List<String> failures, String pipe, Pattern expected,
|
| +/// Compares the [actual] output from running pub with [expected].
|
| +///
|
| +/// If [expected] is a [String], ignores leading and trailing whitespace
|
| +/// differences and tries to report the offending difference in a nice way.
|
| +///
|
| +/// If it's a [RegExp] or [Matcher], just reports whether the output matches.
|
| +void _validateOutput(List<String> failures, String pipe, expected,
|
| String actual) {
|
| if (expected == null) return;
|
|
|
| - var actualLines = actual.split("\n");
|
| - if (expected is RegExp) {
|
| - _validateOutputRegex(failures, pipe, expected, actualLines);
|
| - } else {
|
| - _validateOutputString(failures, pipe, expected, actualLines);
|
| - }
|
| -}
|
| -
|
| -void _validateOutputRegex(List<String> failures, String pipe,
|
| - RegExp expected, List<String> actual) {
|
| - var actualText = actual.join('\n');
|
| - if (actualText.contains(expected)) return;
|
| -
|
| - if (actual.length == 0) {
|
| - failures.add('Expected $pipe to match "${expected.pattern}" but got none.');
|
| + if (expected is String) {
|
| + _validateOutputString(failures, pipe, expected, actual);
|
| } else {
|
| - failures.add('Expected $pipe to match "${expected.pattern}" but got:');
|
| - failures.addAll(actual.map((line) => '| $line'));
|
| + if (expected is RegExp) expected = matches(expected);
|
| + expect(actual, expected);
|
| }
|
| }
|
|
|
| void _validateOutputString(List<String> failures, String pipe,
|
| - String expectedText, List<String> actual) {
|
| - final expected = expectedText.split('\n');
|
| + String expected, String actual) {
|
| + var actualLines = actual.split("\n");
|
| + var expectedLines = expected.split("\n");
|
|
|
| // Strip off the last line. This lets us have expected multiline strings
|
| // where the closing ''' is on its own line. It also fixes '' expected output
|
| // to expect zero lines of output, not a single empty line.
|
| - if (expected.last.trim() == '') {
|
| - expected.removeLast();
|
| + if (expectedLines.last.trim() == '') {
|
| + expectedLines.removeLast();
|
| }
|
|
|
| var results = [];
|
| var failed = false;
|
|
|
| // Compare them line by line to see which ones match.
|
| - var length = max(expected.length, actual.length);
|
| + var length = max(expectedLines.length, actualLines.length);
|
| for (var i = 0; i < length; i++) {
|
| - if (i >= actual.length) {
|
| + if (i >= actualLines.length) {
|
| // Missing output.
|
| failed = true;
|
| - results.add('? ${expected[i]}');
|
| - } else if (i >= expected.length) {
|
| + results.add('? ${expectedLines[i]}');
|
| + } else if (i >= expectedLines.length) {
|
| // Unexpected extra output.
|
| failed = true;
|
| - results.add('X ${actual[i]}');
|
| + results.add('X ${actualLines[i]}');
|
| } else {
|
| - var expectedLine = expected[i].trim();
|
| - var actualLine = actual[i].trim();
|
| + var expectedLine = expectedLines[i].trim();
|
| + var actualLine = actualLines[i].trim();
|
|
|
| if (expectedLine != actualLine) {
|
| // Mismatched lines.
|
| failed = true;
|
| - results.add('X ${actual[i]}');
|
| + results.add('X ${actualLines[i]}');
|
| } else {
|
| // Output is OK, but include it in case other lines are wrong.
|
| - results.add('| ${actual[i]}');
|
| + results.add('| ${actualLines[i]}');
|
| }
|
| }
|
| }
|
| @@ -809,7 +801,7 @@ void _validateOutputString(List<String> failures, String pipe,
|
| // If any lines mismatched, show the expected and actual.
|
| if (failed) {
|
| failures.add('Expected $pipe:');
|
| - failures.addAll(expected.map((line) => '| $line'));
|
| + failures.addAll(expectedLines.map((line) => '| $line'));
|
| failures.add('Got:');
|
| failures.addAll(results);
|
| }
|
|
|