public IList<ValidationError> ValidateMove(Game game, Enums.PlayerType owner, BoardPosition boardPosition)
        {
            var warnings = new List<ValidationError>();
            var isMoveLegitimate = _moveValidationSpecification.IsMoveValid(game, owner, boardPosition);

            if(!isMoveLegitimate)
                warnings.Add(new ValidationError { Type = "InvalidMove", Message = "Sorry this move is not legal, try another move to keep playing." });

            return warnings;
        }
 public Game CreateNew(RepositoryDelegates.SaveGame saveGame)
 {
     var game = new Game
     {
         Id = Guid.NewGuid(),
         Moves = new List<GameMove>()
     };
     saveGame(game);
     return game;
 }
 public Game Build()
 {
     var game = new Game
     {
         Id = _id,
         Moves = _moves ?? new List<GameMove>(),
         IsGameOver = _isGameOver
     };
     return game;
 }
        public Game BuildWithPossibleWinningMove()
        {
            var moves = new List<GameMove>
            {
                new GameMove { Owner = Enums.PlayerType.Human, Position = BoardPosition.CreateFrom("A", 1) },
                new GameMove { Owner = Enums.PlayerType.Computer, Position = BoardPosition.CreateFrom("B", 1) },
                new GameMove { Owner = Enums.PlayerType.Human, Position = BoardPosition.CreateFrom("A", 2) }
            };

            var game = new Game
            {
                Id = _id,
                Moves =  moves,
                IsGameOver = _isGameOver
            };
            return game;
        }
 public void AssignGameStatus(Game game, RepositoryDelegates.SaveGame saveGame)
 {
     var isGameOver = _gameStatusSpecifications.IsGameOver(game);
     game.IsGameOver = isGameOver;
     saveGame(game);
 }
 public void AssignMove(Game game, GameMove gameMove, RepositoryDelegates.SaveGame saveGame)
 {
     game.AddMove(gameMove);
     saveGame(game);
 }
 public void AssignMove(Game game, Enums.PlayerType owner, BoardPosition boardPosition, RepositoryDelegates.SaveGame saveGame)
 {
     var gameMove = _gameFactory.CreateFrom(owner, boardPosition);
     AssignMove(game, gameMove, saveGame);
 }
 public bool IsFirstTurnForComputer(Game game)
 {
     return game.Moves.All(m => m.Owner != Enums.PlayerType.Computer);
 }
 public void Save(Game game)
 {
     var cacheKey = getCacheKeyForGame(game.Id);
     _cacheDataStorage.Add(cacheKey, game);
 }
 public void Remove(Game game)
 {
     var cacheKey = getCacheKeyForGame(game.Id);
     _cacheDataStorage.Remove(cacheKey);
 }