private static MatchDateManager GetMatchDateManager()
        {
            var matchDateManager = new MatchDateManager(2018);

            matchDateManager.Initialize();
            return(matchDateManager);
        }
        public void CreatePreSeasonSchedule_CreatesRoundsAndMatches()
        {
            // Arrange
            const int numberOfTeams          = 16;
            const int expectedNumberOfRounds = 4;

            var friendlyManager = new PreSeasonFriendlyManager();

            var teams  = GetTeams(numberOfTeams).ToList();
            var season = new Season();
            MatchDateManager matchDateManager = GetMatchDateManager();

            // Act
            var schedule = friendlyManager.CreatePreSeasonSchedule(teams, season, matchDateManager);

            // Assert

            // Check the expected number of rounds.
            Assert.AreEqual(expectedNumberOfRounds, schedule.Rounds.Count);

            // There are 8 matches per round.
            var numberOfMatchesPerRound = schedule.Matches.GroupBy(m => m.RoundId).Select(c => c.Count());

            Assert.IsTrue(numberOfMatchesPerRound.All(x => x == 8));

            // Per round, check all matches have different teams.
            foreach (var round in schedule.Rounds)
            {
                var matches          = schedule.Matches.Where(m => m.RoundId == round.Id);
                var teamsInThisRound = matches.Select(m => m.HomeTeamId).ToList();
                teamsInThisRound.AddRange(matches.Select(m => m.AwayTeamId));
                Assert.IsTrue(teamsInThisRound.Distinct().Count() == teamsInThisRound.Count(), "Per round all matches must have different teams");
            }

            // Check every team has different opponents.
            foreach (var team in teams)
            {
                var opponents = schedule.Matches.Where(m => m.HomeTeam.Id == team.Id).Select(m => m.AwayTeam).ToList();
                opponents.AddRange(schedule.Matches.Where(m => m.AwayTeam.Id == team.Id).Select(m => m.HomeTeam));
                Assert.IsFalse(opponents.GroupBy(t => t.Id).Where(g => g.Count() > 1).Any(), "Every team must have different opponents");
            }
        }
Example #3
0
        public CompetitionSchedule CreatePreSeasonSchedule(List <Team> teams, Season season, MatchDateManager matchDateManager)
        {
            var competitionSchedule = new CompetitionSchedule();

            // Create a friendly season competition for all friendlies in the season.
            SeasonCompetition friendlySeasonCompetition = new SeasonCompetition
            {
                Competition = _competition,
                Season      = season
            };

            competitionSchedule.SeasonCompetitions.Add(friendlySeasonCompetition);

            var roundsAndMatches = CreatePreSeasonRoundsAndMatches(teams);

            foreach (var round in roundsAndMatches)
            {
                var matchDate = matchDateManager.GetNextMatchDate(CompetitionType.Friendly, round.Key);

                var friendlyRound = RoundFactory.CreateRound(null, friendlySeasonCompetition, matchDate, round.Key, _competition);
                competitionSchedule.Rounds.Add(friendlyRound);

                foreach (var match in round.Value)
                {
                    match.Season        = season;
                    match.Round         = friendlyRound;
                    match.Date          = matchDate;
                    match.CompetitionId = _competition.Id;
                    competitionSchedule.Matches.Add(match);
                }
            }

            // Add the teams to the pre-season friendly competition of this season.
            foreach (var team in teams)
            {
                var seasonCompetitionTeam = new SeasonCompetitionTeam
                {
                    SeasonCompetition = friendlySeasonCompetition,
                    Team = team
                };
                competitionSchedule.SeasonCompetitionTeams.Add(seasonCompetitionTeam);
            }

            return(competitionSchedule);
        }