テストは TAP(Test Anything Protocol)1 を用いて行います.
Run make check
at the root directory of the project.
Automake の TAP を用いて,自動的にテストを行います.
system_check では,
-
<testname>.lmntest
ファイルは,LMNtal のプログラムだけでなく, 実行結果の予想などを含みます.- そのままではコンパイルできません.
-
<testname>.lmntest
ファイルは, system_check/Makefile.am%.il: %.lmntest awk -f create_testdata.awk | \ ## Create a test program. $(LMNC) --stdin-lmn $(LMNCFLAGS) >$@ ## Compile with a compiler.
によって,
-
create_testdata.awk スクリプトによって, テストが成功した場合に最終状態のプロセスに
ok
を含むような, LMNtal プログラムへと作り替えられます. -
プログラムに変更があった場合は, コンパイラによってこの LMNtal プログラムは il ファイルにコンパイルされます.
-
-
check.pl は, 作成された il ファイルを slim に与えて実行し, 結果に
ok
があるかどうかを検査します.
statespace では,
- 非決定実行したい LMNtal プログラムをおいておき, そのまま il ファイルにコンパイルします.
- check.pl が, コンパイルされた il ファイルと,全状態数と,最終状態数を受け取り,状態空間をチェックします.
library_check では,
--use-builtin-rule
をつけて実行したい LMNtal プログラムをおいておき, 単にそれがそのまま実行されます.- 実行結果の検査などは現在行っていません.
- TODO:
system_check
を参考に,実行結果の確認まで行うようにする.
- TODO:
それぞれのディレクトリの中のテストのみ実行する.
library_check
などのディレクトリに入って,make check-TESTS
を実行する.
system_check にテストを追加する場合について,解説します.
新たなテストが必要な場合は,
- system_check ディレクトリ以下に,
新しくディレクトリ
<dirname>
を作って,または既存のディレクトリの中に,<testname>.lmntest
ファイル(テストスクリプト)を新たに作成してください.- E.g., system_check/testsuite/append/append1.lmntest
append(c(1,c(2,c(3,n))),c(4,c(5,n)),result), ( append(X,Y,Z), n(X) :- Y=Z ), ( append(X,Y,Z), c(A,X1,X) :- c(A,Z1,Z), append(X1,Y,Z1) ). result(c(1,c(2,c(3,c(4,c(5,n)))))) ok
- 構成
- 1 行目にテストしたい LMNtal プログラム,
- 2 行目に LMNtal プログラムの予想される出力,
- 3 行目に
ok
またはng
を記述してください.ok
ならば, 1 行目の結果が 2 行目と等しいとき,ng
ならば, 1 行目の結果が 2 行目と異なるときにテストに成功します.
- 4 行目以降には,LMNtal コメント以外は書かないでください.
- E.g., system_check/testsuite/append/append1.lmntest
check.sh
(テストを実行するプログラム)を新たに生成, または既存のファイルに変更を加えてください.- TAP に従って結果を出力するシェルスクリプトです.
- E.g., system_check/testsuite/append/check.sh
#!/bin/sh ./check.pl \ /testsuite/append/append1 \ /testsuite/append/append2 \ /testsuite/append/append3 \ /testsuite/append/append4
check.sh
ファイルでは,./check.pl
を呼び出し, その引数として, テストしたい<testname>.lmntest
ファイルのパス (e.g.,/testsuite/append/append1.lmntest
) から.lmntest
を除いたもの (e.g.,/testsuite/append/append1
) を全て与えてください.
- system_check/Makefile.am の
TESTS
変数に, 追加したcheck.sh
スクリプトへのパス を追加してください.- E.g.,
TESTS = testsuite/<dirname>/check.sh
- E.g.,
check_DATA
変数に, 追加した<testname>.lmntest
ファイルへのパス を追加してください.- E.g.,
check_DATA = testsuite/<dirname>/<testname>.lmntest
- E.g.,
Compiler option は <testdir>/Makefile.am
で,
LMNCFLAGS
で指定している.
-
E.g., system_check/Makefile.am
LMNCFLAGS = --hl-opt --slimcode -O3
Runtime option は,
<testdir>/check.pl
で,
slim_CHECK_OPTIONS
環境変数を読み込んで指定している.
-
E.g., system_check/check.pl
$options = $ENV{slim_CHECK_OPTIONS};
-
例えば,
--history-management
を用いながらテストしたい場合は,export slim_CHECK_OPTIONS="--history-management"
してから
make check
する.
system_check/testsuite
- append
- Appending a list to a list.
- basic
- 簡単な LMNtal プログラム
- count
- ???
- cslmntal
- Test some CSLMNtal programs. E.g., Skiplists.
- guard_float
- ???
- guard_ground
- ???
- guard_ground_multi
- ???
- guard_int
- ???
- guard_string
- ???
- guard_unary
- ???
- hyperlink
- ???
- mem_name
- ???
- miscellaneous
- ???
- proccxt
- ???
- proccxt_free
- ???
- proxyatom
- ???
- rulecxt
- ???
- simpagation
- ???
- unification
- ???
- uniq
- ???
library_check/testsuite
- integer
- ???
- set
- Test set module.
- statespace
- ???
statespace/testsuite
元々のテストスクリプトは LMNtal 処理系用のテストスクリプトを流用したもので, 以下のような欠点がありました.
- テストが走るたびに lmn ファイルをコンパイルする
- テストの結果如何にかかわらず PASS: 1 のみを表示する
- ~.log にテスト結果が出力される
1回のテストに5分程度かかるため, 自動テストの利点があまり発揮できていませんでした.
そこで, Automake の TAP を用いてよりテストの利便性を高めました.
- コンパイルを毎回しなくとも良いように, テストケースごとにファイルに分け, make によって監視しています.