using System; using System.Threading.Tasks; using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using Nitrox.Test.Client.Communication.MultiplayerSession; using NitroxClient.Communication.Abstract; using NitroxModel.Packets; using NSubstitute; namespace NitroxClient.Communication.MultiplayerSession.ConnectionState { [TestClass] public class DisconnectedStateTests { [TestMethod] public void NegotiateShouldStartTheClientOnTheContext() { // Arrange IClient serverClient = Substitute.For(); serverClient.IsConnected.Returns(false); serverClient .When(client => client.StartAsync(Arg.Any(), TestConstants.TEST_SERVER_PORT)) .Do(info => serverClient.IsConnected.Returns(true)); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT); Disconnected connectionState = new Disconnected(); // Act connectionState.NegotiateReservationAsync(connectionContext); // Assert serverClient.IsConnected.Should().BeTrue(); } [TestMethod] public void NegotiateShouldSendMultiplayerSessionPolicyRequestPacketToClient() { // Arrange IClient serverClient = Substitute.For(); serverClient.IsConnected.Returns(false); serverClient .When(client => client.StartAsync(Arg.Any(), TestConstants.TEST_SERVER_PORT)) .Do(info => serverClient.IsConnected.Returns(true)); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT); Disconnected connectionState = new Disconnected(); // Act connectionState.NegotiateReservationAsync(connectionContext); // Assert serverClient.Received().Send(Arg.Any()); } [TestMethod] public void NegotiateShouldTransitionToEstablishingSessionPolicyState() { // Arrange IClient serverClient = Substitute.For(); serverClient.IsConnected.Returns(false); serverClient .When(client => client.StartAsync(Arg.Any(), TestConstants.TEST_SERVER_PORT)) .Do(info => serverClient.IsConnected.Returns(true)); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); connectionContext.ServerPort.Returns(TestConstants.TEST_SERVER_PORT); Disconnected connectionState = new Disconnected(); // Act connectionState.NegotiateReservationAsync(connectionContext); // Assert connectionContext.Received().UpdateConnectionState(Arg.Any()); } [TestMethod] public async Task NegotiateShouldThrowInvalidOperationExceptionWhenClientIsNull() { // Arrange IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns((IClient)null); connectionContext.IpAddress.Returns(TestConstants.TEST_IP_ADDRESS); Disconnected connectionState = new Disconnected(); // Act Func action = async () => await connectionState.NegotiateReservationAsync(connectionContext); // Assert await action.Should().ThrowAsync(); } [TestMethod] public async Task NegotiateShouldThrowInvalidOperationExceptionWhenIpAddressIsNull() { // Arrange IClient client = Substitute.For(); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(client); connectionContext.IpAddress.Returns((string)null); Disconnected connectionState = new Disconnected(); // Act Func action = async () => await connectionState.NegotiateReservationAsync(connectionContext); // Assert await action.Should().ThrowAsync(); } [TestMethod] public void JoinSessionShouldThrowInvalidOperationException() { // Arrange IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); Disconnected connectionState = new Disconnected(); // Act Action action = () => connectionState.JoinSession(connectionContext); // Assert action.Should().Throw(); } [TestMethod] public void DisconnectShouldThrowInvalidOperationException() { // Arrange IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); Disconnected connectionState = new Disconnected(); // Act Action action = () => connectionState.Disconnect(connectionContext); // Assert action.Should().Throw(); } } }