// 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<RawSocketEvent> takeWhile(bool test(T element))
/// Forwards data events while test is successful.
///
/// Returns a stream that provides the same events as this stream until test
/// fails for a data event. The returned stream is done when either this stream
/// is done, or when this stream first emits a data event that fails test.
///
/// @description Checks that method [takeWhile] returns stream with the same
/// events as this stream as long as test returns true for the event data, and
/// the returned stream is done when either this stream is done, or when this
/// stream first provides a value that test doesn't accept.
/// @author ngl@unipro.ru

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

check(bool test(e), dataExpected, int n) {
  asyncStart();
  var address = InternetAddress.loopbackIPv4;
  RawDatagramSocket.bind(address, 0).then((producer) {
    RawDatagramSocket.bind(address, 0).then((receiver) {
      int sent = 0;
      List list = [];
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.send([sent++], address, receiver.port);
      producer.close();
      receiver.close();

      Stream s = receiver.takeWhile(test);
      s.listen((event) {
        list.add(event);
      }, onDone: () {
        Expect.listEquals(dataExpected, list);
        asyncEnd();
      });
    });
  });
}

main() {
  check((e) => e != RawSocketEvent.closed, [], 1);
  check((e) => e != RawSocketEvent.read, [RawSocketEvent.closed], 2);
  check((e) => true, [RawSocketEvent.closed], 3);
  check((e) => false, [], 4);
}
