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 'package:scheduled_test/descriptor.dart' as d; | 7 import 'package:scheduled_test/descriptor.dart' as d; |
8 import 'package:scheduled_test/scheduled_process.dart'; | |
9 import 'package:scheduled_test/scheduled_stream.dart'; | 8 import 'package:scheduled_test/scheduled_stream.dart'; |
10 import 'package:scheduled_test/scheduled_test.dart'; | 9 import 'package:scheduled_test/scheduled_test.dart'; |
11 | 10 |
12 import '../io.dart'; | 11 import '../io.dart'; |
13 | 12 |
14 void main() { | 13 void main() { |
15 useSandbox(); | 14 useSandbox(); |
16 | 15 |
17 setUp(() { | 16 setUp(() { |
18 d.file("test.dart", """ | 17 d.file("test.dart", """ |
19 import 'package:test/test.dart'; | 18 import 'package:test/test.dart'; |
20 | 19 |
21 void main() { | 20 void main() { |
22 test("no tags", () {}); | 21 test("no tags", () {}); |
23 test("a", () {}, tags: "a"); | 22 test("a", () {}, tags: "a"); |
24 test("b", () {}, tags: "b"); | 23 test("b", () {}, tags: "b"); |
25 test("bc", () {}, tags: ["b", "c"]); | 24 test("bc", () {}, tags: ["b", "c"]); |
26 } | 25 } |
27 """).create(); | 26 """).create(); |
28 }); | 27 }); |
29 | 28 |
30 group("--tags", () { | 29 group("--tags", () { |
31 test("runs all tests when no tags are specified", () { | 30 test("runs all tests when no tags are specified", () { |
32 var test = runTest(["test.dart"]); | 31 var test = runTest(["test.dart"]); |
| 32 test.stdout.expect(tagWarnings(['a', 'b', 'c'])); |
33 test.stdout.expect(consumeThrough(contains(": no tags"))); | 33 test.stdout.expect(consumeThrough(contains(": no tags"))); |
34 test.stdout.expect(consumeThrough(contains(": a"))); | 34 test.stdout.expect(consumeThrough(contains(": a"))); |
35 test.stdout.expect(consumeThrough(contains(": b"))); | 35 test.stdout.expect(consumeThrough(contains(": b"))); |
36 test.stdout.expect(consumeThrough(contains(": bc"))); | 36 test.stdout.expect(consumeThrough(contains(": bc"))); |
37 test.stdout.expect(consumeThrough(contains("+4: All tests passed!"))); | 37 test.stdout.expect(consumeThrough(contains("+4: All tests passed!"))); |
38 expectTagWarnings(test, [ | |
39 ['a', 'a'], | |
40 ['b', 'b'], | |
41 ['b and c', 'bc'] | |
42 ]); | |
43 test.shouldExit(0); | 38 test.shouldExit(0); |
44 }); | 39 }); |
45 | 40 |
46 test("runs a test with only a specified tag", () { | 41 test("runs a test with only a specified tag", () { |
47 var test = runTest(["--tags=a", "test.dart"]); | 42 var test = runTest(["--tags=a", "test.dart"]); |
| 43 test.stdout.expect(tagWarnings(['b', 'c'])); |
48 test.stdout.expect(consumeThrough(contains(": a"))); | 44 test.stdout.expect(consumeThrough(contains(": a"))); |
49 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); | 45 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
50 expectTagWarnings(test, [ | |
51 ['b', 'b'], | |
52 ['b and c', 'bc'] | |
53 ]); | |
54 test.shouldExit(0); | 46 test.shouldExit(0); |
55 }); | 47 }); |
56 | 48 |
57 test("runs a test with a specified tag among others", () { | 49 test("runs a test with a specified tag among others", () { |
58 var test = runTest(["--tags=c", "test.dart"]); | 50 var test = runTest(["--tags=c", "test.dart"]); |
| 51 test.stdout.expect(tagWarnings(['a', 'b'])); |
59 test.stdout.expect(consumeThrough(contains(": bc"))); | 52 test.stdout.expect(consumeThrough(contains(": bc"))); |
60 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); | 53 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
61 expectTagWarnings(test, [ | |
62 ['a', 'a'], | |
63 ['b', 'b'], | |
64 ['b', 'bc'] | |
65 ]); | |
66 test.shouldExit(0); | 54 test.shouldExit(0); |
67 }); | 55 }); |
68 | 56 |
69 test("with multiple tags, runs only tests matching all of them", () { | 57 test("with multiple tags, runs only tests matching all of them", () { |
70 var test = runTest(["--tags=b,c", "test.dart"]); | 58 var test = runTest(["--tags=b,c", "test.dart"]); |
| 59 test.stdout.expect(tagWarnings(['a'])); |
71 test.stdout.expect(consumeThrough(contains(": bc"))); | 60 test.stdout.expect(consumeThrough(contains(": bc"))); |
72 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); | 61 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
73 expectTagWarnings(test, [ | |
74 ['a', 'a'] | |
75 ]); | |
76 test.shouldExit(0); | 62 test.shouldExit(0); |
77 }); | 63 }); |
78 | 64 |
79 test("prints no warnings when all tags are specified", () { | 65 test("prints no warnings when all tags are specified", () { |
80 var test = runTest(["--tags=a,b,c", "test.dart"]); | 66 var test = runTest(["--tags=a,b,c", "test.dart"]); |
81 test.stdout.expect(consumeThrough(contains("No tests ran."))); | 67 test.stdout.expect(consumeThrough(contains("No tests ran."))); |
82 expectTagWarnings(test, []); | |
83 test.shouldExit(0); | 68 test.shouldExit(0); |
84 }); | 69 }); |
85 }); | 70 }); |
86 | 71 |
87 group("--exclude-tags", () { | 72 group("--exclude-tags", () { |
88 test("dosn't run a test with only an excluded tag", () { | 73 test("dosn't run a test with only an excluded tag", () { |
89 var test = runTest(["--exclude-tags=a", "test.dart"]); | 74 var test = runTest(["--exclude-tags=a", "test.dart"]); |
| 75 test.stdout.expect(tagWarnings(['b', 'c'])); |
90 test.stdout.expect(consumeThrough(contains(": no tags"))); | 76 test.stdout.expect(consumeThrough(contains(": no tags"))); |
91 test.stdout.expect(consumeThrough(contains(": b"))); | 77 test.stdout.expect(consumeThrough(contains(": b"))); |
92 test.stdout.expect(consumeThrough(contains(": bc"))); | 78 test.stdout.expect(consumeThrough(contains(": bc"))); |
93 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); | 79 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); |
94 expectTagWarnings(test, [ | |
95 ['b', 'b'], | |
96 ['b and c', 'bc'], | |
97 ]); | |
98 test.shouldExit(0); | 80 test.shouldExit(0); |
99 }); | 81 }); |
100 | 82 |
101 test("doesn't run a test with an exluded tag among others", () { | 83 test("doesn't run a test with an exluded tag among others", () { |
102 var test = runTest(["--exclude-tags=c", "test.dart"]); | 84 var test = runTest(["--exclude-tags=c", "test.dart"]); |
| 85 test.stdout.expect(tagWarnings(['a', 'b'])); |
103 test.stdout.expect(consumeThrough(contains(": no tags"))); | 86 test.stdout.expect(consumeThrough(contains(": no tags"))); |
104 test.stdout.expect(consumeThrough(contains(": a"))); | 87 test.stdout.expect(consumeThrough(contains(": a"))); |
105 test.stdout.expect(consumeThrough(contains(": b"))); | 88 test.stdout.expect(consumeThrough(contains(": b"))); |
106 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); | 89 test.stdout.expect(consumeThrough(contains("+3: All tests passed!"))); |
107 expectTagWarnings(test, [ | |
108 ['a', 'a'], | |
109 ['b', 'b'], | |
110 ['b', 'bc'], | |
111 ]); | |
112 test.shouldExit(0); | 90 test.shouldExit(0); |
113 }); | 91 }); |
114 | 92 |
115 test("allows unused tags", () { | 93 test("allows unused tags", () { |
116 var test = runTest(["--exclude-tags=b,z", "test.dart"]); | 94 var test = runTest(["--exclude-tags=b,z", "test.dart"]); |
| 95 test.stdout.expect(tagWarnings(['a', 'c'])); |
117 test.stdout.expect(consumeThrough(contains(": no tags"))); | 96 test.stdout.expect(consumeThrough(contains(": no tags"))); |
118 test.stdout.expect(consumeThrough(contains(": a"))); | 97 test.stdout.expect(consumeThrough(contains(": a"))); |
119 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); | 98 test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
120 expectTagWarnings(test, [ | |
121 ['a', 'a'], | |
122 ['c', 'bc'], | |
123 ]); | |
124 test.shouldExit(0); | 99 test.shouldExit(0); |
125 }); | 100 }); |
126 | 101 |
127 test("prints no warnings when all tags are specified", () { | 102 test("prints no warnings when all tags are specified", () { |
128 var test = runTest(["--exclude-tags=a,b,c", "test.dart"]); | 103 var test = runTest(["--exclude-tags=a,b,c", "test.dart"]); |
129 test.stdout.expect(consumeThrough(contains(": no tags"))); | 104 test.stdout.expect(consumeThrough(contains(": no tags"))); |
130 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); | 105 test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
131 expectTagWarnings(test, []); | |
132 test.shouldExit(0); | 106 test.shouldExit(0); |
133 }); | 107 }); |
134 }); | 108 }); |
135 | 109 |
136 group("with a tagged group", () { | 110 group("with a tagged group", () { |
137 setUp(() { | 111 setUp(() { |
138 d.file("test.dart", """ | 112 d.file("test.dart", """ |
139 import 'package:test/test.dart'; | 113 import 'package:test/test.dart'; |
140 | 114 |
141 void main() { | 115 void main() { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 | 160 |
187 void main() { | 161 void main() { |
188 test("foo", () {}); | 162 test("foo", () {}); |
189 } | 163 } |
190 """).create(); | 164 """).create(); |
191 | 165 |
192 var test = runTest(["-x", "a", "test.dart"]); | 166 var test = runTest(["-x", "a", "test.dart"]); |
193 test.stdout.expect(consumeThrough(contains("No tests ran"))); | 167 test.stdout.expect(consumeThrough(contains("No tests ran"))); |
194 test.shouldExit(0); | 168 test.shouldExit(0); |
195 }); | 169 }); |
| 170 |
| 171 group("warning formatting", () { |
| 172 test("for multiple tags", () { |
| 173 d.file("test.dart", """ |
| 174 import 'package:test/test.dart'; |
| 175 |
| 176 void main() { |
| 177 test("foo", () {}, tags: ["a", "b"]); |
| 178 } |
| 179 """).create(); |
| 180 |
| 181 var test = runTest(["test.dart"]); |
| 182 test.stdout.expect(consumeThrough(lines( |
| 183 'Warning: Tags were used that weren\'t specified on the command ' |
| 184 'line.\n' |
| 185 ' a was used in the test "foo"\n' |
| 186 ' b was used in the test "foo"'))); |
| 187 test.shouldExit(0); |
| 188 }); |
| 189 |
| 190 test("for multiple tests", () { |
| 191 d.file("test.dart", """ |
| 192 import 'package:test/test.dart'; |
| 193 |
| 194 void main() { |
| 195 test("foo", () {}, tags: "a"); |
| 196 test("bar", () {}, tags: "a"); |
| 197 } |
| 198 """).create(); |
| 199 |
| 200 var test = runTest(["test.dart"]); |
| 201 test.stdout.expect(consumeThrough(lines( |
| 202 'Warning: A tag was used that wasn\'t specified on the command ' |
| 203 'line.\n' |
| 204 ' a was used in:\n' |
| 205 ' the test "foo"\n' |
| 206 ' the test "bar"'))); |
| 207 test.shouldExit(0); |
| 208 }); |
| 209 |
| 210 test("for groups", () { |
| 211 d.file("test.dart", """ |
| 212 import 'package:test/test.dart'; |
| 213 |
| 214 void main() { |
| 215 group("group", () { |
| 216 test("foo", () {}); |
| 217 test("bar", () {}); |
| 218 }, tags: "a"); |
| 219 } |
| 220 """).create(); |
| 221 |
| 222 var test = runTest(["test.dart"]); |
| 223 test.stdout.expect(consumeThrough(lines( |
| 224 'Warning: A tag was used that wasn\'t specified on the command ' |
| 225 'line.\n' |
| 226 ' a was used in the group "group"'))); |
| 227 test.shouldExit(0); |
| 228 }); |
| 229 |
| 230 test("for suites", () { |
| 231 d.file("test.dart", """ |
| 232 @Tags(const ["a"]) |
| 233 import 'package:test/test.dart'; |
| 234 |
| 235 void main() { |
| 236 test("foo", () {}); |
| 237 test("bar", () {}); |
| 238 } |
| 239 """).create(); |
| 240 |
| 241 var test = runTest(["test.dart"]); |
| 242 test.stdout.expect(consumeThrough(lines( |
| 243 'Warning: A tag was used that wasn\'t specified on the command ' |
| 244 'line.\n' |
| 245 ' a was used in the suite itself'))); |
| 246 test.shouldExit(0); |
| 247 }); |
| 248 |
| 249 test("doesn't double-print a tag warning", () { |
| 250 d.file("test.dart", """ |
| 251 import 'package:test/test.dart'; |
| 252 |
| 253 void main() { |
| 254 test("foo", () {}, tags: "a"); |
| 255 } |
| 256 """).create(); |
| 257 |
| 258 var test = runTest(["-p", "vm,content-shell", "test.dart"]); |
| 259 test.stdout.expect(consumeThrough(lines( |
| 260 'Warning: A tag was used that wasn\'t specified on the command ' |
| 261 'line.\n' |
| 262 ' a was used in the test "foo"'))); |
| 263 test.stdout.expect(never(startsWith("Warning:"))); |
| 264 test.shouldExit(0); |
| 265 }); |
| 266 }); |
196 } | 267 } |
197 | 268 |
198 /// Asserts that [test] emits [warnings] in order. | 269 /// Returns a [StreamMatcher] that asserts that a test emits warnings for [tags] |
199 /// | 270 /// in order. |
200 /// Each element of [warnings] should be a pair whose first element is the | 271 StreamMatcher tagWarnings(List<String> tags) => inOrder(() sync* { |
201 /// unrecognized tags and whose second is the name of the test in which they | 272 yield consumeThrough( |
202 /// were detected. | 273 "Warning: ${tags.length == 1 ? 'A tag was' : 'Tags were'} used that " |
203 expectTagWarnings(ScheduledProcess test, List<List<String>> warnings) { | 274 "${tags.length == 1 ? "wasn't" : "weren't"} specified on the command " |
204 for (var warning in warnings) { | 275 "line."); |
205 test.stderr.expect(consumeThrough(allOf([ | 276 |
206 startsWith("Warning: Unknown tag"), | 277 for (var tag in tags) { |
207 endsWith('${warning.first} in test "${warning.last}".') | 278 yield consumeWhile(isNot(contains(" was used in"))); |
208 ]))); | 279 yield consumeThrough(startsWith(" $tag was used in")); |
209 } | 280 } |
210 test.stderr.expect(never(startsWith("Warning:"))); | 281 |
211 } | 282 // Consume until the end of the warning block, and assert that it has no |
| 283 // further tags than the ones we specified. |
| 284 yield consumeWhile(isNot(anyOf([contains(" was used in"), isEmpty]))); |
| 285 yield isEmpty; |
| 286 }()); |
| 287 |
| 288 /// Returns a [StreamMatcher] that matches the lines of [string] in order. |
| 289 StreamMatcher lines(String string) => inOrder(string.split("\n")); |
OLD | NEW |