// 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();

    final server = await servePackages();
    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();

    final server = await servePackages();
    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();

    final server = await servePackages();
    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();

    final server = await servePackages();
    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"'));
  });
}
