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

import 'package:fxtest/fxtest.dart';
import 'package:fxutils/fxutils.dart';
import 'package:test/test.dart';

// Note: These tests pass locally (when executed by `pub run test`), but not
// when built by GN, because of their dependency on `output_tester.sh`.
// For this reason, they are commented out in the BUILD.gn file. Ideally, a
// solution here will be worked out and the directive in BUILD.gn can be
// uncommented.

void main() {
  group('test output is routed correctly', () {
    test('when -o is passed', () async {
      var strings = <String>[];
      void addStrings(String s) {
        strings.add(s);
      }

      var startProcess = mockStartProcess(createOutputTester());
      var runner = TestRunner(startProcess: startProcess);
      runner.output.listen(addStrings);
      var result = await runner.run(
        './test/output_tester.sh',
        [],
        workingDirectory: '.',
      );

      expect(strings.length, 3);
      expect(strings[0], 'line 1');
      expect(strings[1], 'line 2');
      expect(strings[2], 'stderr');
      expect(result.stdout, 'line 1\nline 2\n');
    });

    test('when -o is not passed', () async {
      var startProcess = mockStartProcess(createOutputTester());
      var runner = TestRunner(startProcess: startProcess);
      runner.output.listen((_) {});
      var result = await runner.run(
        './test/output_tester.sh',
        [],
        workingDirectory: '.',
      );
      expect(result.stdout, 'line 1\nline 2\n');
    });
  });
}

/// Creates an output tester mock process with hardcoded output.
Process createOutputTester() => MockProcess.raw(
      stdout: 'line 1\nline 2\n',
      stderr: 'stderr\n',
    );
