/*
 * 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
 * @author a.semenov@unipro.ru
 */
import "dart:async";
import "dart:io";
import "../http_utils.dart";

import "allTests_A01.lib.dart";

Future<Stream> create<T>(Iterable<T> data) async {
  HttpServer? server;
  server = await spawnWebSocketServer((WebSocket ws) {
    data.forEach((T x) => ws.add(x));
    ws.close(WebSocketStatus.normalClosure).then((_) {
      server?.close();
    });
  });
  return WebSocket.connect("ws://${server.address.address}:${server.port}/");
}

main() {
  test(create);
}
