/*
 * Copyright (c) 2017, 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 CLASS  Stdout
 * It provides a blocking [IOSink], so using this to write will block until the
 * output is written.
 * @description Checks that [stdout] is blocked during writing by default.
 * @author iarkh@unipro.ru
 */

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

bool called = false;

Stream<List<int>> stream1 = new Stream<List<int>>.fromIterable(
    [[1, 2, 3, 4, 5], [12], [3, 22]]);
Stream<List<int>> stream2 = new Stream<List<int>>.fromIterable(
    [[1, 2, 3, 4, 5], [12], [3, 22]]);

test(Stdout sink, Stream<List<int>> stream) async {
  sink.addStream(stream).then((x) {
    new Future.delayed(new Duration(seconds: 3));
  });
  Expect.throws(() { sink.writeln(); }, (e) => e is StateError);
}

main() async {
  test(stdout, stream1);
  test(stderr, stream2);
}
