// Copyright 2020 The Fuchsia 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 'package:fxutils/fxutils.dart';

void main() {
  group('ProcessLauncher', () {
    test('returns raw specific output', () async {
      final pl = ProcessLauncher(
        processStarter:
            returnGivenProcess(MockProcess.raw(stdout: 'specific output\n')),
      );
      var processResult = await pl.run('whatever', [], outputEncoding: null);
      expect(processResult.stdout, [
        115,
        112,
        101,
        99,
        105,
        102,
        105,
        99,
        32,
        111,
        117,
        116,
        112,
        117,
        116,
        10,
      ]);
    });

    test('returns utf8 specific output', () async {
      final pl = ProcessLauncher(
        processStarter: returnGivenProcess(
          MockProcess.raw(stdout: 'specific\noutput'),
        ),
      );
      // pl.stdout.listen(output.writeln);
      final result = await pl.run('whatever', []);
      expect(result.stdout.toString(), 'specific\noutput');
    });
  });
  group('fx wrapper', () {
    test('successfully returns process output', () async {
      var fx = Fx.mock(
        MockProcess.raw(stdout: 'specific output\n'),
        FxEnv.env(
          {'FUCHSIA_DIR': '/whatever'},
        ),
      );
      expect(await fx.getSubCommandOutput('whatever'), 'specific output');
    });
    test('successfully returns special characters', () async {
      var fx = Fx.mock(
        MockProcess.raw(stdout: '❌'),
        FxEnv.env({'FUCHSIA_DIR': '/whatever'}),
      );
      expect(await fx.getSubCommandOutput('whatever'), '❌');
    });
    test('leaves trailing newlines', () async {
      var fx = Fx.mock(
        MockProcess.raw(stdout: 'with newline\n'),
        FxEnv.env({'FUCHSIA_DIR': '/whatever'}),
      );
      expect(
          await fx.getSubCommandOutput('whatever', shouldTrimTrailing: false),
          'with newline\n');
    });
    test('raises exp on failed command', () {
      var fx = Fx.mock(
        MockProcess.raw(exitCode: 1),
        FxEnv.env({'FUCHSIA_DIR': '/whatever'}),
      );
      expect(() => fx.getDeviceName(),
          throwsA(TypeMatcher<FailedProcessException>()));
    });
  });
}
