// 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
/// Except for the type of the error, this method is equivalent to
/// [this.elementAt(0)].
/// @description Checks that [first] call result is equivalent to the result of
/// [this.elementAt(0)]
/// @author iarkh@unipro.ru

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

run_process(String arg) {
  if (arg == "first") {
    stdin.first.then((List<int> l) {
      print(SystemEncoding().decode(l));
    });
  } else {
    stdin.elementAt(0).then((List<int> l) {
      print(SystemEncoding().decode(l));
    });
  }
}

String getResultString(List<int> res) {
  return String.fromCharCodes(res).replaceAll("\r\n", "\n");
}

run_main() async {
  String executable = Platform.resolvedExecutable;
  String eScript = Platform.script.toString();
  String res_first = "", res_elementAt = "";

  await Process.start(
          executable, [...Platform.executableArguments, eScript, "first"],
          runInShell: true)
      .then((Process process) async {
    process.stdin.writeln("12345");
    res_first = await process.stdout.transform(systemEncoding.decoder).join();
  });

  await Process.start(executable,
          [eScript, "elementAt"],
          runInShell: true)
      .then((Process process) async {
    process.stdin.writeln("12345");
    res_elementAt =
        await process.stdout.transform(systemEncoding.decoder).join();
  });

  Expect.isTrue("12345\n\n".startsWith(res_first.replaceAll("\r\n", "\n")));
  Expect.isTrue("12345\n\n".startsWith(res_elementAt.replaceAll("\r\n", "\n")));
}

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