class TestSudokuSolver(unittest.TestCase): def setUp(self): self._grid = SudokuGrid( "349287501000000700000509002200095007001000400800720005100402000008000000000000376" ) self._solver = SudokuSolver(self._grid) def test_00_is_valid(self): self.assertTrue(self._solver.is_valid()) def test_01_is_solved(self): self.assertFalse(self._solver.is_solved()) def test_02_solve_step(self): self._solver.solve_step() self.assertEqual(list(self._grid.get_row(0))[7], 6) self.assertEqual(list(self._grid.get_row(2))[6], 8) self.assertEqual(list(self._grid.get_row(6))[6:], [9, 5, 8]) self.assertEqual(list(self._grid.get_row(7))[8], 4) def test_03_solve(self): sol = self._solver.solve() for i, row in enumerate( ([3, 4, 9, 2, 8, 7, 5, 6, 1], [5, 8, 2, 6, 4, 1, 7, 9, 3], [6, 1, 7, 5, 3, 9, 8, 4, 2], [2, 3, 4, 1, 9, 5, 6, 8, 7], [7, 5, 1, 8, 6, 3, 4, 2, 9], [8, 9, 6, 7, 2, 4, 1, 3, 5], [1, 6, 3, 4, 7, 2, 9, 5, 8], [9, 7, 8, 3, 5, 6, 2, 1, 4])): self.assertEqual(list(sol.get_row(i)), row)
class TestSudokuGrid(unittest.TestCase): def setUp(self): self._grid = SudokuGrid( "349000000000000700000509002200095007001000400800720005100402000008000000000000376" ) def test_00_init(self): with self.assertRaises(ValueError): grid = SudokuGrid("123456xyz" * 9) with self.assertRaises(ValueError): grid = SudokuGrid("123456abc" * 9) with self.assertRaises(ValueError): grid = SudokuGrid("123456") with self.assertRaises(ValueError): grid = SudokuGrid("12345678" * 11) def test_01_from_file(self): grid = SudokuGrid.from_file("sudoku_db.txt", random.randint(1, 245)) def test_02_from_stdin(self): with unittest.mock.patch('sys.stdin', iter(("123456789" * 9, ))): with unittest.mock.patch('builtins.input', return_value="123456789" * 9): grid = SudokuGrid.from_stdin() def test_03_str(self): grid_str = str(self._grid) def test_04_get_row(self): self.assertEqual(list(self._grid.get_row(1)), [0, 0, 0, 0, 0, 0, 7, 0, 0]) self.assertEqual(list(self._grid.get_row(4)), [0, 0, 1, 0, 0, 0, 4, 0, 0]) def test_05_get_col(self): self.assertEqual(list(self._grid.get_col(4)), [0, 0, 0, 9, 0, 2, 0, 0, 0]) self.assertEqual(list(self._grid.get_col(5)), [0, 0, 9, 5, 0, 0, 2, 0, 0]) def test_06_get_region(self): self.assertEqual(list(self._grid.get_region(0, 0)), [3, 4, 9, 0, 0, 0, 0, 0, 0]) self.assertEqual(list(self._grid.get_region(2, 2)), [0, 0, 0, 0, 0, 0, 3, 7, 6]) def test_07_empty_pos(self): self.assertEqual( set(self._grid.get_empty_pos()), {(7, 3), (4, 7), (1, 3), (4, 8), (5, 6), (6, 6), (8, 0), (7, 7), (0, 7), (2, 1), (6, 2), (3, 7), (0, 3), (5, 1), (8, 5), (4, 0), (1, 2), (6, 7), (3, 3), (5, 5), (8, 1), (7, 6), (4, 4), (1, 5), (3, 6), (2, 2), (0, 4), (4, 1), (1, 1), (6, 4), (3, 2), (2, 6), (8, 2), (7, 1), (4, 5), (1, 4), (7, 5), (0, 5), (1, 0), (0, 8), (2, 7), (7, 8), (8, 3), (7, 0), (6, 8), (6, 1), (3, 1), (5, 7), (7, 4), (0, 6), (1, 8), (2, 0), (4, 3), (1, 7), (5, 2), (2, 4), (8, 4)}) def test_08_write(self): for _ in range(4): i, j = random.choice(list(self._grid.get_empty_pos())) val = random.randint(1, 9) self._grid.write(i, j, val) self.assertEqual(list(self._grid.get_row(i))[j], val) def test_09_copy(self): grid = self._grid.copy() for i in range(9): self.assertEqual(list(grid.get_row(i)), list(self._grid.get_row(i))) i, j = random.choice(list(self._grid.get_empty_pos())) val = random.randint(1, 9) grid.write(i, j, val) self.assertEqual(list(self._grid.get_row(i))[j], 0)
class TestSudokuGrid(unittest.TestCase): def setUp(self): self._grid = SudokuGrid("349000000000000700000509002" \ + "200095007001000400800720005" \ + "100402000008000000000000376") def test_00_init(self): with self.assertRaises(ValueError): # char grid = SudokuGrid("123456xyz" * 9) with self.assertRaises(ValueError): # hex values grid = SudokuGrid("123456abc" * 9) with self.assertRaises(ValueError): # too short grid = SudokuGrid("123456") with self.assertRaises(ValueError): # too long grid = SudokuGrid("12345678" * 11) def test_01_from_file(self): grid = SudokuGrid.from_file(os.path.join(os.path.dirname(__file__), "..", "sudoku_db.txt"), random.randint(1, 244)) # File not found if instructions not followed while setting up the ws def test_02_from_stdin(self): with unittest.mock.patch('builtins.input', return_value="123456789" * 9): grid = SudokuGrid.from_stdin() def test_03_str(self): expected_str = ("349000000", "000000700", "000509002", "200095007", "001000400", "800720005", "100402000", "008000000", "000000376") grid_str = str(self._grid).splitlines() for grid_line, expected_line in zip(expected_str, grid_str): self.assertRegex(grid_line, ".*".join(expected_line.replace("0", "[0 ]"))) def test_04_get_row(self): self.assertEqual(list(self._grid.get_row(1)), [0, 0, 0, 0, 0, 0, 7, 0, 0]) self.assertEqual(list(self._grid.get_row(4)), [0, 0, 1, 0, 0, 0, 4, 0, 0]) def test_05_get_col(self): self.assertEqual(list(self._grid.get_col(4)), [0, 0, 0, 9, 0, 2, 0, 0, 0]) self.assertEqual(list(self._grid.get_col(5)), [0, 0, 9, 5, 0, 0, 2, 0, 0]) def test_06_get_region(self): self.assertEqual(list(self._grid.get_region(0, 0)), [3, 4, 9, 0, 0, 0, 0, 0, 0]) self.assertEqual(list(self._grid.get_region(2, 1)), [4, 0, 2, 0, 0, 0, 0, 0, 0]) def test_07_empty_pos(self): self.assertEqual(set(self._grid.get_empty_pos()), {(7, 3), (4, 7), (1, 3), (4, 8), (5, 6), (6, 6), (8, 0), (7, 7), (0, 7), (2, 1), (6, 2), (3, 7), (0, 3), (5, 1), (8, 5), (4, 0), (1, 2), (6, 7), (3, 3), (5, 5), (8, 1), (7, 6), (4, 4), (1, 5), (3, 6), (2, 2), (0, 4), (4, 1), (1, 1), (6, 4), (3, 2), (2, 6), (8, 2), (7, 1), (4, 5), (1, 4), (7, 5), (0, 5), (1, 0), (0, 8), (2, 7), (7, 8), (8, 3), (7, 0), (6, 8), (6, 1), (3, 1), (5, 7), (7, 4), (0, 6), (1, 8), (2, 0), (4, 3), (1, 7), (5, 2), (2, 4), (8, 4)}) def test_08_write(self): for _ in range(4): i, j = random.choice(list(self._grid.get_empty_pos())) val = random.randint(1, 9) self._grid.write(i, j, val) self.assertEqual(list(self._grid.get_row(i))[j], val) def test_09_copy(self): grid = self._grid.copy() for i in range(9): self.assertEqual(list(grid.get_row(i)), list(self._grid.get_row(i))) i, j = random.choice(list(self._grid.get_empty_pos())) val = random.randint(1, 9) grid.write(i, j, val) self.assertEqual(list(self._grid.get_row(i))[j], 0)