// Copyright 2024, 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:io';

import 'package:deps/command.dart';
import 'package:test/test.dart';

/// Overrides [Command.run] for a function [body] to return a fixed [result].
///
/// Checks that [Command.executable] matches the [expected] executable.
///
/// Returns the return value of the function [body].
R mockedRun<R>(ProcessResult result, String expected,
    List<String>? expectedArguments, R Function() body) {
  return overrideRun((executable, arguments, {runInShell = false}) async {
    expect(executable, expected);
    if (expectedArguments != null) {
      expect(arguments, expectedArguments);
    }
    return result;
  }, body);
}

void main() {
  test('echo Hello World!', () async {
    final result =
        await Command('echo', ['Hello', 'World!'], runInShell: true).run();
    expect(result.stdout, 'Hello World!\n');
    expect(result.exitCode, 0);
    expect(result.stderr, '');
  });

  test('mocked run', () async {
    final expectedResult = ProcessResult(123, 567, 'Override!', 'Error!');
    final result = await mockedRun(expectedResult, 'echo', ['Hello', 'World!'],
        () => Command('echo', ['Hello', 'World!'], runInShell: true).run());
    expect(result, expectedResult);
  });

  test('mocked run wrong executable', () {
    final expectedResult = ProcessResult(123, 567, null, null);
    final future = mockedRun(
        expectedResult, 'right', null, () => Command('wrong', []).run());
    expect(future, throwsA(isA<TestFailure>()));
  });

  test('mocked run wrong arguments', () {
    final expectedResult = ProcessResult(123, 567, null, null);
    final future = mockedRun(
        expectedResult, 'right', ['wrong'], () => Command('right', []).run());
    expect(future, throwsA(isA<TestFailure>()));
  });
}
