def test_cannot_insert_number_if_it_is_already_on_same_column(self):
        grid = create_zero_grid()
        col = 3
        number = 8
        grid[col][2] = number

        solver = SudokuSolver(grid)

        self.assertFalse(solver._is_possible(col,4,number))
        # ok for neighbor col
        self.assertTrue(solver._is_possible(col + 1, 4 ,number))
    def test_cannot_insert_number_if_it_is_already_on_same_row(self):
        grid = create_zero_grid()
        row = 3
        number = 8
        grid[2][row] = number

        solver = SudokuSolver(grid)

        self.assertFalse(solver._is_possible(4,row,number))
        # ok for neighbor row
        self.assertTrue(solver._is_possible(4,row + 1,number))
    def test_cannot_insert_number_if_it_is_already_on_same_block(self):
        grid = create_zero_grid()
        
        number = 8
        grid[1][1] = number
        grid[4][4] = number
        grid[7][7] = number
        solver = SudokuSolver(grid)

        self.assertFalse(solver._is_possible(2,2,number))
        self.assertFalse(solver._is_possible(5,5,number))
        self.assertFalse(solver._is_possible(8,8,number))
    def test_all_positions_and_numbers_are_possible_on_zero_grid(self):
        grid = create_zero_grid()
        solver = SudokuSolver(grid)

        for number in range(1, 10):
            for col in range(9):
                for row in range(9):
                    self.assertTrue(solver._is_possible(col,row,number))