Esempio n. 1
0
 def setUp(self):
     self.player1 = Player(3)
     self.player2 = Player(5)
     self.player3 = Player(7)
     self.player4 = Player(1)
     self.player5 = Player(1)
     self.ext_players = [self.player1, self.player2, self.player3]
     self.referee = Referee()
 def test_no_players_left_in_game_movement(self):
     """
     Tests running a game with no players left in the game and that it exits out of the game in movement phase
     """
     players = [(RefTests.bad_player_invalid_move, 1), (RefTests.bad_player_invalid_move, 2)]
     ref = Referee()
     ref.initialize_and_run_game(3, 3, players)
     self.assertEqual(GamePhase.END_GAME, ref.current_game_state.get_game_phase())
     self.assertEqual([], ref.winners)
     self.assertListEqual([PlayerColor.RED, PlayerColor.WHITE], ref.kicked_players[KickedPlayerType.CHEATING])
 def test_run_larger_game(self):
     """
     Tests running a larger more non-trivial game
     """
     players = [(BasicPlayer(), 1), (BasicPlayer(), 2)]
     ref = Referee()
     ref.initialize_and_run_game(7, 4, players)
     self.assertEqual(GamePhase.END_GAME, ref.current_game_state.get_game_phase())
     self.assertTrue(PlayerColor.RED in ref.winners or PlayerColor.WHITE in ref.winners)
     self.assertGreater(ref.current_game_state.get_fish_for_player(PlayerColor.RED), 0)
     self.assertGreater(ref.current_game_state.get_fish_for_player(PlayerColor.WHITE), 0)
 def test_single_player_left_game(self):
     """
     Tests running a game when only a single player left
     """
     players = [(BasicPlayer(), 1), (RefTests.bad_player_invalid_placement, 2)]
     ref = Referee()
     ref.initialize_and_run_game(3, 3, players)
     self.assertEqual(GamePhase.END_GAME, ref.current_game_state.get_game_phase())
     self.assertEqual([PlayerColor.RED], ref.winners)
     self.assertGreater(ref.current_game_state.get_fish_for_player(PlayerColor.RED), 0)
     self.assertEqual([PlayerColor.WHITE], ref.kicked_players[KickedPlayerType.CHEATING])
 def test_run_whole_basic_game_multiple_winners(self):
     """
     Test running a whole game and getting 2 winners
     """
     players = [(BasicPlayer(), 1), (BasicPlayer(), 2), (BasicPlayer(), 3)]
     ref = Referee()
     ref.initialize_and_run_game(3, 3, players)
     self.assertEqual(GamePhase.END_GAME, ref.current_game_state.get_game_phase())
     self.assertEqual([PlayerColor.RED, PlayerColor.WHITE, PlayerColor.BROWN], ref.winners)
     self.assertEqual([], ref.kicked_players[KickedPlayerType.FAILING])
     self.assertEqual([], ref.kicked_players[KickedPlayerType.CHEATING])
 def test_run_whole_basic_game(self):
     """
     Test running a whole game and getting a winner
     """
     players = [(BasicPlayer(), 1), (BasicPlayer(), 2)]
     ref = Referee()
     ref.initialize_and_run_game(3, 3, players)
     # In this 3x3 board only one player can move so RED will always win
     self.assertEqual(GamePhase.END_GAME, ref.current_game_state.get_game_phase())
     self.assertEqual([PlayerColor.RED], ref.winners)
     self.assertEqual([], ref.kicked_players[KickedPlayerType.FAILING])
     self.assertEqual([], ref.kicked_players[KickedPlayerType.CHEATING])
    def test_init_board_2_player(self):
        """
        Test basic properties about initializing a game with 2 logical players
        """
        ref = Referee()
        players = [(BasicPlayer(), 1), (BasicPlayer(), 2)]
        ref._init_board(3, 3, players)

        # Test the amount of players, order according to default order and turn and phase
        self.assertEqual(4, ref.amount_penguins_per_player)
        self.assertEqual([PlayerColor.RED, PlayerColor.WHITE], list(ref.players.keys()))
        self.assertEqual(PlayerColor.RED, ref.current_game_state.get_current_turn())
        self.assertEqual(GamePhase.PLACE_PENGUINS, ref.current_game_state.get_game_phase())
        self.assertEqual([PlayerColor.RED, PlayerColor.WHITE], ref.current_game_state.get_player_order())
 def _create_round(allocations):
     """
     Purpose: Creates and runs the round of the Fish game given player allocations. Creates multiple games,
     initializes them, and runs the games in order to get the winners/results.
     Signature: List[List[LogicalPlayers]] -> Dict[Referee]
     :param allocations: The determined player allocations for a single game
     :return rounds: Dictionary of referees that have finished each game
     """
     rounds = {}
     for i in range(len(allocations)):
         new_ref = Referee()
         state = FishGameStateFactory().create_game_state_with_num_fish(
             row=5,
             col=5,
             num_fish=2,
             player_colors=FishGameStateFactory.
             DEFAULT_COLOR_ORDER[:len(allocations[i])])
         new_ref.initialize_and_run_from_game_state(allocations[i], state)
         rounds[i] = new_ref
         if new_ref.current_game_state.get_game_phase(
         ) != GamePhase.END_GAME:
             raise ValueError("Game has not reached the end.")
     return rounds
    def test_kick_player_place_penguins(self):
        """
        Test kicking a player in the place_penguins state
        """
        ref = Referee()
        players = [(BasicPlayer(), 1), (BasicPlayer(), 2), (BasicPlayer(), 3), (BasicPlayer(), 4)]
        ref._init_board(5, 5, players)
        ref._add_kicked_player(PlayerColor.RED, GamePhase.PLACE_PENGUINS, cheating=True)

        # Test kicking a player functionality works well
        self.assertEqual({KickedPlayerType.CHEATING: [PlayerColor.RED], KickedPlayerType.FAILING: []}, ref.kicked_players)
        self.assertEqual({KickedPlayerType.CHEATING: [PlayerColor.RED], KickedPlayerType.FAILING: []}, ref.kicked_players)
        self.assertFalse(PlayerColor.RED in ref.current_game_state.get_player_order())
        self.assertFalse(PlayerColor.RED in ref.players.keys())
Esempio n. 10
0
 def set_up_game_phases(self, rows, columns, num_players=2, run_placement_phase=False, bad_player_obj=None):
     """
     Purpose: Set up basic game phases for use in testing movement and placement phases
     Signature: Int Int Int Bool PlayerInterface -> Referee
     """
     ref = Referee()
     players = []
     for i in range(num_players):
         if bad_player_obj and i == 0:
             append_obj = bad_player_obj, i + 1
         else:
             append_obj = BasicPlayer(), i + 1
         players.append(append_obj)
     ref._init_board(rows, columns, players)
     if run_placement_phase:
         ref._run_placement_phase()
     return ref
Esempio n. 11
0
class RefereeTestCase(unittest.TestCase):
    def setUp(self):
        self.player1 = Player(3)
        self.player2 = Player(5)
        self.player3 = Player(7)
        self.player4 = Player(1)
        self.player5 = Player(1)
        self.ext_players = [self.player1, self.player2, self.player3]
        self.referee = Referee()

    def test_initialize_game(self):
        game = self.referee.initialize_game(self.ext_players)
        self.assertEqual(type(game), GameTree)
        self.assertEqual(len(game.state.get_all_penguins()), 9)

        self.assertEqual(self.player1.get_color(), Color.RED)
        self.assertEqual(self.player2.get_color(), Color.WHITE)
        self.assertEqual(self.player3.get_color(), Color.BROWN)

        self.assertFalse(self.referee.has_game_ended())

    def test_initialize_game_player_kicked(self):
        self.player1.choose_placement = MagicMock(return_value=(-1, 0))
        game = self.referee.initialize_game(self.ext_players)
        self.assertEqual(self.referee.get_players_as_colors(),
                         [Color.WHITE, Color.BROWN])

    def test_initialize_game_too_few_players(self):
        self.assertRaisesRegex(ValueError, "Invalid number of players",
                               self.referee.initialize_game, [])

    def test_initialize_game_too_many_players(self):
        too_many_players = [
            self.player1, self.player2, self.player3, self.player4,
            self.player5
        ]
        self.assertRaisesRegex(ValueError, "Invalid number of players",
                               self.referee.initialize_game, too_many_players)

    def test_check_move_validity(self):
        game = self.referee.initialize_game(self.ext_players)
        game_tree = self.referee.check_move_validity(Move((2, 0), (3, 0)))
        self.assertEqual(type(game_tree), GameTree)

    def test_check_move_validity_false(self):
        game = self.referee.initialize_game(self.ext_players)
        self.assertFalse(self.referee.check_move_validity(Move((2, 0),
                                                               (1, 0))))

    def test_check_move_validity_game_setup(self):
        self.assertFalse(self.referee.check_move_validity(Move((2, 0),
                                                               (3, 0))))

    def test_play_game(self):
        game_result = self.referee.play_game(self.ext_players)
        self.assertEqual(type(game_result), dict)
        self.assertEqual(game_result["winners"], self.ext_players)
        self.assertEqual(game_result["kicked_players"], set())

    def test_play_game_player_kicked(self):
        self.player1.choose_next_move = MagicMock(
            return_value=Move((0, 0), (1, 1)))
        game_result = self.referee.play_game(self.ext_players)
        self.assertEqual(game_result["winners"], [self.player2])
        self.assertEqual(game_result["kicked_players"], {self.player1})

    def test_alert_winners(self):
        with patch.object(Player, "game_over") as mock_game_over:
            game_result = self.referee.play_game(self.ext_players)
            self.referee.alert_players(game_result)
        mock_game_over.assert_called()

    def test_alert_winners_no_winners(self):
        with patch.object(Player, "game_over") as mock_game_over:
            game = self.referee.initialize_game(self.ext_players)
            self.referee.alert_players({})
        mock_game_over.assert_not_called()

    def test_get_winners(self):
        self.referee.play_game(self.ext_players)
        self.assertEqual(self.referee.get_winners(), self.ext_players)

    def test_get_winners_game_not_played(self):
        self.referee.initialize_game(self.ext_players)
        self.assertFalse(self.referee.get_winners())

    def test_get_current_scores(self):
        self.referee.initialize_game(self.ext_players)
        self.assertEqual(self.referee.get_current_scores(),
                         [(self.player1, 0), (self.player2, 0),
                          (self.player3, 0)])

    def test_has_game_ended(self):
        self.assertFalse(self.referee.has_game_ended())
        self.referee.play_game(self.ext_players)
        self.assertTrue(self.referee.has_game_ended())

    def test_player_timeout(self):
        def slow_func():
            sleep(10)

        self.player1.choose_placement = slow_func
        self.player2.choose_next_move = slow_func
        game_result = self.referee.play_game(
            [self.player1, self.player2, self.player5])
        self.assertEqual(type(game_result), dict)
        self.assertEqual(game_result["winners"], [self.player5])
        self.assertEqual(game_result["kicked_players"],
                         set([self.player1, self.player2]))

    def test_player_exception(self):
        def bad_func():
            raise Exception

        self.player1.choose_placement = bad_func
        self.player2.choose_next_move = bad_func
        game_result = self.referee.play_game(
            [self.player1, self.player2, self.player5])
        self.assertEqual(type(game_result), dict)
        self.assertEqual(game_result["winners"], [self.player5])
        self.assertEqual(game_result["kicked_players"],
                         set([self.player1, self.player2]))