// 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)})
/// Returns a multi-subscription stream that produces the same events as this.
/// If this stream is single-subscription, return a new stream that allows multiple subscribers.
/// It will subscribe to this stream when its first subscriber is added,
/// and will stay subscribed until this stream ends, or a callback cancels the subscription.
/// @description Checks that returned stream is indeed a multi-subscription
/// stream and it produces the same events as this.
/// @author kaigorodov

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

check(List events0) {
  Stream s0 = IsolateStream.fromIterable(events0);
  Stream s1 = s0.asBroadcastStream();

  List events1 = new List.empty(growable: true);
  StreamSubscription ss1 = s1.listen((event) {
    events1.add(event);
  });
  asyncStart();
  ss1.onDone(() {
    Expect.listEquals(events0, events1);
    asyncEnd();
  });

  List events2 = new List.empty(growable: true);
  StreamSubscription ss2 = s1.listen((event) {
    events2.add(event);
  });
  asyncStart();
  ss2.onDone(() {
    Expect.listEquals(events0, events2);
    asyncEnd();
  });
}

main() {
  check([]);
  check([1, 2, null, []]);
}
