// Copyright (c) 2013, 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.

// OtherResources=stdin_sync_script.dart

import "dart:convert";
import "dart:io";

import "package:expect/expect.dart";

void testReadByte() {
  void test(String line, List<String> expected) {
    var script = Platform.script.resolve("stdin_sync_script.dart").toFilePath();
    Process.start(
            Platform.executable,
            []
              ..addAll(Platform.executableArguments)
              ..add('--verbosity=warning')
              ..add(script)
              ..addAll(expected.map(json.encode)))
        .then((process) {
      process.stdin.write(line);
      process.stdin.flush().then((_) => process.stdin.close());
      process.stderr
          .transform(utf8.decoder)
          .transform(new LineSplitter())
          .fold(new StringBuffer(), (b, d) => b..write(d))
          .then((data) {
        if (data.toString() != '') throw "Bad output: '$data'";
      });
      process.stdout
          .transform(utf8.decoder)
          .transform(new LineSplitter())
          .fold(new StringBuffer(), (b, d) => b..write(d))
          .then((data) {
        if (data.toString() != 'true') throw "Bad output: '$data'";
      });
    });
  }

  test("hej\x01\x00\x0d\x0a\x0a4\x0a", ['hej\x01\x00', '', '4']);

  test("hej\u0187", ['hej\u0187']);

  test("hej\rhej\nhej\r", ['hej\rhej', 'hej\r']);

  test("hej\r\r\nhej\r\nhej\r", ['hej\r', 'hej', 'hej\r']);

  test("hej", ['hej']);
}

void testEchoMode() {
  stdin.echoMode = true;
  Expect.isTrue(stdin.echoMode);
  stdin.echoMode = false;
  Expect.isFalse(stdin.echoMode);
  var line;
  while ((line = stdin.readLineSync()) != null) {
    print("You typed: $line");
  }
}

void testLineMode() {
  stdin.lineMode = true;
  Expect.isTrue(stdin.lineMode);
  stdin.lineMode = false;
  Expect.isFalse(stdin.lineMode);
  var char;
  while ((char = stdin.readByteSync()) != -1) {
    print("You typed: $char");
  }
}

void main() {
  testReadByte();

  // testEchoMode and testLineMode is developer-interactive tests, thus not
  // enabled.
  //testEchoMode();
  //testLineMode();
}
