generated from asa-holland/python-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tests.py
190 lines (141 loc) · 5.21 KB
/
tests.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# test.py
# Author: Asa LeHolland
import unittest
import main as main_sudoku
# Puzzle Source: https://dingo.sbs.arizona.edu/~sandiway/sudoku/examples.html
puzzle = [
[0,0,0, 2,6,0, 7,0,1],
[6,8,0, 0,7,0, 0,9,0],
[1,9,0, 0,0,4, 5,0,0],
[8,2,0, 1,0,0, 0,4,0],
[0,0,4, 6,0,2, 9,0,0],
[0,5,0, 0,0,3, 0,2,8],
[0,0,9, 3,0,0, 0,7,4],
[0,4,0, 0,5,0, 0,3,6],
[7,0,3, 0,1,8, 0,0,0]
]
# Solution Source: https://dingo.sbs.arizona.edu/~sandiway/sudoku/examples.html
solution = [
[4,3,5, 2,6,9, 7,8,1],
[6,8,2, 5,7,1, 4,9,3],
[1,9,7, 8,3,4, 5,6,2],
[8,2,6, 1,9,5, 3,4,7],
[3,7,4, 6,8,2, 9,1,5],
[9,5,1, 7,4,3, 6,2,8],
[5,1,9, 3,2,6, 8,7,4],
[2,4,8, 9,5,7, 1,3,6],
[7,6,3, 4,1,8, 2,5,9]
]
# Impossible Puzzle
# Source: https://www.sudokudragon.com/unsolvable.htm
impossible_puzzle = [
[5,1,6, 8,4,9, 7,3,2],
[3,0,7, 6,0,5, 0,0,0],
[8,0,9, 7,0,0, 0,5,6],
[1,3,5, 0,6,0, 9,0,7],
[4,7,2, 5,9,1, 0,0,6],
[9,6,8, 3,7,0, 0,5,0],
[2,5,3, 1,8,6, 0,7,4],
[6,8,4, 2,0,7, 5,0,0],
[7,9,1, 0,5,0, 6,0,8]
]
# Blank Puzzle
blank_puzzle = [
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0]
]
class SudokuTestMethods(unittest.TestCase):
def test_valid_placement(self):
# Test that is_placement_possible() returns valid input for a Valid placement
self.assertEqual(main_sudoku.is_placement_possible(y=0, x=0, n=3, board=puzzle), True)
def test_invalid_row_placement(self):
# Test that is_placement_possible() returns valid input for a non-valid placement in the same row
self.assertEqual(main_sudoku.is_placement_possible(y=0, x=0, n=2, board=puzzle), False)
def test_invalid_column_placement(self):
# Test that is_placement_possible() returns valid input for a non-valid placement in the same column
self.assertEqual(main_sudoku.is_placement_possible(y=0, x=0, n=8, board=puzzle), False)
def test_invalid_subsquare_placement(self):
# Test that is_placement_possible() returns valid input for a non-valid placement in the same subsquare
self.assertEqual(main_sudoku.is_placement_possible(y=0, x=0, n=9, board=puzzle), False)
def test_valid_solving(self):
# Test that solve_sudoku() correctly solves a puzzle when compared to the actual solution
attempt = puzzle
main_sudoku.solve_sudoku(board_to_solve=attempt)
self.assertEqual(attempt, solution)
def test_impossible_solving(self):
# Test that an impossible sudokue puzzle correctly returns False when attempted to solve
attempt = impossible_puzzle
self.assertEqual(main_sudoku.solve_sudoku(board_to_solve=attempt), False)
def test_solved_solving(self):
# Test that an already solved sudoku puzzle correctly returns True when attempted to solve
attempt = solution
self.assertEqual(main_sudoku.solve_sudoku(board_to_solve=attempt), True)
def test_blank_solving(self):
# Test that solution can be obtained from a fully blank sudoku board when attempted to solve
attempt = blank_puzzle
self.assertEqual(main_sudoku.solve_sudoku(board_to_solve=attempt), True)
def test_validate_valid_board(self):
# Test that a valid board proudces the correct result
attempt = solution
actual_result = main_sudoku.is_valid_sudoku(board_to_test=attempt)['is_valid']
expected_result = True
self.assertEqual(actual_result, expected_result)
def test_validate_incomplete_board(self):
# Test that an incomplete board produces the correct result
incomplete_solution = [
[4,3,5, 2,6,9, 7,8,1],
[6,8,2, 5,7,1, 4,9,3],
[1,9,7, 8,3,4, 5,6,2],
[8,2,6, 1,9,5, 3,4,7],
[3,7,4, 6,0,2, 9,1,5],
[9,5,1, 7,4,3, 6,2,8],
[5,1,9, 3,2,6, 8,7,4],
[2,4,8, 9,5,7, 1,3,6],
[7,6,3, 4,1,8, 2,5,9]
]
actual_result = main_sudoku.is_valid_sudoku(board_to_test=incomplete_solution)
expected_result = {'is_valid': False, 'invalid_row':4, 'invalid_column':4, 'invalid_digit':0}
self.assertEqual(actual_result, expected_result)
def test_validate_duplicated_number(self):
# Test that a board with an invalid duplicated number produces the correct result
incomplete_solution = [
[4,3,5, 2,6,9, 7,8,1],
[6,8,2, 5,4,1, 4,9,3],
[1,9,7, 8,3,4, 5,6,2],
[8,2,6, 1,9,5, 3,4,7],
[3,7,4, 6,8,2, 9,1,5],
[9,5,1, 7,4,3, 6,2,8],
[5,1,9, 3,2,6, 8,7,4],
[2,4,8, 9,5,7, 1,3,6],
[7,6,3, 4,1,8, 2,5,9]
]
actual_result = main_sudoku.is_valid_sudoku(board_to_test=incomplete_solution)
expected_result = {'is_valid': False, 'invalid_row':1, 'invalid_column':4, 'invalid_digit':4}
self.assertEqual(actual_result, expected_result)
def test_generate_solution(self):
# Generate a solution for an easy puzzle to add to the puzzle library
fill_in_puzzle = [
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 1,2,3, 0,0,0],
[0,0,0, 4,0,6, 0,0,0],
[0,0,0, 7,8,9, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0],
[0,0,0, 0,0,0, 0,0,0]
]
main_sudoku.solve_sudoku(board_to_solve=fill_in_puzzle)
actual_result = main_sudoku.is_valid_sudoku(board_to_test=fill_in_puzzle)
expected_result = {'is_valid': True, 'invalid_row':None, 'invalid_column':None, 'invalid_digit':None}
self.assertEqual(actual_result, expected_result)
# When run as a script, run the test cases
if __name__ == '__main__':
unittest.main()