Esempio n. 1
0
"""Slightly more advanced example of using HangmanGame."""

from hangman import HangmanGame
from PyDictionary import PyDictionary
from goslate import Goslate
import random

print('\n\nH A N G M A N\n')
print('Hi there! Let\'s see if you can save the first Hangman\n')

game = HangmanGame()

end_game = False
while not end_game:
    game.set_word()
    game_over = not game.get_status() == 'guessing'

    print(game.get_hangman())
    print(game.get_position())

    while not game_over:
        game.guess_letter()
        print(game.get_hangman())
        print(game.get_position())
        game_over = not game.get_status() == 'guessing'

    if game.get_status() == 'won':
        print('Congratulations! You guessed the word correctly.')
    else:
        print(f'The word to be guessed is: {game.get_word()}')
        print('I am sure you will do better next time. :)\n')
Esempio n. 2
0
class TestGamePlay(TestCase):
    def setUp(self):
        """Creates GamePlay class for all the unittests."""
        self.game_one = HangmanGame()
        self.game_two = HangmanGame()

    def test_is_valid_filename_TypeError(self):
        with self.assertRaises(TypeError,
                               msg='TypeError was not thrown when '
                               'an absolute Path was '
                               'input'):
            path_to_file = Path('word_bank')
            HangmanGame(path_to_file=path_to_file)

    def test_is_valid_filename_NameError(self):
        with self.assertRaises(NameError,
                               msg='NameError was not thrown when '
                               'an incorrect filename was '
                               'input'):
            path_to_file = Path.cwd()
            path_to_file = path_to_file / 'word_bank'
            HangmanGame(path_to_file=path_to_file)

    def test_read_file_stats_FileFoundError(self):
        with self.assertRaises(FileNotFoundError,
                               msg='FileNotFoundError was '
                               'not thrown when an '
                               'incorrect '
                               'filename was input'):
            path_to_file = Path.cwd()
            path_to_file = path_to_file / 'word_banker.txt'
            HangmanGame(path_to_file=path_to_file)

    def test_is_comment_true(self):
        result = HangmanGame.is_comment('# This is a comment')
        self.assertEqual(True, result)

    def test_is_comment_false(self):
        result = HangmanGame.is_comment('This is a not comment')
        self.assertEqual(False, result)

    def test_set_word_empty(self):
        """Checks if the word is set correctly."""
        self.game_one.set_word()
        self.assertIsNotNone(self.game_one.word, 'Variable \'word\' is empty')
        self.assertEqual(
            len(self.game_one.word_display), len(self.game_one.word),
            'Length of \'word_display\' '
            'and \'word\' do not match.')
        self.assertIn('_', self.game_one.word_display, '\'word_display\' does '
                      'not contain dashes: '
                      '\'_\'')

    @mock.patch('builtins.input', lambda *args: 'n')
    def test_set_word_error_n(self):
        """Checks if the correct error is raised."""
        self.game_one.word_bank = set()

        with self.assertRaises(UserWarning,
                               msg='The word bank has been '
                               'exhausted and you did not '
                               'update it.'):
            with mock.patch('sys.stdout', new=io.StringIO()) as stdout:
                self.game_one.set_word()
                self.assertEqual(
                    'Error: The word bank has been exhausted. '
                    'All the words have been used.\n', stdout.getvalue(),
                    'UserWarning not raised')

    def test_set_word_error_y(self):
        """Checks if the correct error is raised.

        Notes: The syntax for this test is based on Pytest and not unittest.
        """
        self.game_one.word_bank = set()

        with mock.patch('builtins.input',
                        side_effect=['y', 'hangman/data/word_bank.txt']):
            self.game_one.set_word()

        self.assertIsNotNone(self.game_one.word_bank, 'word_bank is not '
                             'updated.')
        self.assertIsNotNone(self.game_one.word, 'Word is not updated after '
                             'updating file.')

    def test_update_word_display(self):
        self.game_one.set_word()
        letter = self.game_one.word[1]
        self.game_one.update_word_display(letter)
        self.assertEqual(
            letter, self.game_one.word_display[1],
            '\'word_display\' is not updated correctly. The '
            'second letter should be displayed.')

    def test_update_hangman_head(self):
        self.game_one.incorrect_guesses = ['a']
        self.game_one.update_hangman()
        self.assertEqual('O', self.game_one.hangman.get('head'),
                         'hangman\'s head was not updated.')

    def test_update_hangman_body(self):
        self.game_one.incorrect_guesses = ['a', 'b']
        self.game_one.update_hangman()
        self.assertEqual('|', self.game_one.hangman.get('body'),
                         'hangman\'s body was not updated.')

    def test_update_hangman_right_hand(self):
        self.game_one.incorrect_guesses = ['a', 'b', 'c']
        self.game_one.update_hangman()
        self.assertEqual('/', self.game_one.hangman.get('right_hand'),
                         'hangman\'s right_hand was not updated.')

    def test_update_hangman_left_hand(self):
        self.game_one.incorrect_guesses = ['a', 'b', 'c', 'd']
        self.game_one.update_hangman()
        self.assertEqual('\\', self.game_one.hangman.get('left_hand'),
                         'hangman\'s left_hand was not updated.')

    def test_get_status_guessing_hello(self):
        self.game_one.set_word()
        self.game_one.word = 'hello'
        self.assertEqual('guessing', self.game_one.get_status(),
                         'Initial state of the game is incorrect')

        self.game_one.word_display = ['o']
        self.assertEqual('guessing', self.game_one.get_status(),
                         'State of the game after one move is incorrect')

    def test_get_status_won_hello(self):
        self.game_one.set_word()
        self.game_one.word = 'hello'
        self.game_one.word_display = ['h', 'e', 'l', 'l', 'o']
        self.assertEqual('won', self.game_one.get_status(),
                         'State of a game won is incorrect')

    def test_get_status_guessing_world(self):
        self.game_two.set_word()
        self.game_two.word = 'world'
        self.assertEqual('guessing', self.game_two.get_status(),
                         'Initial state of the game is incorrect')

    def test_get_status_lost_world(self):
        self.game_two.set_word()
        self.game_two.word = 'world'
        self.game_two.word_display = ['w', 'o', 'r', 'l', '_']
        self.game_two.incorrect_guesses = ['i', 'p', 't', 'q', 's', 'n']
        self.assertEqual('lost', self.game_two.get_status(),
                         'State of a game lost is incorrect')

    def test_update_points_hello_right_3(self):
        self.game_one.word = 'hello'
        self.game_one.word_display = list('hello')
        self.game_one.incorrect_guesses = ['r', 'p', 'q']
        self.game_one.correct_guesses = ['h', 'e', 'l', 'o']
        points = self.game_one.update_points()
        self.assertEqual(
            7, points, f'Points for \'hello\' should be 7 and '
            f'not {points}')

    def test_update_points_hello_wrong_2(self):
        self.game_one.word = 'hello'
        self.game_one.word_display = list('h___o')
        self.game_one.incorrect_guesses = ['r', 't', 'q', 'z', 'y', 'n']
        self.game_one.correct_guesses = ['h', 'o']
        points = self.game_one.update_points()
        self.assertEqual(
            -2, points, f'Points for \'h___o\' should '
            f'be -2 and not {points}')

    def test_update_points_world_right(self):
        self.game_two.word = 'world'
        self.game_two.word_display = list('world')
        self.game_two.incorrect_guesses = ['i', 'p', 't', 'q', 's']
        self.game_two.correct_guesses = ['w', 'r', 'l', 'o', 'd']
        points = self.game_two.update_points()
        self.assertEqual(
            7, points, f'Points for \'world\' '
            f'should be 7 and not {points}')

    def test_update_points_python_right(self):
        self.game_two.word = 'python'
        self.game_two.word_display = list('python')
        self.game_two.incorrect_guesses = ['k']
        self.game_two.correct_guesses = ['h', 'o', 't', 'p', 'n', 'y']
        points = self.game_two.update_points()
        self.assertEqual(
            13, points, f'Points for \'python\' should '
            f'be 13 and not {points}')

    def test_update_points_python_guessing(self):
        self.game_two.word = 'python'
        self.game_two.word_display = list('pyt__n')
        self.game_two.incorrect_guesses = ['k']
        self.game_two.correct_guesses = ['t', 'p', 'n', 'y']
        points = self.game_two.update_points()
        self.assertEqual(
            0, points, f'Points for an unfinished \'pyt__n\' '
            f'should be 0 and not {points}')

    def test_update_points_javascript_wrong_1(self):
        self.game_two.word = 'javascript'
        self.game_two.word_display = list('javascrip_')
        self.game_two.incorrect_guesses = ['n', 'o', 'l', 'q', 'b', 'y']
        self.game_two.correct_guesses = [
            'i', 'a', 'v', 'j', 's', 'c', 'r', 'p'
        ]
        points = self.game_two.update_points()
        self.assertEqual(
            0, points, f'Points for \'javascrip_\' should be 0 '
            f'and not {points}')

    def test_update_points_javascript_wrong_7(self):
        self.game_two.word = 'javascript'
        self.game_two.word_display = list('j_v_s_____')
        self.game_two.incorrect_guesses = ['n', 'o', 'l', 'q', 'b', 'y']
        self.game_two.correct_guesses = ['v', 'j', 's']
        points = self.game_two.update_points()
        self.assertEqual(
            -5, points, f'Points for \'j_v_s_____\' should '
            f'be -5 and not {points}')

    def test_update_list_of_words_and_reset_game(self):
        self.game_one.set_word()
        self.game_one.word = 'hello'
        self.game_one.word_display = list('hello')
        self.game_one.reset_game()
        self.assertIn('hello', self.game_one.words_played,
                      'Word not present in words played set')
        self.assertIn('hello', self.game_one.words_guessed,
                      'Word not present in the correctly guessed set')
        self.assertEqual(2, self.game_one.game_number,
                         'The game class number is incorrect')

        self.game_one.set_word()
        self.game_one.word = 'javascript'
        self.game_one.word_display = list('j_v_s_____')
        self.game_one.incorrect_guesses = ['n', 'o', 'l', 'q', 'b', 'y']
        self.game_one.correct_guesses = ['v', 'j', 's']
        self.game_one.reset_game()
        self.assertIn('javascript', self.game_one.words_played,
                      'Word not present in words played set')
        self.assertNotIn('javascript', self.game_one.words_guessed,
                         'Word not present in the correctly guessed set')
        self.assertIn('hello', self.game_one.words_played,
                      'Word not present in words played set')
        self.assertIn('hello', self.game_one.words_guessed,
                      'Word not present in the correctly guessed set')
        self.assertEqual(3, self.game_one.game_number,
                         'The game class number is incorrect')