Index: pkg/barback/test/utils.dart |
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart |
index 99a7ec1d19d776d8101c08aeef52dc25a0a7bba2..cdeab38873022148a242bcf0ef7147f6682bf051 100644 |
--- a/pkg/barback/test/utils.dart |
+++ b/pkg/barback/test/utils.dart |
@@ -61,9 +61,38 @@ void initGraph([assets, |
if (assets == null) assets = []; |
if (transformers == null) transformers = {}; |
- _provider = new MockProvider(assets, transformers); |
+ var assetList; |
+ if (assets is Map) { |
+ assetList = assets.keys.map((asset) { |
+ var id = new AssetId.parse(asset); |
+ return new _MockAsset(id, assets[asset]); |
+ }); |
+ } else if (assets is Iterable) { |
+ assetList = assets.map((asset) { |
+ var id = new AssetId.parse(asset); |
+ var contents = pathos.basenameWithoutExtension(id.path); |
+ return new _MockAsset(id, contents); |
+ }); |
+ } |
+ |
+ var assetMap = mapMapValues(groupBy(assetList, (asset) => asset.id.package), |
+ (package, assets) => new AssetSet.from(assets)); |
+ |
+ // Make sure that packages that have transformers but no assets are considered |
+ // by MockProvider to exist. |
+ for (var package in transformers.keys) { |
+ assetMap.putIfAbsent(package, () => new AssetSet()); |
+ } |
+ |
+ _provider = new MockProvider(assetMap); |
_barback = new Barback(_provider); |
_nextBuildResult = 0; |
+ |
+ transformers.forEach(_barback.updateTransformers); |
+ |
+ // There should be one successful build after adding all the transformers but |
+ // before adding any sources. |
+ if (!transformers.isEmpty) buildShouldSucceed(); |
} |
/// Updates [assets] in the current [PackageProvider]. |
@@ -102,6 +131,13 @@ void removeSources(Iterable assets) { |
void removeSourcesSync(Iterable assets) => |
_barback.removeSources(_parseAssets(assets)); |
+/// Sets the transformers for [package] to [transformers]. |
+void updateTransformers(String package, |
+ Iterable<Iterable<Transformers>> transformers) { |
+ schedule(() => _barback.updateTransformers(package, transformers), |
+ "updating transformers for $package"); |
+} |
+ |
/// Parse a list of strings or [AssetId]s into a list of [AssetId]s. |
List<AssetId> _parseAssets(Iterable assets) { |
return assets.map((asset) { |
@@ -340,9 +376,9 @@ Future _futureShouldNotCompleteUntil(Future future, Future delay, |
/// An [AssetProvider] that provides the given set of assets. |
class MockProvider implements PackageProvider { |
- Iterable<String> get packages => _packages.keys; |
+ Iterable<String> get packages => _assets.keys; |
- Map<String, _MockPackage> _packages; |
+ Map<String, AssetSet> _assets; |
/// The set of assets for which [MockLoadException]s should be emitted if |
/// they're loaded. |
@@ -366,42 +402,19 @@ class MockProvider implements PackageProvider { |
_pauseCompleter = null; |
} |
- MockProvider(assets, |
- Map<String, Iterable<Iterable<Transformer>>> transformers) { |
- var assetList; |
- if (assets is Map) { |
- assetList = assets.keys.map((asset) { |
- var id = new AssetId.parse(asset); |
- return new _MockAsset(id, assets[asset]); |
- }); |
- } else if (assets is Iterable) { |
- assetList = assets.map((asset) { |
- var id = new AssetId.parse(asset); |
- var contents = pathos.basenameWithoutExtension(id.path); |
- return new _MockAsset(id, contents); |
- }); |
- } |
- |
- _packages = mapMapValues(groupBy(assetList, (asset) => asset.id.package), |
- (package, assets) { |
- var packageTransformers = transformers[package]; |
- if (packageTransformers == null) packageTransformers = []; |
- return new _MockPackage( |
- new AssetSet.from(assets), packageTransformers.toList()); |
- }); |
- |
+ MockProvider(this._assets) { |
// If there are no assets or transformers, add a dummy package. This better |
// simulates the real world, where there'll always be at least the |
// entrypoint package. |
- if (_packages.isEmpty) { |
- _packages = {"app": new _MockPackage(new AssetSet(), [])}; |
+ if (_assets.isEmpty) { |
+ _assets = {"app": new AssetSet()}; |
} |
} |
void _modifyAsset(String name, String contents) { |
var id = new AssetId.parse(name); |
_errors.remove(id); |
- _packages[id.package].assets[id].contents = contents; |
+ _assets[id.package][id].contents = contents; |
} |
void _setAssetError(String name) => _errors.add(new AssetId.parse(name)); |
@@ -411,23 +424,15 @@ class MockProvider implements PackageProvider { |
throw new UnimplementedError("Doesn't handle 'within' yet."); |
} |
- return _packages[package].assets.map((asset) => asset.id); |
- } |
- |
- Iterable<Iterable<Transformer>> getTransformers(String package) { |
- var mockPackage = _packages[package]; |
- if (mockPackage == null) { |
- throw new ArgumentError("No package named $package."); |
- } |
- return mockPackage.transformers; |
+ return _assets[package].map((asset) => asset.id); |
} |
Future<Asset> getAsset(AssetId id) { |
// Eagerly load the asset so we can test an asset's value changing between |
// when a load starts and when it finishes. |
- var package = _packages[id.package]; |
+ var assets = _assets[id.package]; |
var asset; |
- if (package != null) asset = package.assets[id]; |
+ if (assets != null) asset = assets[id]; |
var hasError = _errors.contains(id); |
@@ -455,16 +460,6 @@ class MockLoadException implements Exception { |
String toString() => "Error loading $id."; |
} |
-/// Used by [MockProvider] to keep track of which assets and transformers exist |
-/// for each package. |
-class _MockPackage { |
- final AssetSet assets; |
- final List<List<Transformer>> transformers; |
- |
- _MockPackage(this.assets, Iterable<Iterable<Transformer>> transformers) |
- : transformers = transformers.map((phase) => phase.toList()).toList(); |
-} |
- |
/// An implementation of [Asset] that never hits the file system. |
class _MockAsset implements Asset { |
final AssetId id; |