// 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 @assertion
/// Future<S> fold<S>(
///     S initialValue,
///     S combine(
///         S previous,
///         T element
///     )
/// )
/// Reduces a sequence of values by repeatedly applying combine.
///
/// @description Checks that method [fold] reduces a sequence of values by
/// repeatedly applying combine.
/// @author ngl@unipro.ru

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

check(initial, convert, expected) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      int counter = 0;
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.send([sent], address, receiver.port);
      producer.close();

      Stream<RawSocketEvent> bcs = receiver.asBroadcastStream();
      Future fValue = bcs.fold(initial, convert);
      fValue.then((value) {
        Expect.equals(expected, value);
      }).whenComplete(() {
        asyncEnd();
      });

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

      bcs.listen((event) {
        counter++;
        receiver.receive();
      }).onDone(() {
        Expect.equals(4, counter);
      });
    });
  });
}

main() {
  check(0, (previous, element) => previous + 1, 4);
  check(
      0,
      (previous, element) =>
          previous +
          (element == RawSocketEvent.write
              ? 1
              : (element == RawSocketEvent.read
                  ? 10
                  : (element == RawSocketEvent.closed ? 100 : 0))),
      121);
}
