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

import 'src/utils.dart';

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

  test('containsCommand passes if command matched', () async {
    final testEnvironment = TestEnvironment.withTestEngine(
      cannedProcesses: cannedProcesses,
    );
    addTearDown(testEnvironment.cleanup);

    await testEnvironment.environment.processRunner.runProcess(
      ['ulfuls', '--lyrics'],
      workingDirectory: testEnvironment.environment.engine.srcDir,
      failOk: true,
    );
    await testEnvironment.environment.processRunner.runProcess(
      ['quruli', '--lyrics'],
      workingDirectory: testEnvironment.environment.engine.srcDir,
      failOk: true,
    );
    final history = testEnvironment.processHistory;
    expect(history, containsCommand((command) {
      return command.isNotEmpty && command[0] == 'quruli';
    }));
    expect(history, containsCommand((command) {
      return command.length > 1 && command[1] == '--lyrics';
    }));
  });

  test('doesNotContainCommand passes if command not matched', () async {
    final testEnvironment = TestEnvironment.withTestEngine(
      cannedProcesses: cannedProcesses,
    );
    addTearDown(testEnvironment.cleanup);

    await testEnvironment.environment.processRunner.runProcess(
      ['elizaveta', '--lyrics'],
      workingDirectory: testEnvironment.environment.engine.srcDir,
      failOk: true,
    );
    await testEnvironment.environment.processRunner.runProcess(
      ['scott_murphy', '--lyrics'],
      workingDirectory: testEnvironment.environment.engine.srcDir,
      failOk: true,
    );
    final history = testEnvironment.processHistory;
    expect(history, doesNotContainCommand((command) {
      return command.length > 1 && command[1] == '--not-an-option';
    }));
  });
}
