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

// @dart = 2.9

/// @assertion StreamController.broadcast({void onListen(), void onCancel(),
///                                       bool sync: false})
/// A controller where stream can be listened to more than once.
///
/// The Stream returned by stream is a broadcast stream. It can be listened to
/// more than once.
///
/// The controller distributes any events to all currently subscribed listeners
/// at the time when add, addError or close is called.
///
/// @description Checks that the controller distributes all data and error
/// events to all currently subscribed listeners.
/// @author a.semenov@unipro.ru

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

check(List events) {
  StreamController controller = new StreamController.broadcast();
  Stream s = controller.stream;
  List expectedData = events.where((e) => !(e is num) || e >= 0).toList();
  List expectedErrors = events.where((e) => e is num && e < 0).toList();

  asyncMultiStart(2);

  List events1 = [], errors1 = [];
  s.listen(
    (event) => events1.add(event),
    onError: (error) => errors1.add(error),
    onDone: () {
      Expect.listEquals(expectedData, events1);
      Expect.listEquals(expectedErrors, errors1);
      asyncEnd();
    }
  );


  List events2 = [], errors2 = [];
  s.listen(
      (event) => events2.add(event),
      onError: (error) => errors2.add(error),
      onDone: () {
        Expect.listEquals(expectedData, events2);
        Expect.listEquals(expectedErrors, errors2);
        asyncEnd();
      }
  );

  for (var event in events) {
    if (event is num && event < 0) {
      controller.addError(event);
    } else {
      controller.add(event);
    }
  }
  controller.close();
}

main() {
  check([]);
  check([1, 2, null, []]);
  check([1, 2, -1, "aaa", -3, 10]);
  check([-1, -2, -1, -3, -10]);
  check([-1, 1, -2, 2, "hello", "world", -10]);
}
