/*
 * 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 int readByteSync()
 * @assertion String readLineSync({
 *   Encoding encoding: systemEncoding,
 *   bool retainNewlines: false
 *   })
 * If [retainNewlines] is [false], the returned [String] will not contain the
 * final [newline]. If [true], the returned [String] will contain the line
 * terminator. Default is [false].
 * @description Check that if [retainNewlines] is [true], the returned [String]
 * contains [newLine] in the end
 * @author iarkh@unipro.ru
 */
import "../../../Utils/expect.dart";
import "dart:io";

run_process() {
  stdout.write(stdin.readLineSync(retainNewlines: true));
}

run_main() async {
  const CR = 13;
  const LF = 10;

  String executable = Platform.resolvedExecutable;
  String eScript = Platform.script.toString();
  int called = 0;

  await Process.start(
          executable, [...Platform.executableArguments, eScript, "test"],
          runInShell: true)
      .then((Process process) async {
    process.stdin.writeln("Hello");
    await process.stdout.toList().then((out) {
      Expect.isTrue((out[0][out[0].length - 1] == CR) ||
          (out[0][out[0].length - 1] == LF));
      called++;
    });
  });
  Expect.equals(1, called);
}

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