| 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 String _sandbox; | |
| 16 | |
| 17 final _success = """ | 13 final _success = """ |
| 18 import 'package:test/test.dart'; | 14 import 'package:test/test.dart'; |
| 19 | 15 |
| 20 void main() { | 16 void main() { |
| 21 test("success", () {}); | 17 test("success", () {}); |
| 22 } | 18 } |
| 23 """; | 19 """; |
| 24 | 20 |
| 25 final _failure = """ | 21 final _failure = """ |
| 26 import 'package:test/test.dart'; | 22 import 'package:test/test.dart'; |
| 27 | 23 |
| 28 void main() { | 24 void main() { |
| 29 test("failure", () => throw new TestFailure("oh no")); | 25 test("failure", () => throw new TestFailure("oh no")); |
| 30 } | 26 } |
| 31 """; | 27 """; |
| 32 | 28 |
| 33 void main() { | 29 void main() { |
| 34 setUp(() { | 30 useSandbox(); |
| 35 _sandbox = createTempDir(); | |
| 36 }); | |
| 37 | |
| 38 tearDown(() { | |
| 39 new Directory(_sandbox).deleteSync(recursive: true); | |
| 40 }); | |
| 41 | 31 |
| 42 group("fails gracefully if", () { | 32 group("fails gracefully if", () { |
| 43 test("a test file fails to compile", () { | 33 test("a test file fails to compile", () { |
| 44 var testPath = p.join(_sandbox, "test.dart"); | 34 d.file("test.dart", "invalid Dart file").create(); |
| 45 new File(testPath).writeAsStringSync("invalid Dart file"); | 35 var test = runTest(["-p", "chrome", "test.dart"]); |
| 46 var result = _runTest(["-p", "chrome", "test.dart"]); | |
| 47 | 36 |
| 48 var relativePath = p.relative(testPath, from: _sandbox); | 37 test.stdout.expect(containsInOrder([ |
| 49 expect(result.stdout, allOf([ | 38 "Expected a declaration, but got 'invalid'", |
| 50 contains("Expected a declaration, but got 'invalid'"), | 39 '-1: compiling test.dart', |
| 51 contains('-1: compiling $relativePath'), | 40 'Failed to load "test.dart": dart2js failed.' |
| 52 contains('Failed to load "$relativePath": dart2js failed.') | |
| 53 ])); | 41 ])); |
| 54 expect(result.exitCode, equals(1)); | 42 test.shouldExit(1); |
| 55 }); | 43 }); |
| 56 | 44 |
| 57 test("a test file throws", () { | 45 test("a test file throws", () { |
| 58 var testPath = p.join(_sandbox, "test.dart"); | 46 d.file("test.dart", "void main() => throw 'oh no';").create(); |
| 59 new File(testPath).writeAsStringSync("void main() => throw 'oh no';"); | |
| 60 | 47 |
| 61 var relativePath = p.relative(testPath, from: _sandbox); | 48 var test = runTest(["-p", "chrome", "test.dart"]); |
| 62 var result = _runTest(["-p", "chrome", "test.dart"]); | 49 test.stdout.expect(containsInOrder([ |
| 63 expect(result.stdout, allOf([ | 50 '-1: compiling test.dart', |
| 64 contains('-1: compiling $relativePath'), | 51 'Failed to load "test.dart": oh no' |
| 65 contains('Failed to load "$relativePath": oh no') | |
| 66 ])); | 52 ])); |
| 67 expect(result.exitCode, equals(1)); | 53 test.shouldExit(1); |
| 68 }); | 54 }); |
| 69 | 55 |
| 70 test("a test file doesn't have a main defined", () { | 56 test("a test file doesn't have a main defined", () { |
| 71 var testPath = p.join(_sandbox, "test.dart"); | 57 d.file("test.dart", "void foo() {}").create(); |
| 72 new File(testPath).writeAsStringSync("void foo() {}"); | |
| 73 | 58 |
| 74 var relativePath = p.relative(testPath, from: _sandbox); | 59 var test = runTest(["-p", "chrome", "test.dart"]); |
| 75 var result = _runTest(["-p", "chrome", "test.dart"]); | 60 test.stdout.expect(containsInOrder([ |
| 76 expect(result.stdout, allOf([ | 61 '-1: compiling test.dart', |
| 77 contains('-1: compiling $relativePath'), | 62 'Failed to load "test.dart": No top-level main() function defined.' |
| 78 contains('Failed to load "$relativePath": No top-level main() function ' | |
| 79 'defined.') | |
| 80 ])); | 63 ])); |
| 81 expect(result.exitCode, equals(1)); | 64 test.shouldExit(1); |
| 82 }); | 65 }); |
| 83 | 66 |
| 84 test("a test file has a non-function main", () { | 67 test("a test file has a non-function main", () { |
| 85 var testPath = p.join(_sandbox, "test.dart"); | 68 d.file("test.dart", "int main;").create(); |
| 86 new File(testPath).writeAsStringSync("int main;"); | |
| 87 | 69 |
| 88 var relativePath = p.relative(testPath, from: _sandbox); | 70 var test = runTest(["-p", "chrome", "test.dart"]); |
| 89 var result = _runTest(["-p", "chrome", "test.dart"]); | 71 test.stdout.expect(containsInOrder([ |
| 90 expect(result.stdout, allOf([ | 72 '-1: compiling test.dart', |
| 91 contains('-1: compiling $relativePath'), | 73 'Failed to load "test.dart": Top-level main getter is not a function.' |
| 92 contains('Failed to load "$relativePath": Top-level main getter is not ' | |
| 93 'a function.\n') | |
| 94 ])); | 74 ])); |
| 95 expect(result.exitCode, equals(1)); | 75 test.shouldExit(1); |
| 96 }); | 76 }); |
| 97 | 77 |
| 98 test("a test file has a main with arguments", () { | 78 test("a test file has a main with arguments", () { |
| 99 var testPath = p.join(_sandbox, "test.dart"); | 79 d.file("test.dart", "void main(arg) {}").create(); |
| 100 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 101 | 80 |
| 102 var relativePath = p.relative(testPath, from: _sandbox); | 81 var test = runTest(["-p", "chrome", "test.dart"]); |
| 103 var result = _runTest(["-p", "chrome", "test.dart"]); | 82 test.stdout.expect(containsInOrder([ |
| 104 expect(result.stdout, allOf([ | 83 '-1: compiling test.dart', |
| 105 contains('-1: compiling $relativePath'), | 84 'Failed to load "test.dart": Top-level main() function takes arguments.' |
| 106 contains('Failed to load "$relativePath": Top-level main() function ' | |
| 107 'takes arguments.\n') | |
| 108 ])); | 85 ])); |
| 109 expect(result.exitCode, equals(1)); | 86 test.shouldExit(1); |
| 110 }); | 87 }); |
| 111 | 88 |
| 112 test("a custom HTML file has no script tag", () { | 89 test("a custom HTML file has no script tag", () { |
| 113 var testPath = p.join(_sandbox, "test.dart"); | 90 d.file("test.dart", "void main() {}").create(); |
| 114 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 115 | 91 |
| 116 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 92 d.file("test.html", """ |
| 117 <html> | 93 <html> |
| 118 <head> | 94 <head> |
| 119 <link rel="x-dart-test" href="test.dart"> | 95 <link rel="x-dart-test" href="test.dart"> |
| 120 </head> | 96 </head> |
| 121 </html> | 97 </html> |
| 122 """); | 98 """).create(); |
| 123 | 99 |
| 124 var relativePath = p.relative(testPath, from: _sandbox); | 100 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 125 var result = _runTest(["-p", "content-shell", "test.dart"]); | 101 test.stdout.expect(containsInOrder([ |
| 126 expect(result.stdout, allOf([ | 102 '-1: loading test.dart', |
| 127 contains('-1: loading $relativePath'), | 103 'Failed to load "test.dart": "test.html" must contain ' |
| 128 contains( | 104 '<script src="packages/test/dart.js"></script>.' |
| 129 'Failed to load "$relativePath": ' | |
| 130 '"${p.withoutExtension(relativePath)}.html" must contain ' | |
| 131 '<script src="packages/test/dart.js"></script>.\n') | |
| 132 ])); | 105 ])); |
| 133 expect(result.exitCode, equals(1)); | 106 test.shouldExit(1); |
| 134 }); | 107 }); |
| 135 | 108 |
| 136 test("a custom HTML file has no link", () { | 109 test("a custom HTML file has no link", () { |
| 137 var testPath = p.join(_sandbox, "test.dart"); | 110 d.file("test.dart", "void main() {}").create(); |
| 138 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 139 | 111 |
| 140 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 112 d.file("test.html", """ |
| 141 <html> | 113 <html> |
| 142 <head> | 114 <head> |
| 143 <script src="packages/test/dart.js"></script> | 115 <script src="packages/test/dart.js"></script> |
| 144 </head> | 116 </head> |
| 145 </html> | 117 </html> |
| 146 """); | 118 """).create(); |
| 147 | 119 |
| 148 var relativePath = p.relative(testPath, from: _sandbox); | 120 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 149 var result = _runTest(["-p", "content-shell", "test.dart"]); | 121 test.stdout.expect(containsInOrder([ |
| 150 expect(result.stdout, allOf([ | 122 '-1: loading test.dart', |
| 151 contains('-1: loading $relativePath'), | 123 'Failed to load "test.dart": Expected exactly 1 ' |
| 152 contains( | 124 '<link rel="x-dart-test"> in test.html, found 0.' |
| 153 'Failed to load "$relativePath": ' | |
| 154 'Expected exactly 1 <link rel="x-dart-test"> in test.html, ' | |
| 155 'found 0.\n') | |
| 156 ])); | 125 ])); |
| 157 expect(result.exitCode, equals(1)); | 126 test.shouldExit(1); |
| 158 }); | 127 }); |
| 159 | 128 |
| 160 test("a custom HTML file has too many links", () { | 129 test("a custom HTML file has too many links", () { |
| 161 var testPath = p.join(_sandbox, "test.dart"); | 130 d.file("test.dart", "void main() {}").create(); |
| 162 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 163 | 131 |
| 164 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 132 d.file("test.html", """ |
| 165 <html> | 133 <html> |
| 166 <head> | 134 <head> |
| 167 <link rel='x-dart-test' href='test.dart'> | 135 <link rel='x-dart-test' href='test.dart'> |
| 168 <link rel='x-dart-test' href='test.dart'> | 136 <link rel='x-dart-test' href='test.dart'> |
| 169 <script src="packages/test/dart.js"></script> | 137 <script src="packages/test/dart.js"></script> |
| 170 </head> | 138 </head> |
| 171 </html> | 139 </html> |
| 172 """); | 140 """).create(); |
| 173 | 141 |
| 174 var relativePath = p.relative(testPath, from: _sandbox); | 142 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 175 var result = _runTest(["-p", "content-shell", "test.dart"]); | 143 test.stdout.expect(containsInOrder([ |
| 176 expect(result.stdout, allOf([ | 144 '-1: loading test.dart', |
| 177 contains('-1: loading $relativePath'), | 145 'Failed to load "test.dart": Expected exactly 1 ' |
| 178 contains( | 146 '<link rel="x-dart-test"> in test.html, found 2.' |
| 179 'Failed to load "$relativePath": ' | |
| 180 'Expected exactly 1 <link rel="x-dart-test"> in test.html, ' | |
| 181 'found 2.\n') | |
| 182 ])); | 147 ])); |
| 183 expect(result.exitCode, equals(1)); | 148 test.shouldExit(1); |
| 184 }); | 149 }); |
| 185 | 150 |
| 186 test("a custom HTML file has no href in the link", () { | 151 test("a custom HTML file has no href in the link", () { |
| 187 var testPath = p.join(_sandbox, "test.dart"); | 152 d.file("test.dart", "void main() {}").create(); |
| 188 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 189 | 153 |
| 190 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 154 d.file("test.html", """ |
| 191 <html> | 155 <html> |
| 192 <head> | 156 <head> |
| 193 <link rel='x-dart-test'> | 157 <link rel='x-dart-test'> |
| 194 <script src="packages/test/dart.js"></script> | 158 <script src="packages/test/dart.js"></script> |
| 195 </head> | 159 </head> |
| 196 </html> | 160 </html> |
| 197 """); | 161 """).create(); |
| 198 | 162 |
| 199 var relativePath = p.relative(testPath, from: _sandbox); | 163 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 200 var result = _runTest(["-p", "content-shell", "test.dart"]); | 164 test.stdout.expect(containsInOrder([ |
| 201 expect(result.stdout, allOf([ | 165 '-1: loading test.dart', |
| 202 contains('-1: loading $relativePath'), | 166 'Failed to load "test.dart": Expected <link rel="x-dart-test"> in ' |
| 203 contains( | 167 'test.html to have an "href" attribute.' |
| 204 'Failed to load "$relativePath": ' | |
| 205 'Expected <link rel="x-dart-test"> in test.html to have an ' | |
| 206 '"href" attribute.\n') | |
| 207 ])); | 168 ])); |
| 208 expect(result.exitCode, equals(1)); | 169 test.shouldExit(1); |
| 209 }); | 170 }); |
| 210 | 171 |
| 211 test("a custom HTML file has an invalid test URL", () { | 172 test("a custom HTML file has an invalid test URL", () { |
| 212 var testPath = p.join(_sandbox, "test.dart"); | 173 d.file("test.dart", "void main() {}").create(); |
| 213 new File(testPath).writeAsStringSync("void main(arg) {}"); | |
| 214 | 174 |
| 215 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 175 d.file("test.html", """ |
| 216 <html> | 176 <html> |
| 217 <head> | 177 <head> |
| 218 <link rel='x-dart-test' href='wrong.dart'> | 178 <link rel='x-dart-test' href='wrong.dart'> |
| 219 <script src="packages/test/dart.js"></script> | 179 <script src="packages/test/dart.js"></script> |
| 220 </head> | 180 </head> |
| 221 </html> | 181 </html> |
| 222 """); | 182 """).create(); |
| 223 | 183 |
| 224 var relativePath = p.relative(testPath, from: _sandbox); | 184 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 225 var result = _runTest(["-p", "content-shell", "test.dart"]); | 185 test.stdout.expect(containsInOrder([ |
| 226 expect(result.stdout, allOf([ | 186 '-1: loading test.dart', |
| 227 contains('-1: loading $relativePath'), | 187 'Failed to load "test.dart": Failed to load script at ' |
| 228 contains( | |
| 229 'Failed to load "$relativePath": ' | |
| 230 'Failed to load script at ') | |
| 231 ])); | 188 ])); |
| 232 expect(result.exitCode, equals(1)); | 189 test.shouldExit(1); |
| 233 }); | 190 }); |
| 234 | 191 |
| 235 // TODO(nweiz): test what happens when a test file is unreadable once issue | 192 // TODO(nweiz): test what happens when a test file is unreadable once issue |
| 236 // 15078 is fixed. | 193 // 15078 is fixed. |
| 237 }); | 194 }); |
| 238 | 195 |
| 239 group("runs successful tests", () { | 196 group("runs successful tests", () { |
| 240 test("on Chrome", () { | 197 test("on a JS and non-JS browser", () { |
| 241 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 198 d.file("test.dart", _success).create(); |
| 242 var result = _runTest(["-p", "chrome", "test.dart"]); | 199 var test = runTest(["-p", "content-shell", "-p", "chrome", "test.dart"]); |
| 243 expect(result.exitCode, equals(0)); | |
| 244 }); | |
| 245 | 200 |
| 246 test("on Safari", () { | 201 test.stdout.fork().expect(consumeThrough(contains("[Chrome] compiling"))); |
| 247 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 202 test.stdout.expect(never(contains("[Dartium Content Shell] compiling"))); |
| 248 var result = _runTest(["-p", "safari", "test.dart"]); | 203 test.shouldExit(0); |
| 249 expect(result.exitCode, equals(0)); | |
| 250 }, testOn: "mac-os"); | |
| 251 | |
| 252 test("on content shell", () { | |
| 253 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | |
| 254 var result = _runTest(["-p", "content-shell", "test.dart"]); | |
| 255 expect(result.stdout, isNot(contains("Compiling"))); | |
| 256 expect(result.exitCode, equals(0)); | |
| 257 }); | |
| 258 | |
| 259 test("on a JS and non-JS browser", () { | |
| 260 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | |
| 261 var result = _runTest( | |
| 262 ["-p", "content-shell", "-p", "chrome", "test.dart"]); | |
| 263 expect(result.stdout, contains("[Chrome] compiling")); | |
| 264 expect(result.stdout, | |
| 265 isNot(contains("[Dartium Content Shell] compiling"))); | |
| 266 expect(result.exitCode, equals(0)); | |
| 267 }); | 204 }); |
| 268 | 205 |
| 269 test("on a browser and the VM", () { | 206 test("on a browser and the VM", () { |
| 270 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_success); | 207 d.file("test.dart", _success).create(); |
| 271 var result = _runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); | 208 var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
| 272 expect(result.exitCode, equals(0)); | 209 |
| 210 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
| 211 test.shouldExit(0); |
| 273 }); | 212 }); |
| 274 | 213 |
| 275 // Regression test; this broke in 0.12.0-beta.9. | 214 // Regression test; this broke in 0.12.0-beta.9. |
| 276 test("on a file in a subdirectory", () { | 215 test("on a file in a subdirectory", () { |
| 277 new Directory(p.join(_sandbox, "dir")).createSync(); | 216 d.dir("dir", [d.file("test.dart", _success)]).create(); |
| 278 new File(p.join(_sandbox, "dir", "test.dart")) | 217 |
| 279 .writeAsStringSync(_success); | 218 var test = runTest(["-p", "chrome", "dir/test.dart"]); |
| 280 var result = _runTest(["-p", "chrome", "dir/test.dart"]); | 219 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 281 expect(result.exitCode, equals(0)); | 220 test.shouldExit(0); |
| 282 }); | 221 }); |
| 283 | 222 |
| 284 group("with a custom HTML file", () { | 223 group("with a custom HTML file", () { |
| 285 setUp(() { | 224 setUp(() { |
| 286 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 225 d.file("test.dart", """ |
| 287 import 'dart:html'; | 226 import 'dart:html'; |
| 288 | 227 |
| 289 import 'package:test/test.dart'; | 228 import 'package:test/test.dart'; |
| 290 | 229 |
| 291 void main() { | 230 void main() { |
| 292 test("success", () { | 231 test("success", () { |
| 293 expect(document.query('#foo'), isNotNull); | 232 expect(document.query('#foo'), isNotNull); |
| 294 }); | 233 }); |
| 295 } | 234 } |
| 296 """); | 235 """).create(); |
| 297 | 236 |
| 298 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 237 d.file("test.html", """ |
| 299 <html> | 238 <html> |
| 300 <head> | 239 <head> |
| 301 <link rel='x-dart-test' href='test.dart'> | 240 <link rel='x-dart-test' href='test.dart'> |
| 302 <script src="packages/test/dart.js"></script> | 241 <script src="packages/test/dart.js"></script> |
| 303 </head> | 242 </head> |
| 304 <body> | 243 <body> |
| 305 <div id="foo"></div> | 244 <div id="foo"></div> |
| 306 </body> | 245 </body> |
| 307 </html> | 246 </html> |
| 308 """); | 247 """).create(); |
| 309 }); | 248 }); |
| 310 | 249 |
| 311 test("on content shell", () { | 250 test("on content shell", () { |
| 312 var result = _runTest(["-p", "content-shell", "test.dart"]); | 251 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 313 expect(result.exitCode, equals(0)); | 252 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 253 test.shouldExit(0); |
| 314 }); | 254 }); |
| 315 | 255 |
| 316 test("on Chrome", () { | 256 test("on Chrome", () { |
| 317 var result = _runTest(["-p", "chrome", "test.dart"]); | 257 var test = runTest(["-p", "chrome", "test.dart"]); |
| 318 expect(result.exitCode, equals(0)); | 258 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 259 test.shouldExit(0); |
| 319 }); | 260 }); |
| 320 | 261 |
| 321 // Regression test for https://github.com/dart-lang/test/issues/82. | 262 // Regression test for https://github.com/dart-lang/test/issues/82. |
| 322 test("ignores irrelevant link tags", () { | 263 test("ignores irrelevant link tags", () { |
| 323 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 264 d.file("test.html", """ |
| 324 <html> | 265 <html> |
| 325 <head> | 266 <head> |
| 326 <link rel='x-dart-test-not'> | 267 <link rel='x-dart-test-not'> |
| 327 <link rel='other' href='test.dart'> | 268 <link rel='other' href='test.dart'> |
| 328 <link rel='x-dart-test' href='test.dart'> | 269 <link rel='x-dart-test' href='test.dart'> |
| 329 <script src="packages/test/dart.js"></script> | 270 <script src="packages/test/dart.js"></script> |
| 330 </head> | 271 </head> |
| 331 <body> | 272 <body> |
| 332 <div id="foo"></div> | 273 <div id="foo"></div> |
| 333 </body> | 274 </body> |
| 334 </html> | 275 </html> |
| 335 """); | 276 """).create(); |
| 336 | 277 |
| 337 var result = _runTest(["-p", "content-shell", "test.dart"]); | 278 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 338 expect(result.exitCode, equals(0)); | 279 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 280 test.shouldExit(0); |
| 339 }); | 281 }); |
| 340 }); | 282 }); |
| 341 }); | 283 }); |
| 342 | 284 |
| 343 group("runs failing tests", () { | 285 group("runs failing tests", () { |
| 344 test("on Chrome", () { | |
| 345 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | |
| 346 var result = _runTest(["-p", "chrome", "test.dart"]); | |
| 347 expect(result.exitCode, equals(1)); | |
| 348 }); | |
| 349 | |
| 350 test("on Safari", () { | |
| 351 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | |
| 352 var result = _runTest(["-p", "safari", "test.dart"]); | |
| 353 expect(result.exitCode, equals(1)); | |
| 354 }, testOn: "mac-os"); | |
| 355 | |
| 356 test("on content-shell", () { | |
| 357 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | |
| 358 var result = _runTest(["-p", "content-shell", "test.dart"]); | |
| 359 expect(result.exitCode, equals(1)); | |
| 360 }); | |
| 361 | |
| 362 test("that fail only on the browser", () { | 286 test("that fail only on the browser", () { |
| 363 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 287 d.file("test.dart", """ |
| 364 import 'dart:async'; | 288 import 'dart:async'; |
| 365 | 289 |
| 366 import 'package:path/path.dart' as p; | 290 import 'package:path/path.dart' as p; |
| 367 import 'package:test/test.dart'; | 291 import 'package:test/test.dart'; |
| 368 | 292 |
| 369 void main() { | 293 void main() { |
| 370 test("test", () { | 294 test("test", () { |
| 371 if (p.style == p.Style.url) throw new TestFailure("oh no"); | 295 if (p.style == p.Style.url) throw new TestFailure("oh no"); |
| 372 }); | 296 }); |
| 373 } | 297 } |
| 374 """); | 298 """).create(); |
| 375 var result = _runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); | 299 |
| 376 expect(result.exitCode, equals(1)); | 300 var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
| 301 test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed."))); |
| 302 test.shouldExit(1); |
| 377 }); | 303 }); |
| 378 | 304 |
| 379 test("that fail only on the VM", () { | 305 test("that fail only on the VM", () { |
| 380 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 306 d.file("test.dart", """ |
| 381 import 'dart:async'; | 307 import 'dart:async'; |
| 382 | 308 |
| 383 import 'package:path/path.dart' as p; | 309 import 'package:path/path.dart' as p; |
| 384 import 'package:test/test.dart'; | 310 import 'package:test/test.dart'; |
| 385 | 311 |
| 386 void main() { | 312 void main() { |
| 387 test("test", () { | 313 test("test", () { |
| 388 if (p.style != p.Style.url) throw new TestFailure("oh no"); | 314 if (p.style != p.Style.url) throw new TestFailure("oh no"); |
| 389 }); | 315 }); |
| 390 } | 316 } |
| 391 """); | 317 """).create(); |
| 392 var result = _runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); | 318 |
| 393 expect(result.exitCode, equals(1)); | 319 var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
| 320 test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed."))); |
| 321 test.shouldExit(1); |
| 394 }); | 322 }); |
| 395 | 323 |
| 396 | |
| 397 group("with a custom HTML file", () { | 324 group("with a custom HTML file", () { |
| 398 setUp(() { | 325 setUp(() { |
| 399 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 326 d.file("test.dart", """ |
| 400 import 'dart:html'; | 327 import 'dart:html'; |
| 401 | 328 |
| 402 import 'package:test/test.dart'; | 329 import 'package:test/test.dart'; |
| 403 | 330 |
| 404 void main() { | 331 void main() { |
| 405 test("failure", () { | 332 test("failure", () { |
| 406 expect(document.query('#foo'), isNull); | 333 expect(document.query('#foo'), isNull); |
| 407 }); | 334 }); |
| 408 } | 335 } |
| 409 """); | 336 """).create(); |
| 410 | 337 |
| 411 new File(p.join(_sandbox, "test.html")).writeAsStringSync(""" | 338 d.file("test.html", """ |
| 412 <html> | 339 <html> |
| 413 <head> | 340 <head> |
| 414 <link rel='x-dart-test' href='test.dart'> | 341 <link rel='x-dart-test' href='test.dart'> |
| 415 <script src="packages/test/dart.js"></script> | 342 <script src="packages/test/dart.js"></script> |
| 416 </head> | 343 </head> |
| 417 <body> | 344 <body> |
| 418 <div id="foo"></div> | 345 <div id="foo"></div> |
| 419 </body> | 346 </body> |
| 420 </html> | 347 </html> |
| 421 """); | 348 """).create(); |
| 422 }); | 349 }); |
| 423 | 350 |
| 424 test("on content shell", () { | 351 test("on content shell", () { |
| 425 var result = _runTest(["-p", "content-shell", "test.dart"]); | 352 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 426 expect(result.exitCode, equals(1)); | 353 test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
| 354 test.shouldExit(1); |
| 427 }); | 355 }); |
| 428 | 356 |
| 429 test("on Chrome", () { | 357 test("on Chrome", () { |
| 430 var result = _runTest(["-p", "chrome", "test.dart"]); | 358 var test = runTest(["-p", "chrome", "test.dart"]); |
| 431 expect(result.exitCode, equals(1)); | 359 test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
| 360 test.shouldExit(1); |
| 432 }); | 361 }); |
| 433 }); | 362 }); |
| 434 }); | 363 }); |
| 435 | 364 |
| 436 test("the compiler uses colors if the test runner uses colors", () { | 365 test("the compiler uses colors if the test runner uses colors", () { |
| 437 var testPath = p.join(_sandbox, "test.dart"); | 366 d.file("test.dart", "String main() => 12;\n").create(); |
| 438 new File(testPath).writeAsStringSync("String main() => 12;\n"); | |
| 439 | 367 |
| 440 var result = _runTest(["--color", "-p", "chrome", "test.dart"]); | 368 var test = runTest(["--color", "-p", "chrome", "test.dart"]); |
| 441 expect(result.stdout, contains('\u001b[35m')); | 369 test.stdout.expect(consumeThrough(contains('\u001b[35m'))); |
| 442 expect(result.exitCode, equals(1)); | 370 test.shouldExit(1); |
| 443 }); | 371 }); |
| 444 | 372 |
| 445 test("forwards prints from the browser test", () { | 373 test("forwards prints from the browser test", () { |
| 446 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(""" | 374 d.file("test.dart", """ |
| 447 import 'dart:async'; | 375 import 'dart:async'; |
| 448 | 376 |
| 449 import 'package:test/test.dart'; | 377 import 'package:test/test.dart'; |
| 450 | 378 |
| 451 void main() { | 379 void main() { |
| 452 test("test", () { | 380 test("test", () { |
| 453 print("Hello,"); | 381 print("Hello,"); |
| 454 return new Future(() => print("world!")); | 382 return new Future(() => print("world!")); |
| 455 }); | 383 }); |
| 456 } | 384 } |
| 457 """); | 385 """).create(); |
| 458 | 386 |
| 459 var result = _runTest(["-p", "content-shell", "test.dart"]); | 387 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 460 expect(result.stdout, contains("Hello,\nworld!\n")); | 388 test.stdout.expect(inOrder([ |
| 461 expect(result.exitCode, equals(0)); | 389 consumeThrough("Hello,"), |
| 390 "world!" |
| 391 ])); |
| 392 test.shouldExit(0); |
| 462 }); | 393 }); |
| 463 | 394 |
| 464 test("dartifies stack traces for JS-compiled tests by default", () { | 395 test("dartifies stack traces for JS-compiled tests by default", () { |
| 465 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | 396 d.file("test.dart", _failure).create(); |
| 466 var result = _runTest(["-p", "chrome", "--verbose-trace", "test.dart"]); | 397 |
| 467 expect(result.stdout, contains(" main.<fn>\n")); | 398 var test = runTest(["-p", "chrome", "--verbose-trace", "test.dart"]); |
| 468 expect(result.stdout, contains("package:test")); | 399 test.stdout.expect(containsInOrder([ |
| 469 expect(result.stdout, contains("dart:async/zone.dart")); | 400 " main.<fn>", |
| 470 expect(result.exitCode, equals(1)); | 401 "package:test", |
| 402 "dart:async/zone.dart" |
| 403 ])); |
| 404 test.shouldExit(1); |
| 471 }); | 405 }); |
| 472 | 406 |
| 473 test("doesn't dartify stack traces for JS-compiled tests with --js-trace", ()
{ | 407 test("doesn't dartify stack traces for JS-compiled tests with --js-trace", ()
{ |
| 474 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(_failure); | 408 d.file("test.dart", _failure).create(); |
| 475 var result = _runTest( | 409 |
| 410 var test = runTest( |
| 476 ["-p", "chrome", "--verbose-trace", "--js-trace", "test.dart"]); | 411 ["-p", "chrome", "--verbose-trace", "--js-trace", "test.dart"]); |
| 477 expect(result.stdout, isNot(contains(" main.<fn>\n"))); | 412 test.stdout.fork().expect(never(endsWith(" main.<fn>"))); |
| 478 expect(result.stdout, isNot(contains("package:test"))); | 413 test.stdout.fork().expect(never(contains("package:test"))); |
| 479 expect(result.stdout, isNot(contains("dart:async/zone.dart"))); | 414 test.stdout.fork().expect(never(contains("dart:async/zone.dart"))); |
| 480 expect(result.exitCode, equals(1)); | 415 test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
| 416 test.shouldExit(1); |
| 481 }); | 417 }); |
| 482 | 418 |
| 483 test("respects top-level @Timeout declarations", () { | 419 test("respects top-level @Timeout declarations", () { |
| 484 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 420 d.file("test.dart", ''' |
| 485 @Timeout(const Duration(seconds: 0)) | 421 @Timeout(const Duration(seconds: 0)) |
| 486 | 422 |
| 487 import 'dart:async'; | 423 import 'dart:async'; |
| 488 | 424 |
| 489 import 'package:test/test.dart'; | 425 import 'package:test/test.dart'; |
| 490 | 426 |
| 491 void main() { | 427 void main() { |
| 492 test("timeout", () {}); | 428 test("timeout", () {}); |
| 493 } | 429 } |
| 494 '''); | 430 ''').create(); |
| 495 | 431 |
| 496 var result = _runTest(["-p", "content-shell", "test.dart"]); | 432 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 497 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 433 test.stdout.expect(containsInOrder([ |
| 498 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); |
| 499 }); | 438 }); |
| 500 | 439 |
| 501 group("with onPlatform", () { | 440 group("with onPlatform", () { |
| 502 test("respects matching Skips", () { | 441 test("respects matching Skips", () { |
| 503 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 442 d.file("test.dart", ''' |
| 504 import 'dart:async'; | 443 import 'dart:async'; |
| 505 | 444 |
| 506 import 'package:test/test.dart'; | 445 import 'package:test/test.dart'; |
| 507 | 446 |
| 508 void main() { | 447 void main() { |
| 509 test("fail", () => throw 'oh no', onPlatform: {"browser": new Skip()}); | 448 test("fail", () => throw 'oh no', onPlatform: {"browser": new Skip()}); |
| 510 } | 449 } |
| 511 '''); | 450 ''').create(); |
| 512 | 451 |
| 513 var result = _runTest(["-p", "content-shell", "test.dart"]); | 452 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 514 expect(result.stdout, contains("+0 ~1: All tests skipped.")); | 453 test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped."))); |
| 454 test.shouldExit(0); |
| 515 }); | 455 }); |
| 516 | 456 |
| 517 test("ignores non-matching Skips", () { | 457 test("ignores non-matching Skips", () { |
| 518 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 458 d.file("test.dart", ''' |
| 519 import 'dart:async'; | 459 import 'dart:async'; |
| 520 | 460 |
| 521 import 'package:test/test.dart'; | 461 import 'package:test/test.dart'; |
| 522 | 462 |
| 523 void main() { | 463 void main() { |
| 524 test("success", () {}, onPlatform: {"vm": new Skip()}); | 464 test("success", () {}, onPlatform: {"vm": new Skip()}); |
| 525 } | 465 } |
| 526 '''); | 466 ''').create(); |
| 527 | 467 |
| 528 var result = _runTest(["-p", "content-shell", "test.dart"]); | 468 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 529 expect(result.stdout, contains("+1: All tests passed!")); | 469 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 470 test.shouldExit(0); |
| 530 }); | 471 }); |
| 531 | 472 |
| 532 test("respects matching Timeouts", () { | 473 test("respects matching Timeouts", () { |
| 533 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 474 d.file("test.dart", ''' |
| 534 import 'dart:async'; | 475 import 'dart:async'; |
| 535 | 476 |
| 536 import 'package:test/test.dart'; | 477 import 'package:test/test.dart'; |
| 537 | 478 |
| 538 void main() { | 479 void main() { |
| 539 test("fail", () => throw 'oh no', onPlatform: { | 480 test("fail", () => throw 'oh no', onPlatform: { |
| 540 "browser": new Timeout(new Duration(seconds: 0)) | 481 "browser": new Timeout(new Duration(seconds: 0)) |
| 541 }); | 482 }); |
| 542 } | 483 } |
| 543 '''); | 484 ''').create(); |
| 544 | 485 |
| 545 var result = _runTest(["-p", "content-shell", "test.dart"]); | 486 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 546 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 487 test.stdout.expect(containsInOrder([ |
| 547 expect(result.stdout, contains("-1: Some tests failed.")); | 488 "Test timed out after 0 seconds.", |
| 489 "-1: Some tests failed." |
| 490 ])); |
| 491 test.shouldExit(1); |
| 548 }); | 492 }); |
| 549 | 493 |
| 550 test("ignores non-matching Timeouts", () { | 494 test("ignores non-matching Timeouts", () { |
| 551 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 495 d.file("test.dart", ''' |
| 552 import 'dart:async'; | 496 import 'dart:async'; |
| 553 | 497 |
| 554 import 'package:test/test.dart'; | 498 import 'package:test/test.dart'; |
| 555 | 499 |
| 556 void main() { | 500 void main() { |
| 557 test("success", () {}, onPlatform: { | 501 test("success", () {}, onPlatform: { |
| 558 "vm": new Timeout(new Duration(seconds: 0)) | 502 "vm": new Timeout(new Duration(seconds: 0)) |
| 559 }); | 503 }); |
| 560 } | 504 } |
| 561 '''); | 505 ''').create(); |
| 562 | 506 |
| 563 var result = _runTest(["-p", "content-shell", "test.dart"]); | 507 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 564 expect(result.stdout, contains("+1: All tests passed!")); | 508 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 509 test.shouldExit(0); |
| 565 }); | 510 }); |
| 566 | 511 |
| 567 test("applies matching platforms in order", () { | 512 test("applies matching platforms in order", () { |
| 568 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 513 d.file("test.dart", ''' |
| 569 import 'dart:async'; | 514 import 'dart:async'; |
| 570 | 515 |
| 571 import 'package:test/test.dart'; | 516 import 'package:test/test.dart'; |
| 572 | 517 |
| 573 void main() { | 518 void main() { |
| 574 test("success", () {}, onPlatform: { | 519 test("success", () {}, onPlatform: { |
| 575 "browser": new Skip("first"), | 520 "browser": new Skip("first"), |
| 576 "browser || windows": new Skip("second"), | 521 "browser || windows": new Skip("second"), |
| 577 "browser || linux": new Skip("third"), | 522 "browser || linux": new Skip("third"), |
| 578 "browser || mac-os": new Skip("fourth"), | 523 "browser || mac-os": new Skip("fourth"), |
| 579 "browser || android": new Skip("fifth") | 524 "browser || android": new Skip("fifth") |
| 580 }); | 525 }); |
| 581 } | 526 } |
| 582 '''); | 527 ''').create(); |
| 583 | 528 |
| 584 var result = _runTest(["-p", "content-shell", "test.dart"]); | 529 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 585 expect(result.stdout, contains("Skip: fifth")); | 530 test.stdout.fork().expect(never(contains("Skip: first"))); |
| 586 expect(result.stdout, isNot(anyOf([ | 531 test.stdout.fork().expect(never(contains("Skip: second"))); |
| 587 contains("Skip: first"), | 532 test.stdout.fork().expect(never(contains("Skip: third"))); |
| 588 contains("Skip: second"), | 533 test.stdout.fork().expect(never(contains("Skip: fourth"))); |
| 589 contains("Skip: third"), | 534 test.stdout.expect(consumeThrough(contains("Skip: fifth"))); |
| 590 contains("Skip: fourth") | 535 test.shouldExit(0); |
| 591 ]))); | |
| 592 }); | 536 }); |
| 593 }); | 537 }); |
| 594 | 538 |
| 595 group("with an @OnPlatform annotation", () { | 539 group("with an @OnPlatform annotation", () { |
| 596 test("respects matching Skips", () { | 540 test("respects matching Skips", () { |
| 597 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 541 d.file("test.dart", ''' |
| 598 @OnPlatform(const {"browser": const Skip()}) | 542 @OnPlatform(const {"browser": const Skip()}) |
| 599 | 543 |
| 600 import 'dart:async'; | 544 import 'dart:async'; |
| 601 | 545 |
| 602 import 'package:test/test.dart'; | 546 import 'package:test/test.dart'; |
| 603 | 547 |
| 604 void main() { | 548 void main() { |
| 605 test("fail", () => throw 'oh no'); | 549 test("fail", () => throw 'oh no'); |
| 606 } | 550 } |
| 607 '''); | 551 ''').create(); |
| 608 | 552 |
| 609 var result = _runTest(["-p", "content-shell", "test.dart"]); | 553 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 610 expect(result.stdout, contains("+0 ~1: All tests skipped.")); | 554 test.stdout.expect(consumeThrough(contains("~1: All tests skipped."))); |
| 555 test.shouldExit(0); |
| 611 }); | 556 }); |
| 612 | 557 |
| 613 test("ignores non-matching Skips", () { | 558 test("ignores non-matching Skips", () { |
| 614 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 559 d.file("test.dart", ''' |
| 615 @OnPlatform(const {"vm": const Skip()}) | 560 @OnPlatform(const {"vm": const Skip()}) |
| 616 | 561 |
| 617 import 'dart:async'; | 562 import 'dart:async'; |
| 618 | 563 |
| 619 import 'package:test/test.dart'; | 564 import 'package:test/test.dart'; |
| 620 | 565 |
| 621 void main() { | 566 void main() { |
| 622 test("success", () {}); | 567 test("success", () {}); |
| 623 } | 568 } |
| 624 '''); | 569 ''').create(); |
| 625 | 570 |
| 626 var result = _runTest(["-p", "content-shell", "test.dart"]); | 571 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 627 expect(result.stdout, contains("+1: All tests passed!")); | 572 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 573 test.shouldExit(0); |
| 628 }); | 574 }); |
| 629 | 575 |
| 630 test("respects matching Timeouts", () { | 576 test("respects matching Timeouts", () { |
| 631 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 577 d.file("test.dart", ''' |
| 632 @OnPlatform(const { | 578 @OnPlatform(const { |
| 633 "browser": const Timeout(const Duration(seconds: 0)) | 579 "browser": const Timeout(const Duration(seconds: 0)) |
| 634 }) | 580 }) |
| 635 | 581 |
| 636 import 'dart:async'; | 582 import 'dart:async'; |
| 637 | 583 |
| 638 import 'package:test/test.dart'; | 584 import 'package:test/test.dart'; |
| 639 | 585 |
| 640 void main() { | 586 void main() { |
| 641 test("fail", () => throw 'oh no'); | 587 test("fail", () => throw 'oh no'); |
| 642 } | 588 } |
| 643 '''); | 589 ''').create(); |
| 644 | 590 |
| 645 var result = _runTest(["-p", "content-shell", "test.dart"]); | 591 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 646 expect(result.stdout, contains("Test timed out after 0 seconds.")); | 592 test.stdout.expect(containsInOrder([ |
| 647 expect(result.stdout, contains("-1: Some tests failed.")); | 593 "Test timed out after 0 seconds.", |
| 594 "-1: Some tests failed." |
| 595 ])); |
| 596 test.shouldExit(1); |
| 648 }); | 597 }); |
| 649 | 598 |
| 650 test("ignores non-matching Timeouts", () { | 599 test("ignores non-matching Timeouts", () { |
| 651 new File(p.join(_sandbox, "test.dart")).writeAsStringSync(''' | 600 d.file("test.dart", ''' |
| 652 @OnPlatform(const { | 601 @OnPlatform(const { |
| 653 "vm": const Timeout(const Duration(seconds: 0)) | 602 "vm": const Timeout(const Duration(seconds: 0)) |
| 654 }) | 603 }) |
| 655 | 604 |
| 656 import 'dart:async'; | 605 import 'dart:async'; |
| 657 | 606 |
| 658 import 'package:test/test.dart'; | 607 import 'package:test/test.dart'; |
| 659 | 608 |
| 660 void main() { | 609 void main() { |
| 661 test("success", () {}); | 610 test("success", () {}); |
| 662 } | 611 } |
| 663 '''); | 612 ''').create(); |
| 664 | 613 |
| 665 var result = _runTest(["-p", "content-shell", "test.dart"]); | 614 var test = runTest(["-p", "content-shell", "test.dart"]); |
| 666 expect(result.stdout, contains("+1: All tests passed!")); | 615 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
| 616 test.shouldExit(0); |
| 667 }); | 617 }); |
| 668 }); | 618 }); |
| 669 } | 619 } |
| 670 | |
| 671 ProcessResult _runTest(List<String> args) => | |
| 672 runTest(args, workingDirectory: _sandbox); | |
| OLD | NEW |