%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                           %
%       file:           test_suite.pl                                       %
%       purpose:        interpreter tests                                   %
%       author:         Sebastian Varges                                    %
%       date:           Wed Feb 19 14:35:13 MET 1997                        %
%       related files:  tests.pl, chart.pl, head.pl, memo_head.pl,          %
%                                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

test(Mode) :- 
        interpreter(Interpreter,Int),
        nl,write('******  Testing '),write(Interpreter),write(' interpreter in '), 
        mode(Mode,ModeName),write(ModeName),write(' mode  ******'),nl, 
        test(Int,Mode,_),nl,nl,fail.

test(ed,Mode,parse) :- 
        test_output(parse_correct),
        fs_parse(N,ParseFS,Wanted),
        test_output(Mode,N),
        findall(ParseFS,proc(ed,ParseFS),Solutions),
        test_output(Mode,ParseFS,Wanted,Solutions),
        fail.

test(ed,Mode,parse) :- 
        test_output(parse_false),
        fs_error_parse(N,ParseFS,Wanted),
        test_output(Mode,N),
        findall(ParseFS,proc(ed,ParseFS),Solutions),
        test_output(Mode,ParseFS,Wanted,Solutions),
        fail.

test(Int,Mode,gen) :- 
        test_output(gen_correct),
        fs_gen(N,GenFS,Wanted),
        test_output(Mode,N),
        findall(GenFS,proc(Int,GenFS),Solutions),
        test_output(Mode,GenFS,Wanted,Solutions),
        fail.

test(Int,Mode,gen) :- 
        test_output(gen_false),
        fs_error_gen(N,GenFS,Wanted),
        test_output(Mode,N),
        findall(GenFS,proc(Int,GenFS),Solutions),
        test_output(Mode,GenFS,Wanted,Solutions),
        fail.

test(ed,Mode,mixed) :- 
        test_output(mixed_correct),
        fs_cons_mixed(N,ConsFS,Wanted),
        test_output(Mode,N),
        findall(ConsFS,proc(ed,ConsFS),Solutions),
        test_output(Mode,ConsFS,Wanted,Solutions),
        fail.

test(ed,Mode,mixed) :- 
        test_output(mixed_false),
        fs_incons_mixed(N,InconsFS,Wanted),
        test_output(Mode,N),
        findall(InconsFS,proc(ed,InconsFS),Solutions),
        test_output(Mode,InconsFS,Wanted,Solutions),
        fail.

test(_,_,_).
test(_).

%--------
test_output(TestType) :- test_msg(TestType,Msg),nl,nl,write(Msg),nl,nl.

test_output(v,N) :-  nl,write('Nr. '),write(N),write(':'),tab(4),nl.
test_output(v,FS,Wanted,Solutions) :- 
        equal_elements(Wanted,Solutions),verbose_output(FS,Solutions),nl,!.

test_output(s,N) :- write('['), write(N).
test_output(s,_,Wanted,Solutions) :- 
        equal_elements(Wanted,Solutions),write(']'),tab(2),!.

test_output(_,FS,_,Solutions) :- 
        nl,write('*** error ***'),nl,verbose_output(FS,Solutions),nl.

verbose_output(FS,Solutions) :-
        write('Input:   '),write(FS),nl,
        write('Output:  '),write_solutions(Solutions).

write_solutions([]).
write_solutions([F|R]) :- write(F),nl,tab(9),write_solutions(R).

%---------
mode(v,verbose).
mode(s,silent).

interpreter('head-driven',hd).
interpreter('memoized head-driven',mhd).
interpreter('Earley deduction',ed).

test_msg(parse_correct,'%%%  Parsing correct phrases:').
test_msg(parse_false,'%%%  Parsing incorrect phrases:').
test_msg(gen_correct,'%%%  Generating with consistent feature structures:').
test_msg(gen_false,'%%%  Generating with inconsistent feature structures:').
test_msg(mixed_correct,'%%%  Completing consistent feature structures:').
test_msg(mixed_false,'%%%  Trying to complete inconsistent feature structures:').

%---------
equal_elements([],[]).
equal_elements([F|R],List) :-
        delete_one(F,List,List1),
        equal_elements(R,List1).
        
delete_one(F,[F|R],R).
delete_one(F,[E|R],[E|R1]) :-
        delete_one(F,R,R1).