// 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")
@Tags(const ["pub"])

import 'dart:io';

import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;

import 'package:test/src/util/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';

import '../io.dart';

/// The `--pub-serve` argument for the test process, based on [pubServePort].
String get _pubServeArg => '--pub-serve=$pubServePort';

void main() {
  setUp(() async {
    await d.file("pubspec.yaml", """
name: myapp
dependencies:
  barback: any
  test: {path: ${p.current}}
transformers:
- myapp:
    \$include: test/**_test.dart
- test/pub_serve:
    \$include: test/**_test.dart
""").create();

    await d.dir("test", [
      d.file("my_test.dart", """
import 'package:test/test.dart';

void main() {
  test("test", () => expect(true, isTrue));
}
""")
    ]).create();

    await d.dir("lib", [
      d.file("myapp.dart", """
import 'package:barback/barback.dart';

class MyTransformer extends Transformer {
  final allowedExtensions = '.dart';

  MyTransformer.asPlugin();

  Future apply(Transform transform) async {
    var contents = await transform.primaryInput.readAsString();
    transform.addOutput(new Asset.fromString(
        transform.primaryInput.id,
        contents.replaceAll("isFalse", "isTrue")));
  }
}
""")
    ]).create();

    await (await runPub(['get'])).shouldExit(0);
  });

  group("with transformed tests", () {
    setUp(() async {
      // Give the test a failing assertion that the transformer will convert to
      // a passing assertion.
      await d.file("test/my_test.dart", """
import 'package:test/test.dart';

void main() {
  test("test", () => expect(true, isFalse));
}
""").create();
    });

    test("runs those tests in the VM", () async {
      var pub = await runPubServe();
      var test = await runTest([_pubServeArg]);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    });

    testWithCompiler("runs those tests on Chrome", (compilerArgs) async {
      var pub = await runPubServe(args: compilerArgs);
      var test = await runTest([_pubServeArg, '-p', 'chrome']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    }, tags: 'chrome');

    test("runs those tests on Node", () async {
      var pub = await runPubServe();
      var test = await runTest([_pubServeArg, '-p', 'node']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    }, tags: 'node');

    test("runs those tests on content shell", () async {
      var pub = await runPubServe();
      var test = await runTest([_pubServeArg, '-p', 'content-shell']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    }, tags: 'content-shell');

    test(
        "gracefully handles pub serve running on the wrong directory for "
        "VM tests", () async {
      await d.dir("web").create();

      var pub = await runPubServe(args: ['web']);
      var test = await runTest([_pubServeArg]);
      expect(
          test.stdout,
          containsInOrder([
            '-1: loading ${p.join("test", "my_test.dart")} [E]',
            'Failed to load "${p.join("test", "my_test.dart")}":',
            '404 Not Found',
            'Make sure "pub serve" is serving the test/ directory.'
          ]));
      await test.shouldExit(1);

      await pub.kill();
    });

    group(
        "gracefully handles pub serve running on the wrong directory for "
        "browser tests", () {
      testWithCompiler("when run on Chrome", (compilerArgs) async {
        await d.dir("web").create();

        var pub = await runPubServe(args: ['web']..addAll(compilerArgs));
        var test = await runTest([_pubServeArg, '-p', 'chrome']);
        expect(
            test.stdout,
            containsInOrder([
              '-1: compiling ${p.join("test", "my_test.dart")} [E]',
              'Failed to load "${p.join("test", "my_test.dart")}":',
              '404 Not Found',
              'Make sure "pub serve" is serving the test/ directory.'
            ]));
        await test.shouldExit(1);

        await pub.kill();
      }, tags: 'chrome');

      test("when run on content shell", () async {
        await d.dir("web").create();

        var pub = await runPubServe(args: ['web']);
        var test = await runTest([_pubServeArg, '-p', 'content-shell']);
        expect(
            test.stdout,
            containsInOrder([
              '-1: loading ${p.join("test", "my_test.dart")} [E]',
              'Failed to load "${p.join("test", "my_test.dart")}":',
              '404 Not Found',
              'Make sure "pub serve" is serving the test/ directory.'
            ]));
        await test.shouldExit(1);

        await pub.kill();
      }, tags: 'content-shell');
    });

    test(
        "gracefully handles pub serve running on the wrong directory for Node "
        "tests", () async {
      await d.dir("web").create();

      var pub = await runPubServe(args: ['web']);
      var test = await runTest([_pubServeArg, '-p', 'node']);
      expect(
          test.stdout,
          containsInOrder([
            '-1: compiling ${p.join("test", "my_test.dart")} [E]',
            'Failed to load "${p.join("test", "my_test.dart")}":',
            '404 Not Found',
            'Make sure "pub serve" is serving the test/ directory.'
          ]));
      await test.shouldExit(1);

      await pub.kill();
    }, tags: 'node');

    test("gracefully handles unconfigured transformers", () async {
      await d.file("pubspec.yaml", """
name: myapp
dependencies:
  barback: any
  test: {path: ${p.current}}
""").create();

      var pub = await runPubServe();
      var test = await runTest([_pubServeArg]);
      expectStderrEquals(test, '''
When using --pub-serve, you must include the "test/pub_serve" transformer in
your pubspec:

transformers:
- test/pub_serve:
    \$include: test/**_test.dart
''');
      await test.shouldExit(exit_codes.data);

      await pub.kill();
    });
  });

  group("uses a custom HTML file", () {
    setUp(() async {
      await d.dir("test", [
        d.file("test.dart", """
import 'dart:html';

import 'package:test/test.dart';

void main() {
  test("failure", () {
    expect(document.query('#foo'), isNull);
  });
}
"""),
        d.file("test.html", """
<html>
<head>
  <link rel='x-dart-test' href='test.dart'>
  <script src="packages/test/dart.js"></script>
</head>
<body>
  <div id="foo"></div>
</body>
""")
      ]).create();
    });

    testWithCompiler("on Chrome", (compilerArgs) async {
      var pub = await runPubServe(args: compilerArgs);
      var test = await runTest([_pubServeArg, '-p', 'chrome']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    }, tags: 'chrome');

    test("on content shell", () async {
      var pub = await runPubServe();
      var test = await runTest([_pubServeArg, '-p', 'content-shell']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
      await pub.kill();
    }, tags: 'content-shell');
  });

  group("with a failing test", () {
    setUp(() async {
      await d.file("test/my_test.dart", """
import 'dart:html';

import 'package:test/test.dart';

void main() {
  test("failure", () => throw 'oh no');
}
""").create();
    });

    group("dartifies stack traces for JS-compiled tests by default", () {
      test("on a browser", () async {
        var pub = await runPubServe();
        var test =
            await runTest([_pubServeArg, '-p', 'chrome', '--verbose-trace']);
        expect(
            test.stdout,
            containsInOrder(
                [" main.<fn>", "package:test", "dart:async/zone.dart"]));
        await test.shouldExit(1);
        pub.kill();
      }, tags: 'chrome');

      test("on Node", () async {
        var pub = await runPubServe();
        var test =
            await runTest([_pubServeArg, '-p', 'node', '--verbose-trace']);
        expect(
            test.stdout,
            containsInOrder(
                [" main.<fn>", "package:test", "dart:async/zone.dart"]));
        await test.shouldExit(1);
        pub.kill();
      }, tags: 'node');
    });

    group("doesn't dartify stack traces for JS-compiled tests with --js-trace",
        () {
      test("on a browser", () async {
        var pub = await runPubServe();
        var test = await runTest(
            [_pubServeArg, '-p', 'chrome', '--js-trace', '--verbose-trace']);

        expect(test.stdoutStream(), neverEmits(endsWith(" main.<fn>")));
        expect(test.stdoutStream(), neverEmits(contains("package:test")));
        expect(
            test.stdoutStream(), neverEmits(contains("dart:async/zone.dart")));
        expect(test.stdout, emitsThrough(contains("-1: Some tests failed.")));
        await test.shouldExit(1);

        await pub.kill();
      }, tags: 'chrome');

      test("on Node", () async {
        var pub = await runPubServe();
        var test = await runTest(
            [_pubServeArg, '-p', 'node', '--js-trace', '--verbose-trace']);

        expect(test.stdoutStream(), neverEmits(endsWith(" main.<fn>")));
        expect(test.stdoutStream(), neverEmits(contains("package:test")));
        expect(
            test.stdoutStream(), neverEmits(contains("dart:async/zone.dart")));
        expect(test.stdout, emitsThrough(contains("-1: Some tests failed.")));
        await test.shouldExit(1);

        await pub.kill();
      }, tags: 'node');
    });
  });

  test("gracefully handles pub serve not running for VM tests", () async {
    var test = await runTest(['--pub-serve=54321']);
    expect(
        test.stdout,
        containsInOrder([
          '-1: loading ${p.join("test", "my_test.dart")} [E]',
          'Failed to load "${p.join("test", "my_test.dart")}":',
          'Error getting http://localhost:54321/my_test.dart.vm_test.dart: '
              'Connection refused',
          'Make sure "pub serve" is running.'
        ]));
    await test.shouldExit(1);
  });

  test("gracefully handles pub serve not running for browser tests", () async {
    var test = await runTest(['--pub-serve=54321', '-p', 'chrome']);
    var message = Platform.isWindows
        ? 'The remote computer refused the network connection.'
        : 'Connection refused (errno ';

    expect(
        test.stdout,
        containsInOrder([
          '-1: compiling ${p.join("test", "my_test.dart")} [E]',
          'Failed to load "${p.join("test", "my_test.dart")}":',
          'Error getting http://localhost:54321/my_test.dart.browser_test.dart.js'
              '.map: $message',
          'Make sure "pub serve" is running.'
        ]));
    await test.shouldExit(1);
  }, tags: 'chrome');

  test("gracefully handles pub serve not running for Node tests", () async {
    var test = await runTest(['--pub-serve=54321', '-p', 'node']);
    var message = Platform.isWindows
        ? 'The remote computer refused the network connection.'
        : 'Connection refused (errno ';

    expect(
        test.stdout,
        containsInOrder([
          '-1: compiling ${p.join("test", "my_test.dart")} [E]',
          'Failed to load "${p.join("test", "my_test.dart")}":',
          'Error getting http://localhost:54321/my_test.dart.node_test.dart.js:'
              ' $message',
          'Make sure "pub serve" is running.'
        ]));
    await test.shouldExit(1);
  }, tags: 'node');

  test("gracefully handles a test file not being in test/", () async {
    new File(p.join(d.sandbox, 'test/my_test.dart'))
        .copySync(p.join(d.sandbox, 'my_test.dart'));

    var test = await runTest(['--pub-serve=54321', 'my_test.dart']);
    expect(
        test.stdout,
        containsInOrder([
          '-1: loading my_test.dart [E]',
          'Failed to load "my_test.dart": When using "pub serve", all test files '
              'must be in test/.'
        ]));
    await test.shouldExit(1);
  });
}

/// The list of supported compilers for the current [Platform.version].
final Iterable<String> _compilers = () {
  var compilers = ['dart2js'];
  if (_sdkSupportsDartDevc) compilers.add('dartdevc');
  return compilers;
}();

/// Whether or not the dartdevc compiler is supported on the current
/// [Platform.version].
final bool _sdkSupportsDartDevc = () {
  var sdkVersion = new Version.parse(Platform.version.split(' ').first);
  var minDartDevcVersion = new Version(1, 24, 0);
  return sdkVersion >= minDartDevcVersion;
}();

/// Runs the test described by [testFn] once for each supported compiler on the
/// current [Platform.version], passing the relevant compiler args for pub serve
/// as the first argument.
void testWithCompiler(String name, testFn(List<String> compilerArgs), {tags}) {
  for (var compiler in _compilers) {
    var compilerArgs = _sdkSupportsDartDevc ? ['--web-compiler', compiler] : [];
    test("$name with $compiler", () => testFn(compilerArgs), tags: tags);
  }
}
