// 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.

// @dart = 2.9

/// @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);
}
