/*
 * Copyright (c) 2017, 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
 * Future<WebSocket> connect(
 *     String url, {
 *     Iterable<String> protocols,
 *     Map<String, dynamic> headers,
 *     CompressionOptions compression: CompressionOptions.compressionDefault
 * })
 * Create a new WebSocket connection. The URL supplied in url must use the
 * scheme ws or wss.
 * The protocols argument is specifying the subprotocols the client is willing
 * to speak.
 * The headers argument is specifying additional HTTP headers for setting up
 * the connection. This would typically be the Origin header and potentially
 * cookies. The keys of the map are the header fields and the values are either
 * String or List.
 * If headers is provided, there are a number of headers which are controlled by
 * the WebSocket connection process. These headers are:
 * - connection
 * - sec-websocket-key
 * - sec-websocket-protocol
 * - sec-websocket-version
 * - upgrade
 * If any of these are passed in the headers map they will be ignored.
 * If the url contains user information this will be passed as basic
 * authentication when setting up the connection.
 * @description Checks that the static method WebSocket.connect creates a new
 * Future that will complete with WebSocket. Tests methods and properties of
 * created instance (error processing)
 * @author a.semenov@unipro.ru
 */
import "dart:async";
import "dart:io";
import "../http_utils.dart";

import "allTests_A02.lib.dart";

Future<Stream> create<T extends Object>(Iterable<T> data, {bool Function(T element)? isError}) async {
  HttpServer? server;
  server = await spawnWebSocketServer((WebSocket ws) {
    data.forEach((T x) {
      if (isError != null && isError(x)){
        ws.addError(x);
      } else {
        ws.add(x);
      }
    });
    ws.close(WebSocketStatus.normalClosure).then((_) {
      server?.close();
    });
  });
  return WebSocket.connect("ws://${server.address.address}:${server.port}/");
}

main() {
  test(create);
}
