def test_str(): s = str(basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79')) assert s == """5 3 . | . 7 . | . . . 6 . . | 1 9 5 | . . . . 9 8 | . . . | . 6 . ------+-------+------ 8 . . | . 6 . | . . 3 4 . . | 8 . 3 | . . 1 7 . . | . 2 . | . . 6 ------+-------+------ . 6 . | . . . | 2 8 . . . . | 4 1 9 | . . 5 . . . | . 8 . | . 7 9""" s = str(basicsudoku.SudokuBoard(symbols='534678912672195348198342567859761423426853791713924856961537284287419635345286179')) assert s == """5 3 4 | 6 7 8 | 9 1 2 6 7 2 | 1 9 5 | 3 4 8 1 9 8 | 3 4 2 | 5 6 7 ------+-------+------ 8 5 9 | 7 6 1 | 4 2 3 4 2 6 | 8 5 3 | 7 9 1 7 1 3 | 9 2 4 | 8 5 6 ------+-------+------ 9 6 1 | 5 3 7 | 2 8 4 2 8 7 | 4 1 9 | 6 3 5 3 4 5 | 2 8 6 | 1 7 9""" s = str(basicsudoku.SudokuBoard(symbols='1234341223414123')) assert s == '1 2 | 3 4\n3 4 | 1 2\n----+-----+----\n2 3 | 4 1\n4 1 | 2 3'
def test_is_valid_board(): board = basicsudoku.SudokuBoard(size=9, strict=False) assert board.is_valid_board() == True board[0, 0] = '1' assert board.is_valid_board() == True # Test putting the same symbol in the same row. board[8, 0] = '1' assert board.is_valid_board() == False # Test putting the same symbol in the same subgrid. board[8, 0] = basicsudoku.EMPTY_SPACE board[0, 1] = '1' assert board.is_valid_board() == False # Test putting the same symbol in the same column. board[0, 1] = basicsudoku.EMPTY_SPACE board[0, 8] = '1' assert board.is_valid_board() == False board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.is_valid_board() == True board = basicsudoku.SudokuBoard(symbols='534678912672195348198342567859761423426853791713924856961537284287419635345286179') assert board.is_valid_board() == True
def test_symbols_property(): # Test an empty board. board = basicsudoku.SudokuBoard() assert board.symbols == '.' * 81 # Test a board with a few symbols set. board[0, 0] = '1' board[1, 0] = '2' board[8, 8] = '3' assert board.symbols == '12.......' + ('.' * 63) + '........3' # Test a partially filled-in board. board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.symbols == SYMBOLS_FOR_A_PARTIAL_BOARD # Test a completely filled-in but invalid board. board = basicsudoku.SudokuBoard(symbols='1' * 81, strict=False) assert board.symbols == '1' * 81 # Test setting the symbols board.symbols = SYMBOLS_FOR_A_PARTIAL_BOARD assert board.symbols == SYMBOLS_FOR_A_PARTIAL_BOARD # Test validation for setting symbols with pytest.raises(basicsudoku.SudokuBoardException): board.symbols = '1' with pytest.raises(basicsudoku.SudokuBoardException): board.symbols = 42 # Test setting symbols to an invalid board in strict mode. board = basicsudoku.SudokuBoard(strict=True) with pytest.raises(basicsudoku.SudokuBoardException): board.symbols = '1' * 81
def test_len(): full_board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD) assert len(full_board) == 81 partial_board = basicsudoku.SudokuBoard( symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert len(partial_board) == 81
def test_is_valid_board(): board = basicsudoku.SudokuBoard(strict=False) assert board.is_valid_board() == True board[0, 0] = '1' assert board.is_valid_board() == True # Test putting the same symbol in the same row. board[8, 0] = '1' assert board.is_valid_board() == False # Test putting the same symbol in the same box. board[8, 0] = basicsudoku.EMPTY_SPACE board[0, 1] = '1' assert board.is_valid_board() == False # Test putting the same symbol in the same column. board[0, 1] = basicsudoku.EMPTY_SPACE board[0, 8] = '1' assert board.is_valid_board() == False board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.is_valid_board() == True board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD) assert board.is_valid_board() == True
def test_str(): s = str(basicsudoku.SudokuBoard()) assert s == """. . . | . . . | . . . . . . | . . . | . . . . . . | . . . | . . . ------+-------+------ . . . | . . . | . . . . . . | . . . | . . . . . . | . . . | . . . ------+-------+------ . . . | . . . | . . . . . . | . . . | . . . . . . | . . . | . . .""" s = str(basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD)) assert s == """5 3 . | . 7 . | . . . 6 . . | 1 9 5 | . . . . 9 8 | . . . | . 6 . ------+-------+------ 8 . . | . 6 . | . . 3 4 . . | 8 . 3 | . . 1 7 . . | . 2 . | . . 6 ------+-------+------ . 6 . | . . . | 2 8 . . . . | 4 1 9 | . . 5 . . . | . 8 . | . 7 9""" s = str(basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD)) assert s == """5 3 4 | 6 7 8 | 9 1 2
def test_get_subgrid(): board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.get_subgrid(0, 0) == ['5', '3', '.', '6', '.', '.', '.', '9', '8'] assert board.get_subgrid(0, 1) == ['8', '.', '.', '4', '.', '.', '7', '.', '.'] assert board.get_subgrid(1, 0) == ['.', '7', '.', '1', '9', '5', '.', '.', '.'] with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(0.0 , 0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(0, 0.0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(-1 , 0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(0, 3) with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(3, 0) board = basicsudoku.SudokuBoard(symbols='1234341223414123') assert board.get_subgrid(0, 0) == ['1', '2', '3', '4'] assert board.get_subgrid(0, 1) == ['2', '3', '4', '1'] assert board.get_subgrid(1, 0) == ['3', '4', '1', '2'] with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(2, 0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_subgrid(0, 2)
def test_is_solved(): board = basicsudoku.SudokuBoard() assert board.is_solved() == False board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.is_solved() == False board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD) assert board.is_solved() == True
def test_is_valid_symbol(): board = basicsudoku.SudokuBoard(size=9) assert board.is_valid_symbol('1') == True assert board.is_valid_symbol('9') == True assert board.is_valid_symbol('16') == False assert board.is_valid_symbol('X') == False board = basicsudoku.SudokuBoard(size=16) assert board.is_valid_symbol('1') == True assert board.is_valid_symbol('9') == True assert board.is_valid_symbol('16') == True assert board.is_valid_symbol('X') == False
def test_is_solved(): board = basicsudoku.SudokuBoard() assert board.is_solved() == False board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.is_solved() == False board = basicsudoku.SudokuBoard(symbols='534678912672195348198342567859761423426853791713924856961537284287419635345286179') assert board.is_solved() == True board = basicsudoku.SudokuBoard(symbols='1234341223414123') assert board.is_solved() == True
def test_ctor(): # Test the basic constructor. board = basicsudoku.SudokuBoard() assert board.symbols == SYMBOLS_FOR_AN_EMPTY_BOARD # Test with default values for the keyword arguments. board = basicsudoku.SudokuBoard(symbols=None, strict=True) assert board.symbols == SYMBOLS_FOR_AN_EMPTY_BOARD # Test with default values for the keyword arguments. board = basicsudoku.SudokuBoard(None, True) assert board.symbols == SYMBOLS_FOR_AN_EMPTY_BOARD assert board.strict == True
def test_ctor(): # Test the basic constructor. board = basicsudoku.SudokuBoard() assert board.get_symbols() == '.................................................................................' # Test with default values for the keyword arguments. board = basicsudoku.SudokuBoard(symbols=None, size=9, strict=True, solved=False) assert board.get_symbols() == '.................................................................................' # Test with default values for the keyword arguments. board = basicsudoku.SudokuBoard(None, 9, True, False) assert board.get_symbols() == '.................................................................................' assert board.size == 9 assert board.strict == True
def test_is_full(): board = basicsudoku.SudokuBoard(size=9) assert board.is_full() == False board[0, 0] = '1' assert board.is_full() == False board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.is_full() == False board = basicsudoku.SudokuBoard(symbols='534678912672195348198342567859761423426853791713924856961537284287419635345286179') assert board.is_full() == True board[0, 0] = basicsudoku.EMPTY_SPACE assert board.is_full() == False
def test_is_full(): board = basicsudoku.SudokuBoard() assert board.is_full() == False board[0, 0] = '1' assert board.is_full() == False board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.is_full() == False board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD) assert board.is_full() == True board[0, 0] = basicsudoku.EMPTY_SPACE assert board.is_full() == False
def test_ctor_strict_arg(): # Strict mode enabled. board = basicsudoku.SudokuBoard(strict=True) board[0, 0] = '1' with pytest.raises(basicsudoku.SudokuBoardException): board[0, 1] = '1' # Strict mode disabled. board = basicsudoku.SudokuBoard(strict=False) board[0, 0] = '1' board[0, 1] = '1' # Strict mode enabled doesn't raise an exception for the symbols argument. basicsudoku.SudokuBoard(symbols='1' * 81, strict=True)
def solveSudoku(unsolvedSudoku): solvedSudoku = [[], [], [], [], [], [], [], [], []] board = basicsudoku.SudokuBoard() # board.strict = False for x in range(9): for y in range(9): if unsolvedSudoku[y][x] != '_': board[x, y] = (int)(unsolvedSudoku[y][x]) print('Found Puzzle') print(board) print() solvers.BasicSolver(board) print('Solved Puzzle') print(board) print() for y in range(9): for x in range(9): solvedSudoku[y].append(board[x, y]) # Print to console the found puzzle # for i in range(9): # print(solvedSudoku[i]) return solvedSudoku
def test_get_set(): board = basicsudoku.SudokuBoard() assert board[0, 0] == basicsudoku.EMPTY_SPACE board[0, 0] = 1 assert board[0, 0] == '1' board[0, 0] = '1' assert board[0, 0] == '1' # Test setting invalid symbols. with pytest.raises(basicsudoku.SudokuBoardException): board[0, 0] = '10' with pytest.raises(basicsudoku.SudokuBoardException): board[0, 0] = {'hello': 'world'} # Try to get/set invalid key. with pytest.raises(basicsudoku.SudokuBoardException): board['hello'] with pytest.raises(basicsudoku.SudokuBoardException): board['hello'] = '1' # Test out of range indexes. with pytest.raises(basicsudoku.SudokuBoardException): board[99, 0] with pytest.raises(basicsudoku.SudokuBoardException): board[0, 99] with pytest.raises(basicsudoku.SudokuBoardException): board[99] with pytest.raises(basicsudoku.SudokuBoardException): board[99, 0] = '1' with pytest.raises(basicsudoku.SudokuBoardException): board[0, 99] = '1' with pytest.raises(basicsudoku.SudokuBoardException): board[99] = '1'
def test_strict_property(): board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD, strict=False) board.strict = True board.strict = False # Test trying to set strict to a non-bool value. with pytest.raises(basicsudoku.SudokuBoardException): board.strict = 0 with pytest.raises(basicsudoku.SudokuBoardException): board.strict = 1 with pytest.raises(basicsudoku.SudokuBoardException): board.strict = None # Test making the board invalid while in strict mode. board.strict = True with pytest.raises(basicsudoku.SudokuBoardException): board[0, 0] = 1 # Make sure that the last set didn't go through. assert board[0, 0] != '1' # Test enabling strict mode while the board is currently invalid. board.strict = False board[0, 0] = 1 with pytest.raises(basicsudoku.SudokuBoardException): board.strict = True
def test_ctor_strict_arg(): # Strict mode enabled. board = basicsudoku.SudokuBoard(strict=True) board[0, 0] = '1' # Setting an invalid symbol should raise an exception. with pytest.raises(basicsudoku.SudokuBoardException): board[0, 1] = '1' # Strict mode disabled. board = basicsudoku.SudokuBoard(strict=False) board[0, 0] = '1' board[0, 1] = '1' # Strict mode enabled raises an exception for invalid symbols argument. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(symbols='1' * 81, strict=True)
def basicsudoku(self): """Returns the basicsudoku representation of the Sudoku.""" if self.loaded: symbols = "".join([x if 1 <= int(x) <= 9 else "." for x in self.flat_puzzle]) board = basicsudoku.SudokuBoard(symbols=symbols) return board else: return None
def test_ctor_symbols_arg(): # Test the `symbols` keyword argument. board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_AN_EMPTY_BOARD) assert board.symbols == SYMBOLS_FOR_AN_EMPTY_BOARD # Test the EMPTY_SPACE constant is '.' board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_AN_EMPTY_BOARD) assert board.symbols == SYMBOLS_FOR_AN_EMPTY_BOARD # Test with full, real symbols. board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD) assert board.symbols == SYMBOLS_FOR_A_FULL_BOARD # Test with partial, real symbols. board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.symbols == SYMBOLS_FOR_A_PARTIAL_BOARD # Test too few symbols. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(symbols='...') # Test too many symbols. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_AN_EMPTY_BOARD + '1') # Test invalid symbols. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard( symbols= 'X................................................................................' )
def test_copy_method(): board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_FULL_BOARD, strict=False) board_copy = board.copy() # Ensure that the boards have the same symbols. assert board_copy.symbols == SYMBOLS_FOR_A_FULL_BOARD assert board_copy.strict == False # Ensure that you can change the symbols on the boards independently. board[0, 0] = '1' assert board[0, 0] == '1' assert board_copy[0, 0] == SYMBOLS_FOR_A_FULL_BOARD[0] # Ensure that the strict property gets copied. board = basicsudoku.SudokuBoard(strict=True) board_copy = board.copy() assert board_copy.strict == True
def test_boxes_iter(): board = basicsudoku.SudokuBoard( symbols= '53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79' ) it = iter(board.boxes) assert next(it) == ['5', '3', '.', '6', '.', '.', '.', '9', '8'] assert next(it) == ['.', '7', '.', '1', '9', '5', '.', '.', '.']
def test_ctor_size_arg(): basicsudoku.SudokuBoard() basicsudoku.SudokuBoard(size=1) basicsudoku.SudokuBoard(size=4) basicsudoku.SudokuBoard(size=9) basicsudoku.SudokuBoard(size=16) basicsudoku.SudokuBoard(size=25) basicsudoku.SudokuBoard(size=81) # Test non-square number size. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(size=10) with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(size=-10) # Size must be int. with pytest.raises(basicsudoku.SudokuBoardException): basicsudoku.SudokuBoard(size=9.0)
def test_get_column(): board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.get_column(0) == ['5', '6', '.', '8', '4', '7', '.', '.', '.'] assert board.get_column(1) == ['3', '.', '9', '.', '.', '.', '6', '.', '.'] assert board.get_column(2) == ['.', '.', '8', '.', '.', '.', '.', '.', '.'] with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(0.0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(-1) with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(9) board = basicsudoku.SudokuBoard(symbols='1234341223414123') assert board.get_column(0) == ['1', '3', '2', '4'] with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(4)
def test_get_symbols(): # Test an empty board. board = basicsudoku.SudokuBoard(size=9) assert board.get_symbols() == '.' * 81 # Test a board with a few symbols set. board[0, 0] = '1' board[1, 0] = '2' board[8, 8] = '3' assert board.get_symbols() == '12.......' + ('.' * 63) + '........3' # Test a 4x4 board. board = basicsudoku.SudokuBoard(size=4) assert board.get_symbols() == '.' * 16 # Test a 16x16 board. board = basicsudoku.SudokuBoard(size=16) assert board.get_symbols() == ('.',) * 256 # Test a partially filled-in board. board = basicsudoku.SudokuBoard(symbols='53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') assert board.get_symbols() == '53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79' # Test a completely filled-in board. board = basicsudoku.SudokuBoard(symbols='1234341223414123') assert board.get_symbols() == '1234341223414123' # Test a completely filled-in but invalid board. board = basicsudoku.SudokuBoard(symbols='1' * 81) assert board.get_symbols() == '1' * 81
def test_get_set(): board = basicsudoku.SudokuBoard(size=9) assert board[0, 0] == basicsudoku.EMPTY_SPACE board[0, 0] = 1 assert board[0, 0] == '1' board[0, 0] = '1' assert board[0, 0] == '1' with pytest.raises(basicsudoku.SudokuBoardException): board[9, 0] = '1' with pytest.raises(basicsudoku.SudokuBoardException): board[0, 9] = '1' with pytest.raises(basicsudoku.SudokuBoardException): board[0, 0] = '10' board = basicsudoku.SudokuBoard(size=16) board[0, 0] = '10' assert board[0, 0] == '10'
def test_is_complete_group(): board = basicsudoku.SudokuBoard(size=9) assert board.is_complete_group('123456789') == True # complete group assert board.is_complete_group('987654321') == True # complete group, different order assert board.is_complete_group('112345678') == False # repeated '1' symbol assert board.is_complete_group('12345678.') == False # empty space with pytest.raises(basicsudoku.SudokuBoardException): assert board.is_complete_group(42) == True # Test too few symbols in group. with pytest.raises(basicsudoku.SudokuBoardException): assert board.is_complete_group('123') == True # Test too many symbols in group. with pytest.raises(basicsudoku.SudokuBoardException): assert board.is_complete_group('1234567890') == True # Test with a 16 x 16 board. board = basicsudoku.SudokuBoard(size=16) assert board.is_complete_group((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) == True assert board.is_complete_group((16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)) == True
def test_get_column(): board = basicsudoku.SudokuBoard(symbols=SYMBOLS_FOR_A_PARTIAL_BOARD) assert board.get_column(0) == ['5', '6', '.', '8', '4', '7', '.', '.', '.'] assert board.get_column(1) == ['3', '.', '9', '.', '.', '.', '6', '.', '.'] assert board.get_column(2) == ['.', '.', '8', '.', '.', '.', '.', '.', '.'] with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(0.0) with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(-1) with pytest.raises(basicsudoku.SudokuBoardException): board.get_column(9)
def main(): # Convert array to usable string for basicsudoku boardString = boardToString(board) formattedBoard = bs.SudokuBoard() formattedBoard.symbols = boardString print(formattedBoard) # Solve the puzzle, which will change the boardString generate(board) print("\n") # Print the new completed, formatted board boardString = boardToString(board) formattedBoard.symbols = boardString print(formattedBoard)