/*
 * 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 Future<bool> contains(Object needle)
 * Returns whether needle occurs in the elements provided by this stream.
 *
 * Compares each element of this stream to needle using Object.==. If an equal
 * element is found, the returned future is completed with true. If the stream
 * ends without finding a match, the future is completed with false.
 *
 * @description Checks whether needle occurs in the elements provided by this
 * RawDatagramSocket.
 * @author ngl@unipro.ru
 */
import "dart:async";
import "dart:io";
import "../http_utils.dart";
import "../../../Utils/expect.dart";

var localhost = InternetAddress.loopbackIPv4;

Future<bool> checkContains(value) async {
  RawDatagramSocket producer = await RawDatagramSocket.bind(localhost, 0);
  RawDatagramSocket receiver = await RawDatagramSocket.bind(localhost, 0);
  List<List<int>> toSend = [[0, 1, 2, 3], [1, 2, 3], [2, 3], [3]];
  Completer<bool> completer = new Completer<bool>();
  Future<bool> f = completer.future;

  bool wasSent = await sendDatagram(producer, toSend, localhost, receiver.port);
  Expect.isTrue(wasSent, "No datagram was sent");

  receiver.close();

  Future<bool> b = receiver.contains(value);

  if (!completer.isCompleted) {
    completer.complete(b);
  }

  return f;
}

main() async {
  int attempts = 5;

  toCheck(value, bool expected) async {
    for (int i = 0; i < attempts; i++) {
      bool result = await checkContains(value);
      if (result == expected) {
        break;
      }
      if (i == attempts - 1) {
        print('$value element was not found. Look like test failed.');
      }
    }
  }

  toCheck(RawSocketEvent.write, false);
  toCheck(RawSocketEvent.read, false);
  toCheck(RawSocketEvent.closed, true);
  toCheck(RawSocketEvent.readClosed, false);
}
