// 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 close([int code, String reason ])
/// Closes the WebSocket connection. Set the optional code and reason arguments
/// to send close information to the remote peer. If they are omitted, the peer
/// will see WebSocketStatus.noStatusReceived code with no reason.
/// @description Checks that the close method works correctly when its parameters
/// code and reason are not set.
/// @author ngl@unipro.ru

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

main() {
  HttpServer.bind("127.0.0.1", 0).then((server) {
    server.listen((request) {
      WebSocketTransformer
          .upgrade(request)
          .then((websocket) {
        websocket.close();
      });
    });

    WebSocket.connect("ws://127.0.0.1:${server.port}/").then((client) async {
      Expect.isNull(client.closeCode);
      Expect.isNull(client.closeReason);
      await server.close();
      client.close().then((_) {
        Expect.equals(WebSocketStatus.noStatusReceived, client.closeCode);
        Expect.equals("", client.closeReason);
      });
    });
  });
}
