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 @TestOn("vm") | 5 @TestOn("vm") |
6 | 6 |
7 import 'dart:io'; | 7 import 'package:scheduled_test/descriptor.dart' as d; |
8 | 8 import 'package:scheduled_test/scheduled_stream.dart'; |
9 import 'package:path/path.dart' as p; | 9 import 'package:scheduled_test/scheduled_test.dart'; |
10 import 'package:test/src/util/io.dart'; | |
11 import 'package:test/test.dart'; | |
12 | 10 |
13 import '../io.dart'; | 11 import '../io.dart'; |
14 | 12 |
15 void main() { | 13 void main() { |
| 14 useSandbox(); |
| 15 |
16 test("reports when no tests are run", () { | 16 test("reports when no tests are run", () { |
17 return withTempDir((path) { | 17 d.file("test.dart", "void main() {}").create(); |
18 new File(p.join(path, "test.dart")).writeAsStringSync("void main() {}"); | 18 |
19 var result = runTest(["-r", "compact", "test.dart"], | 19 var test = runTest(["test.dart"], compact: true); |
20 workingDirectory: path); | 20 test.stdout.expect(consumeThrough(contains("No tests ran."))); |
21 expect(result.stdout, contains("No tests ran.")); | 21 test.shouldExit(0); |
22 }); | |
23 }); | 22 }); |
24 | 23 |
25 test("runs several successful tests and reports when each completes", () { | 24 test("runs several successful tests and reports when each completes", () { |
26 _expectReport(""" | 25 _expectReport(""" |
27 test('success 1', () {}); | 26 test('success 1', () {}); |
28 test('success 2', () {}); | 27 test('success 2', () {}); |
29 test('success 3', () {});""", | 28 test('success 3', () {});""", |
30 """ | 29 """ |
31 +0: loading test.dart | 30 +0: loading test.dart |
32 +0: success 1 | 31 +0: success 1 |
(...skipping 27 matching lines...) Expand all Loading... |
60 +0 -2: failure 3 | 59 +0 -2: failure 3 |
61 +0 -3: failure 3 | 60 +0 -3: failure 3 |
62 oh no | 61 oh no |
63 test.dart 8:33 main.<fn> | 62 test.dart 8:33 main.<fn> |
64 | 63 |
65 | 64 |
66 +0 -3: Some tests failed."""); | 65 +0 -3: Some tests failed."""); |
67 }); | 66 }); |
68 | 67 |
69 test("includes the full stack trace with --verbose-trace", () { | 68 test("includes the full stack trace with --verbose-trace", () { |
70 return withTempDir((path) { | 69 d.file("test.dart", """ |
71 new File(p.join(path, "test.dart")).writeAsStringSync(""" | |
72 import 'dart:async'; | 70 import 'dart:async'; |
73 | 71 |
74 import 'package:test/test.dart'; | 72 import 'package:test/test.dart'; |
75 | 73 |
76 void main() { | 74 void main() { |
77 test("failure", () => throw "oh no"); | 75 test("failure", () => throw "oh no"); |
78 } | 76 } |
79 """); | 77 """).create(); |
80 var result = runTest(["-r", "compact", "--verbose-trace", "test.dart"], | 78 |
81 workingDirectory: path); | 79 var test = runTest(["--verbose-trace", "test.dart"], compact: true); |
82 expect(result.stdout, contains("dart:isolate-patch")); | 80 test.stdout.expect(consumeThrough(contains("dart:isolate-patch"))); |
83 }); | 81 test.shouldExit(1); |
84 }); | 82 }); |
85 | 83 |
86 test("runs failing tests along with successful tests", () { | 84 test("runs failing tests along with successful tests", () { |
87 _expectReport(""" | 85 _expectReport(""" |
88 test('failure 1', () => throw new TestFailure('oh no')); | 86 test('failure 1', () => throw new TestFailure('oh no')); |
89 test('success 1', () {}); | 87 test('success 1', () {}); |
90 test('failure 2', () => throw new TestFailure('oh no')); | 88 test('failure 2', () => throw new TestFailure('oh no')); |
91 test('success 2', () {});""", | 89 test('success 2', () {});""", |
92 """ | 90 """ |
93 +0: loading test.dart | 91 +0: loading test.dart |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 | 369 |
372 +0 ~1: skip 2 | 370 +0 ~1: skip 2 |
373 +0 ~2: skip 2 | 371 +0 ~2: skip 2 |
374 Skip: or another | 372 Skip: or another |
375 | 373 |
376 +0 ~2: All tests skipped."""); | 374 +0 ~2: All tests skipped."""); |
377 }); | 375 }); |
378 }); | 376 }); |
379 } | 377 } |
380 | 378 |
381 void _expectReport(String tests, String expected, {List<String> args, | 379 void _expectReport(String tests, String expected) { |
382 int concurrency}) { | |
383 if (concurrency == null) concurrency = 1; | |
384 | |
385 var dart = """ | 380 var dart = """ |
386 import 'dart:async'; | 381 import 'dart:async'; |
387 | 382 |
388 import 'package:test/test.dart'; | 383 import 'package:test/test.dart'; |
389 | 384 |
390 void main() { | 385 void main() { |
391 $tests | 386 $tests |
392 } | 387 } |
393 """; | 388 """; |
394 | 389 |
395 expect(withTempDir((path) { | 390 d.file("test.dart", dart).create(); |
396 new File(p.join(path, "test.dart")).writeAsStringSync(dart); | |
397 if (args == null) args = []; | |
398 args = args.toList() | |
399 ..add("test.dart") | |
400 ..add("--concurrency=$concurrency") | |
401 ..add("--reporter=compact"); | |
402 var result = runTest(args, workingDirectory: path); | |
403 | 391 |
404 // Convert CRs into newlines, remove excess trailing whitespace, and trim | 392 var test = runTest(["test.dart"], compact: true); |
405 // off timestamps. | 393 test.shouldExit(); |
| 394 |
| 395 schedule(() async { |
| 396 var stdoutLines = await test.stdoutStream().toList(); |
| 397 |
| 398 // Skip the first CR, remove excess trailing whitespace, and trim off |
| 399 // timestamps. |
406 var lastLine; | 400 var lastLine; |
407 var actual = result.stdout.trim().split(new RegExp(r"[\r\n]")).map((line) { | 401 var actual = stdoutLines.skip(1).map((line) { |
408 if (line.startsWith(" ") || line.isEmpty) return line.trimRight(); | 402 if (line.startsWith(" ") || line.isEmpty) return line.trimRight(); |
409 | 403 |
410 var trimmed = line.trim() | 404 var trimmed = line.trim() |
411 .replaceFirst(new RegExp("^[0-9]{2}:[0-9]{2} "), ""); | 405 .replaceFirst(new RegExp("^[0-9]{2}:[0-9]{2} "), ""); |
412 | 406 |
413 // Trim identical lines so the test isn't dependent on how fast each test | 407 // Trim identical lines so the test isn't dependent on how fast each test |
414 // runs. | 408 // runs. |
415 if (trimmed == lastLine) return null; | 409 if (trimmed == lastLine) return null; |
416 lastLine = trimmed; | 410 lastLine = trimmed; |
417 return trimmed; | 411 return trimmed; |
418 }).where((line) => line != null).join("\n"); | 412 }).where((line) => line != null).join("\n"); |
419 | 413 |
420 // Un-indent the expected string. | 414 // Un-indent the expected string. |
421 var indentation = expected.indexOf(new RegExp("[^ ]")); | 415 var indentation = expected.indexOf(new RegExp("[^ ]")); |
422 expected = expected.split("\n").map((line) { | 416 expected = expected.split("\n").map((line) { |
423 if (line.isEmpty) return line; | 417 if (line.isEmpty) return line; |
424 return line.substring(indentation); | 418 return line.substring(indentation); |
425 }).join("\n"); | 419 }).join("\n"); |
426 | 420 |
427 expect(actual, equals(expected)); | 421 expect(actual, equals(expected)); |
428 }), completes); | 422 }); |
429 } | 423 } |
OLD | NEW |