// 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 Future flush()
/// Returns a [Future] that completes once all buffered data is accepted by the
/// underlying [StreamConsumer].
/// @description Checks that data is flushed after the [flush] call.
/// @author iarkh@unipro.ru

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

int flushed = 0;
int cnt = 0;

class MyStreamConsumer implements StreamConsumer<List<int>> {
  Future addStream(Stream<List<int>> stream) {
    return new Future(() {}).then((x) {
      cnt++;
    });
  }

  Future close() {
    return new Future(() {});
  }
}

test() async {
  Stream<List<int>> stream1 = new Stream<List<int>>.fromIterable([
    [1, 2]
  ]);
  Stream<List<int>> stream2 = new Stream<List<int>>.fromIterable([
    [12],
    [3, 22]
  ]);
  Stream<List<int>> stream3 = new Stream<List<int>>.fromIterable([
    [3, 22]
  ]);
  Stream<List<int>> stream4 = new Stream<List<int>>.fromIterable([
    [1, 1, 2, 1],
    [12]
  ]);
  Stream<List<int>> stream5 = new Stream<List<int>>.fromIterable([
    [1, 2]
  ]);

  StreamConsumer<List<int>> consumer = new MyStreamConsumer();

  IOSink sink = new IOSink(consumer);

  await sink.addStream(stream1).then((x) {
    cnt++;
  });
  sink.add([0]);
  await sink.addStream(stream2).then((x) {
    cnt++;
  });
  sink.write(12);
  await sink.addStream(stream3).then((x) {
    cnt++;
  });
  sink.writeln("This is a test");
  sink.writeAll([129, null, 88, "test"]);
  await sink.addStream(stream4).then((x) {
    cnt++;
  });
  await sink.addStream(stream5).then((x) {
    cnt++;
  });
  sink.writeln("This is a test");
  sink.writeAll([129, null, 88, "test"]);
  sink.writeAll(
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
  await sink.flush().then((x) {
    Expect.equals(14, cnt);
    flushed++;
  });
  await sink.close();
  Expect.equals(1, flushed);
  asyncEnd();
}

main() {
  asyncStart();
  test();
}
