コード例 #1
0
class TestBoardHelper(TestCase):
    def setUp(self):
        self.board = Board()
        self.board_helper = BoardHelper(self.board.all_ships)

    def test_generate_all_spots_returns_a_list_of_all_spaces(self):
        all_spots_list = [
            'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'B1',
            'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'C1', 'C2',
            'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10', 'D1', 'D2', 'D3',
            'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D10', 'E1', 'E2', 'E3', 'E4',
            'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'F1', 'F2', 'F3', 'F4', 'F5',
            'F6', 'F7', 'F8', 'F9', 'F10', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6',
            'G7', 'G8', 'G9', 'G10', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7',
            'H8', 'H9', 'H10', 'I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8',
            'I9', 'I10', 'J1', 'J2', 'J3', 'J4', 'J5', 'J6', 'J7', 'J8', 'J9',
            'J10'
        ]

        self.assertEqual(self.board_helper.generate_all_spots(),
                         all_spots_list)

    def test_generate_empty_board_returns_an_empty_board(self):
        empty_board = [
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_empty_board(), empty_board)

    def test_generate_all_occupied_but_one_returns_a_board_with_one_open_spot(
            self):
        all_occupied_but_one = [
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                None, 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
            [
                'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss', 'Miss',
                'Miss', 'Miss'
            ],
        ]

        self.assertEqual(self.board_helper.generate_all_but_one(),
                         all_occupied_but_one)

    def test_generate_full_board_returns_a_board_with_all_spots_filled(self):
        full_board = [
            [
                'Sunk', "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                'Sunk', "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                'Sunk', "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                'Sunk', "Miss", "Miss", "Miss", 'Sunk', "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                'Sunk', 'Sunk', "Miss", "Miss", 'Sunk', "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                "Miss", 'Sunk', "Miss", "Miss", 'Sunk', "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", 'Sunk', 'Sunk',
                'Sunk', 'Sunk'
            ],
            [
                "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
            [
                'Sunk', 'Sunk', 'Sunk', "Miss", "Miss", "Miss", "Miss", "Miss",
                "Miss", "Miss"
            ],
        ]

        self.assertEqual(self.board_helper.generate_full_board(), full_board)

    def test_generate_board_with_ships_returns_a_board_with_ships(self):
        board_with_ships = [
            [
                self.board.all_ships[0], self.board.all_ships[0],
                self.board.all_ships[0], self.board.all_ships[0],
                self.board.all_ships[0], None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, self.board.all_ships[2], None, None,
                None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [
                None, None, None, None, None, None, self.board.all_ships[1],
                self.board.all_ships[1], self.board.all_ships[1],
                self.board.all_ships[1]
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_board_with_ships(),
                         board_with_ships)

    def test_generate_board_with_hit_returns_a_board_with_a_hit(self):
        board_with_a_hit = [
            [
                self.board.all_ships[0], 'Hit', self.board.all_ships[0],
                self.board.all_ships[0], self.board.all_ships[0], None, None,
                None, None, self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, self.board.all_ships[2], None, None,
                None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [
                None, None, None, None, None, None, self.board.all_ships[1],
                self.board.all_ships[1], self.board.all_ships[1],
                self.board.all_ships[1]
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_board_with_hit(),
                         board_with_a_hit)

    def test_generate_board_with_a_miss_returns_a_board_with_a_miss(self):
        board_with_a_miss = [
            [
                self.board.all_ships[0], self.board.all_ships[0],
                self.board.all_ships[0], self.board.all_ships[0],
                self.board.all_ships[0], None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                'Miss', None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, self.board.all_ships[2], None, None,
                None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [
                None, None, None, None, None, None, self.board.all_ships[1],
                self.board.all_ships[1], self.board.all_ships[1],
                self.board.all_ships[1]
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_board_with_a_miss(),
                         board_with_a_miss)

    def test_generate_board_with_hit_and_miss_returns_a_board_with_a_hit_and_miss(
            self):
        board_with_hit_and_miss = [
            [
                'Hit', self.board.all_ships[0], self.board.all_ships[0],
                self.board.all_ships[0], self.board.all_ships[0], None, None,
                None, None, self.board.all_ships[3]
            ],
            [
                'Miss', None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, self.board.all_ships[2], None, None,
                None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [
                None, None, None, None, None, None, self.board.all_ships[1],
                self.board.all_ships[1], self.board.all_ships[1],
                self.board.all_ships[1]
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_board_with_hit_and_miss(),
                         board_with_hit_and_miss)

    def test_generate_board_with_sunken_ship_returns_a_board_with_a_sunken_ship(
            self):
        board_with_a_sunken_ship = [
            [
                'Sunk', 'Sunk', 'Sunk', 'Sunk', 'Sunk', None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, None, None, None, None, None,
                self.board.all_ships[3]
            ],
            [
                None, None, None, None, self.board.all_ships[2], None, None,
                None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [
                None, self.board.all_ships[4], None, None,
                self.board.all_ships[2], None, None, None, None, None
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [
                None, None, None, None, None, None, self.board.all_ships[1],
                self.board.all_ships[1], self.board.all_ships[1],
                self.board.all_ships[1]
            ],
            [None, None, None, None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None, None, None, None],
        ]

        self.assertEqual(self.board_helper.generate_board_with_a_sunken_ship(),
                         board_with_a_sunken_ship)
コード例 #2
0
class TestValidations(TestCase):
    def setUp(self):
        self.board = Board()
        self.board_helper = BoardHelper(self.board.all_ships)
        self.validate = Validate()
        self.ui = TerminalUi()

    def test_split_user_row_and_returns_a_single_letter_and_a_number_as_strings(
            self):
        user_shot_choice = 'A2'
        split_choice = ('A', '2')
        answer = self.validate.split_user_shot(user_shot_choice)

        self.assertEqual(answer, split_choice)

    def test_Validate_is_initialized_with_a_letters_list(self):
        col_letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']

        self.assertEqual(self.validate.col_letters, col_letters)

    def test_Validate_is_initialized_with_a_numbers_list(self):
        row_nums = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

        self.assertEqual(self.validate.row_nums, row_nums)

    def test_Validate_is_initialized_with_a_all_spots_list(self):
        all_spots_list = self.board_helper.generate_all_spots()

        self.assertEqual(self.validate.all_spots, all_spots_list)

    def test_spot_exists_returns_True_if_spot_exists(self):
        user_shot_choice = 'A1'

        self.assertTrue(self.validate._spot_exists(user_shot_choice))

    def test_spot_exists_returns_False_if_the_spot_is_invalid(self):
        user_shot_choice = 'J4000'

        self.assertFalse(self.validate._spot_exists(user_shot_choice))

    def test_get_current_spot_returns_the_value_of_the_selected_spot_on_the_board(
            self):
        user_shot_choice = 'A1'
        board_with_ships = self.board_helper.generate_board_with_ships()
        spot_value = self.validate.get_current_spot(board_with_ships,
                                                    user_shot_choice)
        aircraft_carrier = self.board.all_ships[0]

        self.assertEqual(spot_value, aircraft_carrier)

    def test_spot_occupied_returns_False_if_spot_is_not_occupied(self):
        user_shot_choice = 'A2'
        all_but_one = self.board_helper.generate_all_but_one()
        board = MagicMock(state=all_but_one, all_ships=self.board.all_ships)
        spot_occupied = self.validate._spot_occupied(board, user_shot_choice)

        self.assertEqual(False, spot_occupied)

    def test_spot_occupied_returns_true_if_spot_is_occupied(self):
        user_shot_choice = 'A1'
        all_but_one = self.board_helper.generate_all_but_one()
        board = MagicMock(state=all_but_one, all_ships=self.board.all_ships)
        spot_occupied = self.validate._spot_occupied(board, user_shot_choice)

        self.assertEqual(True, spot_occupied)

    def test_all_ships_sunk_returns_True_if_there_are_no_ships_left(self):
        full_board = self.board_helper.generate_full_board()
        all_sunken_ships = self.board_helper.generate_sunken_ships()
        board = MagicMock(state=full_board, all_ships=all_sunken_ships)
        all_ships_sunk = self.validate.all_ships_sunk(board)

        self.assertEqual(all_ships_sunk, True)

    def test_all_ships_sunk_returns_False_if_there_are_ships_left(self):
        board_with_ships = self.board_helper.generate_board_with_ships()
        board = MagicMock(state=board_with_ships,
                          all_ships=self.board.all_ships)
        all_ships_sunk = self.validate.all_ships_sunk(board)

        self.assertEqual(all_ships_sunk, False)

    def test_hitting_a_ship_displays_msg_and_returns_str_Hit(self):
        shot = 'A1'
        board_with_ships = self.board_helper.generate_board_with_ships()
        board = MagicMock(state=board_with_ships,
                          all_ships=self.board.all_ships)
        shot_result = self.validate.shot_result(board, shot)
        result = (consts.HIT, {
            'name': 'Aircraft Carrier',
            'size': 5,
            'hit_locations': [[0, 0]]
        })

        self.assertEqual(shot_result, result)

    def test_missing_a_ship_returns_str_Miss_and_None(self):
        shot = 'A9'
        board_with_ships = self.board_helper.generate_board_with_ships()
        board = MagicMock(state=board_with_ships,
                          all_ships=self.board.all_ships)
        shot_result = self.validate.shot_result(board, shot)
        result = (consts.MISS, None)

        self.assertEqual(shot_result, result)

    def test_ship_is_sunk_when_len_hit_locations_equals_ship_size(self):
        sunken_ship = {
            'name': 'Aircraft Carrier',
            'size': 5,
            'hit_locations': [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5]],
        }
        is_sunk = self.validate._is_ship_sunk(sunken_ship)

        self.assertEqual(is_sunk, True)

    def test_ship_is_not_sunk_when_len_hit_locations_doesnt_equal_ship_size(
            self):
        ship_with_no_hits = {
            'name': 'Aircraft Carrier',
            'size': 5,
            'hit_locations': [],
        }

        self.assertFalse(self.validate._is_ship_sunk(ship_with_no_hits))

    def test_when_a_ship_is_hit_it_stores_the_location_of_the_hit(self):
        current_ship = {
            'name': 'Aircraft Carrier',
            'size': 5,
            'hit_locations': [],
        }
        ship_after_hit = {
            'name': 'Aircraft Carrier',
            'size': 5,
            'hit_locations': [[0, 0]]
        }
        shot = 'A1'

        self.assertEqual(self.validate._store_hits(current_ship, shot),
                         ship_after_hit)