// Copyright (c) 2011, 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 StreamController.broadcast({void onListen(), void onCancel(),
///                                       bool sync: false})
/// If a listener is added again later, after the onCancel was called, the
/// onListen will be called again.
///
/// @description Checks that onListen is called each time first listener
/// subscribes and onCancel is called each time the last listener unsubscribes.
/// @author a.semenov@unipro.ru
/// @issue 42568

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

List<StreamSubscription> subscribe(StreamController controller, int count) {
  return new List.generate(count, (_) => controller.stream.listen((event) {}));
}

Future unsubscribe(List<StreamSubscription> subscriptions, int count) {
  count--;
  return new Future.delayed(
          durationInMilliseconds(50), () => subscriptions[count].cancel())
      .then((_) {
    if (count > 0) {
      return unsubscribe(subscriptions, count);
    }
    return count;
  });
}

main() {
  List log = [];
  int listenCount = 0;
  int cancelCount = 0;
  StreamController controller = new StreamController.broadcast(onListen: () {
    log.add("L");
    log.add(listenCount++);
  }, onCancel: () {
    log.add("C");
    log.add(cancelCount++);
  });
  List expectedLog = ["L", 0, "C", 0, "L", 1, "C", 1, "L", 2, "C", 2];
  asyncStart();
  unsubscribe(subscribe(controller, 3), 3).then((_) {
    unsubscribe(subscribe(controller, 5), 5).then((_) {
      unsubscribe(subscribe(controller, 4), 4).then((_) {
        Expect.listEquals(expectedLog, log);
        asyncEnd();
      });
    });
  });
}
