// 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.

// @dart = 2.9

/// @assertion Stream asyncExpand(Stream convert(T event))
/// Creates a new stream with the events of a stream per original event.
/// ...
/// If convert returns null, no value is put on the output stream, just as if it
/// returned an empty stream.
///
/// @description Checks that the returned stream is a broadcast stream
/// if source stream is.
/// @author a.semenov@unipro.ru

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

void check<T,E>(Stream<T> stream, Stream<E> convert(T event)) {
  Expect.equals(stream.isBroadcast, stream.asyncExpand(convert).isBroadcast);
}

void test(CreateStreamFunction create) {

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

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

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

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

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