// 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.
library web_components.test.build.import_crawler_test;

import 'dart:async';
import 'package:barback/barback.dart';
import 'package:code_transformers/tests.dart';
import 'package:code_transformers/messages/build_logger.dart';
import 'package:html5lib/dom.dart' show Document;
import 'package:web_components/build/common.dart';
import 'package:web_components/build/import_crawler.dart';
import 'package:unittest/compact_vm_config.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() {
  useCompactVMConfiguration();
  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)
      ''',
  }, [], 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)
      ''',
  }, [], 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)',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
}
