// Copyright (c) 2014, 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 'package:test/test.dart';

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

const SCRIPT = r'''
import 'dart:io';

main(List<String> args) {
  print('running with PUB_CACHE: "${Platform.environment['PUB_CACHE']}"');
}
''';

void main() {
  Future<void> setupForPubRunToPrecompile() async {
    await d.dir(appPath, [
      d.appPubspec({'test': '1.0.0'}),
    ]).create();

    await servePackages((server) => server
      ..serve('test', '1.0.0', contents: [
        d.dir('bin',
            [d.file('test.dart', 'main(List<String> args) => print("hello");')])
      ]));

    await pubGet(args: ['--no-precompile']);
  }

  test('`pub run` precompiles script', () async {
    await setupForPubRunToPrecompile();
    var pub = await pubRun(args: ['test']);
    await pub.shouldExit(0);
    final lines = await pub.stdout.rest.toList();
    expect(lines, contains('Building package executable...'));
    expect(lines, contains('hello'));
  });

  test(
      "`pub run` doesn't write about precompilation when a terminal is not attached",
      () async {
    await setupForPubRunToPrecompile();

    var pub = await pubRun(args: ['test'], verbose: false);
    await pub.shouldExit(0);
    final lines = await pub.stdout.rest.toList();
    expect(lines, isNot(contains('Building package executable...')));
    expect(lines, contains('hello'));
  });

  // Regression test of https://github.com/dart-lang/pub/issues/2483
  test('`pub run` precompiles script with relative PUB_CACHE', () async {
    await d.dir(appPath, [
      d.appPubspec({'test': '1.0.0'}),
    ]).create();

    await servePackages((server) => server
      ..serve('test', '1.0.0', contents: [
        d.dir('bin', [d.file('test.dart', SCRIPT)])
      ]));

    await pubGet(
        args: ['--no-precompile'], environment: {'PUB_CACHE': '.pub_cache'});

    var pub = await pubRun(
      args: ['test'],
      environment: {'PUB_CACHE': '.pub_cache'},
    );
    await pub.shouldExit(0);
    final lines = await pub.stdout.rest.toList();
    expect(lines, contains('Building package executable...'));
    expect(lines, contains('running with PUB_CACHE: ".pub_cache"'));
  });

  test('`get --precompile` precompiles script', () async {
    await d.dir(appPath, [
      d.appPubspec({'test': '1.0.0'}),
    ]).create();

    await servePackages((server) => server
      ..serve('test', '1.0.0', contents: [
        d.dir('bin', [d.file('test.dart', SCRIPT)])
      ]));

    await pubGet(
        args: ['--precompile'],
        output: contains('Building package executables...'));

    var pub = await pubRun(
      args: ['test'],
    );
    await pub.shouldExit(0);
    final lines = await pub.stdout.rest.toList();
    expect(lines, isNot(contains('Building package executable...')));
  });

  // Regression test of https://github.com/dart-lang/pub/issues/2483
  test('`get --precompile` precompiles script with relative PUB_CACHE',
      () async {
    await d.dir(appPath, [
      d.appPubspec({'test': '1.0.0'}),
    ]).create();

    await servePackages((server) => server
      ..serve('test', '1.0.0', contents: [
        d.dir('bin', [d.file('test.dart', SCRIPT)])
      ]));

    await pubGet(
        args: ['--precompile'],
        environment: {'PUB_CACHE': '.pub_cache'},
        output: contains('Building package executables...'));

    var pub = await pubRun(
      args: ['test'],
      environment: {'PUB_CACHE': '.pub_cache'},
    );
    await pub.shouldExit(0);
    final lines = await pub.stdout.rest.toList();
    expect(lines, isNot(contains('Building package executable...')));
    expect(lines, contains('running with PUB_CACHE: ".pub_cache"'));
  });
}
