def test_general_zone_clauses(self): board = SudokuBoard([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]) result = exactly_one_clauses(board.zones(), board.cell_width) cnf = sorted([str(c) for c in result]) expected = [ "!d1_1_1 || !d1_1_2", "!d1_1_1 || !d1_2_1", "!d1_1_1 || !d1_2_2", "!d1_1_2 || !d1_2_1", "!d1_1_2 || !d1_2_2", "!d1_1_3 || !d1_1_4", "!d1_1_3 || !d1_2_3", "!d1_1_3 || !d1_2_4", "!d1_1_4 || !d1_2_3", "!d1_1_4 || !d1_2_4", "!d1_2_1 || !d1_2_2", "!d1_2_3 || !d1_2_4", "!d1_3_1 || !d1_3_2", "!d1_3_1 || !d1_4_1", "!d1_3_1 || !d1_4_2", "!d1_3_2 || !d1_4_1", "!d1_3_2 || !d1_4_2", "!d1_3_3 || !d1_3_4", "!d1_3_3 || !d1_4_3", "!d1_3_3 || !d1_4_4", "!d1_3_4 || !d1_4_3", "!d1_3_4 || !d1_4_4", "!d1_4_1 || !d1_4_2", "!d1_4_3 || !d1_4_4", "!d2_1_1 || !d2_1_2", "!d2_1_1 || !d2_2_1", "!d2_1_1 || !d2_2_2", "!d2_1_2 || !d2_2_1", "!d2_1_2 || !d2_2_2", "!d2_1_3 || !d2_1_4", "!d2_1_3 || !d2_2_3", "!d2_1_3 || !d2_2_4", "!d2_1_4 || !d2_2_3", "!d2_1_4 || !d2_2_4", "!d2_2_1 || !d2_2_2", "!d2_2_3 || !d2_2_4", "!d2_3_1 || !d2_3_2", "!d2_3_1 || !d2_4_1", "!d2_3_1 || !d2_4_2", "!d2_3_2 || !d2_4_1", "!d2_3_2 || !d2_4_2", "!d2_3_3 || !d2_3_4", "!d2_3_3 || !d2_4_3", "!d2_3_3 || !d2_4_4", "!d2_3_4 || !d2_4_3", "!d2_3_4 || !d2_4_4", "!d2_4_1 || !d2_4_2", "!d2_4_3 || !d2_4_4", "!d3_1_1 || !d3_1_2", "!d3_1_1 || !d3_2_1", "!d3_1_1 || !d3_2_2", "!d3_1_2 || !d3_2_1", "!d3_1_2 || !d3_2_2", "!d3_1_3 || !d3_1_4", "!d3_1_3 || !d3_2_3", "!d3_1_3 || !d3_2_4", "!d3_1_4 || !d3_2_3", "!d3_1_4 || !d3_2_4", "!d3_2_1 || !d3_2_2", "!d3_2_3 || !d3_2_4", "!d3_3_1 || !d3_3_2", "!d3_3_1 || !d3_4_1", "!d3_3_1 || !d3_4_2", "!d3_3_2 || !d3_4_1", "!d3_3_2 || !d3_4_2", "!d3_3_3 || !d3_3_4", "!d3_3_3 || !d3_4_3", "!d3_3_3 || !d3_4_4", "!d3_3_4 || !d3_4_3", "!d3_3_4 || !d3_4_4", "!d3_4_1 || !d3_4_2", "!d3_4_3 || !d3_4_4", "!d4_1_1 || !d4_1_2", "!d4_1_1 || !d4_2_1", "!d4_1_1 || !d4_2_2", "!d4_1_2 || !d4_2_1", "!d4_1_2 || !d4_2_2", "!d4_1_3 || !d4_1_4", "!d4_1_3 || !d4_2_3", "!d4_1_3 || !d4_2_4", "!d4_1_4 || !d4_2_3", "!d4_1_4 || !d4_2_4", "!d4_2_1 || !d4_2_2", "!d4_2_3 || !d4_2_4", "!d4_3_1 || !d4_3_2", "!d4_3_1 || !d4_4_1", "!d4_3_1 || !d4_4_2", "!d4_3_2 || !d4_4_1", "!d4_3_2 || !d4_4_2", "!d4_3_3 || !d4_3_4", "!d4_3_3 || !d4_4_3", "!d4_3_3 || !d4_4_4", "!d4_3_4 || !d4_4_3", "!d4_3_4 || !d4_4_4", "!d4_4_1 || !d4_4_2", "!d4_4_3 || !d4_4_4", "d1_1_1 || d1_1_2 || d1_2_1 || d1_2_2", "d1_1_3 || d1_1_4 || d1_2_3 || d1_2_4", "d1_3_1 || d1_3_2 || d1_4_1 || d1_4_2", "d1_3_3 || d1_3_4 || d1_4_3 || d1_4_4", "d2_1_1 || d2_1_2 || d2_2_1 || d2_2_2", "d2_1_3 || d2_1_4 || d2_2_3 || d2_2_4", "d2_3_1 || d2_3_2 || d2_4_1 || d2_4_2", "d2_3_3 || d2_3_4 || d2_4_3 || d2_4_4", "d3_1_1 || d3_1_2 || d3_2_1 || d3_2_2", "d3_1_3 || d3_1_4 || d3_2_3 || d3_2_4", "d3_3_1 || d3_3_2 || d3_4_1 || d3_4_2", "d3_3_3 || d3_3_4 || d3_4_3 || d3_4_4", "d4_1_1 || d4_1_2 || d4_2_1 || d4_2_2", "d4_1_3 || d4_1_4 || d4_2_3 || d4_2_4", "d4_3_1 || d4_3_2 || d4_4_1 || d4_4_2", "d4_3_3 || d4_3_4 || d4_4_3 || d4_4_4" ] assert cnf == expected
def test_board(self): board = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 0, 0]]) expected = "\n".join(["0003", "0002", "3000", "4000"]) assert str(board) == expected expected = [[(1, 1), (1, 2), (1, 3), (1, 4)], [(2, 1), (2, 2), (2, 3), (2, 4)], [(3, 1), (3, 2), (3, 3), (3, 4)], [(4, 1), (4, 2), (4, 3), (4, 4)]] assert board.rows() == expected expected = [[(1, 1), (2, 1), (3, 1), (4, 1)], [(1, 2), (2, 2), (3, 2), (4, 2)], [(1, 3), (2, 3), (3, 3), (4, 3)], [(1, 4), (2, 4), (3, 4), (4, 4)]] assert board.columns() == expected expected = [[(1, 1), (1, 2), (2, 1), (2, 2)], [(1, 3), (1, 4), (2, 3), (2, 4)], [(3, 1), (3, 2), (4, 1), (4, 2)], [(3, 3), (3, 4), (4, 3), (4, 4)]] assert board.zones() == expected