forked from hiratara/offline-DOUKAKU-skeletons
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.prolog
71 lines (61 loc) · 2.59 KB
/
test.prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
% ストリームから読み込んだコンテンツを第1引数に束縛する
read_contents(Cs) :-
get_code(C),
read_contents(C, Cs).
read_contents(-1, []). % ストリームの終端検出(get_code は -1 を返す)
read_contents(C, [C|Cs]) :-
C > 0,
read_contents(Cs).
% 第1引数の要素(区切り文字)で第2引数のリストを分割した結果のリストのリストを第3引数に束縛する
split(_, [], [[]]).
split(C, [C], [[]]) :- !. % 末尾の区切り文字は無視する
split(C, [X|Xs], [[X|Zs]|Ys]) :-
C \== X,
split(C, Xs, [Zs|Ys]).
split(C, [C|Xs], [[]|Ys]) :-
split(C, Xs, Ys).
% リストを改行文字(文字コード 10)で分割する
lines(Xs, Ys) :- split(10, Xs, Ys).
% リストをタブ文字(文字コード 9)で分割する
words(Xs, Ys) :- split(9, Xs, Ys).
% テストを実行し、合否の結果のリストを第2引数に束縛する
test([Name, Input, Expected|_], R) :-
solve(Input, Actual),
report(Name, Actual, Expected, R).
% テスト結果をレポートする
report(_, Expected, Expected, success).
report(Name, Actual, Expected, failure) :-
Actual \== Expected,
format("Failure in ~s~nexpected: ~s~n actual: ~s~n", [Name, Expected, Actual]).
% テスト結果のリスト中の失敗の数を第2引数に束縛する
count_failure([], 0).
count_failure([R|Rs], C) :-
count_failure(Rs, C1),
(R == failure -> C is C1 + 1; C is C1).
tests :-
consult('answer.prolog'), % 解答プログラムを読み込む
see('patterns.tsv'), % テストパタンのファイルを開く
read_contents(Cs), % ファイルの内容をCsに束縛する
seen, % ファイルを閉じる
lines(Cs, Ls), % 内容を行に分割しLsに束縛する
maplist(words, Ls, Ps), % 各行を入力パタンに分割し、結果のリストをPsに束縛する
maplist(test, Ps, Rs), % 各入力パタンをテストし、結果のリストをRsに束縛する
length(Rs, Cases), % 実施したテストケースの総数をCasesに束縛する
count_failure(Rs, Failures), % 失敗したテストケースの総数をFailuresに束縛する
format("~nCases: ~d Failures: ~d~n", [Cases, Failures]).
% If using SWI-Prolog …
%
% $ swipl -s test.prolog -g tests -t halt
% Failure in #2
% expected: 13245
% actual: 12345
%
% Cases: 3 Failures: 1
% If using GNU-Prolog …
%
% $ gprolog --consult-file test.prolog --entry-goal 'tests, halt'
% Failure in #2
% expected: 13245
% actual: 12345
%
% Cases: 3 Failures: 1