OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, 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.transform.aggregate_test; |
| 6 |
| 7 import 'package:barback/src/utils.dart'; |
| 8 import 'package:scheduled_test/scheduled_test.dart'; |
| 9 |
| 10 import '../../utils.dart'; |
| 11 |
| 12 main() { |
| 13 initConfig(); |
| 14 test("an aggregate transformer can read from multiple primary inputs", () { |
| 15 var sources = [ |
| 16 "app|dir/foo.txt", |
| 17 "app|dir/bar.txt", |
| 18 "app|dir/baz.jpg", |
| 19 "app|dir/subdir/bang.txt", |
| 20 "app|dir/subdir/qux.txt", |
| 21 "app|dir/subdir/zap.png" |
| 22 ]; |
| 23 |
| 24 initGraph(sources, {"app": [ |
| 25 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 26 ]}); |
| 27 |
| 28 updateSources(sources); |
| 29 expectAsset("app|dir/out.txt", "bar\nfoo"); |
| 30 expectAsset("app|dir/subdir/out.txt", "bang\nqux"); |
| 31 buildShouldSucceed(); |
| 32 }); |
| 33 |
| 34 test("an aggregate transformer isn't run if there are no primary inputs", () { |
| 35 var transformer = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 36 initGraph(["app|foo.zip", "app|bar.zap"], {"app": [ |
| 37 [transformer] |
| 38 ]}); |
| 39 |
| 40 updateSources(["app|foo.zip", "app|bar.zap"]); |
| 41 expectNoAsset("app|out.txt"); |
| 42 buildShouldSucceed(); |
| 43 |
| 44 expect(transformer.numRuns, completion(equals(0))); |
| 45 }); |
| 46 |
| 47 test("an aggregate transformer is re-run if a primary input changes", () { |
| 48 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 49 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 50 ]}); |
| 51 |
| 52 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 53 expectAsset("app|out.txt", "bar\nfoo"); |
| 54 buildShouldSucceed(); |
| 55 |
| 56 modifyAsset("app|foo.txt", "new foo"); |
| 57 updateSources(["app|foo.txt"]); |
| 58 expectAsset("app|out.txt", "bar\nnew foo"); |
| 59 buildShouldSucceed(); |
| 60 }); |
| 61 |
| 62 test("an aggregate transformer is re-run if a primary input is removed", () { |
| 63 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 64 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 65 ]}); |
| 66 |
| 67 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 68 expectAsset("app|out.txt", "bar\nfoo"); |
| 69 buildShouldSucceed(); |
| 70 |
| 71 removeSources(["app|foo.txt"]); |
| 72 expectAsset("app|out.txt", "bar"); |
| 73 buildShouldSucceed(); |
| 74 }); |
| 75 |
| 76 test("an aggregate transformer is re-run if a primary input is added", () { |
| 77 initGraph(["app|foo.txt", "app|bar.txt", "app|baz.txt"], {"app": [ |
| 78 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 79 ]}); |
| 80 |
| 81 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 82 expectAsset("app|out.txt", "bar\nfoo"); |
| 83 buildShouldSucceed(); |
| 84 |
| 85 updateSources(["app|baz.txt"]); |
| 86 expectAsset("app|out.txt", "bar\nbaz\nfoo"); |
| 87 buildShouldSucceed(); |
| 88 }); |
| 89 |
| 90 test("an aggregate transformer ceases to run if all primary inputs are " |
| 91 "removed", () { |
| 92 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 93 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 94 ]}); |
| 95 |
| 96 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 97 expectAsset("app|out.txt", "bar\nfoo"); |
| 98 buildShouldSucceed(); |
| 99 |
| 100 removeSources(["app|foo.txt", "app|bar.txt"]); |
| 101 expectNoAsset("app|out.txt"); |
| 102 buildShouldSucceed(); |
| 103 }); |
| 104 |
| 105 test("an aggregate transformer starts to run if new primary inputs are " |
| 106 "added", () { |
| 107 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 108 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 109 ]}); |
| 110 |
| 111 updateSources([]); |
| 112 expectNoAsset("app|out.txt"); |
| 113 buildShouldSucceed(); |
| 114 |
| 115 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 116 expectAsset("app|out.txt", "bar\nfoo"); |
| 117 buildShouldSucceed(); |
| 118 }); |
| 119 |
| 120 group("pass-through", () { |
| 121 test("an aggregate transformer passes through its primary inputs by " |
| 122 "default", () { |
| 123 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 124 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 125 ]}); |
| 126 |
| 127 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 128 expectAsset("app|foo.txt", "foo"); |
| 129 expectAsset("app|bar.txt", "bar"); |
| 130 buildShouldSucceed(); |
| 131 |
| 132 modifyAsset("app|foo.txt", "new foo"); |
| 133 updateSources(["app|foo.txt"]); |
| 134 expectAsset("app|foo.txt", "new foo"); |
| 135 buildShouldSucceed(); |
| 136 }); |
| 137 |
| 138 test("an aggregate transformer can overwrite its primary inputs", () { |
| 139 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [ |
| 140 [new AggregateManyToManyTransformer("txt")] |
| 141 ]}); |
| 142 |
| 143 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 144 expectAsset("app|foo.txt", "modified foo"); |
| 145 expectAsset("app|bar.txt", "modified bar"); |
| 146 buildShouldSucceed(); |
| 147 }); |
| 148 |
| 149 test("an aggregate transformer can consume its primary inputs", () { |
| 150 var transformer = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 151 transformer.consumePrimaries |
| 152 ..add("app|foo.txt") |
| 153 ..add("app|bar.txt"); |
| 154 |
| 155 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[transformer]]}); |
| 156 |
| 157 updateSources(["app|foo.txt", "app|bar.txt"]); |
| 158 expectNoAsset("app|foo.txt"); |
| 159 expectNoAsset("app|bar.txt"); |
| 160 buildShouldSucceed(); |
| 161 }); |
| 162 |
| 163 test("an aggregate transformer passes through non-primary inputs", () { |
| 164 initGraph(["app|foo.jpg", "app|bar.png"], {"app": [ |
| 165 [new AggregateManyToManyTransformer("txt")] |
| 166 ]}); |
| 167 |
| 168 updateSources(["app|foo.jpg", "app|bar.png"]); |
| 169 expectAsset("app|foo.jpg", "foo"); |
| 170 expectAsset("app|bar.png", "bar"); |
| 171 buildShouldSucceed(); |
| 172 |
| 173 modifyAsset("app|foo.jpg", "new foo"); |
| 174 updateSources(["app|foo.jpg"]); |
| 175 expectAsset("app|foo.jpg", "new foo"); |
| 176 buildShouldSucceed(); |
| 177 }); |
| 178 }); |
| 179 |
| 180 group("apply() transform stream", () { |
| 181 test("the primary input stream doesn't close if a previous phase is still " |
| 182 "running", () { |
| 183 var rewrite = new RewriteTransformer("a", "b"); |
| 184 initGraph(["app|foo.txt", "app|bar.a"], {"app": [ |
| 185 [rewrite], |
| 186 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 187 ]}); |
| 188 |
| 189 rewrite.pauseApply(); |
| 190 updateSources(["app|foo.txt", "app|bar.a"]); |
| 191 expectAssetDoesNotComplete("app|out.txt"); |
| 192 |
| 193 rewrite.resumeApply(); |
| 194 expectAsset("app|out.txt", "foo"); |
| 195 buildShouldSucceed(); |
| 196 }); |
| 197 |
| 198 test("the primary input stream doesn't close if a previous phase is " |
| 199 "materializing a primary input", () { |
| 200 var rewrite = new DeclaringRewriteTransformer("in", "txt"); |
| 201 initGraph(["app|foo.txt", "app|bar.in"], {"app": [ |
| 202 [rewrite], |
| 203 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 204 ]}); |
| 205 |
| 206 rewrite.pauseApply(); |
| 207 updateSources(["app|foo.txt", "app|bar.in"]); |
| 208 expectAssetDoesNotComplete("app|out.txt"); |
| 209 |
| 210 rewrite.resumeApply(); |
| 211 expectAsset("app|out.txt", "bar.txt\nfoo"); |
| 212 buildShouldSucceed(); |
| 213 }); |
| 214 |
| 215 test("the primary input stream closes if a previous phase is only " |
| 216 "materializing non-primary inputs", () { |
| 217 var rewrite = new DeclaringRewriteTransformer("a", "b"); |
| 218 initGraph(["app|foo.txt", "app|bar.a"], {"app": [ |
| 219 [rewrite], |
| 220 [new AggregateManyToOneTransformer("txt", "out.txt")] |
| 221 ]}); |
| 222 |
| 223 rewrite.pauseApply(); |
| 224 updateSources(["app|foo.txt", "app|bar.a"]); |
| 225 expectAsset("app|out.txt", "foo"); |
| 226 |
| 227 rewrite.resumeApply(); |
| 228 buildShouldSucceed(); |
| 229 }); |
| 230 |
| 231 test("a new primary input that arrives before the stream closes doesn't " |
| 232 "cause apply to restart", () { |
| 233 var rewrite = new RewriteTransformer("a", "b"); |
| 234 var aggregate = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 235 initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [ |
| 236 [rewrite], |
| 237 [aggregate] |
| 238 ]}); |
| 239 |
| 240 // The stream won't close until [rewrite] finishes running `apply()`. |
| 241 rewrite.pauseApply(); |
| 242 |
| 243 updateSources(["app|foo.txt", "app|baz.a"]); |
| 244 expectAssetDoesNotComplete("app|out.txt"); |
| 245 |
| 246 updateSources(["app|bar.txt"]); |
| 247 expectAssetDoesNotComplete("app|out.txt"); |
| 248 |
| 249 rewrite.resumeApply(); |
| 250 expectAsset("app|out.txt", "bar\nfoo"); |
| 251 buildShouldSucceed(); |
| 252 |
| 253 expect(aggregate.numRuns, completion(equals(1))); |
| 254 }); |
| 255 |
| 256 test("a new primary input that arrives after the stream closes causes " |
| 257 "apply to restart", () { |
| 258 var aggregate = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 259 initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[aggregate]]}); |
| 260 |
| 261 aggregate.pauseApply(); |
| 262 updateSources(["app|foo.txt"]); |
| 263 expectAssetDoesNotComplete("app|out.txt"); |
| 264 |
| 265 updateSources(["app|bar.txt"]); |
| 266 expectAssetDoesNotComplete("app|out.txt"); |
| 267 |
| 268 aggregate.resumeApply(); |
| 269 expectAsset("app|out.txt", "bar\nfoo"); |
| 270 buildShouldSucceed(); |
| 271 |
| 272 expect(aggregate.numRuns, completion(equals(2))); |
| 273 }); |
| 274 |
| 275 test("a primary input that's modified before the stream closes causes " |
| 276 "apply to restart", () { |
| 277 var rewrite = new RewriteTransformer("a", "b"); |
| 278 var aggregate = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 279 initGraph(["app|foo.txt", "app|bar.a"], {"app": [ |
| 280 [rewrite], |
| 281 [aggregate] |
| 282 ]}); |
| 283 |
| 284 // The stream won't close until [rewrite] finishes running `apply()`. |
| 285 rewrite.pauseApply(); |
| 286 |
| 287 updateSources(["app|foo.txt", "app|bar.a"]); |
| 288 expectAssetDoesNotComplete("app|out.txt"); |
| 289 |
| 290 modifyAsset("app|foo.txt", "new foo"); |
| 291 updateSources(["app|foo.txt"]); |
| 292 expectAssetDoesNotComplete("app|out.txt"); |
| 293 |
| 294 rewrite.resumeApply(); |
| 295 expectAsset("app|out.txt", "new foo"); |
| 296 buildShouldSucceed(); |
| 297 |
| 298 expect(aggregate.numRuns, completion(equals(2))); |
| 299 }); |
| 300 |
| 301 test("a primary input that's removed before the stream closes causes apply " |
| 302 "to restart", () { |
| 303 var rewrite = new RewriteTransformer("a", "b"); |
| 304 var aggregate = new AggregateManyToOneTransformer("txt", "out.txt"); |
| 305 initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [ |
| 306 [rewrite], |
| 307 [aggregate] |
| 308 ]}); |
| 309 |
| 310 // The stream won't close until [rewrite] finishes running `apply()`. |
| 311 rewrite.pauseApply(); |
| 312 |
| 313 updateSources(["app|foo.txt", "app|bar.txt", "app|baz.a"]); |
| 314 expectAssetDoesNotComplete("app|out.txt"); |
| 315 |
| 316 removeSources(["app|bar.txt"]); |
| 317 expectAssetDoesNotComplete("app|out.txt"); |
| 318 |
| 319 rewrite.resumeApply(); |
| 320 expectAsset("app|out.txt", "foo"); |
| 321 buildShouldSucceed(); |
| 322 |
| 323 expect(aggregate.numRuns, completion(equals(2))); |
| 324 }); |
| 325 }); |
| 326 } |
OLD | NEW |