// Copyright (c) 2014, 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 "package:expect/expect.dart";
import "dart:async";
import "dart:convert";
import "dart:io";

callIOSink(IOSink sink) {
  // Call all methods on IOSink.
  sink.encoding = ascii;
  Expect.equals(ascii, sink.encoding);
  sink.write("Hello\n");
  sink.writeln("Hello");
  sink.writeAll(["H", "e", "l", "lo\n"]);
  sink.writeCharCode(72);
  sink.add([101, 108, 108, 111, 10]);

  var controller = new StreamController<List<int>>(sync: true);
  var future = sink.addStream(controller.stream);
  controller.add([72, 101, 108]);
  controller.add([108, 111, 10]);
  controller.close();

  future.then((_) {
    controller = new StreamController(sync: true);
    controller.stream.pipe(sink);
    controller.add([72, 101, 108]);
    controller.add([108, 111, 10]);
    controller.close();
  });
}

main() {
  callIOSink(stdout.nonBlocking);
  stdout.nonBlocking.done.then((_) {
    callIOSink(stderr.nonBlocking);
    stderr.nonBlocking.done.then((_) {
      stdout.close();
      stderr.close();
    });
  });
}
