// 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 for a project.');

  // 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;
    }
  }
}
