// 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.script_compactor_test;

import 'package:code_transformers/tests.dart';
import 'package:web_components/build/messages.dart';
import 'package:web_components/build/script_compactor.dart';
import 'package:unittest/compact_vm_config.dart';
import 'package:unittest/unittest.dart';

var transformer = new ScriptCompactorTransformer();
var phases = [[transformer]];

main() {
  useCompactVMConfiguration();

  group('basic', basicTests);
  group('code extraction tests', codeExtractorTests);
  group('fixes import/export/part URIs', dartUriTests);
  group('validates script-tag URIs', validateUriTests);
}

void basicTests() {
  testPhases('single script', phases, {
    'a|web/index.html': '''
        <!DOCTYPE html><html><head></head><body>
          <script type="application/dart" src="index.dart"></script>
        </body></html>''',
    'a|web/index.dart': '''
        library a.index;
        main(){}''',
  }, {
    'a|web/index.html': '''
        <!DOCTYPE html><html><head></head><body>
        <script type="application/dart" src="index.bootstrap.dart"></script>
        </body></html>''',
    'a|web/index.bootstrap.dart': '''
        library a.web.index_bootstrap_dart;

        import 'index.dart' as i0;

        void main() { i0.main(); }''',
    'a|web/index.dart': '''
        library a.index;
        main(){}''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('multiple scripts from nested html import', phases, {
    'a|web/index.html': '''
        <!DOCTYPE html><html>
          <head>
            <link rel="import" href="packages/b/a.html">
          </head>
          <body>
            <script type="application/dart" src="index.dart"></script>
          </body>
        </body></html>''',
    'a|web/index.dart': '''
        library a.index;
        main(){}''',
    'b|lib/a.html': '''
        <link rel="import" href="b/b.html">
        <link rel="import" href="../../packages/c/c.html">
        <script type="application/dart" src="a.dart"></script>''',
    'b|lib/b/b.html': '<script type="application/dart" src="b.dart"></script>',
    'b|lib/a.dart': 'library b.a;',
    'b|lib/b/b.dart': 'library b.b.b;',
    'c|lib/c.html': '<script type="application/dart" src="c.dart"></script>',
    'c|lib/c.dart': 'library c.c;',
  }, {
    'a|web/index.html': '''
        <!DOCTYPE html><html>
        <head>
          <link rel="import" href="packages/b/a.html">
        </head>
        <body>
          <script type="application/dart" src="index.bootstrap.dart"></script>
        </body></html>''',
    'a|web/index.bootstrap.dart': '''
        library a.web.index_bootstrap_dart;

        import 'package:b/b/b.dart' as i0;
        import 'package:c/c.dart' as i1;
        import 'package:b/a.dart' as i2;
        import 'index.dart' as i3;

        void main() { i3.main(); }''',
    'b|lib/a.html': '''
        <link rel="import" href="b/b.html">
        <link rel="import" href="../../packages/c/c.html">
        <script type="application/dart" src="a.dart"></script>''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('inline scripts', phases, {
    'a|web/index.html': '''
        <!DOCTYPE html>
        <html>
          <head>
            <link rel="import" href="packages/a/foo.html">
          </head>
          <body>
            <script type="application/dart">
              library a.index;
              main(){}
            </script>
          </body>
        </html>''',
    'a|lib/foo.html': '''
        <script type="application/dart">
          library a.foo;

          import 'bar.dart';
        </script>''',
  }, {
    'a|web/index.html': '''
        <!DOCTYPE html>
        <html>
          <head>
            <link rel="import" href="packages/a/foo.html">
          </head>
          <body>
            <script type="application/dart" src="index.html.1.bootstrap.dart"></script>
          </body>
        </html>''',
    'a|web/index.html.1.dart': '''
        library a.index;
        main(){}''',
    'a|web/index.html.0.dart': '''
        library a.foo;

        import 'package:a/bar.dart';''',
    'a|web/index.html.1.bootstrap.dart': '''
        library a.web.index_html_1_bootstrap_dart;

        import 'index.html.0.dart' as i0;
        import 'index.html.1.dart' as i1;

        void main() { i1.main(); }''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('Cleans library names generated from file paths.', phases, {
    'a|web/01_test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">/*1*/</script>
        </head></html>''',
    'a|web/foo_02_test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">/*2*/</script>
        </head></html>''',
    'a|web/test_03.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">/*3*/</script>
        </head></html>''',
    'a|web/*test_%foo_04!.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">/*4*/</script>
        </head></html>''',
    'a|web/%05_test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">/*5*/</script>
        </head></html>''',
  }, {
    // Appends an _ if it starts with a number.
    'a|web/01_test.html.0.dart': 'library a.web._01_test_html_0;\n/*1*/',
    // Allows numbers in the middle.
    'a|web/foo_02_test.html.0.dart': 'library a.web.foo_02_test_html_0;\n/*2*/',
    // Allows numbers at the end.
    'a|web/test_03.html.0.dart': 'library a.web.test_03_html_0;\n/*3*/',
    // Replaces invalid characters with _.
    'a|web/*test_%foo_04!.html.0.dart':
        'library a.web._test__foo_04__html_0;\n/*4*/',
    // Replace invalid character followed by number.
    'a|web/%05_test.html.0.dart': 'library a.web._05_test_html_0;\n/*5*/',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
}

void codeExtractorTests() {
  testPhases('no dart script', phases, {
    'a|web/test.html': '<!DOCTYPE html><html></html>',
  }, {}, [
    'error: Found either zero or multiple dart scripts in the entry point '
        '`web/test.html`. Exactly one was expected.',
  ], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('single script, no library in script', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">main() { }</script>''',
  }, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <script type="application/dart" src="test.html.0.bootstrap.dart">
          </script>
        </head><body></body></html>''',
    'a|web/test.html.0.dart': '''
        library a.web.test_html_0;
        main() { }''',
    'a|web/test.html.0.bootstrap.dart': '''
        library a.web.test_html_0_bootstrap_dart;

        import 'test.html.0.dart' as i0;

        void main() { i0.main(); }''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('single script, with library', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">
          library f;
          main() { }
        </script>''',
  }, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <script type="application/dart" src="test.html.0.bootstrap.dart">
          </script>
        </head><body></body></html>''',
    'a|web/test.html.0.dart': '''
        library f;
        main() { }''',
    'a|web/test.html.0.bootstrap.dart': '''
        library a.web.test_html_0_bootstrap_dart;

        import 'test.html.0.dart' as i0;

        void main() { i0.main(); }''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('under lib/ directory not transformed', phases, {
    'a|lib/test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">
          library f;
          main() { }
        </script>''',
  }, {
    'a|lib/test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">
          library f;
          main() { }
        </script>''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('multiple scripts - error', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
        <script type="application/dart">
            library a1;
            main1() { }
        </script>
        <script type="application/dart">library a2;\nmain2() { }</script>''',
  }, {}, [
    'error: Found either zero or multiple dart scripts in the entry point '
        '`web/test.html`. Exactly one was expected.',
  ], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('multiple imported scripts', phases, {
    'a|web/test.html': '''
        <link rel="import" href="test2.html">
        <link rel="import" href="bar/test.html">
        <link rel="import" href="packages/a/foo/test.html">
        <link rel="import" href="packages/b/test.html">
        <script type="application/dart" src="test.dart"></script>''',
    'a|web/test.dart': 'library a.test;',
    'a|web/test2.html': '<script type="application/dart">main1() { }',
    'a|web/bar/test.html': '<script type="application/dart">main2() { }',
    'a|lib/foo/test.html': '<script type="application/dart">main3() { }',
    'b|lib/test.html': '<script type="application/dart">main4() { }',
  }, {
    'a|web/test.html': '''
        <html>
          <head>
            <link rel="import" href="test2.html">
            <link rel="import" href="bar/test.html">
            <link rel="import" href="packages/a/foo/test.html">
            <link rel="import" href="packages/b/test.html">
            <script type="application/dart" src="test.bootstrap.dart"></script>
          </head><body></body></html>''',
    'a|web/test.bootstrap.dart': '''
        library a.web.test_bootstrap_dart;
        import 'test.html.0.dart' as i0;
        import 'test.html.1.dart' as i1;
        import 'test.html.2.dart' as i2;
        import 'test.html.3.dart' as i3;
        import 'test.dart' as i4;

        void main() { i4.main(); }
        ''',
    'a|web/test.html.0.dart': '''
        library a.web.test_html_0;
        main1() { }''',
    'a|web/test.html.1.dart': '''
        library a.web.test_html_1;
        main2() { }''',
    'a|web/test.html.2.dart': '''
        library a.web.test_html_2;
        main3() { }''',
    'a|web/test.html.3.dart': '''
        library a.web.test_html_3;
        main4() { }''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
}

dartUriTests() {
  testPhases('from web folder', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <link rel="import" href="test2/foo.html">
          <script type="application/dart" src="test.dart"></script>
        </head><body></body></html>''',
    'a|web/test.dart': 'library a.test;',
    'a|web/test2/foo.html': '''
      <!DOCTYPE html><html><head></head><body>
      <script type="application/dart">
        import 'package:qux/qux.dart';
        import 'foo.dart';
        export 'bar.dart';
        part 'baz.dart';
      </script>
      </body></html>''',
  }, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <link rel="import" href="test2/foo.html">
          <script type="application/dart" src="test.bootstrap.dart"></script>
        </head><body></body></html>''',
    'a|web/test.html.0.dart': '''
        library a.web.test_html_0;

        import 'package:qux/qux.dart';
        import 'test2/foo.dart';
        export 'test2/bar.dart';
        part 'test2/baz.dart';''',
    'a|web/test2/foo.html': '''
        <!DOCTYPE html><html><head></head><body>
          <script type="application/dart" src="foo.html.0.bootstrap.dart">
          </script>
        </body></html>''',
    'a|web/test2/foo.html.0.dart': '''
        library a.web.test2.foo_html_0;

        import 'package:qux/qux.dart';
        import 'foo.dart';
        export 'bar.dart';
        part 'baz.dart';''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('from lib folder', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
        <link rel="import" href="packages/a/test2/foo.html">
        <script type="application/dart" src="test.dart"></script>
        </head><body></body></html>''',
    'a|web/test.dart': 'library a.test;',
    'a|lib/test2/foo.html': '''
        <!DOCTYPE html><html><head></head><body>
        <script type="application/dart">
          import 'package:qux/qux.dart';
          import 'foo.dart';
          export 'bar.dart';
          part 'baz.dart';
        </script>
        </body></html>''',
  }, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <link rel="import" href="packages/a/test2/foo.html">
          <script type="application/dart" src="test.bootstrap.dart"></script>
        </head><body></body></html>''',
    'a|web/test.html.0.dart': '''
        library a.web.test_html_0;

        import 'package:qux/qux.dart';
        import 'package:a/test2/foo.dart';
        export 'package:a/test2/bar.dart';
        part 'package:a/test2/baz.dart';''',
    'a|lib/test2/foo.html': '''
        <!DOCTYPE html><html><head></head><body>
        <script type="application/dart">
          import 'package:qux/qux.dart';
          import 'foo.dart';
          export 'bar.dart';
          part 'baz.dart';
        </script>
        </body></html>''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);

  testPhases('from another pkg', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <link rel="import" href="packages/b/test2/foo.html">
          <script type="application/dart" src="test.dart"></script>
        </head><body></body></html>''',
    'a|web/test.dart': 'library a.test;',
    'b|lib/test2/foo.html': '''
      <!DOCTYPE html><html><head></head><body>
      <script type="application/dart">
      import 'package:qux/qux.dart';
      import 'foo.dart';
      export 'bar.dart';
      part 'baz.dart';
      </script>
      </body></html>''',
  }, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><head>
          <link rel="import" href="packages/b/test2/foo.html">
          <script type="application/dart" src="test.bootstrap.dart"></script>
        </head><body></body></html>''',
    'a|web/test.html.0.dart': '''
        library a.web.test_html_0;

        import 'package:qux/qux.dart';
        import 'package:b/test2/foo.dart';
        export 'package:b/test2/bar.dart';
        part 'package:b/test2/baz.dart';''',
  }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
}

validateUriTests() {
  testPhases('script src is invalid', phases, {
    'a|web/test.html': '''
        <!DOCTYPE html><html><body>
        <script type="application/dart" src="a.dart"></script>
        </body></html>''',
  }, {}, [
    'warning: ${scriptFileNotFound.create({'url': 'a|web/a.dart'}).snippet} '
        '(web/test.html 1 8)',
  ]);
}
