package cx.prutser.sudoku.solver; import static org.easymock.EasyMock.*; import static org.junit.Assert.fail; import org.junit.Before; import org.junit.Test; import java.util.Arrays; /** * Created by IntelliJ IDEA. * User: erik * Date: 3/10/2008 * Time: 23:49:01 * To change this template use File | Settings | File Templates. */ public class ClassicSolverTest { private Integer solvedPuzzle[] = null; private Integer simplePuzzle[] = null; private Integer blankPuzzle[] = null; private Integer realPuzzle[] = null; @Before public void setup() { solvedPuzzle = new Integer[] { 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, 9, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6, 7, 8, 9, 1, 2, 3, 4, 5 }; simplePuzzle = new Integer[] { 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, 9, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6, 7, 8, 9, 1, 2, 3, 4, null }; blankPuzzle = new Integer[81]; realPuzzle = new Integer[] { null, null, 8, null, null, 2, null, null, 3, null, 6, null, null, 5, null, null, 8, null, 9, null, null, 3, null, null, 4, null, null, null, null, null, 1, 2, null, null, 9, null, null, null, 5, null, null, null, 7, null, null, null, 8, null, null, 3, 6, null, null, null, null, null, 6, null, null, 1, null, null, 8, null, 5, null, null, 9, null, null, 6, null, 3, null, null, 6, null, null, 9, null, null }; } @Test public void solvedPuzzle() { @SuppressWarnings("unchecked") SolutionsCollector<Integer> collector = createStrictMock(SolutionsCollector.class); collector.newSolution(aryEq(solvedPuzzle), isA(SolverContext.class)); collector.searchComplete(0L); replay(collector); ClassicSolver solver = new ClassicSolver(solvedPuzzle); solver.solve(collector); verify(collector); } @Test public void simplePuzzle() { // very simple puzzle: only a single tile missing { @SuppressWarnings("unchecked") SolutionsCollector<Integer> collector = createStrictMock(SolutionsCollector.class); collector.newSolution(aryEq(solvedPuzzle), isA(SolverContext.class)); collector.searchComplete(11L); replay(collector); ClassicSolver solver = new ClassicSolver(simplePuzzle); solver.solve(collector); verify(collector); } } @Test public void illegalBoard() { // null reference { try { new ClassicSolver(null); fail(); } catch(IllegalArgumentException iae) {} } // invalid number of tiles { try { new ClassicSolver(new Integer[80]); fail(); } catch(IllegalArgumentException iae) {} } // illegal tile number { try { blankPuzzle[80] = 10; new ClassicSolver(blankPuzzle); fail(); } catch(IllegalArgumentException iae) {} } } @Test public void cancel() { // cancel after the first solution { ClassicSolver solver = new ClassicSolver(blankPuzzle); solver.solve(new SolutionsCollector<Integer>() { public void newSolution(Integer[] solution, SolverContext ctx) { System.out.println(Arrays.toString(solution)); System.out.println("Evaluations: " + ctx.evaluations()); ctx.cancel(); } public void searchComplete(long evaluations) { fail(); } public void timeoutExceeded(long millis) { fail(); } }); } } @Test public void realPuzzle() { ClassicSolver solver = new ClassicSolver(realPuzzle); solver.solve(new SolutionsCollector<Integer>() { public void newSolution(Integer[] solution, SolverContext ctx) { System.out.println(Arrays.toString(solution)); System.out.println("Evaluations: " + ctx.evaluations()); } public void searchComplete(long evaluations) { System.out.println("Completed in " + evaluations + " evaluations: "); } public void timeoutExceeded(long millis) { fail(); } }); } }