// 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 'package:litetest/litetest.dart';

import 'utils.dart';

void main() async {
  final List<CannedProcess> cannedProcesses = <CannedProcess>[
    CannedProcess((List<String> command) => command.contains('ulfuls'),
        stdout: 'Ashita ga aru sa'),
    CannedProcess((List<String> command) => command.contains('quruli'),
        stdout: 'Tokyo'),
    CannedProcess((List<String> command) => command.contains('elizaveta'),
        stdout: 'Moshimo ano toki'),
    CannedProcess((List<String> command) => command.contains('scott_murphy'),
        stdout: 'Donna toki mo'),
  ];

  test('containsCommand passes if command matched', () async {
    final TestEnvironment testEnvironment = TestEnvironment.withTestEngine(
      cannedProcesses: cannedProcesses,
    );
    try {
      await testEnvironment.environment.processRunner.runProcess(
          <String>['ulfuls', '--lyrics'],
          workingDirectory: testEnvironment.environment.engine.srcDir,
          failOk: true);
      await testEnvironment.environment.processRunner.runProcess(
          <String>['quruli', '--lyrics'],
          workingDirectory: testEnvironment.environment.engine.srcDir,
          failOk: true);
      final List<ExecutedProcess> history = testEnvironment.processHistory;
      expect(history, containsCommand((List<String> command) {
        return command.isNotEmpty && command[0] == 'quruli';
      }));
      expect(history, containsCommand((List<String> command) {
        return command.length > 1 && command[1] == '--lyrics';
      }));
    } finally {
      testEnvironment.cleanup();
    }
  });

  test('doesNotContainCommand passes if command not matched', () async {
    final TestEnvironment testEnvironment = TestEnvironment.withTestEngine(
      cannedProcesses: cannedProcesses,
    );
    try {
      await testEnvironment.environment.processRunner.runProcess(
          <String>['elizaveta', '--lyrics'],
          workingDirectory: testEnvironment.environment.engine.srcDir,
          failOk: true);
      await testEnvironment.environment.processRunner.runProcess(
          <String>['scott_murphy', '--lyrics'],
          workingDirectory: testEnvironment.environment.engine.srcDir,
          failOk: true);
      final List<ExecutedProcess> history = testEnvironment.processHistory;
      expect(history, doesNotContainCommand((List<String> command) {
        return command.length > 1 && command[1] == '--not-an-option';
      }));
    } finally {
      testEnvironment.cleanup();
    }
  });
}
