// Copyright (c) 2016, 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<S> expand<S>(Iterable<S> convert(T value))
 * The returned stream is a broadcast stream if this stream is.
 *
 * @description Checks that the returned stream is a broadcast stream
 * if source stream is.
 * @author a.semenov@unipro.ru
 */
library expand_A02_t01;
import "dart:async";
import "../../../Utils/expect.dart";

void check<T,S>(Stream<T> stream, Iterable<S> convert(T event)) {
  Expect.equals(stream.isBroadcast, stream.expand(convert).isBroadcast);
}

void test(CreateStreamFunction create) {

  check(create([]), (_) => []);
  check(create([]).asBroadcastStream(), (_) => []);

  check(create([1,2,3,4,5]), (_) => []);
  check(create([1,2,3,4,5]).asBroadcastStream(), (_) => []);

  check(create([]), (e) => [e]);
  check(create([]).asBroadcastStream(), (e) => [e]);

  check(create([1,2,3,4,5]), (e) => [e]);
  check(create([1,2,3,4,5]).asBroadcastStream(), (e) => [e]);

  check(create([1,2,3,4,5]), (e) => [e,e]);
  check(create([1,2,3,4,5]).asBroadcastStream(), (e) => [e,e]);
}
