using System; 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 SessionReservedStateTests { [TestMethod] public void NegotiateShouldThrowInvalidOperationException() { // Arrange IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); SessionReserved connectionState = new SessionReserved(); // Act Action action = () => connectionState.NegotiateReservationAsync(connectionContext); // Assert action.Should().Throw(); } [TestMethod] public void JoinSessionShouldSendPlayerJoiningMultiplayerSessionPacket() { // Arrange MultiplayerSessionReservation successfulReservation = new MultiplayerSessionReservation( TestConstants.TEST_CORRELATION_ID, TestConstants.TEST_PLAYER_ID, TestConstants.TEST_RESERVATION_KEY); IClient client = Substitute.For(); client.IsConnected.Returns(true); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Reservation.Returns(successfulReservation); connectionContext.Client.Returns(client); SessionReserved connectionState = new SessionReserved(); // Act connectionState.JoinSession(connectionContext); // Assert client.Received().Send(Arg.Any()); } [TestMethod] public void JoinSessionShouldTransitionToSessionJoinedState() { // Arrange MultiplayerSessionReservation successfulReservation = new MultiplayerSessionReservation( TestConstants.TEST_CORRELATION_ID, TestConstants.TEST_PLAYER_ID, TestConstants.TEST_RESERVATION_KEY); IClient serverClient = Substitute.For(); serverClient.IsConnected.Returns(true); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Reservation.Returns(successfulReservation); connectionContext.Client.Returns(serverClient); SessionReserved connection = new SessionReserved(); // Act connection.JoinSession(connectionContext); // Assert connectionContext.Received().UpdateConnectionState(Arg.Any()); } [TestMethod] public void DisconnectShouldStopTheClient() { // Arrange IClient serverClient = Substitute.For(); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); SessionReserved connectionState = new SessionReserved(); // Act connectionState.Disconnect(connectionContext); // Assert serverClient.Received().Stop(); } [TestMethod] public void DisconnectShouldResetTheConnectionContext() { // Arrange IClient serverClient = Substitute.For(); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); SessionReserved connectionState = new SessionReserved(); // Act connectionState.Disconnect(connectionContext); // Assert connectionContext.Received().ClearSessionState(); } [TestMethod] public void DisconnectShouldTransitionToDisconnectedState() { // Arrange IClient serverClient = Substitute.For(); IMultiplayerSessionConnectionContext connectionContext = Substitute.For(); connectionContext.Client.Returns(serverClient); SessionReserved connection = new SessionReserved(); // Act connection.Disconnect(connectionContext); // Assert connectionContext.Received().UpdateConnectionState(Arg.Any()); } } }