// 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 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]);
}
