| 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 'dart:io'; |
| 8 import 'dart:math' as math; | 8 import 'dart:math' as math; |
| 9 | 9 |
| 10 import 'package:path/path.dart' as p; | 10 import 'package:path/path.dart' as p; |
| 11 import 'package:scheduled_test/descriptor.dart' as d; |
| 12 import 'package:scheduled_test/scheduled_stream.dart'; |
| 13 import 'package:scheduled_test/scheduled_test.dart'; |
| 11 import 'package:test/src/util/exit_codes.dart' as exit_codes; | 14 import 'package:test/src/util/exit_codes.dart' as exit_codes; |
| 12 import 'package:test/src/util/io.dart'; | |
| 13 import 'package:test/test.dart'; | |
| 14 | 15 |
| 15 import '../io.dart'; | 16 import '../io.dart'; |
| 16 | 17 |
| 17 String _sandbox; | |
| 18 | |
| 19 final _success = """ | 18 final _success = """ |
| 20 import 'dart:async'; | 19 import 'dart:async'; |
| 21 | 20 |
| 22 import 'package:test/test.dart'; | 21 import 'package:test/test.dart'; |
| 23 | 22 |
| 24 void main() { | 23 void main() { |
| 25 test("success", () {}); | 24 test("success", () {}); |
| 26 } | 25 } |
| 27 """; | 26 """; |
| 28 | 27 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 [compact] A single line, updated continuously. | 63 [compact] A single line, updated continuously. |
| 65 [expanded] A separate line for each update. | 64 [expanded] A separate line for each update. |
| 66 | 65 |
| 67 --verbose-trace Whether to emit stack traces with core library fr
ames. | 66 --verbose-trace Whether to emit stack traces with core library fr
ames. |
| 68 --js-trace Whether to emit raw JavaScript stack traces for b
rowser tests. | 67 --js-trace Whether to emit raw JavaScript stack traces for b
rowser tests. |
| 69 --[no-]color Whether to use terminal colors. | 68 --[no-]color Whether to use terminal colors. |
| 70 (auto-detected by default) | 69 (auto-detected by default) |
| 71 """; | 70 """; |
| 72 | 71 |
| 73 void main() { | 72 void main() { |
| 74 setUp(() { | 73 useSandbox(); |
| 75 _sandbox = createTempDir(); | |
| 76 }); | |
| 77 | |
| 78 tearDown(() { | |
| 79 new Directory(_sandbox).deleteSync(recursive: true); | |
| 80 }); | |
| 81 | 74 |
| 82 test("prints help information", () { | 75 test("prints help information", () { |
| 83 var result = _runTest(["--help"]); | 76 var test = runTest(["--help"]); |
| 84 expect(result.stdout, equals(""" | 77 expectStdoutEquals(test, """ |
| 85 Runs tests in this package. | 78 Runs tests in this package. |
| 86 | 79 |
| 87 $_usage""")); | 80 $_usage"""); |
| 88 expect(result.exitCode, equals(exit_codes.success)); | 81 test.shouldExit(0); |
| 89 }); | 82 }); |
| 90 | 83 |
| 91 group("fails gracefully if", () { | 84 group("fails gracefully if", () { |
| 92 test("an invalid option is passed", () { | 85 test("an invalid option is passed", () { |
| 93 var result = _runTest(["--asdf"]); | 86 var test = runTest(["--asdf"]); |
| 94 expect(result.stderr, equals(""" | 87 expectStderrEquals(test, """ |
| 95 Could not find an option named "asdf". | 88 Could not find an option named "asdf". |
| 96 | 89 |
| 97 $_usage""")); | 90 $_usage"""); |
| 98 expect(result.exitCode, equals(exit_codes.usage)); | 91 test.shouldExit(exit_codes.usage); |
| 99 }); | 92 }); |
| 100 | 93 |
| 101 test("a non-existent file is passed", () { | 94 test("a non-existent file is passed", () { |
| 102 var result = _runTest(["file"]); | 95 var test = runTest(["file"]); |
| 103 expect(result.stdout, allOf([ | 96 test.stdout.expect(containsInOrder([ |
| 104 contains('-1: loading file'), | 97 '-1: loading file', |
| 105 contains('Failed to load "file": Does not exist.') | 98 'Failed to load "file": Does not exist.' |
| 106 ])); | 99 ])); |
| 107 expect(result.exitCode, equals(1)); | 100 test.shouldExit(1); |
| 108 }); | 101 }); |
| 109 | 102 |
| 110 test("the default directory doesn't exist", () { | 103 test("the default directory doesn't exist", () { |
| 111 var result = _runTest([]); | 104 var test = runTest([]); |
| 112 expect(result.stderr, equals(""" | 105 expectStderrEquals(test, """ |
| 113 No test files were passed and the default "test/" directory doesn't exist. | 106 No test files were passed and the default "test/" directory doesn't exist. |
| 114 | 107 |
| 115 $_usage""")); | 108 $_usage"""); |
| 116 expect(result.exitCode, equals(exit_codes.data)); | 109 test.shouldExit(exit_codes.data); |
| 117 }); | 110 }); |
| 118 | 111 |
| 119 test("a test file fails to load", () { | 112 test("a test file fails to load", () { |
| 120 var testPath = p.join(_sandbox, "test.dart"); | 113 d.file("test.dart", "invalid Dart file").create(); |
| 121 new File(testPath).writeAsStringSync("invalid Dart file"); | 114 var test = runTest(["test.dart"]); |
| 122 var result = _runTest(["test.dart"]); | |
| 123 | 115 |
| 124 expect(result.stdout, allOf([ | 116 test.stdout.expect(containsInOrder([ |
| 125 contains('-1: loading test.dart'), | 117 '-1: loading test.dart', |
| 126 contains( | 118 'Failed to load "test.dart":', |
| 127 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n' | 119 "line 1 pos 1: unexpected token 'invalid'", |
| 128 " line 1 pos 1: unexpected token 'invalid'\n" | 120 "invalid Dart file", |
| 129 " invalid Dart file\n" | 121 "^" |
| 130 " ^\n") | |
| 131 ])); | 122 ])); |
| 132 expect(result.exitCode, equals(1)); | 123 test.shouldExit(1); |
| 133 }); | 124 }); |
| 134 | 125 |
| 135 // This syntax error is detected lazily, and so requires some extra | 126 // This syntax error is detected lazily, and so requires some extra |
| 136 // machinery to support. | 127 // machinery to support. |
| 137 test("a test file fails to parse due to a missing semicolon", () { | 128 test("a test file fails to parse due to a missing semicolon", () { |
| 138 var testPath = p.join(_sandbox, "test.dart"); | 129 d.file("test.dart", "void main() {foo}").create(); |
| 139 new File(testPath).writeAsStringSync("void main() {foo}"); | 130 var test = runTest(["test.dart"]); |
| 140 var result = _runTest(["test.dart"]); | |
| 141 | 131 |
| 142 expect(result.stdout, allOf([ | 132 test.stdout.expect(containsInOrder([ |
| 143 contains('-1: loading test.dart'), | 133 '-1: loading test.dart', |
| 144 contains( | 134 'Failed to load "test.dart":', |
| 145 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n' | 135 'line 1 pos 17: semicolon expected', |
| 146 " line 1 pos 17: semicolon expected\n" | 136 'void main() {foo}', |
| 147 " void main() {foo}\n" | 137 ' ^' |
| 148 " ^\n") | |
| 149 ])); | 138 ])); |
| 150 expect(result.exitCode, equals(1)); | 139 test.shouldExit(1); |
| 151 }); | 140 }); |
| 152 | 141 |
| 153 // This is slightly different from the above test because it's an error | 142 // This is slightly different from the above test because it's an error |
| 154 // that's caught first by the analyzer when it's used to parse the file. | 143 // that's caught first by the analyzer when it's used to parse the file. |
| 155 test("a test file fails to parse", () { | 144 test("a test file fails to parse", () { |
| 156 var testPath = p.join(_sandbox, "test.dart"); | 145 d.file("test.dart", "@TestOn)").create(); |
| 157 new File(testPath).writeAsStringSync("@TestOn)"); | 146 var test = runTest(["test.dart"]); |
| 158 var result = _runTest(["test.dart"]); | |
| 159 | 147 |
| 160 expect(result.stdout, allOf([ | 148 test.stdout.expect(containsInOrder([ |
| 161 contains('-1: loading test.dart'), | 149 '-1: loading test.dart', |
| 162 contains( | 150 'Failed to load "test.dart":', |
| 163 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n' | 151 "line 1 pos 8: unexpected token ')'", |
| 164 " line 1 pos 8: unexpected token ')'\n" | 152 "@TestOn)", |
| 165 " @TestOn)\n" | 153 " ^" |
| 166 " ^\n") | |
| 167 ])); | 154 ])); |
| 168 expect(result.exitCode, equals(1)); | 155 test.shouldExit(1); |
| 169 }); | 156 }); |
| 170 | 157 |
| 171 test("an annotation's structure is invalid", () { | 158 test("an annotation's structure is invalid", () { |
| 172 var testPath = p.join(_sandbox, "test.dart"); | 159 d.file("test.dart", "@TestOn()\nlibrary foo;").create(); |
| 173 new File(testPath).writeAsStringSync("@TestOn()\nlibrary foo;"); | 160 var test = runTest(["test.dart"]); |
| 174 var result = _runTest(["test.dart"]); | |
| 175 | 161 |
| 176 expect(result.stdout, allOf([ | 162 test.stdout.expect(containsInOrder([ |
| 177 contains('-1: loading test.dart'), | 163 '-1: loading test.dart', |
| 178 contains( | 164 'Failed to load "test.dart":', |
| 179 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n' | 165 "Error on line 1, column 8: TestOn takes 1 argument.", |
| 180 " Error on line 1, column 8: TestOn takes 1 argument.\n" | 166 "@TestOn()", |
| 181 " @TestOn()\n" | 167 " ^^" |
| 182 " ^^\n") | |
| 183 ])); | 168 ])); |
| 184 expect(result.exitCode, equals(1)); | 169 test.shouldExit(1); |
| 185 }); | 170 }); |
| 186 | 171 |
| 187 test("an annotation's contents are invalid", () { | 172 test("an annotation's contents are invalid", () { |
| 188 var testPath = p.join(_sandbox, "test.dart"); | 173 d.file("test.dart", "@TestOn('zim')\nlibrary foo;").create(); |
| 189 new File(testPath).writeAsStringSync("@TestOn('zim')\nlibrary foo;"); | 174 var test = runTest(["test.dart"]); |
| 190 var result = _runTest(["test.dart"]); | |
| 191 | 175 |
| 192 expect(result.stdout, allOf([ | 176 test.stdout.expect(containsInOrder([ |
| 193 contains('-1: loading test.dart'), | 177 '-1: loading test.dart', |
| 194 contains( | 178 'Failed to load "test.dart":', |
| 195 ' Failed to load "${p.relative(testPath, from: _sandbox)}":\n' | 179 "Error on line 1, column 10: Undefined variable.", |
| 196 " Error on line 1, column 10: Undefined variable.\n" | 180 "@TestOn('zim')", |
| 197 " @TestOn('zim')\n" | 181 " ^^^" |
| 198 " ^^^\n") | |
| 199 ])); | 182 ])); |
| 200 expect(result.exitCode, equals(1)); | 183 test.shouldExit(1); |
| 201 }); | 184 }); |
| 202 | 185 |
| 203 test("a test file throws", () { | 186 test("a test file throws", () { |
| 204 var testPath = p.join(_sandbox, "test.dart"); | 187 d.file("test.dart", "void main() => throw 'oh no';").create(); |
| 205 new File(testPath).writeAsStringSync("void main() => throw 'oh no';"); | 188 var test = runTest(["test.dart"]); |
| 206 | 189 |
| 207 var result = _runTest(["test.dart"]); | 190 test.stdout.expect(containsInOrder([ |
| 208 expect(result.stdout, allOf([ | 191 '-1: loading test.dart', |
| 209 contains('-1: loading test.dart'), | 192 'Failed to load "test.dart": oh no' |
| 210 contains( | |
| 211 'Failed to load "${p.relative(testPath, from: _sandbox)}": oh no') | |
| 212 ])); | 193 ])); |
| 213 expect(result.exitCode, equals(1)); | 194 test.shouldExit(1); |
| 214 }); | 195 }); |
| 215 | 196 |
| 216 test("a test file doesn't have a main defined", () { | 197 test("a test file doesn't have a main defined", () { |
| 217 var testPath = p.join(_sandbox, "test.dart"); | 198 d.file("test.dart", "void foo() {}").create(); |
| 218 new File(testPath).writeAsStringSync("void foo() {}"); | 199 var test = runTest(["test.dart"]); |
| 219 | 200 |
| 220 var result = _runTest(["test.dart"]); | 201 test.stdout.expect(containsInOrder([ |
| 221 expect(result.stdout, allOf([ | 202 '-1: loading test.dart', |
| 222 contains('-1: loading test.dart'), | 203 'Failed to load "test.dart": No top-level main() function defined.' |
| 223 contains( | |
| 224 'Failed to load "${p.relative(testPath, from: _sandbox)}": No ' | |
| 225 'top-level main() function defined.') | |
| 226 ])); | 204 ])); |
| 227 expect(result.exitCode, equals(1)); | 205 test.shouldExit(1); |
| 228 }); | 206 }); |
| 229 | 207 |
| 230 test("a test file has a non-function main", () { | 208 test("a test file has a non-function main", () { |
| 231 var testPath = p.join(_sandbox, "test.dart"); | 209 d.file("test.dart", "int main;").create(); |
| 232 new File(testPath).writeAsStringSync("int main;"); | 210 var test = runTest(["test.dart"]); |
| 233 | 211 |
| 234 var result = _runTest(["test.dart"]); | 212 test.stdout.expect(containsInOrder([ |
| 235 expect(result.stdout, allOf([ | 213 '-1: loading test.dart', |
| 236 contains('-1: loading test.dart'), | 214 'Failed to load "test.dart": Top-level main getter is not a function.' |
| 237 contains( | |
| 238 'Failed to load "${p.relative(testPath, from: _sandbox)}": ' | |
| 239 'Top-level main getter is not a function.') | |
| 240 ])); | 215 ])); |
| 241 expect(result.exitCode, equals(1)); | 216 test.shouldExit(1); |
| 242 }); | 217 }); |
| 243 | 218 |
| 244 test("a test file has a main with arguments", () { | 219 test("a test file has a main with arguments", () { |
| 245 var testPath = p.join(_sandbox, "test.dart"); | 220 d.file("test.dart", "void main(arg) {}").create(); |
| 246 new File(testPath).writeAsStringSync("void main(arg) {}"); | 221 var test = runTest(["test.dart"]); |
| 247 | 222 |
| 248 var result = _runTest(["test.dart"]); | 223 test.stdout.expect(containsInOrder([ |
| 249 expect(result.stdout, allOf([ | 224 '-1: loading test.dart', |
| 250 contains('-1: loading test.dart'), | 225 'Failed to load "test.dart": Top-level main() function takes arguments.' |
| 251 contains( | |
| 252 'Failed to load "${p.relative(testPath, from: _sandbox)}": ' | |
| 253 'Top-level main() function takes arguments.') | |
| 254 ])); | 226 ])); |
| 255 expect(result.exitCode, equals(1)); | 227 test.shouldExit(1); |
| 256 }); | 228 }); |
| 257 | 229 |
| 258 test("multiple load errors occur", () { | 230 test("multiple load errors occur", () { |
| 259 var testPath = p.join(_sandbox, "test.dart"); | 231 d.file("test.dart", "invalid Dart file").create(); |
| 260 new File(testPath).writeAsStringSync("invalid Dart file"); | 232 var test = runTest(["test.dart", "nonexistent.dart"]); |
| 261 var result = _runTest(["test.dart", "nonexistent.dart"]); | |
| 262 | 233 |
| 263 expect(result.stdout, allOf([ | 234 test.stdout.expect(containsInOrder([ |
| 264 contains('loading test.dart'), | 235 'loading nonexistent.dart', |
| 265 contains( | 236 'Failed to load "nonexistent.dart": Does not exist.', |
| 266 ' Failed to load "test.dart":\n' | 237 'loading test.dart', |
| 267 " line 1 pos 1: unexpected token 'invalid'\n" | 238 'Failed to load "test.dart":', |
| 268 " invalid Dart file\n" | 239 "line 1 pos 1: unexpected token 'invalid'", |
| 269 " ^\n"), | 240 "invalid Dart file", |
| 270 contains('loading nonexistent.dart'), | 241 "^" |
| 271 contains('Failed to load "nonexistent.dart": Does not exist.') | |
| 272 ])); | 242 ])); |
| 243 test.shouldExit(1); |
| 273 }); | 244 }); |
| 274 | 245 |
| 275 // TODO(nweiz): test what happens when a test file is unreadable once issue | 246 // TODO(nweiz): test what happens when a test file is unreadable once issue |
| 276 // 15078 is fixed. | 247 // 15078 is fixed. |
| 277 }); | 248 }); |
| 278 | 249 |
| 279 group("runs successful tests", () { | 250 group("runs successful tests", () { |
| 280 test("defined in a single file", () { | 251 test("defined in a single file", () { |
| 281 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 252 d.file("test.dart", _success).create(); |
| 282 var result = _runTest(["test.dart"]); | 253 var test = runTest(["test.dart"]); |
| 283 expect(result.exitCode, equals(0)); | 254 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 255 test.shouldExit(0); |
| 284 }); | 256 }); |
| 285 | 257 |
| 286 test("defined in a directory", () { | 258 test("defined in a directory", () { |
| 287 for (var i = 0; i < 3; i++) { | 259 for (var i = 0; i < 3; i++) { |
| 288 new File(p.join(_sandbox, "${i}_test.dart")) | 260 d.file("${i}_test.dart", _success).create(); |
| 289 .writeAsStringSync(_success); | |
| 290 } | 261 } |
| 291 | 262 |
| 292 var result = _runTest(["."]); | 263 var test = runTest(["."]); |
| 293 expect(result.exitCode, equals(0)); | 264 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); |
| 265 test.shouldExit(0); |
| 294 }); | 266 }); |
| 295 | 267 |
| 296 test("defaulting to the test directory", () { | 268 test("defaulting to the test directory", () { |
| 297 new Directory(p.join(_sandbox, "test")).createSync(); | 269 d.dir("test", new Iterable.generate(3, (i) { |
| 298 for (var i = 0; i < 3; i++) { | 270 return d.file("${i}_test.dart", _success); |
| 299 new File(p.join(_sandbox, "test", "${i}_test.dart")) | 271 })).create(); |
| 300 .writeAsStringSync(_success); | |
| 301 } | |
| 302 | 272 |
| 303 var result = _runTest([]); | 273 var test = runTest([]); |
| 304 expect(result.exitCode, equals(0)); | 274 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); |
| 275 test.shouldExit(0); |
| 305 }); | 276 }); |
| 306 | 277 |
| 307 test("directly", () { | 278 test("directly", () { |
| 308 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 279 d.file("test.dart", _success).create(); |
| 309 var result = _runDart([ | 280 var test = runDart([ |
| 310 "--package-root=${p.join(packageDir, 'packages')}", | 281 "--package-root=${p.join(packageDir, 'packages')}", |
| 311 "test.dart" | 282 "test.dart" |
| 312 ]); | 283 ]); |
| 313 expect(result.stdout, contains("All tests passed!")); | 284 |
| 314 expect(result.exitCode, equals(0)); | 285 test.stdout.expect(consumeThrough(contains("All tests passed!"))); |
| 286 test.shouldExit(0); |
| 315 }); | 287 }); |
| 316 | 288 |
| 317 // Regression test; this broke in 0.12.0-beta.9. | 289 // Regression test; this broke in 0.12.0-beta.9. |
| 318 test("on a file in a subdirectory", () { | 290 test("on a file in a subdirectory", () { |
| 319 new Directory(p.join(_sandbox, "dir")).createSync(); | 291 d.dir("dir", [d.file("test.dart", _success)]).create(); |
| 320 new File(p.join(_sandbox, "dir", "test.dart")) | 292 |
| 321 .writeAsStringSync(_success); | 293 var test = runTest(["dir/test.dart"]); |
| 322 var result = _runTest(["dir/test.dart"]); | 294 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 323 expect(result.exitCode, equals(0)); | 295 test.shouldExit(0); |
| 324 }); | 296 }); |
| 325 }); | 297 }); |
| 326 | 298 |
| 327 group("runs failing tests", () { | 299 group("runs failing tests", () { |
| 328 test("defined in a single file", () { | 300 test("defined in a single file", () { |
| 329 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | 301 d.file("test.dart", _failure).create(); |
| 330 var result = _runTest(["test.dart"]); | 302 |
| 331 expect(result.exitCode, equals(1)); | 303 var test = runTest(["test.dart"]); |
| 304 test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
| 305 test.shouldExit(1); |
| 332 }); | 306 }); |
| 333 | 307 |
| 334 test("defined in a directory", () { | 308 test("defined in a directory", () { |
| 335 for (var i = 0; i < 3; i++) { | 309 for (var i = 0; i < 3; i++) { |
| 336 new File(p.join(_sandbox, "${i}_test.dart")) | 310 d.file("${i}_test.dart", _failure).create(); |
| 337 .writeAsStringSync(_failure); | |
| 338 } | 311 } |
| 339 | 312 |
| 340 var result = _runTest(["."]); | 313 var test = runTest(["."]); |
| 341 expect(result.exitCode, equals(1)); | 314 test.stdout.expect(consumeThrough(contains("-3: Some tests failed."))); |
| 315 test.shouldExit(1); |
| 342 }); | 316 }); |
| 343 | 317 |
| 344 test("defaulting to the test directory", () { | 318 test("defaulting to the test directory", () { |
| 345 new Directory(p.join(_sandbox, "test")).createSync(); | 319 d.dir("test", new Iterable.generate(3, (i) { |
| 346 for (var i = 0; i < 3; i++) { | 320 return d.file("${i}_test.dart", _failure); |
| 347 new File(p.join(_sandbox, "test", "${i}_test.dart")) | 321 })).create(); |
| 348 .writeAsStringSync(_failure); | |
| 349 } | |
| 350 | 322 |
| 351 var result = _runTest([]); | 323 var test = runTest([]); |
| 352 expect(result.exitCode, equals(1)); | 324 test.stdout.expect(consumeThrough(contains("-3: Some tests failed."))); |
| 325 test.shouldExit(1); |
| 353 }); | 326 }); |
| 354 | 327 |
| 355 test("directly", () { | 328 test("directly", () { |
| 356 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | 329 d.file("test.dart", _failure).create(); |
| 357 var result = _runDart([ | 330 var test = runDart([ |
| 358 "--package-root=${p.join(packageDir, 'packages')}", | 331 "--package-root=${p.join(packageDir, 'packages')}", |
| 359 "test.dart" | 332 "test.dart" |
| 360 ]); | 333 ]); |
| 361 expect(result.stdout, contains("Some tests failed.")); | 334 test.stdout.expect(consumeThrough(contains("Some tests failed."))); |
| 362 expect(result.exitCode, isNot(equals(0))); | 335 test.shouldExit(255); |
| 363 }); | 336 }); |
| 364 }); | 337 }); |
| 365 | 338 |
| 366 test("runs tests even when a file fails to load", () { | 339 test("runs tests even when a file fails to load", () { |
| 367 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 340 d.file("test.dart", _success).create(); |
| 368 var result = _runTest(["test.dart", "nonexistent.dart"]); | 341 |
| 369 expect(result.stdout, contains("+1 -1: Some tests failed.")); | 342 var test = runTest(["test.dart", "nonexistent.dart"]); |
| 370 expect(result.exitCode, equals(1)); | 343 test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed."))); |
| 344 test.shouldExit(1); |
| 371 }); | 345 }); |
| 372 | 346 |
| 373 test("respects top-level @Timeout declarations", () { | 347 test("respects top-level @Timeout declarations", () { |
| 374 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 348 d.file("test.dart", ''' |
| 375 @Timeout(const Duration(seconds: 0)) | 349 @Timeout(const Duration(seconds: 0)) |
| 376 | 350 |
| 377 import 'dart:async'; | 351 import 'dart:async'; |
| 378 | 352 |
| 379 import 'package:test/test.dart'; | 353 import 'package:test/test.dart'; |
| 380 | 354 |
| 381 void main() { | 355 void main() { |
| 382 test("timeout", () {}); | 356 test("timeout", () {}); |
| 383 } | 357 } |
| 384 '''); | 358 ''').create(); |
| 385 | 359 |
| 386 var result = _runTest(["test.dart"]); | 360 var test = runTest(["test.dart"]); |
| 387 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 361 test.stdout.expect(containsInOrder([ |
| 388 expect(result.stdout, contains("-1: Some tests failed.")); | 362 "Test timed out after 0 seconds.", |
| 363 "-1: Some tests failed." |
| 364 ])); |
| 365 test.shouldExit(1); |
| 389 }); | 366 }); |
| 390 | 367 |
| 391 test("respects top-level @Skip declarations", () { | 368 test("respects top-level @Skip declarations", () { |
| 392 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 369 d.file("test.dart", ''' |
| 393 @Skip() | 370 @Skip() |
| 394 | 371 |
| 395 import 'dart:async'; | 372 import 'dart:async'; |
| 396 | 373 |
| 397 import 'package:test/test.dart'; | 374 import 'package:test/test.dart'; |
| 398 | 375 |
| 399 void main() { | 376 void main() { |
| 400 test("fail", () => throw 'oh no'); | 377 test("fail", () => throw 'oh no'); |
| 401 } | 378 } |
| 402 '''); | 379 ''').create(); |
| 403 | 380 |
| 404 var result = _runTest(["test.dart"]); | 381 var test = runTest(["test.dart"]); |
| 405 expect(result.stdout, contains("+0 ~1: All tests skipped.")); | 382 test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped."))); |
| 383 test.shouldExit(0); |
| 406 }); | 384 }); |
| 407 | 385 |
| 408 group("with onPlatform", () { | 386 group("with onPlatform", () { |
| 409 test("respects matching Skips", () { | 387 test("respects matching Skips", () { |
| 410 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 388 d.file("test.dart", ''' |
| 411 import 'dart:async'; | 389 import 'dart:async'; |
| 412 | 390 |
| 413 import 'package:test/test.dart'; | 391 import 'package:test/test.dart'; |
| 414 | 392 |
| 415 void main() { | 393 void main() { |
| 416 test("fail", () => throw 'oh no', onPlatform: {"vm": new Skip()}); | 394 test("fail", () => throw 'oh no', onPlatform: {"vm": new Skip()}); |
| 417 } | 395 } |
| 418 '''); | 396 ''').create(); |
| 419 | 397 |
| 420 var result = _runTest(["test.dart"]); | 398 var test = runTest(["test.dart"]); |
| 421 expect(result.stdout, contains("+0 ~1: All tests skipped.")); | 399 test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped."))); |
| 400 test.shouldExit(0); |
| 422 }); | 401 }); |
| 423 | 402 |
| 424 test("ignores non-matching Skips", () { | 403 test("ignores non-matching Skips", () { |
| 425 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 404 d.file("test.dart", ''' |
| 426 import 'dart:async'; | 405 import 'dart:async'; |
| 427 | 406 |
| 428 import 'package:test/test.dart'; | 407 import 'package:test/test.dart'; |
| 429 | 408 |
| 430 void main() { | 409 void main() { |
| 431 test("success", () {}, onPlatform: {"chrome": new Skip()}); | 410 test("success", () {}, onPlatform: {"chrome": new Skip()}); |
| 432 } | 411 } |
| 433 '''); | 412 ''').create(); |
| 434 | 413 |
| 435 var result = _runTest(["test.dart"]); | 414 var test = runTest(["test.dart"]); |
| 436 expect(result.stdout, contains("+1: All tests passed!")); | 415 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 416 test.shouldExit(0); |
| 437 }); | 417 }); |
| 438 | 418 |
| 439 test("respects matching Timeouts", () { | 419 test("respects matching Timeouts", () { |
| 440 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 420 d.file("test.dart", ''' |
| 441 import 'dart:async'; | 421 import 'dart:async'; |
| 442 | 422 |
| 443 import 'package:test/test.dart'; | 423 import 'package:test/test.dart'; |
| 444 | 424 |
| 445 void main() { | 425 void main() { |
| 446 test("fail", () => throw 'oh no', onPlatform: { | 426 test("fail", () => throw 'oh no', onPlatform: { |
| 447 "vm": new Timeout(new Duration(seconds: 0)) | 427 "vm": new Timeout(new Duration(seconds: 0)) |
| 448 }); | 428 }); |
| 449 } | 429 } |
| 450 '''); | 430 ''').create(); |
| 451 | 431 |
| 452 var result = _runTest(["test.dart"]); | 432 var test = runTest(["test.dart"]); |
| 453 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 433 test.stdout.expect(containsInOrder([ |
| 454 expect(result.stdout, contains("-1: Some tests failed.")); | 434 "Test timed out after 0 seconds.", |
| 435 "-1: Some tests failed." |
| 436 ])); |
| 437 test.shouldExit(1); |
| 455 }); | 438 }); |
| 456 | 439 |
| 457 test("ignores non-matching Timeouts", () { | 440 test("ignores non-matching Timeouts", () { |
| 458 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 441 d.file("test.dart", ''' |
| 459 import 'dart:async'; | 442 import 'dart:async'; |
| 460 | 443 |
| 461 import 'package:test/test.dart'; | 444 import 'package:test/test.dart'; |
| 462 | 445 |
| 463 void main() { | 446 void main() { |
| 464 test("success", () {}, onPlatform: { | 447 test("success", () {}, onPlatform: { |
| 465 "chrome": new Timeout(new Duration(seconds: 0)) | 448 "chrome": new Timeout(new Duration(seconds: 0)) |
| 466 }); | 449 }); |
| 467 } | 450 } |
| 468 '''); | 451 ''').create(); |
| 469 | 452 |
| 470 var result = _runTest(["test.dart"]); | 453 var test = runTest(["test.dart"]); |
| 471 expect(result.stdout, contains("+1: All tests passed!")); | 454 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 455 test.shouldExit(0); |
| 472 }); | 456 }); |
| 473 | 457 |
| 474 test("applies matching platforms in order", () { | 458 test("applies matching platforms in order", () { |
| 475 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 459 d.file("test.dart", ''' |
| 476 import 'dart:async'; | 460 import 'dart:async'; |
| 477 | 461 |
| 478 import 'package:test/test.dart'; | 462 import 'package:test/test.dart'; |
| 479 | 463 |
| 480 void main() { | 464 void main() { |
| 481 test("success", () {}, onPlatform: { | 465 test("success", () {}, onPlatform: { |
| 482 "vm": new Skip("first"), | 466 "vm": new Skip("first"), |
| 483 "vm || windows": new Skip("second"), | 467 "vm || windows": new Skip("second"), |
| 484 "vm || linux": new Skip("third"), | 468 "vm || linux": new Skip("third"), |
| 485 "vm || mac-os": new Skip("fourth"), | 469 "vm || mac-os": new Skip("fourth"), |
| 486 "vm || android": new Skip("fifth") | 470 "vm || android": new Skip("fifth") |
| 487 }); | 471 }); |
| 488 } | 472 } |
| 489 '''); | 473 ''').create(); |
| 490 | 474 |
| 491 var result = _runTest(["test.dart"]); | 475 var test = runTest(["test.dart"]); |
| 492 expect(result.stdout, contains("Skip: fifth")); | 476 test.stdout.fork().expect(never(contains("Skip: first"))); |
| 493 expect(result.stdout, isNot(anyOf([ | 477 test.stdout.fork().expect(never(contains("Skip: second"))); |
| 494 contains("Skip: first"), | 478 test.stdout.fork().expect(never(contains("Skip: third"))); |
| 495 contains("Skip: second"), | 479 test.stdout.fork().expect(never(contains("Skip: fourth"))); |
| 496 contains("Skip: third"), | 480 test.stdout.expect(consumeThrough(contains("Skip: fifth"))); |
| 497 contains("Skip: fourth") | 481 test.shouldExit(0); |
| 498 ]))); | |
| 499 }); | 482 }); |
| 500 }); | 483 }); |
| 501 | 484 |
| 502 group("with an @OnPlatform annotation", () { | 485 group("with an @OnPlatform annotation", () { |
| 503 test("respects matching Skips", () { | 486 test("respects matching Skips", () { |
| 504 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 487 d.file("test.dart", ''' |
| 505 @OnPlatform(const {"vm": const Skip()}) | 488 @OnPlatform(const {"vm": const Skip()}) |
| 506 | 489 |
| 507 import 'dart:async'; | 490 import 'dart:async'; |
| 508 | 491 |
| 509 import 'package:test/test.dart'; | 492 import 'package:test/test.dart'; |
| 510 | 493 |
| 511 void main() { | 494 void main() { |
| 512 test("fail", () => throw 'oh no'); | 495 test("fail", () => throw 'oh no'); |
| 513 } | 496 } |
| 514 '''); | 497 ''').create(); |
| 515 | 498 |
| 516 var result = _runTest(["test.dart"]); | 499 var test = runTest(["test.dart"]); |
| 517 expect(result.stdout, contains("+0 ~1: All tests skipped.")); | 500 test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped."))); |
| 501 test.shouldExit(0); |
| 518 }); | 502 }); |
| 519 | 503 |
| 520 test("ignores non-matching Skips", () { | 504 test("ignores non-matching Skips", () { |
| 521 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 505 d.file("test.dart", ''' |
| 522 @OnPlatform(const {"chrome": const Skip()}) | 506 @OnPlatform(const {"chrome": const Skip()}) |
| 523 | 507 |
| 524 import 'dart:async'; | 508 import 'dart:async'; |
| 525 | 509 |
| 526 import 'package:test/test.dart'; | 510 import 'package:test/test.dart'; |
| 527 | 511 |
| 528 void main() { | 512 void main() { |
| 529 test("success", () {}); | 513 test("success", () {}); |
| 530 } | 514 } |
| 531 '''); | 515 ''').create(); |
| 532 | 516 |
| 533 var result = _runTest(["test.dart"]); | 517 var test = runTest(["test.dart"]); |
| 534 expect(result.stdout, contains("+1: All tests passed!")); | 518 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 519 test.shouldExit(0); |
| 535 }); | 520 }); |
| 536 | 521 |
| 537 test("respects matching Timeouts", () { | 522 test("respects matching Timeouts", () { |
| 538 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 523 d.file("test.dart", ''' |
| 539 @OnPlatform(const { | 524 @OnPlatform(const { |
| 540 "vm": const Timeout(const Duration(seconds: 0)) | 525 "vm": const Timeout(const Duration(seconds: 0)) |
| 541 }) | 526 }) |
| 542 | 527 |
| 543 import 'dart:async'; | 528 import 'dart:async'; |
| 544 | 529 |
| 545 import 'package:test/test.dart'; | 530 import 'package:test/test.dart'; |
| 546 | 531 |
| 547 void main() { | 532 void main() { |
| 548 test("fail", () => throw 'oh no'); | 533 test("fail", () => throw 'oh no'); |
| 549 } | 534 } |
| 550 '''); | 535 ''').create(); |
| 551 | 536 |
| 552 var result = _runTest(["test.dart"]); | 537 var test = runTest(["test.dart"]); |
| 553 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 538 test.stdout.expect(containsInOrder([ |
| 554 expect(result.stdout, contains("-1: Some tests failed.")); | 539 "Test timed out after 0 seconds.", |
| 540 "-1: Some tests failed." |
| 541 ])); |
| 542 test.shouldExit(1); |
| 555 }); | 543 }); |
| 556 | 544 |
| 557 test("ignores non-matching Timeouts", () { | 545 test("ignores non-matching Timeouts", () { |
| 558 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 546 d.file("test.dart", ''' |
| 559 @OnPlatform(const { | 547 @OnPlatform(const { |
| 560 "chrome": const Timeout(const Duration(seconds: 0)) | 548 "chrome": const Timeout(const Duration(seconds: 0)) |
| 561 }) | 549 }) |
| 562 | 550 |
| 563 import 'dart:async'; | 551 import 'dart:async'; |
| 564 | 552 |
| 565 import 'package:test/test.dart'; | 553 import 'package:test/test.dart'; |
| 566 | 554 |
| 567 void main() { | 555 void main() { |
| 568 test("success", () {}); | 556 test("success", () {}); |
| 569 } | 557 } |
| 570 '''); | 558 ''').create(); |
| 571 | 559 |
| 572 var result = _runTest(["test.dart"]); | 560 var test = runTest(["test.dart"]); |
| 573 expect(result.stdout, contains("+1: All tests passed!")); | 561 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 562 test.shouldExit(0); |
| 574 }); | 563 }); |
| 575 }); | 564 }); |
| 576 | 565 |
| 577 group("flags:", () { | 566 group("flags:", () { |
| 578 test("with the --color flag, uses colors", () { | 567 test("with the --color flag, uses colors", () { |
| 579 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | 568 d.file("test.dart", _failure).create(); |
| 580 var result = _runTest(["--color", "test.dart"]); | 569 var test = runTest(["--color", "test.dart"]); |
| 581 // This is the color code for red. | 570 // This is the color code for red. |
| 582 expect(result.stdout, contains("\u001b[31m")); | 571 test.stdout.expect(consumeThrough(contains("\u001b[31m"))); |
| 572 test.shouldExit(); |
| 583 }); | 573 }); |
| 584 | 574 |
| 585 group("with the --name flag,", () { | 575 group("with the --name flag,", () { |
| 586 test("selects tests with matching names", () { | 576 test("selects tests with matching names", () { |
| 587 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 577 d.file("test.dart", """ |
| 588 import 'dart:async'; | 578 import 'dart:async'; |
| 589 | 579 |
| 590 import 'package:test/test.dart'; | 580 import 'package:test/test.dart'; |
| 591 | 581 |
| 592 void main() { | 582 void main() { |
| 593 test("selected 1", () {}); | 583 test("selected 1", () {}); |
| 594 test("nope", () => throw new TestFailure("oh no")); | 584 test("nope", () => throw new TestFailure("oh no")); |
| 595 test("selected 2", () {}); | 585 test("selected 2", () {}); |
| 596 } | 586 } |
| 597 """); | 587 """).create(); |
| 598 | 588 |
| 599 var result = _runTest(["--name", "selected", "test.dart"]); | 589 var test = runTest(["--name", "selected", "test.dart"]); |
| 600 expect(result.stdout, contains("+2: All tests passed!")); | 590 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
| 601 expect(result.exitCode, equals(0)); | 591 test.shouldExit(0); |
| 602 }); | 592 }); |
| 603 | 593 |
| 604 test("supports RegExp syntax", () { | 594 test("supports RegExp syntax", () { |
| 605 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 595 d.file("test.dart", """ |
| 606 import 'dart:async'; | 596 import 'dart:async'; |
| 607 | 597 |
| 608 import 'package:test/test.dart'; | 598 import 'package:test/test.dart'; |
| 609 | 599 |
| 610 void main() { | 600 void main() { |
| 611 test("test 1", () {}); | 601 test("test 1", () {}); |
| 612 test("test 2", () => throw new TestFailure("oh no")); | 602 test("test 2", () => throw new TestFailure("oh no")); |
| 613 test("test 3", () {}); | 603 test("test 3", () {}); |
| 614 } | 604 } |
| 615 """); | 605 """).create(); |
| 616 | 606 |
| 617 var result = _runTest(["--name", "test [13]", "test.dart"]); | 607 var test = runTest(["--name", "test [13]", "test.dart"]); |
| 618 expect(result.stdout, contains("+2: All tests passed!")); | 608 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
| 619 expect(result.exitCode, equals(0)); | 609 test.shouldExit(0); |
| 620 }); | 610 }); |
| 621 | 611 |
| 622 test("produces an error when no tests match", () { | 612 test("produces an error when no tests match", () { |
| 623 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 613 d.file("test.dart", _success).create(); |
| 624 | 614 |
| 625 var result = _runTest(["--name", "no match", "test.dart"]); | 615 var test = runTest(["--name", "no match", "test.dart"]); |
| 626 expect(result.stderr, | 616 test.stderr.expect(consumeThrough( |
| 627 contains('No tests match regular expression "no match".')); | 617 contains('No tests match regular expression "no match".'))); |
| 628 expect(result.exitCode, equals(exit_codes.data)); | 618 test.shouldExit(exit_codes.data); |
| 629 }); | 619 }); |
| 630 | 620 |
| 631 test("doesn't filter out load exceptions", () { | 621 test("doesn't filter out load exceptions", () { |
| 632 var result = _runTest(["--name", "name", "file"]); | 622 var test = runTest(["--name", "name", "file"]); |
| 633 expect(result.stdout, allOf([ | 623 test.stdout.expect(containsInOrder([ |
| 634 contains('-1: loading file'), | 624 '-1: loading file', |
| 635 contains('Failed to load "file": Does not exist.') | 625 ' Failed to load "file": Does not exist.' |
| 636 ])); | 626 ])); |
| 637 expect(result.exitCode, equals(1)); | 627 test.shouldExit(1); |
| 638 }); | 628 }); |
| 639 }); | 629 }); |
| 640 | 630 |
| 641 group("with the --plain-name flag,", () { | 631 group("with the --plain-name flag,", () { |
| 642 test("selects tests with matching names", () { | 632 test("selects tests with matching names", () { |
| 643 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 633 d.file("test.dart", """ |
| 644 import 'dart:async'; | 634 import 'dart:async'; |
| 645 | 635 |
| 646 import 'package:test/test.dart'; | 636 import 'package:test/test.dart'; |
| 647 | 637 |
| 648 void main() { | 638 void main() { |
| 649 test("selected 1", () {}); | 639 test("selected 1", () {}); |
| 650 test("nope", () => throw new TestFailure("oh no")); | 640 test("nope", () => throw new TestFailure("oh no")); |
| 651 test("selected 2", () {}); | 641 test("selected 2", () {}); |
| 652 } | 642 } |
| 653 """); | 643 """).create(); |
| 654 | 644 |
| 655 var result = _runTest(["--plain-name", "selected", "test.dart"]); | 645 var test = runTest(["--plain-name", "selected", "test.dart"]); |
| 656 expect(result.stdout, contains("+2: All tests passed!")); | 646 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
| 657 expect(result.exitCode, equals(0)); | 647 test.shouldExit(0); |
| 658 }); | 648 }); |
| 659 | 649 |
| 660 test("doesn't support RegExp syntax", () { | 650 test("doesn't support RegExp syntax", () { |
| 661 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 651 d.file("test.dart", """ |
| 662 import 'dart:async'; | 652 import 'dart:async'; |
| 663 | 653 |
| 664 import 'package:test/test.dart'; | 654 import 'package:test/test.dart'; |
| 665 | 655 |
| 666 void main() { | 656 void main() { |
| 667 test("test 1", () => throw new TestFailure("oh no")); | 657 test("test 1", () => throw new TestFailure("oh no")); |
| 668 test("test 2", () => throw new TestFailure("oh no")); | 658 test("test 2", () => throw new TestFailure("oh no")); |
| 669 test("test [12]", () {}); | 659 test("test [12]", () {}); |
| 670 } | 660 } |
| 671 """); | 661 """).create(); |
| 672 | 662 |
| 673 var result = _runTest(["--plain-name", "test [12]", "test.dart"]); | 663 var test = runTest(["--plain-name", "test [12]", "test.dart"]); |
| 674 expect(result.stdout, contains("+1: All tests passed!")); | 664 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 675 expect(result.exitCode, equals(0)); | 665 test.shouldExit(0); |
| 676 }); | 666 }); |
| 677 | 667 |
| 678 test("produces an error when no tests match", () { | 668 test("produces an error when no tests match", () { |
| 679 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 669 d.file("test.dart", _success).create(); |
| 680 | 670 |
| 681 var result = _runTest(["--plain-name", "no match", "test.dart"]); | 671 var test = runTest(["--plain-name", "no match", "test.dart"]); |
| 682 expect(result.stderr, | 672 test.stderr.expect( |
| 683 contains('No tests match "no match".')); | 673 consumeThrough(contains('No tests match "no match".'))); |
| 684 expect(result.exitCode, equals(exit_codes.data)); | 674 test.shouldExit(exit_codes.data); |
| 685 }); | 675 }); |
| 686 }); | 676 }); |
| 687 }); | 677 }); |
| 688 } | 678 } |
| 689 | |
| 690 ProcessResult _runTest(List<String> args) => | |
| 691 runTest(args, workingDirectory: _sandbox); | |
| 692 | |
| 693 ProcessResult _runDart(List<String> args) => | |
| 694 runDart(args, workingDirectory: _sandbox); | |
| OLD | NEW |