예제 #1
0
        private void ValidateGameInTournament(Game game, TournamentScheduleDto tournamentScheduleInfo)
        {
            if (tournamentScheduleInfo == null)
            {
                throw new ArgumentException(Resources.NoSuchToruanment);
            }

            var allGamesInTournament = QueryAllTournamentGames(game.TournamentId);
            var oldGameToUpdate      = allGamesInTournament.Where(gr => gr.Id == game.Id).SingleOrDefault();

            if (oldGameToUpdate != null)
            {
                allGamesInTournament.Remove(oldGameToUpdate);
            }

            PutFreeDayTeamAsAway(game);
            ValidateGameDateSet(game);
            ValidateGameDate(tournamentScheduleInfo, game);
            ValidateGameInRound(game, allGamesInTournament, tournamentScheduleInfo);
            if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.One)
            {
                ValidateGamesInTournamentSchemeOne(game, allGamesInTournament);
            }
            else if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.Two)
            {
                ValidateGamesInTournamentSchemeTwo(game, allGamesInTournament);
            }
        }
예제 #2
0
        private List <Game> GetGamesToSchedule(Game finishedGame, TournamentScheduleDto torunamentScheduleInfo)
        {
            List <Game> gamesToUpdate = new List <Game>();

            List <Game> gamesInCurrentAndNextRounds = _gamesByTournamentIdInRoundsByNumbersQuery
                                                      .Execute(new GamesByRoundCriteria()
            {
                TournamentId = torunamentScheduleInfo.Id,
                RoundNumbers = new List <byte>
                {
                    finishedGame.Round,
                    Convert.ToByte(finishedGame.Round + 1)
                }
            });

            // Schedule next games only if finished game is not in last round
            if (!IsGameInLastRound(finishedGame, gamesInCurrentAndNextRounds))
            {
                Game oldGame = gamesInCurrentAndNextRounds.Where(gr => gr.Id == finishedGame.Id).SingleOrDefault();
                gamesToUpdate.AddRange(GetGamesToUpdate(finishedGame, gamesInCurrentAndNextRounds));

                if (finishedGame.AwayTeamId.HasValue &&
                    finishedGame.Result.GameScore.Home == 0 &&
                    finishedGame.Result.GameScore.Away == 0)
                {
                    foreach (Game game in gamesToUpdate)
                    {
                        ClearGame(finishedGame, game);
                    }
                }
            }

            return(gamesToUpdate);
        }
예제 #3
0
        /// <summary>
        /// Edits result of specified instance of game.
        /// </summary>
        /// <param name="game">Game which result have to be to update.</param>
        public void EditGameResult(Game game)
        {
            _authService.CheckAccess(AuthOperations.Games.EditResult);

            ValidateResult(game.Result);

            TournamentScheduleDto tournamentScheduleInfo = _tournamentScheduleDtoByIdQuery
                                                           .Execute(new TournamentScheduleInfoCriteria {
                TournamentId = game.TournamentId
            });

            ValidateGame(game, tournamentScheduleInfo);

            // Add autogeneration
            if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.PlayOff)
            {
                ScheduleNextGames(game, tournamentScheduleInfo);
            }

            try
            {
                _gameRepository.Update(game);
            }
            catch (ConcurrencyException ex)
            {
                throw new MissingEntityException(ServiceResources.ExceptionMessages.GameNotFound, ex);
            }

            UpdateTournamentLastTimeUpdated(game);
            _gameRepository.UnitOfWork.Commit();
        }
예제 #4
0
        private static string GetRoundName(int roundNumber, TournamentScheduleDto tournament)
        {
            string result;

            if (tournament.Scheme != TournamentSchemeEnum.PlayOff)
            {
                result = $"Тур {roundNumber}";
            }
            else
            {
                var playoffRounds = new Dictionary <int, string>
                {
                    [1] = "Финал",
                    [2] = "Полуфинал",
                    [3] = "Четверть-финал",
                    [4] = "Раунд 16",
                    [5] = "Раунд 32",
                    [6] = "Раунд 64",
                    [7] = "Раунд 128"
                };
                var reversedRoundNumber = tournament.Divisions.First().NumberOfRounds - roundNumber + 1;
                if (!playoffRounds.TryGetValue(reversedRoundNumber, out result))
                {
                    result = $"Тур {roundNumber}";
                }
            }

            return(result);
        }
예제 #5
0
        /// <summary>
        /// Creates a new game.
        /// </summary>
        /// <param name="game">Game to create.</param>
        public void Create(Game game)
        {
            _authService.CheckAccess(AuthOperations.Games.Create);

            if (game == null)
            {
                throw new ArgumentNullException("game");
            }

            if (game.Result != null)
            {
                ValidateResult(game.Result);
            }

            TournamentScheduleDto tournamentScheduleInfo = _tournamentScheduleDtoByIdQuery
                                                           .Execute(new TournamentScheduleInfoCriteria {
                TournamentId = game.TournamentId
            });

            ValidateGame(game, tournamentScheduleInfo);
            if (game.Result != null)
            {
                UpdateTournamentLastTimeUpdated(game);
            }
            else
            {
                // Set default empty result
                game.Result = new Result();
            }

            _gameRepository.Add(game);
            _gameRepository.UnitOfWork.Commit();
        }
예제 #6
0
        private static void ValidateAreSameTeamsInGames(
            GameResultDto game,
            Game newGame,
            TournamentScheduleDto tournamentScheduleInfo)
        {
            string errorMessage = null;

            if (GameValidation.IsFreeDayGame(newGame))
            {
                if (tournamentScheduleInfo.Scheme != TournamentSchemeEnum.PlayOff)
                {
                    errorMessage = Resources.SameFreeDayGameInRound;
                }
                else
                {
                    errorMessage = string.Format(
                        Resources.SameTeamInRound,
                        game.HomeTeamId);
                }
            }
            else
            {
                errorMessage = String.Format(
                    Resources.SameGameInRound,
                    game.HomeTeamName,
                    game.AwayTeamName,
                    game.Round.ToString());
            }
            throw new ArgumentException(errorMessage);
        }
예제 #7
0
        private void ValidateGameInRound(Game newGame, ICollection <GameResultDto> games,
                                         TournamentScheduleDto tournamentSсheduleInfo)
        {
            var teamsInTournament =
                _tournamentTeamsQuery.Execute(new FindByTournamentIdCriteria
            {
                TournamentId = tournamentSсheduleInfo.Id
            });

            var newGameDivisionId = (int?)0;

            if (IsNotPlayOffThemeAndBothTeamsNotNull(newGame, tournamentSсheduleInfo))
            {
                newGameDivisionId = teamsInTournament
                                    .First(t => t.TeamId == newGame.AwayTeamId || t.TeamId == newGame.HomeTeamId).DivisionId;
            }

            var gamesInSameRoundSameDivision = (
                from game in games
                where game.Round == newGame.Round
                join homeTeam in teamsInTournament
                on game.HomeTeamId equals homeTeam.TeamId
                where homeTeam.DivisionId == newGameDivisionId
                join awayTeam in teamsInTournament
                on game.HomeTeamId equals awayTeam.TeamId
                where awayTeam.DivisionId == newGameDivisionId
                select game
                ).ToList();

            ValidateGameInRoundOnCreate(
                newGame,
                gamesInSameRoundSameDivision,
                tournamentSсheduleInfo);
        }
예제 #8
0
 private void ValidateGameDate(TournamentScheduleDto tournament, Game game)
 {
     if (DateTime.Compare(tournament.StartDate, game.GameDate.Value) > 0 ||
         DateTime.Compare(tournament.EndDate, game.GameDate.Value) < 0)
     {
         throw new ArgumentException(Resources.WrongRoundDate);
     }
 }
예제 #9
0
        private void ScheduleNextGames(Game finishedGame, TournamentScheduleDto tournamentScheduleInfo)
        {
            List <Game> gamesToUpdate = GetGamesToSchedule(finishedGame, tournamentScheduleInfo);

            foreach (Game nextGame in gamesToUpdate)
            {
                _gameRepository.Update(nextGame);
            }
        }
예제 #10
0
 private void ValidateTeams(int?homeTeamId, int?awayTeamId, TournamentScheduleDto tournamentScheduleInfo)
 {
     if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.PlayOff)
     {
         if (!(homeTeamId == null && awayTeamId == null) &&
             GameValidation.AreTheSameTeams(homeTeamId, awayTeamId))
         {
             throw new ArgumentException(Resources.GameResultSameTeam);
         }
     }
     else if (GameValidation.AreTheSameTeams(homeTeamId, awayTeamId))
     {
         throw new ArgumentException(Resources.GameResultSameTeam);
     }
 }
예제 #11
0
 private static void ValidateGameInRoundOnCreate(
     Game newGame,
     List <GameResultDto> gamesInRound,
     TournamentScheduleDto tournamentScheduleInfo)
 {
     // We are sure that newGame is been created, not edited
     foreach (GameResultDto game in gamesInRound)
     {
         if (GameValidation.AreSameTeamsInGames(game, newGame))
         {
             ValidateAreSameTeamsInGames(game, newGame, tournamentScheduleInfo);
         }
         else if (GameValidation.IsTheSameTeamInTwoGames(game, newGame))
         {
             ValidateIsTheSameTeamInTwoGames(game, newGame, tournamentScheduleInfo);
         }
     }
 }
예제 #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TournamentScheduleDtoBuilder"/> class
 /// </summary>
 public TournamentScheduleDtoBuilder()
 {
     _tournamentScheduleDto = new TournamentScheduleDto()
     {
         Id        = DEFAULT_ID,
         Name      = "Tour1",
         Scheme    = TournamentSchemeEnum.One,
         Divisions = new List <DivisionScheduleDto>
         {
             new DivisionScheduleDto
             {
                 DivisionId   = 1,
                 DivisionName = "First division",
                 TeamCount    = 3
             }
         },
         StartDate = DateTime.Parse(TEST_START_DATE),
         EndDate   = DateTime.Parse(TEST_END_DATE)
     };
 }
예제 #13
0
        private static void ValidateAreSameTeamsInGames(
            GameResultDto game,
            Game newGame,
            TournamentScheduleDto tournamentScheduleInfo)
        {
            string errorMessage = null;
            var    tmpres       = (tournamentScheduleInfo.Scheme !=
                                   TournamentSchemeEnum.PlayOff
                ? Resources.SameFreeDayGameInRound
                : string.Format(
                                       Resources.SameTeamInRound,
                                       game.HomeTeamId));

            errorMessage = GameValidation.IsFreeDayGame(newGame)
                ? tmpres
                : string.Format(
                Resources.SameGameInRound,
                game.HomeTeamName,
                game.AwayTeamName,
                game.Round.ToString());
            throw new ArgumentException(errorMessage);
        }
예제 #14
0
        /// <summary>
        /// Edits specified instance of game.
        /// </summary>
        /// <param name="game">Game to update.</param>
        public void Edit(Game game)
        {
            _authService.CheckAccess(AuthOperations.Games.Edit);

            TournamentScheduleDto tournamentScheduleInfo = _tournamentScheduleDtoByIdQuery
                                                           .Execute(new TournamentScheduleInfoCriteria {
                TournamentId = game.TournamentId
            });

            ValidateGame(game, tournamentScheduleInfo);

            // Add autogeneration
            if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.PlayOff &&
                (game.Result != null || game.AwayTeamId == null))
            {
                ScheduleNextGames(game, tournamentScheduleInfo);
            }

            // Provide persisting results in case of editing dates
            var existingGame   = Get(game.Id);
            var gameHasResults = existingGame != null && existingGame.Result.SetScores.Any(s => !s.IsEmpty);

            if (gameHasResults)
            {
                game.Result = existingGame.Result;
            }

            try
            {
                _gameRepository.Update(game);
            }
            catch (ConcurrencyException ex)
            {
                throw new MissingEntityException(ServiceResources.ExceptionMessages.GameNotFound, ex);
            }

            _gameRepository.UnitOfWork.Commit();
        }
예제 #15
0
        private static void ValidateIsTheSameTeamInTwoGames(
            GameResultDto game,
            Game newGame,
            TournamentScheduleDto tournamentScheduleInfo)
        {
            if (tournamentScheduleInfo.Scheme == TournamentSchemeEnum.PlayOff)
            {
                return;
            }

            if (GameValidation.IsFreeDayGame(newGame))
            {
                if (game.HomeTeamId != newGame.HomeTeamId &&
                    game.AwayTeamId != newGame.HomeTeamId)
                {
                    throw new ArgumentException(Resources.SameFreeDayGameInRound);
                }
                else if (game.HomeTeamId != newGame.HomeTeamId ||
                         game.AwayTeamId != newGame.HomeTeamId)
                {
                    throw new ArgumentException(string.Format(
                                                    Resources.SameTeamInRound,
                                                    (game.HomeTeamId == newGame.HomeTeamId)
                            ? game.HomeTeamName
                            : game.AwayTeamName));
                }
            }
            else
            {
                throw new ArgumentException(string.Format(
                                                Resources.SameTeamInRound,
                                                (game.HomeTeamId == newGame.HomeTeamId ||
                                                 game.HomeTeamId == newGame.AwayTeamId)
                        ? game.HomeTeamName
                        : game.AwayTeamName));
            }
        }
예제 #16
0
 private void MockGetScheduleInfo(int tournamentId, TournamentScheduleDto tournament)
 {
     _tournamentServiceMock.Setup(tr => tr.GetTournamentScheduleInfo(tournamentId)).Returns(tournament);
 }
예제 #17
0
 private void ValidateGame(Game game, TournamentScheduleDto tournamentScheduleInfo)
 {
     ValidateTeams(game.HomeTeamId, game.AwayTeamId, tournamentScheduleInfo);
     ValidateGameInTournament(game, tournamentScheduleInfo);
 }
예제 #18
0
 private static bool IsNotPlayOffThemeAndBothTeamsNotNull(Game newGame, TournamentScheduleDto tournamentSсheduleInfo)
 {
     return(!(newGame.AwayTeamId == null &&
              newGame.HomeTeamId == null &&
              tournamentSсheduleInfo.Scheme == TournamentSchemeEnum.PlayOff));
 }