// Copyright (c) 2020, 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 'package:args/args.dart';
import 'package:path/path.dart';
import 'package:pub/pub.dart';

import '../core.dart';
import '../vm_interop_handler.dart';

/// Implement `dart test`.
///
/// This command largely delegates to `pub run test`.
class TestCommand extends DartdevCommand {
  static const String cmdName = 'test';

  TestCommand() : super(cmdName, 'Run tests in this package.');

  // This argument parser is here solely to ensure that VM specific flags are
  // provided before any command and to provide a more consistent help message
  // with the rest of the tool.
  @override
  ArgParser createArgParser() {
    return ArgParser.allowAnything();
  }

  @override
  FutureOr<int> run() async {
    try {
      final testExecutable = await getExecutableForCommand('test:test');
      log.trace('dart $testExecutable ${argResults.rest.join(' ')}');
      VmInteropHandler.run(testExecutable, argResults.rest,
          packageConfigOverride:
              join(current, '.dart_tool', 'package_config.json'));
      return 0;
    } on CommandResolutionFailedException catch (e) {
      if (project.hasPubspecFile) {
        print(e.message);
        print('You need to add a dev_dependency on package:test.');
        print('Try running `dart pub add --dev test`.');
      } else {
        print(
            'No pubspec.yaml file found - run this command in your project folder.');
      }
      if (argResults.rest.contains('-h') ||
          argResults.rest.contains('--help')) {
        print('');
        printUsage();
      }
      return 65;
    }
  }
}
