// 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 Stream<S> map<S>(S convert(T event))
/// Creates a new stream that converts each element of this stream to a new value
/// using the convert function.
/// . . .
/// If convert throws, the returned stream reports the exception as an error
/// event instead.
///
/// Error and done events are passed through unchanged to the returned stream.
///
/// @description Checks that if convert throws, the returned stream reports the
/// exception as an error event instead.
/// @author ngl@unipro.ru

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

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

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

      Stream stream = receiver.map(convert);
      stream.listen((event) {
        list.add(event);
        receiver.receive();
        counter++;
      }, onError: (error) {
        errCounter++;
        list.add(error);
        receiver.receive();
      }, onDone: () {
        Expect.equals(dExpected, counter);
        Expect.equals(eExpected, errCounter);
        Expect.listEquals(expected, list);
        asyncEnd();
      });
    });
  });
}

main() {
  check(
      (e) => e == RawSocketEvent.write ? throw 1 : e,
      [1, RawSocketEvent.read, RawSocketEvent.read, RawSocketEvent.closed],
      3,
      1);
  check((e) => e == RawSocketEvent.read ? throw 2 : e,
      [RawSocketEvent.write, 2, 2, RawSocketEvent.closed], 2, 2);
  check(
      (e) => e == RawSocketEvent.closed ? throw 3 : e,
      [RawSocketEvent.write, RawSocketEvent.read, RawSocketEvent.read, 3],
      3,
      1);
}
