| Index: mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart
|
| diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3465f269ee38dc55a9a580f265fe7deffa25bdb2
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart
|
| @@ -0,0 +1,251 @@
|
| +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library barback.test.package_graph.transform.declaring_aggregate_test;
|
| +
|
| +import 'package:barback/src/utils.dart';
|
| +import 'package:scheduled_test/scheduled_test.dart';
|
| +
|
| +import '../../utils.dart';
|
| +
|
| +main() {
|
| + initConfig();
|
| + group("a declaring aggregate transformer", () {
|
| + test("is eager by default", () {
|
| + var transformer = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.txt"], {"app": [[transformer]]});
|
| +
|
| + updateSources(["app|foo.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| + });
|
| +
|
| + test("is deferred if any primary input is deferred", () {
|
| + var rewrite = new LazyRewriteTransformer("in", "txt");
|
| + var aggregate = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [rewrite]
|
| + ]});
|
| +
|
| + updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + // Add [aggregate] to the graph after a build has been completed so that
|
| + // all its inputs are available immediately. Otherwise it could start
|
| + // applying eagerly before receiving its lazy input.
|
| + updateTransformers("app", [[rewrite], [aggregate]]);
|
| + buildShouldSucceed();
|
| + expect(aggregate.numRuns, completion(equals(0)));
|
| +
|
| + expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
|
| + buildShouldSucceed();
|
| + expect(aggregate.numRuns, completion(equals(1)));
|
| + });
|
| +
|
| + test("switches from eager to deferred if a deferred primary input is added",
|
| + () {
|
| + var transformer = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [new LazyRewriteTransformer("in", "txt")],
|
| + [transformer]
|
| + ]});
|
| +
|
| + updateSources(["app|bar.txt", "app|baz.txt"]);
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| +
|
| + updateSources(["app|foo.in"]);
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| +
|
| + expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(2)));
|
| + });
|
| +
|
| + test("switches from deferred to eager if its last deferred primary input "
|
| + "is removed", () {
|
| + var rewrite = new LazyRewriteTransformer("in", "txt");
|
| + var aggregate = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [rewrite]
|
| + ]});
|
| +
|
| + updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + // Add [aggregate] to the graph after a build has been completed so that
|
| + // all its inputs are available immediately. Otherwise it could start
|
| + // applying eagerly before receiving its lazy input.
|
| + updateTransformers("app", [[rewrite], [aggregate]]);
|
| + buildShouldSucceed();
|
| + expect(aggregate.numRuns, completion(equals(0)));
|
| +
|
| + removeSources(["app|foo.in"]);
|
| + buildShouldSucceed();
|
| + expect(aggregate.numRuns, completion(equals(1)));
|
| + });
|
| +
|
| + test("begins running eagerly when all its deferred primary inputs become "
|
| + "available", () {
|
| + var lazyPhase = [
|
| + new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
|
| + input: "app|foo.in"),
|
| + new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
|
| + input: "app|bar.in")
|
| + ];
|
| + var transformer = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
|
| + lazyPhase,
|
| + ]});
|
| +
|
| + updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + // Add [transformer] to the graph after a build has been completed so that
|
| + // all its inputs are available immediately. Otherwise it could start
|
| + // applying eagerly before receiving its lazy inputs.
|
| + updateTransformers("app", [lazyPhase, [transformer]]);
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(0)));
|
| +
|
| + // Now "app|foo.txt" will be available, but "app|bar.txt" won't, so the
|
| + // [transformer] shouldn't run.
|
| + expectAsset("app|foo.x", "app|foo.x");
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(0)));
|
| +
|
| + // Now "app|foo.txt" and "app|bar.txt" will both be available, so the
|
| + // [transformer] should run.
|
| + expectAsset("app|bar.x", "app|bar.x");
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| + });
|
| +
|
| + test("stops running eagerly when any of its deferred primary inputs become "
|
| + "unavailable", () {
|
| + var lazyPhase = [
|
| + new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
|
| + input: "app|foo.in"),
|
| + new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
|
| + input: "app|bar.in")
|
| + ];
|
| + var transformer = new DeclaringAggregateManyToOneTransformer(
|
| + "txt", "out.txt");
|
| + initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
|
| + lazyPhase
|
| + ]});
|
| +
|
| + updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
|
| + expectAsset("app|foo.x", "app|foo.x");
|
| + expectAsset("app|bar.x", "app|bar.x");
|
| + buildShouldSucceed();
|
| +
|
| + // Add [transformer] to the graph after a build has been completed so that
|
| + // all its inputs are available immediately. Otherwise it could start
|
| + // applying eagerly before receiving its lazy inputs.
|
| + updateTransformers("app", [lazyPhase, [transformer]]);
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| +
|
| + // Now "app|foo.txt" is unavailable, so the [transformer] shouldn't run.
|
| + updateSources(["app|foo.in"]);
|
| + buildShouldSucceed();
|
| + expect(transformer.numRuns, completion(equals(1)));
|
| + });
|
| +
|
| + test("re-declares its outputs for a new primary input", () {
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [new LazyRewriteTransformer("in", "txt")],
|
| + [new DeclaringAggregateManyToManyTransformer("txt")]
|
| + ]});
|
| +
|
| + updateSources(["app|foo.in", "app|bar.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + updateSources(["app|baz.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + // If the aggregate transformer didn't re-declare its outputs upon getting
|
| + // a new primary input, getting "baz.txt" wouldn't trigger an apply and
|
| + // would just return the unmodified baz.
|
| + expectAsset("app|baz.txt", "modified baz");
|
| + });
|
| +
|
| + test("re-declares its outputs for a new primary input received while "
|
| + "applying", () {
|
| + var transformer = new DeclaringAggregateManyToManyTransformer("txt");
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [new LazyRewriteTransformer("in", "txt")],
|
| + [transformer]
|
| + ]});
|
| +
|
| + transformer.pauseApply();
|
| + updateSources(["app|foo.in", "app|bar.txt"]);
|
| +
|
| + // Ensure we're waiting on `apply()`.
|
| + schedule(pumpEventQueue);
|
| +
|
| + updateSources(["app|baz.txt"]);
|
| + transformer.resumeApply();
|
| + buildShouldSucceed();
|
| +
|
| + expectAsset("app|baz.txt", "modified baz");
|
| + });
|
| +
|
| + test("re-declares its outputs for a new primary input received while "
|
| + "applying after a primary input was modified", () {
|
| + var transformer = new DeclaringAggregateManyToManyTransformer("txt");
|
| + initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
|
| + [new LazyRewriteTransformer("in", "txt")],
|
| + [transformer]
|
| + ]});
|
| +
|
| + transformer.pauseApply();
|
| + updateSources(["app|foo.in", "app|bar.txt"]);
|
| +
|
| + // Ensure we're waiting on `apply()`.
|
| + schedule(pumpEventQueue);
|
| +
|
| + updateSources(["app|bar.txt"]);
|
| +
|
| + // Make sure the change to "bar.txt" is fully processed.
|
| + schedule(pumpEventQueue);
|
| +
|
| + updateSources(["app|baz.txt"]);
|
| + transformer.resumeApply();
|
| + buildShouldSucceed();
|
| +
|
| + expectAsset("app|baz.txt", "modified baz");
|
| + });
|
| + });
|
| +
|
| + group("a lazy aggregate transformer", () {
|
| + test("doesn't run eagerly", () {
|
| + var transformer = new LazyAggregateManyToOneTransformer("txt", "out.txt");
|
| + initGraph(["app|foo.txt"], {"app": [[transformer]]});
|
| +
|
| + updateSources(["app|foo.txt"]);
|
| + buildShouldSucceed();
|
| +
|
| + expect(transformer.numRuns, completion(equals(0)));
|
| + });
|
| +
|
| + test("runs when an output is requested", () {
|
| + initGraph(["app|foo.txt"], {"app": [[
|
| + new LazyAggregateManyToOneTransformer("txt", "out.txt")
|
| + ]]});
|
| +
|
| + updateSources(["app|foo.txt"]);
|
| + buildShouldSucceed();
|
| + expectAsset("app|out.txt", "foo");
|
| + });
|
| + });
|
| +}
|
|
|