% test_case(N, Sol, Test, Result): Test case number N is Test,
% and the sorted list of its results in Sol is  Result.
test_case( 1, Sol, skysudoku(ss(1,[]), Sol), [[[1]]]).
test_case( 2, Sol, skysudoku(ss(2,[v(4,n,1),v(4,s,4)]), Sol), [[[1,3,2,4],[2,4,1,3],[3,1,4,2],[4,2,3,1]]]).
test_case( 3, Sol, skysudoku(ss(2,[v(4,n,1),g(4,1,4)]), Sol), [[[1,3,2,4],[2,4,1,3],[3,1,4,2],[4,2,3,1]], [[1,3,2,4],[2,4,1,3],[3,2,4,1],[4,1,3,2]], [[1,3,2,4],[2,4,3,1],[3,1,4,2],[4,2,1,3]]]).
test_case( 4, Sol, skysudoku(ss(2,[g(4,1,1),v(2,n,1)]), Sol), []).
test_case( 5, Sol, skysudoku(ss(3,[g(1,1,1),g(9,1,4),g(6,1,5),g(5,1,9),g(2,3,3),g(4,3,5),g(3,5,2),g(4,5,3),g(7,5,7),g(2,6,4),g(6,6,6),g(1,6,9),g(2,7,1),g(5,7,6),g(7,8,2),g(3,8,8),g(1,9,6),v(2,e,8),v(2,e,9),v(3,w,1),v(3,n,6),v(2,s,3),v(3,w,5),v(2,n,8),v(3,n,9),v(3,e,1),v(3,e,2),v(2,e,3),v(1,e,4)]), Sol), [[[1,4,3,9,6,7,2,8,5],[9,5,8,1,2,3,4,6,7],[7,6,2,5,4,8,9,1,3],[6,2,1,7,3,4,8,5,9],[5,3,4,8,1,9,7,2,6],[8,9,7,2,5,6,3,4,1],[2,1,9,3,8,5,6,7,4],[4,7,5,6,9,2,1,3,8],[3,8,6,4,7,1,5,9,2]],[[1,8,3,9,6,7,4,2,5],[4,6,9,5,3,2,8,1,7],[7,5,2,1,4,8,6,9,3],[6,2,1,4,7,3,5,8,9],[5,3,4,8,1,9,7,6,2],[8,9,7,2,5,6,3,4,1],[2,1,6,3,8,5,9,7,4],[9,7,5,6,2,4,1,3,8],[3,4,8,7,9,1,2,5,6]]]).
test_case( 6, Sol, skysudoku(ss(4,[v(3,w,2),v(4,n,12),v(2,n,13),v(3,e,6),v(2,e,4),g(5,1,11),g(13,1,15),g(14,1,16),g(13,2,6),g(6,2,7),g(12,2,8),g(16,2,10),g(14,2,11),g(3,2,12),g(7,2,15),g(1,3,2),g(5,3,4),g(7,3,7),g(2,3,13),g(11,3,14),g(5,4,5),g(4,4,9),g(12,4,12),g(6,4,14),g(16,4,15),g(5,5,2),g(15,5,3),g(9,5,4),g(1,5,6),g(11,5,9),g(14,5,10),g(6,6,3),g(7,6,6),g(10,6,7),g(8,6,12),g(13,6,14),g(2,7,3),g(4,7,5),g(12,7,6),g(16,7,14),g(8,8,1),g(16,8,3),g(3,8,7),g(15,8,8),g(9,8,10),g(1,8,13),g(5,8,15),g(16,9,1),g(12,9,9),g(4,9,11),g(9,9,14),g(6,10,1),g(3,10,2),g(14,10,4),g(7,10,5),g(12,10,15),g(9,11,1),g(13,11,3),g(15,11,4),g(10,11,9),g(7,11,10),g(14,11,14),g(4,11,16),g(4,12,1),g(8,12,5),g(16,12,6),g(9,12,7),g(15,12,9),g(13,12,10),g(6,12,11),g(3,13,1),g(10,13,3),g(1,13,4),g(2,13,10),g(4,13,12),g(7,13,13),g(9,13,15),g(2,14,7),g(8,14,11),g(7,14,12),g(14,14,13),g(5,14,14),g(3,14,15),g(12,14,16),g(15,15,1),g(13,15,2),g(2,15,4),g(6,15,6),g(3,15,9),g(1,15,11),g(8,16,3),g(12,16,4),g(11,16,6),g(9,16,9),g(6,16,13),g(10,16,16)]), Sol), [[[2,16,3,6,10,4,11,8,7,1,5,9,15,12,13,14],[10,15,11,8,1,13,6,12,2,16,14,3,5,4,7,9],[12,1,4,5,16,9,7,14,8,6,15,13,2,11,10,3],[13,9,14,7,5,3,15,2,4,11,10,12,8,6,16,1],[7,5,15,9,6,1,16,13,11,14,2,10,12,3,4,8],[14,12,6,3,11,7,10,5,1,4,16,8,9,13,15,2],[1,10,2,13,4,12,8,9,5,3,7,15,11,16,14,6],[8,11,16,4,14,2,3,15,13,9,12,6,1,10,5,7],[16,7,1,10,15,14,13,6,12,5,4,2,3,9,8,11],[6,3,5,14,7,10,1,4,16,8,9,11,13,2,12,15],[9,8,13,15,2,5,12,11,10,7,3,1,16,14,6,4],[4,2,12,11,8,16,9,3,15,13,6,14,10,7,1,5],[3,6,10,1,12,8,5,16,14,2,11,4,7,15,9,13],[11,4,9,16,13,15,2,1,6,10,8,7,14,5,3,12],[15,13,7,2,9,6,14,10,3,12,1,5,4,8,11,16],[5,14,8,12,3,11,4,7,9,15,13,16,6,1,2,10]],[[2,16,3,6,11,4,8,10,7,1,5,9,15,12,13,14],[10,15,11,8,1,13,6,12,2,16,14,3,5,4,7,9],[12,1,4,5,16,9,7,14,8,6,15,13,2,11,10,3],[13,9,14,7,5,3,15,2,4,11,10,12,8,6,16,1],[7,5,15,9,6,1,16,13,11,14,2,10,12,3,4,8],[14,12,6,3,9,7,10,5,1,4,16,8,11,13,15,2],[1,10,2,13,4,12,11,8,5,3,7,15,9,16,14,6],[8,11,16,4,14,2,3,15,13,9,12,6,1,10,5,7],[16,7,1,10,15,14,13,6,12,5,4,2,3,9,8,11],[6,3,5,14,7,10,1,4,16,8,9,11,13,2,12,15],[9,8,13,15,2,5,12,11,10,7,3,1,16,14,6,4],[4,2,12,11,8,16,9,3,15,13,6,14,10,7,1,5],[3,6,10,1,12,8,5,16,14,2,11,4,7,15,9,13],[11,4,9,16,13,15,2,1,6,10,8,7,14,5,3,12],[15,13,7,2,10,6,14,9,3,12,1,5,4,8,11,16],[5,14,8,12,3,11,4,7,9,15,13,16,6,1,2,10]],[[2,16,3,6,11,10,8,4,7,1,5,9,15,12,13,14],[10,15,11,8,1,13,6,12,2,16,14,3,5,4,7,9],[12,1,4,5,16,9,7,14,8,6,15,13,2,11,10,3],[13,9,14,7,5,3,15,2,4,11,10,12,8,6,16,1],[7,5,15,9,6,1,16,13,11,14,2,10,12,3,4,8],[14,12,6,3,9,7,10,5,1,4,16,8,11,13,15,2],[1,10,2,13,4,12,11,8,5,3,7,15,9,16,14,6],[8,11,16,4,14,2,3,15,13,9,12,6,1,10,5,7],[16,7,1,10,15,14,13,6,12,5,4,2,3,9,8,11],[6,3,5,14,7,4,1,10,16,8,9,11,13,2,12,15],[9,8,13,15,2,5,12,11,10,7,3,1,16,14,6,4],[4,2,12,11,8,16,9,3,15,13,6,14,10,7,1,5],[3,6,10,1,12,8,5,16,14,2,11,4,7,15,9,13],[11,4,9,16,13,15,2,1,6,10,8,7,14,5,3,12],[15,13,7,2,10,6,14,9,3,12,1,5,4,8,11,16],[5,14,8,12,3,11,4,7,9,15,13,16,6,1,2,10]]]).
test_case( 7, Sol, skysudoku(ss(3,[v(2,n,1),v(2,n,2),v(3,n,4),v(2,n,6),v(2,n,8),v(3,e,1),v(4,e,3),v(2,e,5),v(5,e,7),v(2,e,9),v(3,s,2),v(3,s,4),v(4,s,6),v(2,w,1),v(2,w,3),v(4,w,6),v(1,w,8),v(2,w,9),g(5,1,3),g(1,2,2),g(3,2,7),g(4,2,8),g(6,4,5),g(2,4,6),g(1,5,3),g(5,5,7),g(3,6,5),g(6,8,2),g(3,8,3),g(4,9,4),g(3,9,9)]), Sol), [[[7,4,5,6,2,3,9,8,1],[2,1,6,7,8,9,3,4,5],[3,9,8,5,4,1,2,7,6],[5,8,9,1,6,2,4,3,7],[6,3,1,9,7,4,5,2,8],[4,2,7,8,3,5,6,1,9],[1,5,4,3,9,8,7,6,2],[9,6,3,2,1,7,8,5,4],[8,7,2,4,5,6,1,9,3]]]).
test_case( 8, Sol, skysudoku(ss(3,[v(2,n,2),v(3,n,4),v(2,n,6),v(2,n,8),v(3,e,1),v(4,e,3),v(2,e,5),v(5,e,7),v(2,e,9),v(3,s,2),v(3,s,4),v(4,s,6),v(2,w,1),v(2,w,3),v(4,w,6),v(2,w,9),g(5,1,3),g(1,2,2),g(3,2,7),g(4,2,8),g(6,4,5),g(2,4,6),g(1,5,3),g(5,5,7),g(3,6,5),g(6,8,2),g(3,8,3),g(4,9,4),g(3,9,9)]), Sol), [[[7,4,5,3,2,1,9,8,6],[2,1,6,7,8,9,3,4,5],[3,9,8,6,4,5,2,7,1],[5,8,9,1,6,2,4,3,7],[6,3,1,9,7,4,5,2,8],[4,2,7,5,3,8,6,1,9],[9,5,4,8,1,3,7,6,2],[1,6,3,2,9,7,8,5,4],[8,7,2,4,5,6,1,9,3]],[[7,4,5,6,2,3,9,8,1],[2,1,6,7,8,9,3,4,5],[3,9,8,5,4,1,2,7,6],[5,8,9,1,6,2,4,3,7],[6,3,1,9,7,4,5,2,8],[4,2,7,8,3,5,6,1,9],[1,5,4,3,9,8,7,6,2],[9,6,3,2,1,7,8,5,4],[8,7,2,4,5,6,1,9,3]],[[7,4,5,6,2,3,9,8,1],[2,1,6,7,8,9,3,4,5],[3,9,8,5,4,1,2,7,6],[5,8,9,1,6,2,4,3,7],[6,3,1,9,7,4,5,2,8],[4,2,7,8,3,5,6,1,9],[9,5,4,3,1,8,7,6,2],[1,6,3,2,9,7,8,5,4],[8,7,2,4,5,6,1,9,3]]]).
test_case( 9, Sol, skysudoku(ss(3,[v(2,n,1),v(6,n,2),v(3,n,3),v(3,n,4),v(1,n,5), v(3,n,6),v(4,n,7),v(3,n,8),v(2,n,9),v(2,w,1), v(1,w,2),v(3,w,3),v(3,w,4),v(3,w,5),v(2,w,6), v(4,w,7),v(3,w,8),v(2,w,9),v(2,s,1),v(2,s,2), v(1,s,3),v(4,s,4),v(3,s,5),v(3,s,6),v(2,s,7), v(3,s,8),v(3,s,9),v(2,e,1),v(5,e,2),v(1,e,3), v(4,e,4),v(2,e,5),v(4,e,6),v(2,e,7),v(3,e,8), v(4,e,9),g(6,1,4),g(8,2,6),g(2,3,8),g(6,4,3), g(1,5,5),g(3,6,7),g(5,7,2),g(5,8,4),g(4,9,6)]), Sol), [[[7,2,5,6,9,1,4,3,8], [9,3,1,4,2,8,7,6,5], [6,4,8,7,5,3,1,2,9], [3,7,6,9,4,2,8,5,1], [5,8,4,3,1,7,2,9,6], [1,9,2,8,6,5,3,7,4], [2,5,3,1,8,9,6,4,7], [4,1,7,5,3,6,9,8,2], [8,6,9,2,7,4,5,1,3]]]).
test_case(10, Sol, skysudoku(ss(3,[v(5,n,2),v(4,n,4),v(5,n,6),v(2,n,7),v(2,n,8),v(2,n,9), v(4,w,4),v(8,w,5),v(2,w,6),v(3,w,7),v(3,w,9), v(4,s,4),v(2,s,7),v(2,s,8),v(3,s,9), v(3,e,3),v(3,e,4),v(2,e,6),v(6,e,8), g(6,3,1),g(7,3,6),g(2,6,5),g(7,7,4),g(4,8,6)]), Sol), [[[9,4,5,3,6,1,8,7,2],[7,1,8,5,4,2,6,3,9],[6,3,2,8,9,7,1,4,5],[4,5,6,9,7,8,2,1,3],[1,2,3,4,5,6,7,9,8],[8,7,9,1,2,3,4,5,6],[2,8,1,7,3,5,9,6,4],[5,9,7,6,8,4,3,2,1],[3,6,4,2,1,9,5,8,7]]]).



% Run all test cases
test_all :-
	test_case(N, Sol, Goal, ExpectedSols),
	statistics(runtime, [T0,_]),  % T0 is the CPU time since the start
			   	      % of the Prolog system, in msec
	findall(Sol, Goal, Sols),
	statistics(runtime, [T1,_]),
	T is T1-T0,
	sort(Sols, SortedSols), 
	(   SortedSols == ExpectedSols, same_length(Sols, SortedSols)
	->  format('test case ~t~w~12+: OK', [N])
	;   format('test case ~t~w~12+: Expected ~w, got ~w', [N,ExpectedSols,Sols])
	),
	format(' CPU time = ~|~t~3d~8+ sec\n', [T]), 
	fail.
test_all(_,_).


