// 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<RawSocketEvent> handleError(
///     Function onError, {
///     bool test(error)
/// })
/// . . .
/// If this stream sends an error that matches test, then it is intercepted by
/// the onError function.
/// . . .
/// An asynchronous error 'error' is matched by a test function if test(error)
/// returns true. If test is omitted, every error is considered matching.
///
/// @description Checks that if this stream sends an error that matches test,
/// then it is intercepted by the onError function.
/// @author ngl@unipro.ru

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

main() {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      int counter = 0;
      List intercepted = [];
      List data = [];
      List errors = [];
      producer.send([sent++], address, receiver.port);
      producer.send([sent], address, receiver.port);
      producer.close();

      Stream bcs = receiver.asBroadcastStream();
      Stream s = bcs.skipWhile((e) => throw 11);
      s.handleError((e) {
        intercepted.add(e);
      }, test: (e) => e == 11).listen((d) {
        data.add(d);
      }, onError: (err) {
        errors.add(err);
      }, onDone: () {
        Expect.listEquals([11], intercepted);
        Expect.listEquals([RawSocketEvent.read, RawSocketEvent.closed], data);
        Expect.listEquals([], errors);
        asyncEnd();
      });

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

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