1

我正在使用 SWI-Prolog 的PlUnit编写测试,并希望提供更好的错误消息,也许通过区分我所得到的和我所期望的。

以下最小工作示例(MWE)举例说明了我所追求的:

:- 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).

输出是:

% PL-Unit: mwe ..
ERROR: /home/bkim/Projects/swifun/mwe.pl:11:
    test parse int (forall bindings = ["100000000000",10000000000]): assertion failed
    Assertion: 100000000000=10000000000
false.

与go-cmp类似的不同可能会呈现如下结果:

- 100000000000
+ 10000000000

一目了然比较容易。

我找不到任何对一般 Prolog 术语执行此类检查的东西,更接近是list 之间编辑距离的示例。

4

1 回答 1

1

您应该将比较移动到测试规则的头部:

test("parse int", [forall(testcase(Text, Want)), Got = Want]) :-
    parse_int(Text, Got).

这样,您希望测试表达的内容更加明确。它允许 PlUnit 提供更多信息输出:

ERROR: /home/isabelle/foo.pl:11:
    test parse int (forall bindings = ["100000000000",10000000000]): wrong answer (compared using =)
ERROR:     Expected: 10000000000
ERROR:     Got:      100000000000
于 2021-12-23T00:17:56.713 回答