/*
 * Copyright (c) 2018, 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> map<S>(S convert(T event))
 * Creates a new stream that converts each element of this stream to a new value
 * using the convert function.
 * . . .
 * The convert function is called once per data event per listener. If a
 * broadcast stream is listened to more than once, each subscription will
 * individually call convert on each data event.
 *
 * @description Checks that if a broadcast stream is listened to more than once,
 * each subscription will individually call convert on each data event.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

main() {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      int counter1 = 0;
      int counter2 = 0;
      int cCounter = 0;
      List list1 = [];
      List list2 = [];
      List expected = [1, 2, 2, 3];
      int convert(e) {
        cCounter++;
        return (e == RawSocketEvent.write
            ? 1
            : (e == RawSocketEvent.read
                ? 2
                : (e == RawSocketEvent.closed ? 3 : 0)));
      }

      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.close();

      new Timer(const Duration(milliseconds: 200), () {
        Expect.isNull(receiver.receive());
        receiver.close();
      });

      Stream bcs = receiver.asBroadcastStream();
      Stream stream = bcs.map(convert);
      stream.listen((event) {
        list1.add(event);
        receiver.receive();
        counter1++;
      });

      stream.listen((event) {
        list2.add(event);
        counter2++;
      }, onDone: () {
        Expect.equals(8, counter1 + counter2);
        Expect.equals(8, cCounter);
        Expect.listEquals(expected, list1);
        Expect.listEquals(expected, list2);
        asyncEnd();
      });
    });
  });
}
