// 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:async";
import "dart:io";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

class TestConsumer implements StreamConsumer<List<int>> {
  final List expected;
  final List received = [];

  int addStreamCount = 0;
  int expectedAddStreamCount;
  bool expectClose;

  TestConsumer(this.expected,
      {this.expectClose = true, this.expectedAddStreamCount = -1}) {
    if (expectClose) asyncStart();
  }

  Future addStream(Stream stream) {
    addStreamCount++;
    var sub = stream.listen((v) {
      received.addAll(v);
    });
    sub.pause();
    scheduleMicrotask(sub.resume);
    return sub.asFuture();
  }

  void matches(List list) {
    Expect.listEquals(list, received);
  }

  Future close() {
    return new Future.value().then((_) {
      if (expectClose) asyncEnd();
      Expect.listEquals(expected, received);
      if (expectedAddStreamCount >= 0) {
        Expect.equals(expectedAddStreamCount, addStreamCount);
      }
    });
  }
}

void testClose() {
  var sink = new IOSink(new TestConsumer([], expectedAddStreamCount: 0));
  sink.close();
}

void testAddClose() {
  var sink = new IOSink(new TestConsumer([0]));
  sink.add([0]);
  sink.close();

  sink = new IOSink(new TestConsumer([0, 1, 2]));
  sink.add([0]);
  sink.add([1]);
  sink.add([2]);
  sink.close();
}

void testAddFlush() {
  var consumer = new TestConsumer([0, 1, 2]);
  var sink = new IOSink(consumer);
  sink.add([0]);
  sink.flush().then((s) {
    consumer.matches([0]);
    s.add([1]);
    s.add([2]);
    s.flush().then((s) {
      consumer.matches([0, 1, 2]);
      s.close();
    });
  });
}

void testAddStreamClose() {
  {
    var sink = new IOSink(new TestConsumer([0]));
    var controller = new StreamController<List<int>>(sync: true);
    sink.addStream(controller.stream).then((_) {
      sink.close();
    });
    controller.add([0]);
    controller.close();
  }
  {
    var sink = new IOSink(new TestConsumer([0, 1, 2]));
    var controller = new StreamController<List<int>>(sync: true);
    sink.addStream(controller.stream).then((_) {
      sink.close();
    });
    controller.add([0]);
    controller.add([1]);
    controller.add([2]);
    controller.close();
  }
}

void testAddStreamAddClose() {
  {
    var sink = new IOSink(new TestConsumer([0, 1]));
    var controller = new StreamController<List<int>>(sync: true);
    sink.addStream(controller.stream).then((_) {
      sink.add([1]);
      sink.close();
    });
    controller.add([0]);
    controller.close();
  }
}

void main() {
  testClose();
  testAddClose();
  testAddFlush();
  testAddStreamClose();
  testAddStreamAddClose();
}
