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

// @dart = 2.9

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