// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// @assertion Future<T> first
/// Stops listening to the stream after the first element has been received.
/// Internally the method cancels its subscription after the first element. This
/// means that single-subscription (non-broadcast) streams are closed and cannot
/// be reused after a call to this getter.
/// @description Checks that [first] cannot be called twice.
/// @author iarkh@unipro.ru

import "../../../Utils/expect.dart";
import "dart:io";

Future<String> readOutput(Stream<List<int>> output) async {
  List<List<int>> result = await output.toList();
  if (result.isEmpty) return "";
  return String.fromCharCodes(result.reduce((x, y) => x + y));
}

run_process() async {
  await stdin.first.then((_) async {
    try {
      await stdin.first;
    } catch (e) {
      exit(0);
    }
  });
}

run_main() async {
  String executable = Platform.resolvedExecutable;
  String eScript = Platform.script.toString();

  Process process = await Process.start(
      executable, [...Platform.executableArguments, eScript, "test"],
      runInShell: true);

  process.stdin.writeln("1");
  await process.stdin.flush();

  try {
    await process.stdin.close();
    int code = await process.exitCode;
    Expect.equals(0, code);
  } catch (e) {
    print("Subprocess failed or exited prematurely!");
    print("Exit code: ${await process.exitCode}");
    print("stdout: " + await readOutput(process.stdout));
    print("stderr: " + await readOutput(process.stderr));
    rethrow;
  }
}

main(List<String> args) {
  args.length > 0 ? run_process() : run_main();
}
