// 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 Stream<T> asBroadcastStream ({void onListen(StreamSubscription<T>
 *   subscription), void onCancel(StreamSubscription<T> subscription)})
 * If onCancel is provided, it is called in a similar way to onListen when
 * the returned stream stops having listener. If it later gets a new listener,
 * the onListen function is called again.
 * @description Checks that subscription to underlying stream can be paused in
 * onCancel callback when broadcast stream stops having listeners and resumed
 * again in onListen callback when new listeners appear.
 * @author ilya
 */
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateStream.dart" as IsolateStream;

main() {
  var iter = new Iterable.generate(10, (x) => x);
  var values = iter.toList();
  var s = IsolateStream.fromIterable(iter);

  var anySubscribers = false;
  var firstListen = true;
  var streamOpen = true;
  var timer;

  asyncStart();

  var b = s.asBroadcastStream(onListen: (subs) {
    if (firstListen)
      firstListen = false;
    else {
      Expect.isTrue(subs.isPaused);
      subs.resume();
    }
  }, onCancel: (subs) {
    if (streamOpen) {
      Expect.isFalse(subs.isPaused);
      subs.pause();
      anySubscribers = false;
    } else {
      subs.cancel();
      timer.cancel();
      Expect.listEquals([], values);
      asyncEnd();
    }
  });

  newSubscription(stream, n) {
    // get n elements and cancel
    var count = 0;
    var subs = stream.listen(null);
    subs.onData((x) {
      // remove seen value from list
      values.remove(x);
      if (++count == n) subs.cancel();
    });
    subs.onDone(() {
      streamOpen = false;
    });
  }

  addSubscribersIfNeeded(_) {
    if (streamOpen && !anySubscribers) {
      newSubscription(b, 1);
      newSubscription(b, 2);
      newSubscription(b, 3);
      anySubscribers = true;
    }
  }

  timer = new Timer.periodic(durationMs(10), addSubscribersIfNeeded);
}
