Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: pkg/barback/test/package_graph/cluster_test.dart

Issue 25376003: Add support for transformer clusters to barback. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Expose the Operator class. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698