| 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.declaring_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 group("a declaring aggregate transformer", () { | |
| 15 test("is eager by default", () { | |
| 16 var transformer = new DeclaringAggregateManyToOneTransformer( | |
| 17 "txt", "out.txt"); | |
| 18 initGraph(["app|foo.txt"], {"app": [[transformer]]}); | |
| 19 | |
| 20 updateSources(["app|foo.txt"]); | |
| 21 buildShouldSucceed(); | |
| 22 | |
| 23 expect(transformer.numRuns, completion(equals(1))); | |
| 24 }); | |
| 25 | |
| 26 test("is deferred if any primary input is deferred", () { | |
| 27 var rewrite = new LazyRewriteTransformer("in", "txt"); | |
| 28 var aggregate = new DeclaringAggregateManyToOneTransformer( | |
| 29 "txt", "out.txt"); | |
| 30 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 31 [rewrite] | |
| 32 ]}); | |
| 33 | |
| 34 updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]); | |
| 35 buildShouldSucceed(); | |
| 36 | |
| 37 // Add [aggregate] to the graph after a build has been completed so that | |
| 38 // all its inputs are available immediately. Otherwise it could start | |
| 39 // applying eagerly before receiving its lazy input. | |
| 40 updateTransformers("app", [[rewrite], [aggregate]]); | |
| 41 buildShouldSucceed(); | |
| 42 expect(aggregate.numRuns, completion(equals(0))); | |
| 43 | |
| 44 expectAsset("app|out.txt", "bar\nbaz\nfoo.txt"); | |
| 45 buildShouldSucceed(); | |
| 46 expect(aggregate.numRuns, completion(equals(1))); | |
| 47 }); | |
| 48 | |
| 49 test("switches from eager to deferred if a deferred primary input is added", | |
| 50 () { | |
| 51 var transformer = new DeclaringAggregateManyToOneTransformer( | |
| 52 "txt", "out.txt"); | |
| 53 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 54 [new LazyRewriteTransformer("in", "txt")], | |
| 55 [transformer] | |
| 56 ]}); | |
| 57 | |
| 58 updateSources(["app|bar.txt", "app|baz.txt"]); | |
| 59 buildShouldSucceed(); | |
| 60 expect(transformer.numRuns, completion(equals(1))); | |
| 61 | |
| 62 updateSources(["app|foo.in"]); | |
| 63 buildShouldSucceed(); | |
| 64 expect(transformer.numRuns, completion(equals(1))); | |
| 65 | |
| 66 expectAsset("app|out.txt", "bar\nbaz\nfoo.txt"); | |
| 67 buildShouldSucceed(); | |
| 68 expect(transformer.numRuns, completion(equals(2))); | |
| 69 }); | |
| 70 | |
| 71 test("switches from deferred to eager if its last deferred primary input " | |
| 72 "is removed", () { | |
| 73 var rewrite = new LazyRewriteTransformer("in", "txt"); | |
| 74 var aggregate = new DeclaringAggregateManyToOneTransformer( | |
| 75 "txt", "out.txt"); | |
| 76 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 77 [rewrite] | |
| 78 ]}); | |
| 79 | |
| 80 updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]); | |
| 81 buildShouldSucceed(); | |
| 82 | |
| 83 // Add [aggregate] to the graph after a build has been completed so that | |
| 84 // all its inputs are available immediately. Otherwise it could start | |
| 85 // applying eagerly before receiving its lazy input. | |
| 86 updateTransformers("app", [[rewrite], [aggregate]]); | |
| 87 buildShouldSucceed(); | |
| 88 expect(aggregate.numRuns, completion(equals(0))); | |
| 89 | |
| 90 removeSources(["app|foo.in"]); | |
| 91 buildShouldSucceed(); | |
| 92 expect(aggregate.numRuns, completion(equals(1))); | |
| 93 }); | |
| 94 | |
| 95 test("begins running eagerly when all its deferred primary inputs become " | |
| 96 "available", () { | |
| 97 var lazyPhase = [ | |
| 98 new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"], | |
| 99 input: "app|foo.in"), | |
| 100 new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"], | |
| 101 input: "app|bar.in") | |
| 102 ]; | |
| 103 var transformer = new DeclaringAggregateManyToOneTransformer( | |
| 104 "txt", "out.txt"); | |
| 105 initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [ | |
| 106 lazyPhase, | |
| 107 ]}); | |
| 108 | |
| 109 updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]); | |
| 110 buildShouldSucceed(); | |
| 111 | |
| 112 // Add [transformer] to the graph after a build has been completed so that | |
| 113 // all its inputs are available immediately. Otherwise it could start | |
| 114 // applying eagerly before receiving its lazy inputs. | |
| 115 updateTransformers("app", [lazyPhase, [transformer]]); | |
| 116 buildShouldSucceed(); | |
| 117 expect(transformer.numRuns, completion(equals(0))); | |
| 118 | |
| 119 // Now "app|foo.txt" will be available, but "app|bar.txt" won't, so the | |
| 120 // [transformer] shouldn't run. | |
| 121 expectAsset("app|foo.x", "app|foo.x"); | |
| 122 buildShouldSucceed(); | |
| 123 expect(transformer.numRuns, completion(equals(0))); | |
| 124 | |
| 125 // Now "app|foo.txt" and "app|bar.txt" will both be available, so the | |
| 126 // [transformer] should run. | |
| 127 expectAsset("app|bar.x", "app|bar.x"); | |
| 128 buildShouldSucceed(); | |
| 129 expect(transformer.numRuns, completion(equals(1))); | |
| 130 }); | |
| 131 | |
| 132 test("stops running eagerly when any of its deferred primary inputs become " | |
| 133 "unavailable", () { | |
| 134 var lazyPhase = [ | |
| 135 new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"], | |
| 136 input: "app|foo.in"), | |
| 137 new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"], | |
| 138 input: "app|bar.in") | |
| 139 ]; | |
| 140 var transformer = new DeclaringAggregateManyToOneTransformer( | |
| 141 "txt", "out.txt"); | |
| 142 initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [ | |
| 143 lazyPhase | |
| 144 ]}); | |
| 145 | |
| 146 updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]); | |
| 147 expectAsset("app|foo.x", "app|foo.x"); | |
| 148 expectAsset("app|bar.x", "app|bar.x"); | |
| 149 buildShouldSucceed(); | |
| 150 | |
| 151 // Add [transformer] to the graph after a build has been completed so that | |
| 152 // all its inputs are available immediately. Otherwise it could start | |
| 153 // applying eagerly before receiving its lazy inputs. | |
| 154 updateTransformers("app", [lazyPhase, [transformer]]); | |
| 155 buildShouldSucceed(); | |
| 156 expect(transformer.numRuns, completion(equals(1))); | |
| 157 | |
| 158 // Now "app|foo.txt" is unavailable, so the [transformer] shouldn't run. | |
| 159 updateSources(["app|foo.in"]); | |
| 160 buildShouldSucceed(); | |
| 161 expect(transformer.numRuns, completion(equals(1))); | |
| 162 }); | |
| 163 | |
| 164 test("re-declares its outputs for a new primary input", () { | |
| 165 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 166 [new LazyRewriteTransformer("in", "txt")], | |
| 167 [new DeclaringAggregateManyToManyTransformer("txt")] | |
| 168 ]}); | |
| 169 | |
| 170 updateSources(["app|foo.in", "app|bar.txt"]); | |
| 171 buildShouldSucceed(); | |
| 172 | |
| 173 updateSources(["app|baz.txt"]); | |
| 174 buildShouldSucceed(); | |
| 175 | |
| 176 // If the aggregate transformer didn't re-declare its outputs upon getting | |
| 177 // a new primary input, getting "baz.txt" wouldn't trigger an apply and | |
| 178 // would just return the unmodified baz. | |
| 179 expectAsset("app|baz.txt", "modified baz"); | |
| 180 }); | |
| 181 | |
| 182 test("re-declares its outputs for a new primary input received while " | |
| 183 "applying", () { | |
| 184 var transformer = new DeclaringAggregateManyToManyTransformer("txt"); | |
| 185 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 186 [new LazyRewriteTransformer("in", "txt")], | |
| 187 [transformer] | |
| 188 ]}); | |
| 189 | |
| 190 transformer.pauseApply(); | |
| 191 updateSources(["app|foo.in", "app|bar.txt"]); | |
| 192 | |
| 193 // Ensure we're waiting on `apply()`. | |
| 194 schedule(pumpEventQueue); | |
| 195 | |
| 196 updateSources(["app|baz.txt"]); | |
| 197 transformer.resumeApply(); | |
| 198 buildShouldSucceed(); | |
| 199 | |
| 200 expectAsset("app|baz.txt", "modified baz"); | |
| 201 }); | |
| 202 | |
| 203 test("re-declares its outputs for a new primary input received while " | |
| 204 "applying after a primary input was modified", () { | |
| 205 var transformer = new DeclaringAggregateManyToManyTransformer("txt"); | |
| 206 initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [ | |
| 207 [new LazyRewriteTransformer("in", "txt")], | |
| 208 [transformer] | |
| 209 ]}); | |
| 210 | |
| 211 transformer.pauseApply(); | |
| 212 updateSources(["app|foo.in", "app|bar.txt"]); | |
| 213 | |
| 214 // Ensure we're waiting on `apply()`. | |
| 215 schedule(pumpEventQueue); | |
| 216 | |
| 217 updateSources(["app|bar.txt"]); | |
| 218 | |
| 219 // Make sure the change to "bar.txt" is fully processed. | |
| 220 schedule(pumpEventQueue); | |
| 221 | |
| 222 updateSources(["app|baz.txt"]); | |
| 223 transformer.resumeApply(); | |
| 224 buildShouldSucceed(); | |
| 225 | |
| 226 expectAsset("app|baz.txt", "modified baz"); | |
| 227 }); | |
| 228 }); | |
| 229 | |
| 230 group("a lazy aggregate transformer", () { | |
| 231 test("doesn't run eagerly", () { | |
| 232 var transformer = new LazyAggregateManyToOneTransformer("txt", "out.txt"); | |
| 233 initGraph(["app|foo.txt"], {"app": [[transformer]]}); | |
| 234 | |
| 235 updateSources(["app|foo.txt"]); | |
| 236 buildShouldSucceed(); | |
| 237 | |
| 238 expect(transformer.numRuns, completion(equals(0))); | |
| 239 }); | |
| 240 | |
| 241 test("runs when an output is requested", () { | |
| 242 initGraph(["app|foo.txt"], {"app": [[ | |
| 243 new LazyAggregateManyToOneTransformer("txt", "out.txt") | |
| 244 ]]}); | |
| 245 | |
| 246 updateSources(["app|foo.txt"]); | |
| 247 buildShouldSucceed(); | |
| 248 expectAsset("app|out.txt", "foo"); | |
| 249 }); | |
| 250 }); | |
| 251 } | |
| OLD | NEW |