// 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 Future<String> join([String separator = ""])
/// Combines the string representation of elements into a single string.
///
/// Each element is converted to a string using its Object.toString method. If
/// separator is provided, it is inserted between element string representations.
///
/// @description Checks that if separator is provided, it is inserted between any
/// two elements.
/// @author ngl@unipro.ru

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

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

      Stream<RawSocketEvent> bcs = receiver.asBroadcastStream();
      Future l = bcs.join(separator);
      l.then((value) {
        Expect.equals(expected, value);
      }).whenComplete(() {
        asyncEnd();
      });

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

      bcs.listen((event) {
        receiver.receive();
      });
    });
  });
}

main() {
  String sep() => "--";
  check("", "RawSocketEvent:WRITERawSocketEvent:READRawSocketEvent:CLOSED");
  check(
      ", ", "RawSocketEvent:WRITE, RawSocketEvent:READ, RawSocketEvent:CLOSED");
  check(
      "11", "RawSocketEvent:WRITE11RawSocketEvent:READ11RawSocketEvent:CLOSED");
  check(sep(),
      "RawSocketEvent:WRITE--RawSocketEvent:READ--RawSocketEvent:CLOSED");
  check(null,
      "RawSocketEvent:WRITEnullRawSocketEvent:READnullRawSocketEvent:CLOSED");
}
