// 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.
// @dart = 2.4
import 'dart:io';

import 'package:fuchsia_ctl/src/command_line.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
import 'package:test/test.dart';

import 'fakes.dart';

void main() {
  CommandLine cli;
  MockProcessManager mockProcessManager;
  MockStdout mockStdout;
  MockStdout mockStderr;

  group('CommandLine', () {
    setUp(() {
      mockStdout = MockStdout();
      mockStderr = MockStdout();
      mockProcessManager = MockProcessManager();
      cli = CommandLine(
          processManager: mockProcessManager,
          stderrValue: mockStderr,
          stdoutValue: mockStdout);
    });

    test('run writes to stdout', () async {
      when(mockProcessManager.run(any))
          .thenAnswer((_) async => ProcessResult(123, 0, 'stdout123', ''));

      await cli.run(<String>['test']);

      verify(mockStdout.writeln('stdout123')).called(1);
    });

    test('run writes to stderr', () async {
      when(mockProcessManager.run(any))
          .thenAnswer((_) async => ProcessResult(123, 0, '', 'stderrABC'));

      await cli.run(<String>['test']);

      verify(mockStderr.writeln('stderrABC')).called(1);
    });

    test('run throws on non-0 exit code', () async {
      when(mockProcessManager.run(any))
          .thenAnswer((_) async => ProcessResult(123, 1, '', 'stderrABC'));

      expect(cli.run(<String>['test']), throwsA(isA<CommandLineException>()));
    });

    test('start adds streams', () async {
      when(mockProcessManager.start(any))
          .thenAnswer((_) async => FakeProcess(0, <String>[''], <String>['']));

      await cli.start(<String>['test']);

      verify(mockStdout.addStream(any)).called(1);
      verify(mockStderr.addStream(any)).called(1);
    });

    test('start throws on non-0 exit code', () async {
      when(mockProcessManager.start(any))
          .thenAnswer((_) async => FakeProcess(1, <String>[''], <String>['']));

      expect(cli.start(<String>['test']), throwsA(isA<CommandLineException>()));
    });
  });
}

class MockProcessManager extends Mock implements ProcessManager {}

class MockStdout extends Mock implements Stdout {}
