Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| 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. | |
| 4 | |
| 5 library barback.test.package_graph.cluster_test; | |
| 6 | |
| 7 import 'package:barback/barback.dart'; | |
| 8 import 'package:scheduled_test/scheduled_test.dart'; | |
| 9 | |
| 10 import '../utils.dart'; | |
| 11 | |
| 12 main() { | |
| 13 initConfig(); | |
| 14 test("runs transforms in a cluster", () { | |
| 15 initGraph(["app|foo.a"], {"app": [ | |
| 16 [new TransformerCluster([ | |
| 17 [new RewriteTransformer("a", "b")], | |
| 18 [new RewriteTransformer("b", "c")] | |
| 19 ])] | |
| 20 ]}); | |
| 21 updateSources(["app|foo.a"]); | |
| 22 expectNoAsset("app|foo.b"); | |
| 23 expectAsset("app|foo.c", "foo.b.c"); | |
| 24 buildShouldSucceed(); | |
| 25 }); | |
| 26 | |
| 27 test("passes the output of a cluster to the next phase", () { | |
| 28 initGraph(["app|foo.a"], {"app": [ | |
| 29 [new TransformerCluster([ | |
| 30 [new RewriteTransformer("a", "b")], | |
| 31 [new RewriteTransformer("b", "c")] | |
| 32 ])], | |
| 33 [new RewriteTransformer("c", "d")] | |
| 34 ]}); | |
| 35 updateSources(["app|foo.a"]); | |
| 36 expectNoAsset("app|foo.c"); | |
| 37 expectAsset("app|foo.d", "foo.b.c.d"); | |
| 38 buildShouldSucceed(); | |
| 39 }); | |
| 40 | |
| 41 test("passes the output of a previous phase to a cluster", () { | |
| 42 initGraph(["app|foo.a"], {"app": [ | |
| 43 [new RewriteTransformer("a", "b")], | |
| 44 [new TransformerCluster([ | |
| 45 [new RewriteTransformer("b", "c")], | |
| 46 [new RewriteTransformer("c", "d")] | |
| 47 ])] | |
| 48 ]}); | |
| 49 updateSources(["app|foo.a"]); | |
| 50 expectNoAsset("app|foo.b"); | |
| 51 expectAsset("app|foo.d", "foo.b.c.d"); | |
| 52 buildShouldSucceed(); | |
| 53 }); | |
| 54 | |
| 55 test("intermediate assets in a cluster are usable as secondary inputs within " | |
| 56 "that cluster", () { | |
| 57 initGraph({ | |
| 58 "app|foo.a": "foo", | |
|
Bob Nystrom
2013/10/04 21:47:50
Using "foo" both as the file name and content is a
nweiz
2013/10/07 23:21:31
Done. I did that because that's the default conten
| |
| 59 "app|bar.txt": "foo.inc" | |
| 60 }, {"app": [ | |
| 61 [new TransformerCluster([ | |
| 62 [new RewriteTransformer("a", "inc")], | |
| 63 [new ManyToOneTransformer("txt")] | |
| 64 ])] | |
| 65 ]}); | |
| 66 | |
| 67 updateSources(["app|foo.a", "app|bar.txt"]); | |
| 68 expectAsset("app|bar.out", "foo.inc"); | |
| 69 buildShouldSucceed(); | |
| 70 }); | |
| 71 | |
| 72 test("clusters can be nested", () { | |
| 73 initGraph(["app|foo.a", "app|bar.x"], {"app": [ | |
| 74 [new TransformerCluster([ | |
| 75 [new TransformerCluster([ | |
| 76 [new RewriteTransformer("a", "b")], | |
| 77 [new RewriteTransformer("b", "c")] | |
| 78 ]), new TransformerCluster([ | |
| 79 [new RewriteTransformer("x", "y"), new RewriteTransformer("a", "y")], | |
| 80 [new RewriteTransformer("y", "z")] | |
| 81 ])], | |
| 82 [new RewriteTransformer("c", "d")] | |
| 83 ])] | |
| 84 ]}); | |
| 85 updateSources(["app|foo.a", "app|bar.x"]); | |
| 86 expectAsset("app|foo.d", "foo.b.c.d"); | |
| 87 expectAsset("app|foo.z", "foo.y.z"); | |
| 88 expectAsset("app|bar.z", "bar.y.z"); | |
| 89 buildShouldSucceed(); | |
| 90 }); | |
| 91 | |
| 92 test("an updated asset is propagated through a cluster", () { | |
| 93 initGraph(["app|foo.a"], {"app": [ | |
| 94 [new TransformerCluster([ | |
| 95 [new RewriteTransformer("a", "b")], | |
| 96 [new RewriteTransformer("b", "c")] | |
| 97 ])] | |
| 98 ]}); | |
| 99 | |
| 100 updateSources(["app|foo.a"]); | |
| 101 expectNoAsset("app|foo.b"); | |
| 102 expectAsset("app|foo.c", "foo.b.c"); | |
| 103 buildShouldSucceed(); | |
| 104 | |
| 105 modifyAsset("app|foo.a", "new foo"); | |
| 106 updateSources(["app|foo.a"]); | |
| 107 expectAsset("app|foo.c", "new foo.b.c"); | |
| 108 buildShouldSucceed(); | |
| 109 }); | |
| 110 | |
| 111 test("an updated asset only runs the necessary transforms in a cluster", | |
| 112 () { | |
| 113 var rewriteA = new RewriteTransformer("a", "b"); | |
| 114 var rewriteX = new RewriteTransformer("x", "b"); | |
| 115 initGraph(["app|foo.a", "app|bar.x"], {"app": [ | |
| 116 [new TransformerCluster([ | |
| 117 [rewriteA, rewriteX], | |
| 118 [new RewriteTransformer("b", "c")] | |
| 119 ])] | |
| 120 ]}); | |
| 121 | |
| 122 updateSources(["app|foo.a", "app|bar.x"]); | |
| 123 expectNoAsset("app|foo.b"); | |
| 124 expectAsset("app|foo.c", "foo.b.c"); | |
| 125 expectAsset("app|bar.c", "bar.b.c"); | |
| 126 buildShouldSucceed(); | |
| 127 | |
| 128 modifyAsset("app|foo.a", "new foo"); | |
| 129 updateSources(["app|foo.a"]); | |
| 130 expectAsset("app|foo.c", "new foo.b.c"); | |
| 131 buildShouldSucceed(); | |
| 132 | |
| 133 expect(rewriteA.numRuns, completion(equals(2))); | |
| 134 expect(rewriteX.numRuns, completion(equals(1))); | |
| 135 }); | |
| 136 | |
| 137 group("encapsulation", () { | |
| 138 test("a cluster can't see a parallel transform's outputs", () { | |
| 139 initGraph(["app|foo.x"], {"app": [ | |
| 140 [new TransformerCluster([ | |
| 141 [new RewriteTransformer("a", "b")], | |
| 142 [new RewriteTransformer("b", "c")] | |
| 143 ]), new RewriteTransformer("x", "b")] | |
|
Bob Nystrom
2013/10/04 21:47:50
Nit but can you move "new Rewrite..." to its own l
nweiz
2013/10/07 23:21:31
Done.
| |
| 144 ]}); | |
| 145 updateSources(["app|foo.x"]); | |
| 146 expectAsset("app|foo.b", "foo.b"); | |
| 147 expectNoAsset("app|foo.c"); | |
| 148 buildShouldSucceed(); | |
| 149 }); | |
| 150 | |
| 151 test("a parallel transform can't see a cluster's outputs", () { | |
| 152 initGraph(["app|foo.a"], {"app": [ | |
| 153 [new TransformerCluster([ | |
| 154 [new RewriteTransformer("a", "b")], | |
| 155 [new RewriteTransformer("b", "c")] | |
| 156 ]), new RewriteTransformer("c", "z")] | |
| 157 ]}); | |
| 158 updateSources(["app|foo.a"]); | |
| 159 expectAsset("app|foo.c", "foo.b.c"); | |
| 160 expectNoAsset("app|foo.z"); | |
| 161 buildShouldSucceed(); | |
| 162 }); | |
| 163 | |
| 164 test("a parallel transform can't see a cluster's intermediate assets", () { | |
| 165 initGraph(["app|foo.a"], {"app": [ | |
| 166 [new TransformerCluster([ | |
| 167 [new RewriteTransformer("a", "b")], | |
| 168 [new RewriteTransformer("b", "c")] | |
| 169 ]), new RewriteTransformer("b", "z")] | |
| 170 ]}); | |
| 171 updateSources(["app|foo.a"]); | |
| 172 expectAsset("app|foo.c", "foo.b.c"); | |
| 173 expectNoAsset("app|foo.z"); | |
| 174 buildShouldSucceed(); | |
| 175 }); | |
| 176 | |
| 177 test("parallel clusters can't see one another's intermediate assets", () { | |
|
Bob Nystrom
2013/10/04 21:47:50
What happens if intermediates in two clusters coll
nweiz
2013/10/07 23:21:31
Done.
| |
| 178 initGraph(["app|foo.a", "app|bar.x"], {"app": [ | |
| 179 [new TransformerCluster([ | |
| 180 [new RewriteTransformer("a", "b")], | |
| 181 [new RewriteTransformer("b", "c")] | |
| 182 ]), new TransformerCluster([ | |
| 183 [new RewriteTransformer("x", "b")], | |
| 184 [new RewriteTransformer("b", "z")] | |
| 185 ])] | |
| 186 ]}); | |
| 187 updateSources(["app|foo.a", "app|bar.x"]); | |
| 188 expectAsset("app|foo.c", "foo.b.c"); | |
| 189 expectAsset("app|bar.z", "bar.b.z"); | |
| 190 expectNoAsset("app|foo.z"); | |
| 191 expectNoAsset("app|bar.c"); | |
| 192 buildShouldSucceed(); | |
| 193 }); | |
| 194 }); | |
| 195 | |
| 196 group("pass-through", () { | |
| 197 test("passes an unused input through a cluster", () { | |
| 198 initGraph(["app|foo.x"], {"app": [ | |
| 199 [new TransformerCluster([ | |
| 200 [new RewriteTransformer("a", "b")], | |
| 201 [new RewriteTransformer("b", "c")] | |
| 202 ])] | |
| 203 ]}); | |
| 204 updateSources(["app|foo.x"]); | |
| 205 expectNoAsset("app|foo.c"); | |
| 206 expectAsset("app|foo.x", "foo"); | |
| 207 buildShouldSucceed(); | |
| 208 }); | |
| 209 | |
| 210 test("passes an unused input through parallel clusters", () { | |
| 211 initGraph(["app|foo.x"], {"app": [ | |
| 212 [new TransformerCluster([ | |
| 213 [new RewriteTransformer("a", "b")], | |
| 214 [new RewriteTransformer("b", "c")] | |
| 215 ]), new TransformerCluster([ | |
| 216 [new RewriteTransformer("1", "2")], | |
| 217 [new RewriteTransformer("2", "3")] | |
| 218 ])] | |
| 219 ]}); | |
| 220 updateSources(["app|foo.x"]); | |
| 221 expectNoAsset("app|foo.c"); | |
| 222 expectNoAsset("app|foo.3"); | |
| 223 expectAsset("app|foo.x", "foo"); | |
| 224 buildShouldSucceed(); | |
| 225 }); | |
| 226 | |
| 227 test("passes an unused input through a cluster and a transform", () { | |
| 228 initGraph(["app|foo.x"], {"app": [ | |
| 229 [new TransformerCluster([ | |
| 230 [new RewriteTransformer("a", "b")], | |
| 231 [new RewriteTransformer("b", "c")] | |
| 232 ]), new RewriteTransformer("1", "2")] | |
| 233 ]}); | |
| 234 updateSources(["app|foo.x"]); | |
| 235 expectNoAsset("app|foo.c"); | |
| 236 expectNoAsset("app|foo.2"); | |
| 237 expectAsset("app|foo.x", "foo"); | |
| 238 buildShouldSucceed(); | |
| 239 }); | |
| 240 | |
| 241 test("doesn't pass through an input that's used by a cluster but not by " | |
| 242 "transformers", () { | |
| 243 initGraph(["app|foo.a"], {"app": [ | |
| 244 [new TransformerCluster([ | |
| 245 [new RewriteTransformer("a", "b")], | |
| 246 [new RewriteTransformer("b", "c")] | |
| 247 ]), new RewriteTransformer("x", "y")] | |
| 248 ]}); | |
| 249 updateSources(["app|foo.a"]); | |
| 250 expectNoAsset("app|foo.a"); | |
| 251 expectNoAsset("app|foo.y"); | |
| 252 expectAsset("app|foo.c", "foo.b.c"); | |
| 253 buildShouldSucceed(); | |
| 254 }); | |
| 255 | |
| 256 test("doesn't pass through an input that's used by transformers but not by " | |
| 257 "a cluster", () { | |
| 258 initGraph(["app|foo.x"], {"app": [ | |
| 259 [new TransformerCluster([ | |
| 260 [new RewriteTransformer("a", "b")], | |
| 261 [new RewriteTransformer("b", "c")] | |
| 262 ]), new RewriteTransformer("x", "y")] | |
| 263 ]}); | |
| 264 updateSources(["app|foo.x"]); | |
| 265 expectNoAsset("app|foo.x"); | |
| 266 expectNoAsset("app|foo.c"); | |
| 267 expectAsset("app|foo.y", "foo.y"); | |
| 268 buildShouldSucceed(); | |
| 269 }); | |
| 270 | |
| 271 test("doesn't detect a collision for an input that's modified in-place by " | |
| 272 "a transformer", () { | |
| 273 initGraph(["app|foo.x"], {"app": [ | |
| 274 [new TransformerCluster([ | |
| 275 [new RewriteTransformer("a", "b")], | |
| 276 [new RewriteTransformer("b", "c")] | |
| 277 ]), new RewriteTransformer("x", "x")] | |
| 278 ]}); | |
| 279 updateSources(["app|foo.x"]); | |
| 280 expectAsset("app|foo.x", "foo.x"); | |
| 281 buildShouldSucceed(); | |
| 282 }); | |
| 283 | |
| 284 test("doesn't detect a collision for an input that's modified in-place by " | |
| 285 "a cluster", () { | |
| 286 initGraph(["app|foo.a"], {"app": [ | |
| 287 [ | |
| 288 new TransformerCluster([[new RewriteTransformer("a", "a")]]), | |
| 289 new RewriteTransformer("x", "y") | |
| 290 ] | |
| 291 ]}); | |
| 292 updateSources(["app|foo.a"]); | |
| 293 expectAsset("app|foo.a", "foo.a"); | |
| 294 buildShouldSucceed(); | |
| 295 }); | |
| 296 }); | |
| 297 | |
| 298 test("runs transforms in an added cluster", () { | |
| 299 var rewrite = new RewriteTransformer("a", "z"); | |
| 300 initGraph(["app|foo.a"], {"app": [[rewrite]]}); | |
| 301 | |
| 302 updateSources(["app|foo.a"]); | |
| 303 expectAsset("app|foo.z", "foo.z"); | |
| 304 buildShouldSucceed(); | |
| 305 | |
| 306 updateOperators("app", [ | |
| 307 [rewrite, new TransformerCluster([ | |
| 308 [new RewriteTransformer("a", "b")], | |
| 309 [new RewriteTransformer("b", "c")] | |
| 310 ])] | |
| 311 ]); | |
|
Bob Nystrom
2013/10/04 21:47:50
Style nit, but I think this is a better:
updateOp
nweiz
2013/10/07 23:21:31
Done.
| |
| 312 expectAsset("app|foo.z", "foo.z"); | |
| 313 expectAsset("app|foo.c", "foo.b.c"); | |
| 314 buildShouldSucceed(); | |
| 315 }); | |
| 316 | |
| 317 test("doesn't re-run transforms in a re-added cluster", () { | |
| 318 var rewrite1 = new RewriteTransformer("a", "b"); | |
| 319 var rewrite2 = new RewriteTransformer("b", "c"); | |
| 320 var cluster = new TransformerCluster([[rewrite1], [rewrite2]]); | |
| 321 initGraph(["app|foo.a"], {"app": [[cluster]]}); | |
| 322 | |
| 323 updateSources(["app|foo.a"]); | |
| 324 expectAsset("app|foo.c", "foo.b.c"); | |
| 325 buildShouldSucceed(); | |
| 326 | |
| 327 updateOperators("app", [ | |
| 328 [cluster, new RewriteTransformer("a", "z")] | |
| 329 ]); | |
| 330 expectAsset("app|foo.c", "foo.b.c"); | |
| 331 expectAsset("app|foo.z", "foo.z"); | |
| 332 buildShouldSucceed(); | |
| 333 | |
| 334 expect(rewrite1.numRuns, completion(equals(1))); | |
| 335 expect(rewrite2.numRuns, completion(equals(1))); | |
| 336 }); | |
| 337 | |
| 338 test("doesn't pass through an input that's used by an added cluster", () { | |
| 339 var rewrite = new RewriteTransformer("x", "z"); | |
| 340 initGraph(["app|foo.a"], {"app": [[rewrite]]}); | |
| 341 | |
| 342 updateSources(["app|foo.a"]); | |
| 343 expectAsset("app|foo.a", "foo"); | |
| 344 buildShouldSucceed(); | |
| 345 | |
| 346 updateOperators("app", [ | |
| 347 [rewrite, new TransformerCluster([ | |
| 348 [new RewriteTransformer("a", "b")], | |
| 349 [new RewriteTransformer("b", "c")] | |
| 350 ])] | |
| 351 ]); | |
| 352 expectNoAsset("app|foo.a"); | |
| 353 expectAsset("app|foo.c", "foo.b.c"); | |
| 354 buildShouldSucceed(); | |
| 355 }); | |
| 356 | |
| 357 // TODO(nweiz): make the collision error message nice | |
| 358 test("reports collisions within a cluster", () { | |
| 359 initGraph(["app|foo.a", "app|foo.x"], {"app": [ | |
| 360 [new TransformerCluster([ | |
| 361 [new RewriteTransformer("a", "b")], | |
| 362 [new RewriteTransformer("x", "b")] | |
| 363 ])] | |
| 364 ]}); | |
| 365 updateSources(["app|foo.a", "app|foo.x"]); | |
| 366 buildShouldFail([isAssetCollisionException("app|foo.b")]); | |
| 367 }); | |
| 368 | |
| 369 test("reports collisions between a cluster and a non-clustered transform", | |
| 370 () { | |
| 371 initGraph(["app|foo.a", "app|foo.x"], {"app": [ | |
| 372 [new TransformerCluster([ | |
| 373 [new RewriteTransformer("a", "b")], | |
| 374 [new RewriteTransformer("b", "c")] | |
| 375 ]), new RewriteTransformer("x", "c")] | |
| 376 ]}); | |
| 377 updateSources(["app|foo.a", "app|foo.x"]); | |
| 378 buildShouldFail([isAssetCollisionException("app|foo.c")]); | |
| 379 }); | |
| 380 } | |
| OLD | NEW |