Index: packages/polymer/test/build/common.dart |
diff --git a/packages/polymer/test/build/common.dart b/packages/polymer/test/build/common.dart |
deleted file mode 100644 |
index 8a1b620bd57309157eaf159d3f58d93ab8617db4..0000000000000000000000000000000000000000 |
--- a/packages/polymer/test/build/common.dart |
+++ /dev/null |
@@ -1,258 +0,0 @@ |
-// 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 polymer.test.build.common; |
- |
-import 'dart:async'; |
- |
-import 'package:barback/barback.dart'; |
-import 'package:code_transformers/messages/build_logger.dart' |
- show LOG_EXTENSION; |
-import 'package:polymer/src/build/common.dart'; |
-import 'package:stack_trace/stack_trace.dart'; |
-import 'package:unittest/unittest.dart'; |
- |
-String idToString(AssetId id) => '${id.package}|${id.path}'; |
-AssetId idFromString(String s) { |
- int index = s.indexOf('|'); |
- return new AssetId(s.substring(0, index), s.substring(index + 1)); |
-} |
- |
-String _removeTrailingWhitespace(String str) => str.splitMapJoin('\n', |
- onNonMatch: (s) => s.replaceAll(new RegExp(r'\s+$'), '')); |
- |
-/// A helper package provider that has files stored in memory, also wraps |
-/// [Barback] to simply our tests. |
-class TestHelper implements PackageProvider { |
- /// Maps from an asset string identifier of the form 'package|path' to the |
- /// file contents. |
- final Map<String, String> files; |
- final Iterable<String> packages; |
- final List<String> messages; |
- int messagesSeen = 0; |
- bool errorSeen = false; |
- |
- Barback barback; |
- var errorSubscription; |
- var resultSubscription; |
- var logSubscription; |
- |
- Future<Asset> getAsset(AssetId id) { |
- var content = files[idToString(id)]; |
- if (content == null) fail('error: requested $id, but $id is not available'); |
- return new Future.value(new Asset.fromString(id, content)); |
- } |
- |
- TestHelper(List<List<Transformer>> transformers, Map<String, String> files, |
- this.messages) |
- : files = files, |
- packages = files.keys.map((s) => idFromString(s).package) { |
- barback = new Barback(this); |
- for (var p in packages) { |
- barback.updateTransformers(p, transformers); |
- } |
- |
- errorSubscription = barback.errors.listen((e) { |
- var trace = null; |
- if (e is Error) trace = e.stackTrace; |
- if (trace != null) { |
- print(Trace.format(trace)); |
- } |
- fail('error running barback: $e'); |
- }); |
- |
- resultSubscription = barback.results.listen((result) { |
- expect(result.succeeded, !errorSeen, reason: "${result.errors}"); |
- }); |
- |
- logSubscription = barback.log.listen((entry) { |
- // Ignore info messages. |
- if (entry.level == LogLevel.INFO || entry.level == LogLevel.FINE) return; |
- if (entry.level == LogLevel.ERROR) errorSeen = true; |
- // We only check messages when an expectation is provided. |
- if (messages == null) return; |
- |
- var errorLink = |
- new RegExp(' See http://goo.gl/5HPeuP#polymer_[0-9]* for details.'); |
- var text = entry.message; |
- var newText = text.replaceFirst(errorLink, ''); |
- expect(text != newText, isTrue); |
- var msg = '${entry.level.name.toLowerCase()}: ${newText}'; |
- var span = entry.span; |
- var spanInfo = span == null |
- ? '' |
- : ' (${span.sourceUrl} ${span.start.line} ${span.start.column})'; |
- var index = messagesSeen++; |
- expect(messagesSeen, lessThanOrEqualTo(messages.length), |
- reason: 'more messages than expected.\nMessage seen: $msg$spanInfo'); |
- expect('$msg$spanInfo', messages[index]); |
- }); |
- } |
- |
- void tearDown() { |
- errorSubscription.cancel(); |
- resultSubscription.cancel(); |
- logSubscription.cancel(); |
- } |
- |
- /// Tells barback which files have changed, and thus anything that depends on |
- /// it on should be computed. By default mark all the input files. |
- void run([Iterable<String> paths]) { |
- if (paths == null) paths = files.keys; |
- barback.updateSources(paths.map(idFromString)); |
- } |
- |
- Future<String> operator [](String assetString) { |
- return barback |
- .getAssetById(idFromString(assetString)) |
- .then((asset) => asset.readAsString()); |
- } |
- |
- Future check(String assetIdString, String content) { |
- return this[assetIdString].then((value) { |
- value = _removeTrailingWhitespace(value); |
- content = _removeTrailingWhitespace(content); |
- expect(value, content, reason: 'Final output of $assetIdString differs.'); |
- }); |
- } |
- |
- Future checkAll(Map<String, String> files) { |
- return barback.results.first.then((_) { |
- if (files == null) return null; |
- var futures = []; |
- files.forEach((k, v) { |
- futures.add(check(k, v)); |
- }); |
- return Future.wait(futures); |
- }).then((_) { |
- // We only check messages when an expectation is provided. |
- if (messages == null) return; |
- expect(messagesSeen, messages.length, |
- reason: 'less messages than expected'); |
- }); |
- } |
-} |
- |
-testPhases(String testName, List<List<Transformer>> phases, |
- Map<String, String> inputFiles, Map<String, String> expectedFiles, |
- [List<String> expectedMessages, bool solo = false]) { |
- // Include mock versions of the polymer library that can be used to test |
- // resolver-based code generation. |
- POLYMER_MOCKS.forEach((file, contents) { |
- inputFiles[file] = contents; |
- }); |
- (solo ? solo_test : test)(testName, () { |
- var helper = new TestHelper(phases, inputFiles, expectedMessages)..run(); |
- return helper.checkAll(expectedFiles).whenComplete(() => helper.tearDown()); |
- }); |
-} |
- |
-solo_testPhases(String testName, List<List<Transformer>> phases, |
- Map<String, String> inputFiles, Map<String, String> expectedFiles, |
- [List<String> expectedMessages]) => testPhases( |
- testName, phases, inputFiles, expectedFiles, expectedMessages, true); |
- |
-// Similar to testPhases, but tests all the cases around log behaviour in |
-// different modes. Any expectedFiles with [LOG_EXTENSION] will be removed from |
-// the expectation as appropriate, and any error logs will be changed to expect |
-// warning logs as appropriate. |
-testLogOutput(Function buildPhase, String testName, |
- Map<String, String> inputFiles, Map<String, String> expectedFiles, |
- [List<String> expectedMessages, bool solo = false]) { |
- final transformOptions = [ |
- new TransformOptions(injectBuildLogsInOutput: false, releaseMode: false), |
- new TransformOptions(injectBuildLogsInOutput: false, releaseMode: true), |
- new TransformOptions(injectBuildLogsInOutput: true, releaseMode: false), |
- new TransformOptions(injectBuildLogsInOutput: true, releaseMode: true), |
- ]; |
- |
- for (var options in transformOptions) { |
- var phase = buildPhase(options); |
- var actualExpectedFiles = {}; |
- expectedFiles.forEach((file, content) { |
- if (file.contains(LOG_EXTENSION) && |
- (!options.injectBuildLogsInOutput || options.releaseMode)) { |
- return; |
- } |
- actualExpectedFiles[file] = content; |
- }); |
- var fullTestName = '$testName: ' |
- 'injectLogs=${options.injectBuildLogsInOutput} ' |
- 'releaseMode=${options.releaseMode}'; |
- testPhases(fullTestName, [[phase]], inputFiles, actualExpectedFiles, |
- expectedMessages |
- .map((m) => |
- options.releaseMode ? m : m.replaceFirst('error:', 'warning:')) |
- .toList(), solo); |
- } |
-} |
- |
-/// Generate an expected ._data file, where all files are assumed to be in the |
-/// same [package]. |
-String expectedData(List<String> urls, {package: 'a', experimental: false}) { |
- var ids = urls.map((e) => '["$package","$e"]').join(','); |
- return '{"experimental_bootstrap":$experimental,"script_ids":[$ids]}'; |
-} |
- |
-const EMPTY_DATA = '{"experimental_bootstrap":false,"script_ids":[]}'; |
- |
-const DART_SUPPORT_TAG = |
- '<script src="packages/web_components/dart_support.js"></script>'; |
-const WEB_COMPONENTS_JS_TAG = |
- '<script src="packages/web_components/webcomponents.min.js"></script>'; |
-const COMPATIBILITY_JS_TAGS = '$WEB_COMPONENTS_JS_TAG$DART_SUPPORT_TAG'; |
-const PLATFORM_JS_TAG = |
- '<script src="packages/web_components/platform.js"></script>'; |
- |
-const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>'; |
-const DART_JS_TAG = '<script src="packages/browser/dart.js"></script>'; |
- |
-const POLYMER_MOCKS = const { |
- 'initialize|lib/initialize.dart': ''' |
- library initialize; |
- |
- abstract class Initializer<T> {} |
- |
- class _InitMethod implements Initializer<Function> { |
- const _InitMethod(); |
- } |
- const _InitMethod initMethod = const _InitMethod();''', |
- 'polymer|lib/polymer.html': '<!DOCTYPE html><html>' |
- '<link rel="import" href="../../packages/polymer_interop/polymer.html">', |
- 'polymer|lib/polymer_experimental.html': '<!DOCTYPE html><html>' |
- '<link rel="import" href="polymer.html">', |
- 'polymer_interop|lib/polymer.html': '<!DOCTYPE html><html>' |
- '<link rel="import" href="src/js/polymer.html">', |
- 'polymer_interop|lib/src/js/polymer.html': '<!DOCTYPE html>', |
- 'polymer|lib/polymer.dart': 'library polymer;\n' |
- 'import "dart:html";\n' |
- 'import "package:initialize/initialize.dart";\n' |
- 'export "package:observe/observe.dart";\n' // for @observable |
- 'part "src/loader.dart";\n' // for @CustomTag and @initMethod |
- 'part "src/instance.dart";\n', // for @published and @ObserveProperty |
- |
- 'polymer|lib/src/loader.dart': 'part of polymer;\n' |
- 'class CustomTag implements Initializer<Type> {\n' |
- ' final String tagName;\n' |
- ' const CustomTag(this.tagName);' |
- '}\n', |
- 'polymer|lib/src/instance.dart': 'part of polymer;\n' |
- 'class PublishedProperty { const PublishedProperty(); }\n' |
- 'const published = const PublishedProperty();\n' |
- 'class ComputedProperty {' |
- ' final String expression;\n' |
- ' const ComputedProperty();' |
- '}\n' |
- 'class ObserveProperty { const ObserveProperty(); }\n' |
- 'abstract class Polymer {}\n' |
- 'class PolymerElement extends HtmlElement with Polymer {}\n', |
- 'polymer|lib/init.dart': 'library polymer.init;\n' |
- 'import "package:polymer/polymer.dart";\n' |
- 'main() {};\n', |
- 'observe|lib/observe.dart': 'library observe;\n' |
- 'export "src/metadata.dart";', |
- 'observe|lib/src/metadata.dart': 'library observe.src.metadata;\n' |
- 'class ObservableProperty { const ObservableProperty(); }\n' |
- 'const observable = const ObservableProperty();\n', |
-}; |