public void JoinSessionShouldThrowInvalidOperationException()
        {
            // Arrange
            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();
            AwaitingReservationCredentials       connectionState   = new AwaitingReservationCredentials();

            // Act
            Action action = () => connectionState.JoinSession(connectionContext);

            // Assert
            action.Should().Throw <InvalidOperationException>();
        }
        public void DisconnectShouldTransitionToDisconnectedState()
        {
            // Arrange
            IClient serverClient = Substitute.For <IClient>();
            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();

            connectionContext.Client.Returns(serverClient);

            AwaitingReservationCredentials connectionState = new AwaitingReservationCredentials();

            // Act
            connectionState.Disconnect(connectionContext);

            // Assert
            connectionContext.Received().UpdateConnectionState(Arg.Any <Disconnected>());
        }
        public void DisconnectShouldResetTheConnectionContext()
        {
            // Arrange
            IClient serverClient = Substitute.For <IClient>();
            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();

            connectionContext.Client.Returns(serverClient);

            AwaitingReservationCredentials connectionState = new AwaitingReservationCredentials();

            // Act
            connectionState.Disconnect(connectionContext);

            // Assert
            connectionContext.Received().ClearSessionState();
        }
        public void NegotiateShouldThrowInvalidOperationExceptionWhenAuthenticationContextIsNull()
        {
            // Arrange
            IClient serverClient = Substitute.For <IClient>();

            serverClient.IsConnected.Returns(true);

            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();

            connectionContext.SessionPolicy.Returns(TestConstants.TEST_SESSION_POLICY);
            connectionContext.AuthenticationContext.Returns((AuthenticationContext)null);

            AwaitingReservationCredentials connectionState = new AwaitingReservationCredentials();

            // Act
            Action action = () => connectionState.NegotiateReservation(connectionContext);

            // Assert
            action.Should().Throw <InvalidOperationException>();
        }
        public void NegotiateShouldThrowInvalidOperationExceptionWhenPlayerSettingsIsNull()
        {
            // Arrange
            IClient serverClient = Substitute.For <IClient>();

            serverClient.IsConnected.Returns(true);

            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();

            connectionContext.PlayerSettings.Returns((PlayerSettings)null);
            connectionContext.AuthenticationContext.Returns(TestConstants.TEST_AUTHENTICATION_CONTEXT);

            AwaitingReservationCredentials connectionState = new AwaitingReservationCredentials();

            // Act
            Action action = () => connectionState.NegotiateReservation(connectionContext);

            // Assert
            action.ShouldThrow <InvalidOperationException>();
        }
        public void NegotiateShouldTransitionToAwaitingSessionReservationState()
        {
            // Arrange
            IClient serverClient = Substitute.For <IClient>();

            serverClient.IsConnected.Returns(true);

            IMultiplayerSessionConnectionContext connectionContext = Substitute.For <IMultiplayerSessionConnectionContext>();

            connectionContext.Client.Returns(serverClient);
            connectionContext.PlayerSettings.Returns(TestConstants.TEST_PLAYER_SETTINGS);
            connectionContext.AuthenticationContext.Returns(TestConstants.TEST_AUTHENTICATION_CONTEXT);

            AwaitingReservationCredentials connectionState = new AwaitingReservationCredentials();

            // Act
            connectionState.NegotiateReservation(connectionContext);

            // Assert
            connectionContext.Received().UpdateConnectionState(Arg.Any <AwaitingSessionReservation>());
        }