Пример #1
0
class TestHigscore(unittest.TestCase):
    """Test Higscore Class."""

    def setUp(self):
        """Run at the beginning of the test."""
        self.game = Game()
        self.mock_player1 = Mock(spec=Player, name="player1",
                                 score=42, decision=False)
        self.mock_player2 = Mock(spec=Player, name="Computer",
                                 score=65, decision=True)

        self.assertIsInstance(self.mock_player1, Player)
        self.assertIsInstance(self.mock_player2, Player)
        self.score = Highscore(self.mock_player1, self.mock_player2)

    def test_write_file(self):
        """Test write_file."""
        self.player1 = Player("score1", False)
        self.game.set_playing_now(self.game.player1)
        self.player1.change_score(5)
        self.score.write_file()

        self.player2_name = Player("score2", False)
        self.game.set_playing_now(self.game.player2)
        self.player1.change_score(4)

    def test_read_file(self):
        """Test read_file."""
        self.score.get_path()
        catch_output = io.StringIO()
        sys.stdout = catch_output

        self.score.read_file()

        sys.stdout = sys.__stdout__
        output = catch_output.getvalue()

        self.assertIn("player name: ", output)
        self.assertIn(" (score) -> ", output)

    def test_get_path(self):
        """Test get_path."""
        exp = self.score.get_path()
        self.assertTrue(exp, 'score.txt')
Пример #2
0
class Game():
    """Game Class."""

    win_pig = 50
    still_going = False

    def __init__(self):
        """Initialize instances from other classes."""
        self.computer_controlar = False
        self.dice = Dice()

        # Changable value
        self.forbidden_face = 1

        self.player1 = Player(str, bool)
        self.player2 = Player(str, bool)
        self.set_playing_now(self.player1)
        # Basically, player2 may be computer in case user decided.
        # However, computer_player object has been added to make the
        # code easier to read. Since computer controlled by another class.
        self.computer_player = Player("Computer", bool)
        self.computer_player.set_level("easy")

        self.score = Highscore(self.player1, self.player2)
        self.histogram = Histogram()

    def create_player(self, player_amount):
        """
        Create Players accourding to passed parameter.

        Get info from shell.py, fit equavelent players with names.
        Turn computer_controller on/off.
        """
        player1_name = input("Enter the first player's name >> ")
        if player1_name == "":
            player1_name = "USER1"
        self.player1.set_name(player1_name)
        self.player2.set_name("Computer")
        #  Hold player object temporarily above

        if player_amount == 2:
            player2_name = input("Enter the second player's name >> ")
            if player2_name == "":
                player2_name = "USER2"
            self.player2.set_name(player2_name)

        else:
            self.player2 = self.computer_player
        print("Game Starts!\n\n")

    def switcher(self):
        """
        Switch between players.

        Considering who is playing now and whether
        computer-controler true or false, take rule in switching turns
        between players.
        """
        if (self.get_computer_controler()
                and self.get_playing_now() == self.player1):
            self.set_playing_now(self.computer_player)
            return self.computer_turn()

        if (self.get_computer_controler()
                and self.get_playing_now() == self.computer_player):
            self.set_playing_now(self.player1)

        if self.get_playing_now() == self.player1 and not (
                self.get_computer_controler()):

            print(">>>>> Start {} turn <<<<<\n".format(
                self.player2.get_name()))
            return self.set_playing_now(self.player2)

        print(">>>>> Start {} turn <<<<<\n".format(self.player1.get_name()))
        return self.set_playing_now(self.player1)

    def roll(self):
        """
        Reached by human players.

        Call other methods to make operations depends on die rollments.
        """
        force_stop = self.console(self.get_playing_now())

        if not force_stop and self.get_game_status():
            self.switcher()

    def console(self, player):
        """Synchronize between players's scores and rolled dice."""
        self.print_out_dice(player, self.dice.get_dice())
        player.change_score(self.dice.get_dice())
        player.set_score_list(self.dice.get_dice())
        self.print_score(player)
        # self.mock_in_console = self.dice.get_dice()
        self.set_face(self.dice.get_dice())  # For test purpose.

        if self.dice.get_dice() in (1, 6):
            self.dice.roll_dice()
            return False

        if self.get_playing_now().get_score() >= self.win_pig:
            self.end_game(self.playing_now)
            self.set_game_status(False)

        self.dice.roll_dice()
        return True

    def computer_turn(self):
        """Take orders from Intelligence class to control the decison."""
        print(">>>>> Start Computer turn <<<<<\n")

        while self.get_game_status():
            reaction = self.computer_player.reaction.get_inti_decision(
                self.computer_player, self.cheat())

            if not reaction:
                print("\t\t\t\t>>>>>  Computer decide to HOLD <<<<<")
                self.switcher()
                break

            print("\t\t\t\t>>>>>  Computer decide to ROLL <<<<<")
            self.playing_now = self.computer_player
            force_stop = self.console(self.computer_player)
            if not force_stop:
                print("\t\t\t\t>>>>>  Computer lose its turn <<<<<")
                self.switcher()
                break

    def cheat(self):
        """Return the rolled dice to reach cheating feture."""
        return self.dice.get_dice()

    def check_levels(self, level):
        """Check if the entered level is valid."""
        levels = ("easy", "normal", "hard")
        if level in levels:
            self.computer_player.set_level(level)
            print("My level now is", level)
        else:
            raise ValueError("This kind of level is not available!!")

    def change_name(self, name):
        """Change player name."""
        self.playing_now.set_name(name)

    @staticmethod
    def print_score(player):
        """Print out player score and name."""
        print("{} score is {}".format(player.get_name(), player.get_score()))

    @staticmethod
    def print_out_dice(player, number):
        """Print out rolled dice."""
        print("{} got:".format(player.get_name()))
        print(" ______")
        print(r"|\______\ ")
        print("||      |")
        print("||   {}  |".format(number))
        print(r"\|______|" + "\n")

    def highscore(self):
        """Call method  sprint out from highscore file."""
        self.score.read_file()

    def end_game(self, player):
        """Call other methods to process game ending."""
        self.score = Highscore(self.player1, self.player2)

        # self.score.write_highscore()
        self.set_game_status(False)
        print("WOW! Congra {} you won the game!".format(player.get_name()))
        self.histogram.print_histogram(self.player1, self.player2)
        self.score.write_file()

    def set_game_status(self, bool):
        """Set game status."""
        self.still_going = bool

    def get_game_status(self):
        """Check the game status."""
        return self.still_going

    def set_playing_now(self, player):
        """Change object's holder to help exchanging players."""
        self.playing_now = player

    def get_playing_now(self):
        """Return currently player."""
        return self.playing_now

    def set_computer_controler(self, bool):
        """Setter for a boolen variable.

        Help in switching turns.
        """
        self.computer_controlar = bool

    def get_computer_controler(self):
        """Getter for a boolen variable.

        Help to switching turns.
        """
        return self.computer_controlar

    # The following two methods helps to check
    # the dice face while playing and exatly
    # before the next rollment,
    # do not effect the game, helping in testing
    def set_face(self, num):
        """Set value in variable to hold dice face before automatic rolling.

        This method used for testing purpose.
        """
        self.forbidden_face = num

    def get_face(self):
        """Return dice face before automatic rolling.

        Method used for testing purpose.
        """
        return self.forbidden_face
Пример #3
0
class TestGameClass(unittest.TestCase):
    """Test Game Class."""

    def setUp(self):
        """Run at the beginning of the test."""
        self.game = Game()
        self.game.set_game_status(True)
        self.dice = Dice()

        self.player1 = Player(str, bool)
        self.player2 = Player(str, bool)
        self.computer_player = Player(str, bool)

        self.highscore = Highscore(self.player1, self.player2)

    @patch('builtins.input', return_value='')
    def test_create_player(self, mock):
        """Test create_player."""
        # Test with one player name and no name entered
        self.game.create_player(1)
        self.game.player1_name = mock
        self.assertEqual(self.game.player1.get_name(), "USER1")

    @patch('builtins.input', return_value='name')
    def test_create_player1(self, mock):
        """Test create_player."""
        # Test with one player name and no name entered
        self.game.create_player(1)
        self.game.player1_name = mock
        self.assertEqual(self.game.player1.get_name(), "name")
        self.assertEqual(self.game.player2.get_name(), "Computer")

    @patch('builtins.input', return_value='')
    def test_create_player2(self, mock):
        """Test create_player."""
        # Test with Two players name and no name entered
        self.game.create_player(2)
        self.game.player1_name = mock
        self.game.player2_name = mock
        self.assertEqual(self.game.player1.get_name(), "USER1")
        self.assertEqual(self.game.player2.get_name(), "USER2")
        # Check that computer_controler is off
        self.assertFalse(self.game.get_computer_controler())

    def test_switcher(self):
        """Test Switcher."""
        # Testing switcher
        self.game.set_game_status(True)
        before_switching = self.game.get_playing_now()
        self.game.switcher()
        after_switching = self.game.get_playing_now()
        self.assertNotEqual(before_switching, after_switching)

        # another test and assuming it is ccomputer's turn
        self.game.set_game_status(True)
        self.game.set_playing_now(self.computer_player)
        self.game.switcher()
        self.assertEqual(self.game.get_playing_now(), self.game.player1)

    def test_roll(self):
        """Test roll."""
        res = self.game.roll()
        if self.game.get_face() in (1, 6):
            self.assertFalse(res)

    def test_console(self):
        """Test console."""
        ret_bool = self.game.console(self.game.get_playing_now())
        if self.game.get_face() in (1, 6):
            self.assertFalse(ret_bool)

        # Test that the game ends when the currently player
        # reached the winning score
        if self.game.get_playing_now().get_score() >= self.game.win_pig:
            self.assertFalse(self.game.get_game_status())
            self.game.end_game(self.game.get_playing_now())

    def test_computer_turn(self):
        """Test computer_turn."""
        # Testing prints message:
        self.game.computer_turn()
        # Most output from method inculds :
        printing_res = ' Computer '

        catch_output = io.StringIO()
        sys.stdout = catch_output
        self.game.computer_turn()

        # print player's name and score and catch it.
        sys.stdout = sys.__stdout__
        output = catch_output.getvalue()
        self.assertIn(str(printing_res), output)

        # Testing switcher() be called by computer_player
        #   when it decide stops playing
        test_reaction = self.computer_player.reaction.get_inti_decision(
            self.computer_player, 4)

        if not test_reaction:
            mock_com_player = Mock(spec=Game)
            self.assertIsInstance(mock_com_player, Game)
            mock_com_player.switcher()
            mock_com_player.switcher.assert_called()

        # If game force stop, call switcher
        mock_com_player2 = Mock(spec=Game)
        game_return = self.game.console(self.computer_player)
        if not game_return:
            mock_com_player2.switcher()
            mock_com_player2.switcher.assert_called()

    def test_cheat(self):
        """Test cheat method."""
        cheat_method = self.game.cheat()
        self.assertEqual(cheat_method, self.game.dice.get_dice())

    def test_highscore(self):
        """Test highscore method."""
        mock = Mock(spec=Highscore)
        self.assertIsInstance(mock, Highscore)
        with patch('highscore.Highscore') as fake_obj:
            mock.read_file()
            fake_obj.asert_called()

        # another test
        read_file_method = self.highscore.read_file()
        self.assertEqual(read_file_method, self.highscore.read_file())
        # Test The Instance
        self.assertIsInstance(self.highscore, Highscore)

    def test_change_name(self):
        """Test changing name feature."""
        self.game.change_name("new_name")
        res = self.game.playing_now.get_name()
        self.assertTrue(res == "new_name")

    def test_end_game(self):
        """Test end_game."""
        histogram = Histogram()
        score = Highscore(self.game.player1, self.game.player2)

        self.game.set_game_status(False)
        self.assertIsInstance(histogram, Histogram)
        # self.assertFalse(self.game.get_game_status())
        self.assertIsInstance(score, Highscore)

        #   The folling two lines work find to test
        #   the the method change-game.status to false
        #     exp = self.player1
        #     self.game.end_game(exp)
        # However;
        # The followign method-call raise an error
        #  and may need another tests typ!
        # score.write_file()    <-----
        highscore = Highscore(self.game.player1, self.game.player2)
        highscore.write_file = MagicMock(name='write_file')
        highscore.write_file()

    def test_check_levels(self):
        """Test check_levels."""
        # assuming easy level passed:
        passed_level = "easy"
        levels_list = ("easy")
        self.game.check_levels(passed_level)
        if passed_level in levels_list:
            res = self.computer_player.reaction.level
            self.assertEqual(res, passed_level)

    def test_print_score(self):
        """Test print_score."""
        name_res = self.player1.get_name()
        score_res = self.player1.get_score()
        res = name_res and score_res

        catch_output = io.StringIO()
        sys.stdout = catch_output
        self.game.print_score(self.player1)
        # print player's name and score and catch it.
        sys.stdout = sys.__stdout__
        output = catch_output.getvalue()
        self.assertIn(str(res), output)

    def test_print_out_dice(self):
        """Test print_out_dice."""
        res = str(self.player1.get_name())

        catch_output = io.StringIO()
        sys.stdout = catch_output
        self.game.print_out_dice(self.player1, 5)
        # print cube out and catch it.
        sys.stdout = sys.__stdout__
        output = catch_output.getvalue()
        self.assertIn(res, output)

    def test_get_playing_now(self):
        """Test set And get_playing_now."""
        exp = self.player1
        self.game.set_playing_now(exp)
        res = self.game.get_playing_now()
        self.assertEqual(res, exp)

    def test_get_game_status(self):
        """Test get_game_status."""
        res = self.game.get_game_status()
        self.assertIn(res, [True, False])

    def test_set_cmputer_controler(self):
        """Test set_computer_controler."""
        self.game.set_computer_controler(True)
        self.assertTrue(self.game.computer_controlar)

    def test_get_computer_controler(self):
        """Test get_computer_controler."""
        res = self.game.get_computer_controler()
        self.assertIn(res, [True, False])

    def test_set_face(self):
        """Test set_face."""
        self.game.set_face(2)
        res = self.game.get_face()
        self.assertEqual(res, 2)