Another little problem: The last test in the series here succeeds, but should fail (I think):
:- begin_tests(correct_catch).
% This test will succeed as it catches any exception that threw a term that
% looks like "error(_,_)", which are all ISO standard exception terms.
test("catch anything",[error(_)]) :-
must_be(integer,foo).
% This test will succeed as it expects "type_error" to be thrown,
% which is what happens.
test("correctly catch type error",error(type_error(_,_))) :-
must_be(integer,foo).
% This test will fail because it expects "domain_error" to be thrown,
% but "type_error" is thrown instead
test("wrongly catch domain error",[error(domain_error(_,_))]) :-
must_be(integer,foo).
% Unexpectedly, this test succeeds: it should not, unless the relationship
% between the "Formal" appearing in the head and the "Formal" appearing in the
% body is somehow broken when this code is preprocessed/rewritten. A hypotheses for why
% this test succeeds would be the "Formal" of the head staying fresh in spite
% of the body saying "Formal = domain_error(_,_)"
test(one,[error(Formal)]) :- % this catches the exception term thrown by must_be/2
Formal = domain_error(_,_), % this is not thorwn by the next instruction
must_be(integer,foo).
:- end_tests(correct_catch).