Reputation: 2350
I'm writing tests using SWI-Prolog's PlUnit and would like to provide a better error message, perhaps by diffing what I've got from what I was expecting.
The following minimal working example (MWE) exemplifies what I'm after:
:- module(mwe, [parse_int/2]).
parse_int(Str, Num) :- number_string(Num, Str):
:- begin_tests(mwe).
:- use_module(mwe).
testcase("1", 1).
testcase("10", 10).
testcase("100000000000", 10000000000). % Oops
test("parse int", [forall(testcase(Text, Want))]) :-
parse_int(Text, Got),
assertion(Got = Want).
:- end_tests(mwe).
The output is:
% PL-Unit: mwe ..
ERROR: /home/bkim/Projects/swifun/mwe.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): assertion failed
Assertion: 100000000000=10000000000
false.
A differ, similar to go-cmp, could present this result like:
- 100000000000
+ 10000000000
Which is easier to compare at a glance.
I couldn't find anything that performs this type of check for general Prolog terms, the closer being an example of edit distance between lists.
Upvotes: 1
Views: 91
Reputation: 9378
You should move the comparison into the test rule's head:
test("parse int", [forall(testcase(Text, Want)), Got = Want]) :-
parse_int(Text, Got).
This way it's more explicit what you want the test to express. And it allows PlUnit to give more informative output:
ERROR: /home/isabelle/foo.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): wrong answer (compared using =)
ERROR: Expected: 10000000000
ERROR: Got: 100000000000
Upvotes: 1