// 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.
/// . . .
/// On each data event from this stream, the subscriber's onData handler is
/// called. If onData is null, nothing happens.
///
/// @description Checks that on each data event from this stream, the
/// subscriber's onData handler is called.
/// @author ngl@unipro.ru

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

check(int 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();
      if (n == 0) {
        receiver.close();
      }

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

      receiver.listen((event) {
        actual.add(event);
        counter++;
        receiver.receive();
        if (counter == n) {
          receiver.close();
        }
      }, onDone: () {
        Expect.listEquals(expected, actual);
        asyncEnd();
      });
    });
  });
}

main() {
  check(0, [RawSocketEvent.closed]);
  check(1, [RawSocketEvent.write, RawSocketEvent.closed]);
  check(2, [RawSocketEvent.write, RawSocketEvent.read, RawSocketEvent.closed]);
  check(3, [
    RawSocketEvent.write,
    RawSocketEvent.read,
    RawSocketEvent.read,
    RawSocketEvent.closed
  ]);
}
