import org.fest.assertions.api.Assertions; import org.junit.Ignore; import org.junit.Test; public class SudokuTest { @Test public void it_should_solve_sudoku_with_one_missing_in_first_cell() { assertSudoku(new int[][]{ {0, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_one_missing_in_first_row() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 0, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_one_missing_field() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 0, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_edge_case() { assertSudoku(new int[][]{ {0, 0, 0, 4, 5, 6, 7, 8, 9}, {0, 0, 6, 7, 8, 9, 1, 2, 3}, {0, 8, 9, 1, 2, 3, 4, 5, 6}, {0, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_two_missing_fields_each_in_a_line() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 0, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 0, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_two_missing_fields_in_the_same_line() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 0, 6, 7, 0, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_solve_sudoku_with_four_missing_fields_in_a_square() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 0, 0, 0}, {4, 5, 6, 7, 8, 9, 0, 0, 0}, {7, 8, 9, 1, 2, 3, 4, 0, 0}, {2, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void it_should_return_the_same_sudoku_when_already_solved() { assertSudoku(new int[][]{ {1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } @Test public void acceptance_test() { assertSudoku(new int[][]{ {0, 0, 3, 0, 2, 0, 6, 0, 0}, {9, 0, 0, 3, 0, 5, 0, 0, 1}, {0, 0, 1, 8, 0, 6, 4, 0, 0}, {0, 0, 8, 1, 0, 2, 9, 0, 0}, {7, 0, 0, 0, 0, 0, 0, 0, 8}, {0, 0, 6, 7, 0, 8, 2, 0, 0}, {0, 0, 2, 6, 0, 9, 5, 0, 0}, {8, 0, 0, 2, 0, 3, 0, 0, 9}, {0, 0, 5, 0, 1, 0, 3, 0, 0} }, new int[][]{ {4, 8, 3, 9, 2, 1, 6, 5, 7}, {9, 6, 7, 3, 4, 5, 8, 2, 1}, {2, 5, 1, 8, 7, 6, 4, 9, 3}, {5, 4, 8, 1, 3, 2, 9, 7, 6}, {7, 2, 9, 5, 6, 4, 1, 3, 8}, {1, 3, 6, 7, 9, 8, 2, 4, 5}, {3, 7, 2, 6, 8, 9, 5, 1, 4}, {8, 1, 4, 2, 5, 3, 7, 6, 9}, {6, 9, 5, 4, 1, 7, 3, 8, 2} }); } @Ignore @Test public void acceptance_extreme_test() { int[][] input = new int[][]{ {0,0,4,0,0,2,0,0,8}, {0,3,0,0,7,0,0,1,0}, {1,0,0,6,0,0,7,0,0}, {2,0,0,1,0,0,9,0,0}, {0,5,0,0,2,0,0,4,0}, {0,0,6,0,0,3,0,0,2}, {0,0,1,0,0,6,0,0,3}, {0,8,0,0,9,0,0,6,0}, {7,0,0,2,0,0,4,0,0} }; assertSudoku(input, new int[][]{ {6, 7, 4, 9, 1, 2, 3, 5, 8}, {8, 3, 9, 4, 7, 5, 2, 1, 6}, {1, 2, 5, 6, 3, 8, 7, 9, 4}, {2, 4, 8, 1, 6, 7, 9, 3, 5}, {3, 5, 7, 8, 2, 9, 6, 4, 1}, {9, 1, 6, 5, 4, 3, 8, 7, 2}, {4, 9, 1, 7, 8, 6, 5, 2, 3}, {5, 8, 2, 3, 9, 4, 1, 6, 7}, {7, 6, 3, 2, 5, 1, 4, 8, 9} }); } private void assertSudoku(int[][] input) { assertSudoku(input, new int[][]{ {1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 5, 6, 7, 8, 9, 1, 2, 3}, {7, 8, 9, 1, 2, 3, 4, 5, 6}, {2, 3, 4, 5, 6, 7, 8, 9, 1}, {5, 6, 7, 8, 9, 1, 2, 3, 4}, {8, 9, 1, 2, 3, 4, 5, 6, 7}, {3, 4, 5, 6, 7, 8, 9, 1, 2}, {6, 7, 8, 9, 1, 2, 3, 4, 5}, {9, 1, 2, 3, 4, 5, 6, 7, 8} }); } private void assertSudoku(int[][] input, int[][] expected) { Assertions.assertThat(Sudoku.sudoku(input).solve()).isEqualTo(expected); } }