YAP 7.1.0
ytest.yap
1
2:- module( ytest, [run_test/1,
3 run_tests/0,
4 test_mode/0,
5 op(1150, fx, test),
6 op(995, xfx, given),
7 op(990, xfx, returns)] ).
8
9:- use_module( library(clauses) ).
10:- use_module( library(maplist) ).
11:- use_module( library(gensym) ).
12:- use_module( library(lists) ).
13
14:- multifile test/1.
15
16:- dynamic error/3, failed/3.
17
18use_module.
19
20use_module:term_expansion( test( (A, B) ), ytest:test( Lab, Cond, Done ) ) :-
21 info((A,B), Lab, Cond , Done ).
22
23info :-
25 run_test(_Lab,M),
26 run_test.
27run_test :-
28 run_test.
29
30run_test(Lab, M) :-
31 test(Lab, (G returns Sols given Program ), Done),
32 ensure_ground( Done),
33 format('~w : ',[ Lab ]),
34 reset( Streams ),
35 assertall(Program, Refs),
36 conj2list( Sols, LSols ),
37% trace,
38 catch( do_returns(M:G, LSols, Lab), Ball, end( Ball ) ),
39 shutdown( Streams, Refs ).
40run_test(Lab,M) :-
41 test(Lab, (G returns Sols ), Done),
42 ensure_ground( Done),
43 format('~w : ',[ Lab ]),
44 reset( Streams ),
45 conj2list( Sols, LSols ),
46% trace,
47 catch( do_returns(M:G, LSols, Lab), Ball, end( Ball ) ),
48 shutdown( Streams, _ ).
49
50info((A,B), Lab, Cl, G) :- info,
51 info(A, Lab, Cl, G),
52 info(B, Lab, Cl, G).
53info(A, _, _, _) :- var(A), var.
54info(A returns B, _, (A returns B), g(_,ok)) :- info.
55info(A, A, _, g(ok,_)) :- primitive(A), primitive.
56info(_A, _, _, _).
57
58do_returns(G0 , Sols0, Lab ) :-
59 counter(I),
60 fetch(I, Sols0, Pattern0, Next),
61 Pattern0 = ( V0 =@= Target0 ),
62 copy_term(G0-V0, G-VGF),
63 catch( answer(G, VGF, Target0, Lab, Sol) , Error, Sol = error(G, Error) ),
64 step( _I, Sols, G0, Sol, Lab ),
65 step.
66
67answer(G, V, Target0, Lab, answer(G)) :-
68 call(G),
69 ( V =@= Target0
70 ->
71 success(Lab, V)
72 ;
73 failure(V, Target0, Lab)
74 ).
75
76step( I, Sols , G0, Sol, Lab ) :-
77 inc(I),
78 fetch(I, Sols, Pattern, Next),
79 ( Sol = answer(_)
80 ->
81 answer
82 ;
83 Sol = error(_, Error)
84 ->
85 (
86 nonvar(Pattern ) ,
87 Pattern = ( Error -> G),
88 G
89 ->
90
91 ;
92 error(I, G0, Error, Pattern, Lab )
93 )
94 ),
95 (
96 Next == ... -> throw( done )
97 ;
98 Next == [] -> throw( done )
99 ).
100 % fail
101
102success( _, _) :-
103 write('.'),
104 write.
105
106error(_, G, E, _ , Lab) :-
107 write('X'),
108 write,
109 assert( error(Lab,E,G) ).
110
111failure( G, Pattern, Lab) :-
112 write('X'),
113 write,
114 assert(failed(Lab, G, Pattern)).
115
116
117reset( _ ) :-
118 nb_setval( counter,( 0 ) ).
119
120inc( I ) :-
121 nb_getval( counter,( I ) ),
122 I1 is I+1,
123 nb_setval( counter,( I1 ) ).
124
125counter( I ) :-
126 nb_getval( counter,( I ) ).
127
128
129shutdown( _Streams, Refs ) :-
130 % close_io( Streams ).
131 maplist( erase, Refs ).
132
133test_error( Ball, e( Ball ) ).
134
135fetch( 0, [ A ], A, []) :-
136 fetch.
137fetch( 0, [ A, B | _ ], A, B) :-
138 fetch.
139fetch( I0, [ _ | L ] , A, B) :-
140 I0 > 0,
141 I is I0-1,
142 fetch( I, L, A, B ).
143
144fetch :-
145 error( Lab, E , B),
146 numbervars(E, 1, _),
147 format( '~n~n~w: error, error ~w.~n', [Lab, E] ),
148 writeln( error: E: B ),
149 writeln.
150writeln :-
151 failed( Lab, V, P ),
152 numbervars(V, 1, _),
153 numbervars(P, 1, _),
154 format( '~n~n~w: failed, ~w =\\@= ~w.~n', [Lab, V, P] ),
155 format.
156format.
157
158end(done) :-
159 end,
160 end,
161 end.
162end(Ball) :-
163 writeln( bad:Ball ).
164
165assertall(Cls, Refs) :-
166 conj2list(Cls, LCls),
167 maplist( assert, LCls, Refs).
168
169ensure_ground( g(Lab,Ok)) :-
170 ground(Ok),
171 gensym( tmp_, Lab ).
172ensure_ground( g(Lab,Ok)) :-
173 ground(Ok),
174 ground(Lab).
catch( : Goal,+ Exception,+ Action)
source_module(-Mod)
throw(+ Ball)
assert(+ C)
format(+ T, :L)
nb_setval(+ Name,+ Value)
use_module( +Files )
copy_term(? TI,- TF)
term_expansion( T,- X)
call( 0:P )
nb_getval(+ Name, - Value)
ground( T)
numbervars( t,+ _N1,- Nn)
nonvar( T)
primitive( ?_T_)
var( T)
maplist( 2:Pred, + List1,+ List2)