Example #1
0
class TestTicTacToeMethods(unittest.TestCase):
    def setUp(self):
        self.game = TicTacToe()

    def test_set_square(self):
        self.game.set_square(0, 0, "O")
        self.assertEqual(self.game.get_square(0, 0), "O")
        self.game.set_square(0, 0, "X")
        self.assertEqual(self.game.get_square(0, 0), "X")
        self.game.set_square(0, 0, None)
        self.assertEqual(self.game.get_square(0, 0), None)
        with self.assertRaises(ValueError):
            self.game.set_square(0, 0, "A")
        with self.assertRaises(TypeError):
            self.game.set_square(0, 0, 1)

    def test_make_move(self):
        # Valid move
        board = self.game.make_move(self.game._board, 0, 0, "O")
        self.assertEqual(
            board, [["O", None, None], [None, None, None], [None, None, None]])
        # Invalid move - square already occupied
        new_board = self.game.make_move(board, 0, 0, "X")
        self.assertEqual(new_board, [])
        # Invalid move - invalid square specified
        new_board2 = self.game.make_move(board, 3, 3, "X")
        self.assertEqual(new_board2, [])
        # Check board's state hasn't changed
        self.assertEqual(
            board, [["O", None, None], [None, None, None], [None, None, None]])

    def test_find_winner(self):
        # O wins diagonally
        board = [["O", "X", None], [None, "O", None], ["X", None, "O"]]
        winner = self.game.find_winner(board)
        self.assertEqual(winner, "O")
        # X wins vertically (board[x][y] occupies the (x, y) square)
        board = [["O", None, "O"], [None, "O", None], ["X", "X", "X"]]
        winner = self.game.find_winner(board)
        self.assertEqual(winner, "X")
        # O wins horizontally
        board = [["O", "X", "O"], ["O", "X", "X"], ["O", "O", "X"]]
        winner = self.game.find_winner(board)
        self.assertEqual(winner, "O")
        # Incomplete game
        board = [["O", "X", "O"], [None, "X", "X"], [None, "O", None]]
        winner = self.game.find_winner(board)
        self.assertEqual(winner, None)
        # Draw
        board = [["O", "O", "X"], ["X", "X", "O"], ["O", "X", "O"]]
        winner = self.game.find_winner(board)
        self.assertEqual(winner, None)
        # Two winners
        board = [["O", "X", None], ["O", "X", None], ["O", "X", None]]
        winner = self.game.find_winner(board)
        self.assertTrue(winner == "O" or winner == "X")

    def test_board_full(self):
        board = [["O", "X", "O"], ["O", "X", "X"], ["O", "O", "X"]]
        self.assertTrue(self.game.board_full(board))
        board = [["O", "X", "O"], [None, "X", "X"], [None, "O", None]]
        self.assertFalse(self.game.board_full(board))

    def test_load(self):
        self.game.load(RandomAI(self.game), "O")
        self.assertTrue(isinstance(self.game._O, RandomAI))
        self.game.load(WinningAI(self.game), "X")
        self.assertTrue(isinstance(self.game._X, WinningAI))
        with self.assertRaises(ValueError):
            self.game.load(RandomAI(self.game), "A")
        with self.assertRaises(TypeError):
            self.game.load(RandomAI(self.game), 1)