// Copyright (c) 2017, 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.
import 'dart:async';
import 'dart:io';

import 'package:path/path.dart' as p;
import 'package:test/test.dart';

import '../descriptor.dart' as d;
import '../serve/utils.dart';
import '../test_pub.dart';

main() {
  group("can compile js files for modules under lib and web", () {
    d.DirectoryDescriptor appDir;
    d.DirectoryDescriptor appLibDir;
    d.FileDescriptor appHelloFile;

    setUp(() async {
      await d.dir("foo", [
        d.libPubspec("foo", "1.0.0"),
        d.dir("lib", [
          d.file(
              "foo.dart",
              """
  String get message => 'hello';
  """)
        ]),
      ]).create();

      appHelloFile = d.file(
          "hello.dart",
          """
import 'package:foo/foo.dart';

hello() => message;
""");
      appLibDir = d.dir("lib", [appHelloFile]);
      appDir = d.dir(appPath, [
        d.appPubspec({
          "foo": {"path": "../foo"}
        }),
        appLibDir,
        d.dir("web", [
          d.file(
              "main.dart",
              """
import 'package:myapp/hello.dart';

void main() {
  print(hello());
}
""")
        ])
      ]);
      await appDir.create();

      await pubGet();
      await pubServe(args: ['--web-compiler', 'dartdevc']);
    });

    test("on initial build", () async {
      // Just confirm some basic things are present indicating that the module
      // was compiled. The goal here is not to test dartdevc itself.
      await requestShouldSucceed('web__main.js', contains('main'));
      await requestShouldSucceed('web__main.js.map', contains('web__main.js'));
      await requestShouldSucceed(
          'packages/myapp/lib__hello.js', contains('hello'));
      await requestShouldSucceed(
          'packages/myapp/lib__hello.js.map', contains('lib__hello.js'));
      await requestShouldSucceed(
          'packages/foo/lib__foo.js', contains('message'));
      await requestShouldSucceed(
          'packages/foo/lib__foo.js.map', contains('lib__foo.js'));
      await requestShould404('invalid.js');
      await requestShould404('packages/foo/invalid.js');
      await endPubServe();
    });

    // Creates a world.dart file under lib/src for the main app.
    Future _addWorldDotDart() async {
      var srcDir = d.dir('src', [
        d.file(
            "world.dart",
            """
  world() => "world";
  """)
      ]);
      await srcDir.create(p.join(d.sandbox, appDir.name, appLibDir.name));
      // TODO(jakemac53): Better solution here, we need to give pub a bit of
      // time to recognize the file change. See below as well.
      await new Future.delayed(new Duration(seconds: 1));
    }

    test("after adding new files", () async {
      // Make sure to force an initial build.
      await requestShouldSucceed('web__main.js', contains('main'));

      // Create a new file at lib/src/world.dart
      await _addWorldDotDart();

      // Request it, it ends up in its own module since it's not imported by
      // any entrypoint.
      await requestShouldSucceed(
          'packages/myapp/lib__src__world.js', contains('world'));
      await requestShouldSucceed('packages/myapp/lib__src__world.js.map',
          contains('lib__src__world.js'));
      await endPubServe();
    });

    test("after file edits that cause module restructuring", () async {
      // Make sure to force an initial build.
      await requestShouldSucceed('web__main.js', contains('main'));

      // Create a new file at lib/src/world.dart
      await _addWorldDotDart();

      // Edit lib/src/hello.dart to import that file.
      var helloFile = new File(
          p.join(d.sandbox, appDir.name, appLibDir.name, appHelloFile.name));
      assert(helloFile.existsSync());
      await helloFile.writeAsString("""
  import "package:foo/foo.dart";
  import "src/world.dart";

  hello() => print(hello() + " " + world());
  """);
      // TODO(jakemac53): Better solution here, we need to give pub a bit of
      // time to recognize the file change. See below as well.
      await new Future.delayed(new Duration(seconds: 1));

      await requestShouldSucceed('packages/myapp/lib__hello.js',
          allOf(contains('hello'), contains('world')));
      await requestShouldSucceed(
          'packages/myapp/lib__hello.js.map', contains('lib__hello.js'));

      // Should not get a module for `world.dart` on its own, it should be
      // folded into the `hello.dart` module.
      await requestShould404('packages/myapp/lib__src__world.js');
      await endPubServe();
    });
  });

  group('basic app', () {
    setUp(() async {
      await d.dir(appPath, [
        d.appPubspec(),
        d.dir("lib", [
          d.file("main.dart", 'void main() {}'),
        ]),
        d.dir("web", [
          d.file("main.dart", 'void main() {}'),
          d.dir("subdir", [
            d.file("main.dart", 'void main() {}'),
          ]),
        ]),
      ]).create();

      await pubGet();
      await pubServe(args: ['--web-compiler', 'dartdevc']);
    });

    test("dartdevc resources are copied next to entrypoints", () async {
      await requestShouldSucceed('dart_sdk.js', null);
      await requestShouldSucceed('require.js', null);
      await requestShouldSucceed('dart_stack_trace_mapper.js', null);
      await requestShouldSucceed('ddc_web_compiler.js', null);
      await requestShould404('dart_sdk.js.map');
      await requestShould404('require.js.map');
      await requestShould404('dart_stack_trace_mapper.js.map');
      await requestShould404('ddc_web_compiler.js.map');
      await requestShouldSucceed('subdir/dart_sdk.js', null);
      await requestShouldSucceed('subdir/require.js', null);
      await requestShouldSucceed('subdir/dart_stack_trace_mapper.js', null);
      await requestShouldSucceed('subdir/ddc_web_compiler.js', null);
      await requestShould404('subdir/dart_sdk.js.map');
      await requestShould404('subdir/require.js.map');
      await requestShould404('subdir/dart_stack_trace_mapper.js.map');
      await requestShould404('subdir/ddc_web_compiler.js.map');
      await endPubServe();
    });

    // Regression test for https://github.com/dart-lang/pub/issues/1638.
    test("can request the bootstrap.js file before the dart.js file", () async {
      await requestShouldSucceed('subdir/main.dart.bootstrap.js', null);
      await requestShouldSucceed('subdir/main.dart.js', null);
      await endPubServe();
    });
  });
}
