// Copyright 2013 The Flutter Authors. 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' as io;

import 'package:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_plugin_tools/src/common/core.dart';
import 'package:flutter_plugin_tools/src/custom_test_command.dart';
import 'package:test/test.dart';

import 'mocks.dart';
import 'util.dart';

void main() {
  late FileSystem fileSystem;
  late MockPlatform mockPlatform;
  late Directory packagesDir;
  late RecordingProcessRunner processRunner;
  late CommandRunner<void> runner;

  group('posix', () {
    setUp(() {
      fileSystem = MemoryFileSystem();
      mockPlatform = MockPlatform();
      packagesDir = createPackagesDirectory(fileSystem: fileSystem);
      processRunner = RecordingProcessRunner();
      final CustomTestCommand analyzeCommand = CustomTestCommand(
        packagesDir,
        processRunner: processRunner,
        platform: mockPlatform,
      );

      runner = CommandRunner<void>(
          'custom_test_command', 'Test for custom_test_command');
      runner.addCommand(analyzeCommand);
    });

    test('runs both new and legacy when both are present', () async {
      final Directory package =
          createFakePlugin('a_package', packagesDir, extraFiles: <String>[
        'tool/run_tests.dart',
        'run_tests.sh',
      ]);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(
          processRunner.recordedCalls,
          containsAll(<ProcessCall>[
            ProcessCall(package.childFile('run_tests.sh').path,
                const <String>[], package.path),
            ProcessCall('dart', const <String>['run', 'tool/run_tests.dart'],
                package.path),
          ]));

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Ran for 1 package(s)'),
          ]));
    });

    test('runs when only new is present', () async {
      final Directory package = createFakePlugin('a_package', packagesDir,
          extraFiles: <String>['tool/run_tests.dart']);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(
          processRunner.recordedCalls,
          containsAll(<ProcessCall>[
            ProcessCall('dart', const <String>['run', 'tool/run_tests.dart'],
                package.path),
          ]));

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Ran for 1 package(s)'),
          ]));
    });

    test('runs when only legacy is present', () async {
      final Directory package = createFakePlugin('a_package', packagesDir,
          extraFiles: <String>['run_tests.sh']);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(
          processRunner.recordedCalls,
          containsAll(<ProcessCall>[
            ProcessCall(package.childFile('run_tests.sh').path,
                const <String>[], package.path),
          ]));

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Ran for 1 package(s)'),
          ]));
    });

    test('skips when neither is present', () async {
      createFakePlugin('a_package', packagesDir);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(processRunner.recordedCalls, isEmpty);

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Skipped 1 package(s)'),
          ]));
    });

    test('fails if new fails', () async {
      createFakePlugin('a_package', packagesDir, extraFiles: <String>[
        'tool/run_tests.dart',
        'run_tests.sh',
      ]);

      processRunner.mockProcessesForExecutable['dart'] = <io.Process>[
        MockProcess(exitCode: 1),
      ];

      Error? commandError;
      final List<String> output = await runCapturingPrint(
          runner, <String>['custom-test'], errorHandler: (Error e) {
        commandError = e;
      });

      expect(commandError, isA<ToolExit>());
      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('The following packages had errors:'),
            contains('a_package')
          ]));
    });

    test('fails if legacy fails', () async {
      final Directory package =
          createFakePlugin('a_package', packagesDir, extraFiles: <String>[
        'tool/run_tests.dart',
        'run_tests.sh',
      ]);

      processRunner.mockProcessesForExecutable[
          package.childFile('run_tests.sh').path] = <io.Process>[
        MockProcess(exitCode: 1),
      ];

      Error? commandError;
      final List<String> output = await runCapturingPrint(
          runner, <String>['custom-test'], errorHandler: (Error e) {
        commandError = e;
      });

      expect(commandError, isA<ToolExit>());
      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('The following packages had errors:'),
            contains('a_package')
          ]));
    });
  });

  group('Windows', () {
    setUp(() {
      fileSystem = MemoryFileSystem(style: FileSystemStyle.windows);
      mockPlatform = MockPlatform(isWindows: true);
      packagesDir = createPackagesDirectory(fileSystem: fileSystem);
      processRunner = RecordingProcessRunner();
      final CustomTestCommand analyzeCommand = CustomTestCommand(
        packagesDir,
        processRunner: processRunner,
        platform: mockPlatform,
      );

      runner = CommandRunner<void>(
          'custom_test_command', 'Test for custom_test_command');
      runner.addCommand(analyzeCommand);
    });

    test('runs new and skips old when both are present', () async {
      final Directory package =
          createFakePlugin('a_package', packagesDir, extraFiles: <String>[
        'tool/run_tests.dart',
        'run_tests.sh',
      ]);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(
          processRunner.recordedCalls,
          containsAll(<ProcessCall>[
            ProcessCall('dart', const <String>['run', 'tool/run_tests.dart'],
                package.path),
          ]));

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Ran for 1 package(s)'),
          ]));
    });

    test('runs when only new is present', () async {
      final Directory package = createFakePlugin('a_package', packagesDir,
          extraFiles: <String>['tool/run_tests.dart']);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(
          processRunner.recordedCalls,
          containsAll(<ProcessCall>[
            ProcessCall('dart', const <String>['run', 'tool/run_tests.dart'],
                package.path),
          ]));

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('Ran for 1 package(s)'),
          ]));
    });

    test('skips package when only legacy is present', () async {
      createFakePlugin('a_package', packagesDir,
          extraFiles: <String>['run_tests.sh']);

      final List<String> output =
          await runCapturingPrint(runner, <String>['custom-test']);

      expect(processRunner.recordedCalls, isEmpty);

      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('run_tests.sh is not supported on Windows'),
            contains('Skipped 1 package(s)'),
          ]));
    });

    test('fails if new fails', () async {
      createFakePlugin('a_package', packagesDir, extraFiles: <String>[
        'tool/run_tests.dart',
        'run_tests.sh',
      ]);

      processRunner.mockProcessesForExecutable['dart'] = <io.Process>[
        MockProcess(exitCode: 1),
      ];

      Error? commandError;
      final List<String> output = await runCapturingPrint(
          runner, <String>['custom-test'], errorHandler: (Error e) {
        commandError = e;
      });

      expect(commandError, isA<ToolExit>());
      expect(
          output,
          containsAllInOrder(<Matcher>[
            contains('The following packages had errors:'),
            contains('a_package')
          ]));
    });
  });
}
