// 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 Stream<E> asyncMap<E>(FutureOr convert(T event))
/// Creates a new stream with each data event of this stream asynchronously
/// mapped to a new event.
///
/// This acts like map, except that convert may return a Future, and in that
/// case, the stream waits for that future to complete before continuing with its
/// result.
///
/// @description Checks that for each event received with RawDatagramSocket
/// method asyncMap returns specified value.
/// @author ngl@unipro.ru

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

var localhost = InternetAddress.loopbackIPv4;

Future<List> asyncMapAndClose(convert) 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]];
  List received = [];
  Completer<List> completer = new Completer<List>();
  Future<List> f = completer.future;
  Duration delay = const Duration(seconds: 2);

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

  Stream s = receiver.asyncMap(convert);
  s.listen((value) {
    received.add(value);
    receiver.receive();
  });
  new Future.delayed(delay, () {
    if (!completer.isCompleted) {
      receiver.close();
      completer.complete(received);
    }
  });
  return f;
}

main() async {
  int attempts = 5;
  int expectedLen = 4;

  toCheck(convert, List expectedValues) async {
    for (int i = 0; i < attempts; i++) {
      List list = await asyncMapAndClose(convert);
      int listLen = list.length;
      if (listLen == 0) {
        continue;
      }
      if (listLen >= 1 && listLen <= expectedLen) {
        for (int i = 0; i < list.length; i++) {
          if (list[i] is List) {
            Expect.listEquals(expectedValues[0], list[i]);
          } else {
            Expect.isTrue(
                expectedValues.contains(list[i]),
                "Unexpected value ${list[i]}");
          }
        }
        break;
      }
      if (listLen > expectedLen) {
        Expect.fail("$listLen elements found instead of $expectedLen.");
      }
      if (i == attempts - 1) {
        print('$listLen elements found. Look like test failed.');
      }
    }
  }

  toCheck((e) => e, [RawSocketEvent.write, RawSocketEvent.read]);
  toCheck((e) => [1, 2], [[1, 2]]);
}
