Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_sample.doctest101
1 files changed, 100 insertions, 1 deletions
diff --git a/tests/test_sample.doctest b/tests/test_sample.doctest
index 7c5c1f9..5ab8910 100644
--- a/tests/test_sample.doctest
+++ b/tests/test_sample.doctest
@@ -2,6 +2,14 @@ test_sample.doctest - simple test for rush hour solution finder
>>> from x import find_solutions
+
+>>> def get_moves(board):
+... """Return a list or printable solutions (steps)."""
+... return [
+... ','.join(move for move, board in solution)
+... for solution in find_solutions(board)]
+
+
>>> board = '''
... ....AA
... ..BBCC
@@ -10,5 +18,96 @@ test_sample.doctest - simple test for rush hour solution finder
... ...IEF
... ...IJJ
... '''.strip().split()
+>>> solutions = get_moves(board)
+>>> len(solutions[0].split(','))
+13
+>>> 'AL4,BL2,CL2,EU2,FU2,HR2,IU1,JL4,ID1,HL2,ED3,FD3,rR4' in solutions
+True
+
+
+With the current algorithm it is very hard to determine whether a (manually)
+precomputed solution will be found because there are a lot of orders in which
+steps can be taken and since we try to avoid finding moves that result in the
+exact same board configuration we are bound to miss some.
+
+>>> board = '''
+... ..OOOP
+... .....P
+... rrAB.P
+... Q.ABCC
+... Q.....
+... QRRR..
+... '''.strip().split()
+>>> solutions = get_moves(board)
+>>> len(solutions[0].split(','))
+6
+
+For example, the first one is not found with the current implementation but
+the second (which is basically the exact same solution) is:
+
+>>> 'OL2,BU2,CL1,PD3,AD1,rR4' in solutions
+False
+>>> 'OL2,AD1,BU2,CL1,PD3,rR4' in solutions
+True
+
+
+Another simple example.
+
+>>> board = '''
+... ..OABB
+... ..OA.C
+... ..OrrC
+... ..PPPD
+... .....D
+... ......
+... '''.strip().split()
+>>> solutions = get_moves(board)
+>>> len(solutions[0].split(','))
+9
+>>> 'DD1,PR1,OD3,rL2,AD1,BL3,CU1,AU1,rR3' in solutions
+False
+>>> 'DD1,PR1,OD3,rL2,AD1,BL3,AU1,CU1,rR3' in solutions
+True
->>> list(find_solutions(board))
+
+This is the hardest example from the Rush Hour game.
+
+>>> board = '''
+... OOO..P
+... .....P
+... ..ArrP
+... ..ABCC
+... D.EBFF
+... D.EQQQ
+... '''.strip().split()
+>>> solutions = get_moves(board)
+>>> len(solutions[0].split(','))
+29
+
+
+The algorithm should also deal fine with larger or smaller boards, non-square
+boards and longer cars.
+
+>>> board = '''
+... ....DAAAAA
+... ..rrD..B..
+... .......B..
+... ....CCCCC.
+... '''.strip().split()
+>>> solutions = get_moves(board)
+>>> len(solutions[0].split(','))
+7
+
+
+The algorithm will return nothing (empty iterator) for impossible boards.
+
+>>> board = '''
+... ....B.
+... ..AAB.
+... rr..B.
+... ..ECCC
+... ..E.D.
+... FFF.D.
+... '''.strip().split()
+>>> len(get_moves(board))
+0