public async Task WhenThereIsNoOpposingPlayer_MarkPlayerAsSearchingForGame()
        {
            int gameSize     = 3;
            var expectedGame = new ExpectedTicTacToe(gameSize);

            var sessionFactoryMock = new Mock <IGameSessionFactory>(MockBehavior.Strict);
            var playerMock         = new Mock <IPlayer>(MockBehavior.Strict);

            playerMock.SetupGet(p => p.GameSessionGUID)
            .Returns(Guid.Empty);
            playerMock.Setup(p => p.SetAsSearchingForGame(
                                 It.Is <ExpectedTicTacToe>(e => e == expectedGame)));

            collectionsMock.Setup(c => c.FindPlayerSearchingForGame(
                                      It.Is <IPlayer>(p => p == playerMock.Object)))
            .Returns(() => throw new InvalidOperationException());

            var handler = new FindGameHandler(loggerMock.Object,
                                              collectionsMock.Object, sessionFactoryMock.Object,
                                              msgSenderMock.Object);

            await handler.HandleMessageAsync(playerMock.Object,
                                             new FindGameMessage()
            {
                Size = gameSize
            });

            playerMock.Verify(p => p.SetAsSearchingForGame(
                                  It.Is <ExpectedTicTacToe>(e => e == expectedGame)));
            collectionsMock.Verify(c => c.FindPlayerSearchingForGame(
                                       It.Is <IPlayer>(p => p == playerMock.Object)));
        }
Ejemplo n.º 2
0
        public async Task HandleMessageAsync(IPlayer player, IReceivedMessage message)
        {
            var castedMessage = (FindGameMessage)message;

            if (player.GameSessionGUID != Guid.Empty)
            {
                await collections.RemovePlayer(player);

                collections.AddPlayer(player);
            }

            var expectedGame = new ExpectedTicTacToe(castedMessage.Size);

            player.SetAsSearchingForGame(expectedGame);
            try
            {
                var opponent = collections.FindPlayerSearchingForGame(player);
                var session  = sessionFactory.Create(player, opponent, expectedGame);
                collections.AddSession(session);
                logger.LogInformation("Created new game session.");
                await messageSender.SendMessageAsync(player.Socket, new GameFoundMessage(true));

                await messageSender.SendMessageAsync(opponent.Socket, new GameFoundMessage(false));
            }
            catch (InvalidOperationException) { }
        }
        public async Task WhenPlayerIsAlreadyConnectedToAGameSession_RemoveSessionAndMarkPlayerasSearchingForGame()
        {
            int gameSize     = 3;
            var expectedGame = new ExpectedTicTacToe(gameSize);

            var gameSessionMock    = new Mock <IGameSession>(MockBehavior.Strict);
            var sessionFactoryMock = new Mock <IGameSessionFactory>(MockBehavior.Strict);
            var playerMock         = new Mock <IPlayer>(MockBehavior.Strict);
            var playerSocketMock   = new Mock <IWebSocket>(MockBehavior.Strict);

            playerMock.SetupGet(p => p.GameSessionGUID)
            .Returns(Guid.NewGuid());
            playerMock.SetupGet(p => p.Socket).Returns(playerSocketMock.Object);
            playerMock.Setup(p => p.SetAsSearchingForGame(
                                 It.Is <ExpectedTicTacToe>(e => e == expectedGame)));

            collectionsMock.Setup(c => c.FindPlayerSearchingForGame(
                                      It.Is <IPlayer>(p => p == playerMock.Object)))
            .Returns(() => throw new InvalidOperationException());
            collectionsMock.Setup(c => c.RemovePlayer(It.IsAny <IPlayer>()))
            .Returns(Task.Delay(0));
            collectionsMock.Setup(c => c.AddPlayer(It.IsAny <IPlayer>()));

            var handler = new FindGameHandler(loggerMock.Object,
                                              collectionsMock.Object, sessionFactoryMock.Object,
                                              msgSenderMock.Object);

            await handler.HandleMessageAsync(playerMock.Object,
                                             new FindGameMessage()
            {
                Size = gameSize
            });

            playerMock.Verify(p => p.SetAsSearchingForGame(
                                  It.Is <ExpectedTicTacToe>(e => e == expectedGame)));
            collectionsMock.Verify(c => c.FindPlayerSearchingForGame(
                                       It.Is <IPlayer>(p => p == playerMock.Object)));
            collectionsMock.Verify(c => c.RemovePlayer(
                                       It.Is <IPlayer>(p => p == playerMock.Object)));
            collectionsMock.Verify(c => c.AddPlayer(
                                       It.Is <IPlayer>(p => p == playerMock.Object)));
        }
        public async Task WhenThereIsOpposingPlayer_CreateGameSession_AddItToCollections_AndSendMessageBackToPlayers()
        {
            int gameSize     = 3;
            var expectedGame = new ExpectedTicTacToe(gameSize);

            var gameSessionMock    = new Mock <IGameSession>(MockBehavior.Strict);
            var sessionFactoryMock = new Mock <IGameSessionFactory>(MockBehavior.Strict);
            var playerMock         = new Mock <IPlayer>(MockBehavior.Strict);
            var opponentMock       = new Mock <IPlayer>(MockBehavior.Strict);
            var playerSocketMock   = new Mock <IWebSocket>(MockBehavior.Strict);
            var opponentSocketMock = new Mock <IWebSocket>(MockBehavior.Strict);

            playerMock.SetupGet(p => p.GameSessionGUID)
            .Returns(Guid.Empty);
            playerMock.SetupGet(p => p.Socket)
            .Returns(playerSocketMock.Object);
            playerMock.Setup(p => p.SetAsSearchingForGame(
                                 It.Is <ExpectedTicTacToe>(e => e == expectedGame)));

            opponentMock.SetupGet(p => p.Socket)
            .Returns(opponentSocketMock.Object);

            sessionFactoryMock.Setup(f => f.Create(
                                         It.IsAny <IPlayer>(), It.IsAny <IPlayer>(), It.IsAny <IExpectedGame>()))
            .Returns(gameSessionMock.Object);

            collectionsMock.Setup(c => c.AddSession(It.Is <IGameSession>(
                                                        s => s == gameSessionMock.Object)));
            collectionsMock.Setup(c => c.FindPlayerSearchingForGame(
                                      It.Is <IPlayer>(p => p == playerMock.Object)))
            .Returns(() => opponentMock.Object);

            msgSenderMock.Setup(m => m.SendMessageAsync(
                                    It.IsAny <IWebSocket>(),
                                    It.IsAny <GameFoundMessage>()))
            .Returns(() => Task.Delay(0));

            var handler = new FindGameHandler(loggerMock.Object,
                                              collectionsMock.Object, sessionFactoryMock.Object,
                                              msgSenderMock.Object);

            await handler.HandleMessageAsync(playerMock.Object,
                                             new FindGameMessage()
            {
                Size = gameSize
            });

            playerMock.Verify(p => p.SetAsSearchingForGame(
                                  It.Is <ExpectedTicTacToe>(e => e == expectedGame)));

            collectionsMock.Verify(c => c.FindPlayerSearchingForGame(
                                       It.Is <IPlayer>(p => p == playerMock.Object)));
            collectionsMock.Verify(c => c.AddSession(It.Is <IGameSession>(
                                                         s => s == gameSessionMock.Object)));

            msgSenderMock.Verify(m => m.SendMessageAsync(
                                     It.Is <IWebSocket>(s => s == playerSocketMock.Object),
                                     It.IsAny <GameFoundMessage>()));

            msgSenderMock.Verify(m => m.SendMessageAsync(
                                     It.Is <IWebSocket>(s => s == opponentSocketMock.Object),
                                     It.IsAny <GameFoundMessage>()));

            sessionFactoryMock.Verify(f => f.Create(
                                          It.Is <IPlayer>(p1 => p1 == playerMock.Object),
                                          It.Is <IPlayer>(p2 => p2 == opponentMock.Object),
                                          It.Is <IExpectedGame>(e => e.Equals(expectedGame))));
        }
Ejemplo n.º 5
0
 public bool Equals(ExpectedTicTacToe other)
 {
     return(Size == other.Size);
 }