def _test_match_generation(self, teams, multiplier=1):
     """Test even-numbered round-robin match generation (actual code)."""
     meetings = multiplier * 2
     scheduler = RoundRobinScheduler(teams, meetings=meetings)
     expected = list(itertools.permutations(scheduler.teams, 2)) * multiplier
     matches = scheduler.generate_matches()
     self.assertCountEqual(expected, matches,
                           ('Incorrect matches generated for even-numbered '
                            'round-robin schedule with {} meetings for '
                            '{} teams.').format(meetings, teams))
 def _test_match_generation(self, teams, multiplier=1):
     """Test even-numbered round-robin match generation (actual code)."""
     meetings = multiplier * 2
     scheduler = RoundRobinScheduler(teams, meetings=meetings)
     expected = list(itertools.permutations(scheduler.teams,
                                            2)) * multiplier
     matches = scheduler.generate_matches()
     self.assertCountEqual(expected, matches,
                           ('Incorrect matches generated for even-numbered '
                            'round-robin schedule with {} meetings for '
                            '{} teams.').format(meetings, teams))
    def _test_match_generation(self, teams, evens=0, known_home_teams=None):
        """Test odd-numbered round-robin match generation."""
        meetings = 2 * evens + 1
        team_list = list(range(1, teams + 1))
        scheduler = RoundRobinScheduler(teams, meetings=meetings)
        self.assertSequenceEqual(scheduler.home_teams, (),
                                 'Default home teams not returned.')
        matches = scheduler.generate_matches(home_teams=known_home_teams)
        if known_home_teams:
            self.assertSequenceEqual(known_home_teams, scheduler.home_teams,
                                     'Home teams not stored.')

        homes = [match[0] for match in matches]
        aways = [match[1] for match in matches]
        home_teams = 0
        away_teams = 0
        odd_teams = teams % 2 == 1
        if odd_teams:
            teams += 1
            team_list.append(None)

        more_matches = evens * (teams - 1) + int(teams / 2)
        less_matches = more_matches - 1

        home_match_counts = collections.Counter(homes)
        away_match_counts = collections.Counter(aways)
        for team in team_list:
            home_count = home_match_counts[team]
            away_count = away_match_counts[team]
            self.assertTrue(
                (home_count == more_matches or home_count == less_matches),
                'Team has an illegal number of home matches.')
            self.assertTrue(
                (away_count == more_matches or away_count == less_matches),
                'Team has an illegal number of away matches.')
            if home_count == more_matches:
                if known_home_teams:
                    self.assertIn(team, known_home_teams,
                                  'Home team designation violated.')
                self.assertEqual(away_count, less_matches,
                                 'Wrong number of away matches.')
                home_teams += 1
            else:
                if known_home_teams:
                    self.assertNotIn(team, known_home_teams,
                                     'Away team designation violated.')
                self.assertEqual(away_count, more_matches,
                                 'Wrong number of away matches.')
                away_teams += 1

        self.assertEqual(home_teams, away_teams,
                         'Home and away team counts not balanced.')
    def _test_match_generation(self, teams, evens=0, known_home_teams=None):
        """Test odd-numbered round-robin match generation."""
        meetings = 2 * evens + 1
        team_list = list(range(1, teams + 1))
        scheduler = RoundRobinScheduler(teams, meetings=meetings)
        self.assertSequenceEqual(scheduler.home_teams, (),
                                 'Default home teams not returned.')
        matches = scheduler.generate_matches(home_teams=known_home_teams)
        if known_home_teams:
            self.assertSequenceEqual(known_home_teams, scheduler.home_teams,
                                     'Home teams not stored.')

        homes = [match[0] for match in matches]
        aways = [match[1] for match in matches]
        home_teams = 0
        away_teams = 0
        odd_teams = teams % 2 == 1
        if odd_teams:
            teams += 1
            team_list.append(None)

        more_matches = evens * (teams - 1) + int(teams / 2)
        less_matches = more_matches - 1

        home_match_counts = collections.Counter(homes)
        away_match_counts = collections.Counter(aways)
        for team in team_list:
            home_count = home_match_counts[team]
            away_count = away_match_counts[team]
            self.assertTrue((home_count == more_matches or
                             home_count == less_matches),
                            'Team has an illegal number of home matches.')
            self.assertTrue((away_count == more_matches or
                             away_count == less_matches),
                            'Team has an illegal number of away matches.')
            if home_count == more_matches:
                if known_home_teams:
                    self.assertIn(team, known_home_teams,
                                  'Home team designation violated.')
                self.assertEqual(away_count, less_matches,
                                 'Wrong number of away matches.')
                home_teams += 1
            else:
                if known_home_teams:
                    self.assertNotIn(team, known_home_teams,
                                     'Away team designation violated.')
                self.assertEqual(away_count, more_matches,
                                 'Wrong number of away matches.')
                away_teams += 1

        self.assertEqual(home_teams, away_teams,
                         'Home and away team counts not balanced.')