blob: b82a2f0d8c57f4653dd2115f7efba048f6173f46 [file] [log] [blame]
// Copyright (c) 2015, 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.
@TestOn('vm')
library web_components.test.build.import_crawler_test;
import 'dart:async';
import 'package:barback/barback.dart';
import 'package:transformer_test/utils.dart';
import 'package:code_transformers/messages/build_logger.dart';
import 'package:html/dom.dart' show Document;
import 'package:web_components/build/common.dart';
import 'package:web_components/build/import_crawler.dart';
import 'package:test/test.dart';
class _TestTransformer extends Transformer {
final String _entryPoint;
Map<AssetId, ImportData> documents;
final bool _preParseDocument;
_TestTransformer(this._entryPoint, [this._preParseDocument = false]);
isPrimary(AssetId id) => id.path == _entryPoint;
apply(Transform transform) {
var primaryInput = transform.primaryInput;
var logger = new BuildLogger(transform, primaryId: primaryInput.id);
if (_preParseDocument) {
return primaryInput.readAsString().then((html) {
var document = parseHtml(html, primaryInput.id.path);
return crawlDocument(transform, logger, document);
});
} else {
return crawlDocument(transform, logger);
}
}
Future crawlDocument(Transform transform, BuildLogger logger,
[Document document]) {
var primaryInput = transform.primaryInput;
var crawler = new ImportCrawler(transform, primaryInput.id, logger,
primaryDocument: document);
return crawler.crawlImports().then((docs) {
documents = docs;
transform.addOutput(new Asset.fromString(
new AssetId('a', 'web/result.txt'), '${documents.keys}'));
});
}
}
main() {
runTests([
[new _TestTransformer('web/index.html')]
]);
// Test with a preparsed original document as well.
runTests([
[new _TestTransformer('web/index.html', true)]
]);
}
runTests(List<List<Transformer>> phases) {
testPhases(
'basic',
phases,
{
'a|web/index.html': '''
<link rel="import" href="foo.html">
<link rel="import" href="packages/a/foo.html">
<link rel="import" href="packages/b/foo.html">
<link rel="import" href="packages/b/foo/bar.html">
<div>a|web/index.html</div>
''',
'a|web/foo.html': '<div>a|web/foo.html</div>',
'a|lib/foo.html': '<div>a|lib/foo.html</div>',
'b|lib/foo.html': '''
<link rel="import" href="foo/bar.html">
<div>b|lib/foo.html</div>
''',
'b|lib/foo/bar.html': '<div>b|lib/foo/bar.html</div>',
},
{
'a|web/result.txt': '''
(a|web/foo.html, a|lib/foo.html, b|lib/foo/bar.html, b|lib/foo.html, a|web/index.html)
''',
},
messages: [],
formatter: StringFormatter.noNewlinesOrSurroundingWhitespace);
testPhases(
'cycle',
phases,
{
'a|web/index.html': '''
<link rel="import" href="packages/a/foo.html">
<div>a|web/index.html</div>
''',
'a|lib/foo.html': '''
<link rel="import" href="bar.html">
<div>a|lib/foo.html</div>''',
'a|lib/bar.html': '''
<link rel="import" href="foo.html">
<div>a|lib/bar.html</div>''',
},
{
'a|web/result.txt': '''
(a|lib/bar.html, a|lib/foo.html, a|web/index.html)
''',
},
messages: [],
formatter: StringFormatter.noNewlinesOrSurroundingWhitespace);
testPhases(
'deep imports',
phases,
{
'a|web/index.html': '''
<link rel="import" href="packages/a/foo.html">
<div>a|web/index.html</div>
''',
'a|lib/foo.html': '''
<link rel="import" href="one/bar.html">
<div>a|lib/foo.html</div>''',
'a|lib/one/bar.html': '''
<link rel="import" href="two/baz.html">
<div>a|lib/one/bar.html</div>''',
'a|lib/one/two/baz.html': '''
<link rel="import" href="three/zap.html">
<div>a|lib/one/two/baz.html</div>''',
'a|lib/one/two/three/zap.html': '''
<div>a|lib/one/two/three/zap.html</div>''',
},
{
'a|web/result.txt':
'(a|lib/one/two/three/zap.html, a|lib/one/two/baz.html, '
'a|lib/one/bar.html, a|lib/foo.html, a|web/index.html)',
},
messages: [],
formatter: StringFormatter.noNewlinesOrSurroundingWhitespace);
}