// 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(dependencies: {'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(dependencies: {'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(dependencies: {'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(dependencies: {'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"'));
  });
}
