/*
 * Copyright (c) 2017, 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 Future<bool> isEmpty
 * Whether this stream contains any elements.
 *
 * Waits for the first element of this stream, then completes the returned
 * future with true. If the stream ends without emitting any elements, the
 * returned future is completed with false.
 *
 * @description Checks that isEmpty returns false as RawDatagramSocket cannot
 * be empty.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "../../../Utils/expect.dart";

check([bool no_write_events = false]) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    if (no_write_events) {
      producer.writeEventsEnabled = false;
    }
    var socket = producer.asBroadcastStream();
    var rValue;

    void act() {
      Expect.isFalse(rValue);
      producer.close();
      asyncEnd();
    }

    socket.isEmpty.timeout(const Duration(milliseconds: 200), onTimeout: () {
      producer.close();
      return true;
    });

    socket.isEmpty.then((value) {
      rValue = value;
    }).whenComplete(act);
  });
}

main() {
  check();
  check(true);
}
