// 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
/// StreamSubscription<RawSocketEvent> listen(
///     void onData(
///         T event
///     ), {
///     Function onError,
///     void onDone(),
///     bool cancelOnError
/// })
/// Adds a subscription to this stream.
/// . . .
/// If onData is null, nothing happens.
///
/// If this stream closes and sends a done event, the onDone handler is called.
///
/// @description Checks that onData can be null, and if this stream closes and
/// sends a done event, the onDone handler is called.
/// @author ngl@unipro.ru

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

check(n, expected) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      int counter = 0;
      List actual = [];
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.send([sent], address, receiver.port);
      producer.close();
      Stream bcs = receiver.asBroadcastStream();
      if (n == 0) {
        receiver.close();
      }

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

      bcs.listen((event) {
        counter++;
        var dg = receiver.receive();
        actual.add(dg != null ? dg.data[0] : null);
        if (counter == n) {
          receiver.close();
        }
      }, onDone: () {
        bcs.listen((null
        ), onDone: () {
          Expect.listEquals(expected, actual);
          asyncEnd();
        });
      });
    });
  });
}

main() {
  check(0, [null]);
  check(1, [0, null]);
  check(2, [0, 1, null]);
  check(3, [0, 1, 2, null]);
}
