| // Copyright (c) 2013, 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.source_test; |
| |
| import 'dart:async'; |
| |
| import 'package:barback/barback.dart'; |
| import 'package:barback/src/utils.dart'; |
| import 'package:scheduled_test/scheduled_test.dart'; |
| |
| import '../utils.dart'; |
| |
| main() { |
| initConfig(); |
| test("gets a source asset", () { |
| initGraph(["app|foo.txt"]); |
| updateSources(["app|foo.txt"]); |
| expectAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| }); |
| |
| test("doesn't get an unknown source", () { |
| initGraph(); |
| expectNoAsset("app|unknown.txt"); |
| }); |
| |
| test("doesn't get an unprovided source", () { |
| initGraph(); |
| updateSources(["app|unknown.txt"]); |
| expectNoAsset("app|unknown.txt"); |
| }); |
| |
| test("doesn't get an asset that isn't an updated source", () { |
| initGraph(["app|foo.txt"]); |
| |
| // Sources must be explicitly made visible to barback by calling |
| // updateSources() on them. It isn't enough for the provider to be able |
| // to provide it. |
| // |
| // This lets you distinguish between sources that you want to be primaries |
| // and the larger set of inputs that those primaries are allowed to pull in. |
| expectNoAsset("app|foo.txt"); |
| }); |
| |
| test("gets a source asset if not transformed", () { |
| initGraph(["app|foo.txt"], {"app": [ |
| [new RewriteTransformer("nottxt", "whatever")] |
| ]}); |
| |
| updateSources(["app|foo.txt"]); |
| expectAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| }); |
| |
| test("doesn't get a removed source", () { |
| initGraph(["app|foo.txt"]); |
| |
| updateSources(["app|foo.txt"]); |
| expectAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| |
| removeSources(["app|foo.txt"]); |
| expectNoAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| }); |
| |
| test("collapses redundant updates", () { |
| var transformer = new RewriteTransformer("blub", "blab"); |
| initGraph(["app|foo.blub"], {"app": [[transformer]]}); |
| |
| schedule(() { |
| // Make a bunch of synchronous update calls. |
| updateSourcesSync(["app|foo.blub"]); |
| updateSourcesSync(["app|foo.blub"]); |
| updateSourcesSync(["app|foo.blub"]); |
| updateSourcesSync(["app|foo.blub"]); |
| }); |
| |
| expectAsset("app|foo.blab", "foo.blab"); |
| buildShouldSucceed(); |
| |
| expect(transformer.numRuns, completion(equals(1))); |
| }); |
| |
| test("a removal cancels out an update", () { |
| initGraph(["app|foo.txt"]); |
| |
| schedule(() { |
| updateSourcesSync(["app|foo.txt"]); |
| removeSourcesSync(["app|foo.txt"]); |
| }); |
| |
| expectNoAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| }); |
| |
| test("an update cancels out a removal", () { |
| initGraph(["app|foo.txt"]); |
| |
| schedule(() { |
| removeSourcesSync(["app|foo.txt"]); |
| updateSourcesSync(["app|foo.txt"]); |
| }); |
| |
| expectAsset("app|foo.txt"); |
| buildShouldSucceed(); |
| }); |
| |
| test("reloads an asset that's updated while loading", () { |
| initGraph({"app|foo.txt": "foo"}); |
| |
| pauseProvider(); |
| // The mock provider synchronously loads the value of the assets, so this |
| // will kick off two loads with different values. The second one should |
| // win. |
| updateSources(["app|foo.txt"]); |
| modifyAsset("app|foo.txt", "bar"); |
| updateSources(["app|foo.txt"]); |
| |
| resumeProvider(); |
| expectAsset("app|foo.txt", "bar"); |
| buildShouldSucceed(); |
| }); |
| |
| test("restarts a build if a source is updated while sources are loading", () { |
| var transformer = new RewriteTransformer("txt", "out"); |
| initGraph(["app|foo.txt", "app|other.bar"], {"app": [[transformer]]}); |
| |
| // Run the whole graph so all nodes are clean. |
| updateSources(["app|foo.txt", "app|other.bar"]); |
| expectAsset("app|foo.out", "foo.out"); |
| expectAsset("app|other.bar"); |
| |
| buildShouldSucceed(); |
| |
| // Make the provider slow to load a source. |
| pauseProvider(); |
| |
| // Update an asset that doesn't trigger any transformers. |
| updateSources(["app|other.bar"]); |
| |
| // Now update an asset that does trigger a transformer. |
| updateSources(["app|foo.txt"]); |
| |
| resumeProvider(); |
| |
| buildShouldSucceed(); |
| |
| expect(transformer.numRuns, completion(equals(2))); |
| }); |
| } |