public IHttpActionResult Play(PlayRequestDataModel request) { var currentUserId = this.userIdProvider.GetUserId(); if (request == null || !ModelState.IsValid) { return(this.BadRequest(ModelState)); } var idAsGuid = new Guid(request.GameId); var game = this.data.Games.Find(idAsGuid); if (game == null) { return(this.BadRequest("Invalid game id!")); } if (game.FirstPlayerId != currentUserId && game.SecondPlayerId != currentUserId) { return(this.BadRequest("This is not your game!")); } if (game.State != GameState.TurnX && game.State != GameState.TurnO) { return(this.BadRequest("Invalid game state!")); } if ((game.State == GameState.TurnX && game.FirstPlayerId != currentUserId) || (game.State == GameState.TurnO && game.SecondPlayerId != currentUserId)) { return(this.BadRequest("It's not your turn!")); } var positionIndex = (request.Row - 1) * 3 + request.Col - 1; if (game.Board[positionIndex] != '-') { return(this.BadRequest("Invalid position!")); } // Update games state and board var boardAsStringBuilder = new StringBuilder(game.Board); boardAsStringBuilder[positionIndex] = game.State == GameState.TurnX ? 'X' : 'O'; game.Board = boardAsStringBuilder.ToString(); game.State = game.State == GameState.TurnX ? GameState.TurnO : GameState.TurnX; this.data.SaveChanges(); var gameResult = resultValidator.GetResult(game.Board); switch (gameResult) { case GameResult.NotFinished: break; case GameResult.WonByX: game.State = GameState.WonByX; this.data.SaveChanges(); break; case GameResult.WonByO: game.State = GameState.WonByO; this.data.SaveChanges(); break; case GameResult.Draw: game.State = GameState.Draw; this.data.SaveChanges(); break; default: break; } return(this.Ok()); }
public void GetResult_NoWinner_ShouldReturnGameStateNotFinished() { var result = validator.GetResult("OXOOOXXOX"); Assert.AreEqual(GameResult.NotFinished, result); }