// 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 ABSTRACT CLASS IOSink
/// It is an error to add data to the [IOSink] after the sink is closed.
/// @description Checks that its impossible to add an object to the sink after it
/// is closed.
/// @issue 29554
/// @author iarkh@unipro.ru

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

class MyStreamConsumer implements StreamConsumer<List<int>> {
  MyStreamConsumer() {}
  Future<dynamic> addStream(Stream<List> stream) { return new Future(() {}); }
  Future close() { return new Future(() {} ); }
}

main() {
  StreamConsumer<List<int>> consumer = new MyStreamConsumer();
  IOSink sink = new IOSink(consumer);
  sink.close();

  Expect.throws(() { sink.add([1, 2, 3]); }, (e) => e is StateError);
  Expect.throws(() { sink.addError("error"); }, (e) => e is StateError);
  Expect.throws(() { sink.write(1); }, (e) => e is StateError);
  Expect.throws(() { sink.writeAll([1, "test"]); }, (e) => e is StateError);
  Expect.throws(() { sink.writeln(); }, (e) => e is StateError);
  Expect.throws(() { sink.writeCharCode(53); }, (e) => e is StateError);
}
