// 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.

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

import "package:path/path.dart";

void testReadByte() {
  void test(String line, List<String> expected) {
    var script = join(dirname(Platform.script), "stdin_sync_script.dart");
    Process.start(Platform.executable,
                  ["--checked", script]..addAll(
                      expected.map(stringify))).then((process) {
      process.stdin.write(line);
      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 = false;
  var line;
  while ((line = stdin.readLineSync()) != null) {
    print("You typed: $line");
  }
}

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


void main() {
  testReadByte();

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