リファクタリング中
authorj8takagi <j8takagi@nifty.com>
Thu, 18 Nov 2010 15:37:16 +0000 (00:37 +0900)
committerj8takagi <j8takagi@nifty.com>
Thu, 18 Nov 2010 15:37:16 +0000 (00:37 +0900)
38 files changed:
sample/hoc1/Makefile
sample/hoc1/hoc.y
sample/hoc1/test/Define.mk
sample/hoc1/test/Makefile
sample/hoc1/test/Test.mk
sample/hoc1/test/add2/Makefile [new file with mode: 0644]
sample/hoc1/test/bignum/0.txt [new file with mode: 0644]
sample/hoc1/test/bignum/Makefile [new file with mode: 0644]
sample/hoc1/test/bignum/cmd [new file with mode: 0755]
sample/hoc1/test/bignum/in.txt [new file with mode: 0644]
sample/hoc1/test/pi/0.txt
sample/hoc1/test/test/Makefile [new file with mode: 0644]
selftest/unittest/Define.beta.mk [new file with mode: 0644]
selftest/unittest/Define.mk [new file with mode: 0644]
selftest/unittest/Makefile [new file with mode: 0644]
selftest/unittest/Test.mk [new file with mode: 0644]
selftest/unittest/UNITTEST.log [new file with mode: 0644]
selftest/unittest/create_testmkfile/0.mk [new file with mode: 0644]
selftest/unittest/create_testmkfile/0.txt [new file with mode: 0644]
selftest/unittest/create_testmkfile/Makefile [new file with mode: 0644]
selftest/unittest/create_testmkfile/cmd [new file with mode: 0755]
selftest/unittest/create_testmkfile/desc.txt [new file with mode: 0644]
selftest/unittest/create_testmkfile/testmkfile.mk [new file with mode: 0644]
selftest/unittest/desc_log/0.log [new file with mode: 0644]
selftest/unittest/desc_log/0.txt [new file with mode: 0644]
selftest/unittest/desc_log/Makefile [new file with mode: 0644]
selftest/unittest/desc_log/cmd [new file with mode: 0755]
selftest/unittest/desc_log/desc.txt [new file with mode: 0644]
selftest/unittest/exec_cmd/0.txt [new file with mode: 0644]
selftest/unittest/exec_cmd/00.txt [new file with mode: 0644]
selftest/unittest/exec_cmd/Makefile [new file with mode: 0644]
selftest/unittest/exec_cmd/cmd [new file with mode: 0755]
selftest/unittest/exec_cmd/cmd0 [new file with mode: 0755]
selftest/unittest/exec_cmd/desc.txt [new file with mode: 0644]
template/Define.mk
template/Group.mk
template/Makefile
template/Test.mk

index be721c6..f10080e 100644 (file)
@@ -1,5 +1,5 @@
 CC = gcc
-CFLAGS = -g
+CFLAGS = -g -lm
 .PHPNY: clean
 hoc1: hoc.o
        $(CC) $(CFLAGS) -o $@ $^
index 1762895..98270a8 100644 (file)
@@ -2,12 +2,14 @@
 #define YYSTYPE double          /* data type of yacc stack */
 #include <stdio.h>
 #include <ctype.h>
+#include <math.h>
 %}
 
 %token  NUMBER
 %left   '+' '-'                 /* left associative, same precedence */
 %left   '*' '/' '%'             /* left associative, higher precedence */
 %left   UNARYMINUS UNARYPLUS
+%right  '^'
 %%
 list:                           /* nothing */
         | list '\n'
@@ -19,6 +21,7 @@ expr:   NUMBER          { $$ = $1; }
         | expr '*' expr { $$ = $1 * $3; }
         | expr '/' expr { $$ = $1 / $3; }
         | expr '%' expr { $$ = (int)$1 % (int)$3; }
+        | expr '^' expr { $$ = pow($1, $3); }
         | '(' expr ')'{ $$ = $2; }
         | '-' expr %prec UNARYMINUS { $$ = -$2; }
         | '+' expr %prec UNARYPLUS { $$ = $2; }
index e114af6..71b6726 100644 (file)
-######################################################################
-# テストテンプレートのディレクトリー
-######################################################################
-# テストグループのMakefileとしてコピーされるファイル
-GROUP_MAKEFILE = Group.mk
-
 ######################################################################
 # テストグループのディレクトリー
 ######################################################################
-# グループディレクトリー
-GROUP_DIR = $(shell pwd)
-
-# グループ名。ディレクトリ名から取得
-GROUP = $(notdir $(GROUP_DIR))
-
-# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー
-TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d))
-
 # テストグループとテストの両方で使う変数を定義したファイル
-DEF_FILE = Define.mk
+DEF_FILE := Define.mk
 
 # テストのMakefileにインクルードするファイル
-TEST_MAKEFILE = Test.mk
+TEST_MAKEFILE := Test.mk
 
 # テストグループログファイル
-GROUP_LOG_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
-
-# 成功したテストの数。テストグループログファイルから取得
-SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l)
-
-# 失敗したテストの数。テストグループログファイルから取得
-FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l)
-
-# すべてのテストの数。
-ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST))
+GROUP_LOG_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
 
 ######################################################################
 # テストのディレクトリー
 ######################################################################
-# テスト名。カレントディレクトリー名から取得
-TEST = $(notdir $(shell pwd))
+# Makefile
+MAKEFILE := Makefile
+
+# 現在の日時
+DATE = $(shell date +"%F %T")
 
 # テストコマンドファイル
-CMD_FILE = cmd
+CMD_FILE := cmd
 
 # テスト説明ファイル
-DESC_FILE = desc.txt
+DESC_FILE := desc.txt
 
 # テスト想定結果ファイル
-TEST0_FILE = 0.txt
+TEST0_FILE := 0.txt
 
 # テスト結果ファイル
-TEST1_FILE = 1.txt
+TEST1_FILE := 1.txt
 
 # テストの、想定結果と結果の差分ファイル
-DIFF_FILE = diff.txt
+DIFF_FILE := diff.txt
 
 # テストエラーファイル
-ERR_FILE = err.txt
+ERR_FILE := err.txt
 
 # テストログファイル
-LOG_FILE = test.log
+LOG_FILE := test.log
 
-# 現在の日時
-DATE = `date +"%F %T"`
-
-# テスト実行コマンド。CMD_FILEを実行する。
-# ファイルの内容と、テスト結果を表す標準出力を、ターゲットファイルに保存。
-# エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。
-# ターゲットファイルは、TEST0_FILEまたはTEST1_FILE
-CMD = \
-    chmod u+x $(CMD_FILE); \
-    cat $(CMD_FILE) >$@; \
-    ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \
-    if test -s $(ERR_FILE); then cat $(ERR_FILE) >>$@; else rm -f $(ERR_FILE); fi
+# 実行時間ファイル
+TIME_FILE := time.log
+
+######################################################################
+# コマンド
+######################################################################
+
+CP := cp
+
+CAT := cat
+
+MKDIR := mkdir
+
+RM := rm -f
+
+ECHO := echo
+
+TIME := /usr/bin/time
+
+DIFF := diff -c
+
+DEV_NULL := /dev/null
+
+CHMOD := chmod
+
+# TESTディレクトリーのMakefileを作成
+# 用例: $(call create_testmakefile,file)
+define create_testmkfile
+    $(foreach mkfile, $(DEF_FILE) $(TEST_MAKEFILE), $(ECHO) "include ../$(mkfile)" >>$1; )
+endef
+
+# 説明ファイルの内容を、引数のファイルに出力。
+# 用例: $(call desc_log,file)
+define desc_log
+    $(if $(wildcard $(DESC_FILE)),$(CAT) $(DESC_FILE) >>$1)
+endef
+
+# テスト実行の経過時間をファイルに出力。引数は、テスト名、コマンドファイル、出力ファイル
+# 用例: $(call time_cmd,name,file_cmd,file_out)
+define time_cmd
+    $(TIME) -f "$1: %E" >>$3 $2>$(DEV_NULL)
+    $(CAT) $3
+endef
+
+# テスト実行コマンド。引数は、コマンドファイル、出力ファイル、エラーファイル
+# ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存。
+# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。
+# 用例: $(call exec_cmd,file_cmd,file_out,file_err)
+define exec_cmd
+    $(CHMOD) u+x $1
+    $(CAT) $1 >$2
+    ./$1 >>$2 2>$3
+    if test -s $3; then $(CAT) $3 >>$2; else $(RM) $3; fi
+endef
+
+# 2つのファイルを比較し、差分ファイルを作成。引数は、ファイル0、ファイル1、差分ファイル
+# 用例: $(call diff_testfiles,file0,file1)
+define diff_testfiles
+    diff $1 $2 >$3 2>&1
+    if test ! -s $3; then $(RM) $3; fi
+endef
+
+# 差分ファイルの内容をログファイルに出力。引数は、テスト名、差分ファイル、ログファイル
+# 用例: $(call test_log,name,file_diff,file_log)
+define test_log
+    $(ECHO) "$1: Test $(if $(wildcard $2),Failure,Success) $(DATE)" >>$3
+endef
+
+# テストごとのログファイルをグループログファイルに出力。引数は、テストのリスト、グループログファイル
+# 用例: $(call group_log_each,tests,file_group_log)
+define group_log_each
+    $(foreach target,$1,$(call group_log,$(target),$2))
+endef
+
+# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル
+# 用例: $(call group_log_each,tests,file_group_log)
+define group_log
+    $(ECHO) >>$2
+    if test -s $1/$(LOG_FILE); then $(CAT) $1/$(LOG_FILE) >>$2; else $(ECHO) $1 ": no log." >>$2; fi
+endef
+
+LOG_GROUP = for target in $^; do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done
+
+REPORT_GROUP = $(ECHO) "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
+               if test $(FAIL_TEST) -eq 0; then $(ECHO) "$(GROUP): All tests are succeded."; fi
+
+LOG_TIME_REPORT = for target in ^; do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done
+
+######################################################################
+# エラー
+######################################################################
+
+# chk_var_null: 変数がNULLの場合、エラー
+# 用例: $(call chk_var_null, var)
+define chk_var_null
+    $(if $($1),,$(error $1 is NULL))
+endef
+
+# chk_file_ext: 変数で指定されたファイルが実在する場合、エラー
+# 用例: $(call chk_file_ext, var)
+define chk_file_ext
+    $(if $(wildcard $($1)),$(error $(wildcard $($1)) exists))
+endef
index a66c1f8..31cb794 100644 (file)
@@ -1,6 +1,34 @@
 # autotest.mk > template > Group.mk
 # テストグループのMakefile
-#
+
+######################################################################
+# テストグループの定義
+######################################################################
+
+include Define.mk
+
+# グループディレクトリー
+GROUP_DIR := $(shell pwd)
+
+# グループ名。ディレクトリ名から取得
+GROUP := $(notdir $(GROUP_DIR))
+
+# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー
+TESTS := $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d))
+
+# 成功したテストの数。テストグループログファイルから取得
+SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l)
+
+# 失敗したテストの数。テストグループログファイルから取得
+FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l)
+
+# すべてのテストの数
+ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST))
+
+#テストグループ計時ファイル
+GROUP_TIME_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]')_time.log
+
+######################################################################
 # オペレーター
 # make         : すべてのテストを実施し、ログファイルを作成
 # make check   : ↓
 # make report  : ログファイルから、テストの結果をレポート
 # make clean   : すべてのテストで、"make" で生成されたファイルをクリア
 # make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア
-
-include Define.mk
+######################################################################
 
 .PHONY: check create set checkeach report clean cleanall
 
 check: checkeach report
 
 create:
-ifndef TEST
-       @echo "no test created. set TEST."
-else
-       @mkdir $(TEST)
-       @for ifile in $(DEF_FILE) $(TEST_MAKEFILE); do echo "include ../$$ifile" >>$(TEST)/Makefile; done
-endif
+       @$(call chk_var_null,TEST)
+       @$(call chk_file_ext,TEST)
+       @$(MKDIR) $(TEST)
+       @$(call create_testmkfile,$(TEST)/$(MAKEFILE))
 
-set:
-       @for target in $(TESTS); do $(MAKE) set -C $$target; done
+set: $(TESTS)
+       $(MAKE) set -C $^
 
-checkeach:
-       @rm -f $(GROUP_LOG_FILE)
-       @for target in $(TESTS); do $(MAKE) check -C $$target; done
+checkeach: $(TESTS)
+       @$(RM) $(GROUP_LOG_FILE)
+       TARGET=check
 
-$(GROUP_LOG_FILE):
-       @for target in $(TESTS); do (echo<$$target/$(LOG_FILE) && cat <$$target/$(LOG_FILE)) >>$@ || echo $$target ": no log." >>$@; done
+$(GROUP_LOG_FILE): $(TESTS)
+       @$(LOG_GROUP)
 
 report: $(GROUP_LOG_FILE)
-       @echo "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
-         if test $(FAIL_TEST) -eq 0; then echo "$(GROUP): All tests are succeded."; fi
+       @$(REPORT_GROUP)
+
+time: timeeach $(GROUP_TIME_FILE)
+       @$(CAT) $(GROUP_TIME_FILE)
+
+$(GROUP_TIME_FILE): $(TESTS)
+       @$(LOG_TIME_REPORT)
+
+timeeach: $(TESTS)
+       @$(MAKE) time -C $^
 
-clean:
-       @for target in $(TESTS); do $(MAKE) clean -C $$target; done
-       @rm -f $(GROUP_LOG_FILE)
+clean: $(TESTS)
+       @echo $^ && $(MAKE) clean -C $^
+       @$(RM) $(GROUP_LOG_FILE)
 
-cleanall:
-       @for target in $(TESTS); do $(MAKE) cleanall -C $$target; done
-       @rm -f $(GROUP_LOG_FILE)
+$(TESTS):
+       @echo $@
+       @$(MAKE) $(TARGET) -C $@
index cf5979b..398318f 100644 (file)
@@ -1,16 +1,22 @@
-# autotest.mk > test_template > test.mk
+# autotest.mk > test_template > Test.mk
 # 自動テスト用のMakefile
 #
 # 要: Define.mk
 #
 # オペレーター
-# make         : CMDã\81§è¨­å®\9aã\81\95ã\82\8cã\81\9fã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81\9få\87ºå\8a\9bçµ\90æ\9e\9cã\82\921.txtã\81«å\87ºå\8a\9bã\81\97ã\80\810.txtã\81¨æ¯\94è¼\83ã\81\97ã\80\81ã\83¬ã\83\9dã\83¼ã\83\88
+# make         : CMDã\81®æ¨\99æº\96å\87ºå\8a\9bã\82\92TEST1_FILEã\81«ä¿\9då­\98ã\81\97ã\81\9fã\81\82ã\81¨ã\80\81TEST0_FILEã\81¨ã\81®å·®å\88\86ã\82\92æ¯\94è¼\83ã\81\97ã\80\81çµ\90æ\9e\9cã\82\92LOG_FILEã\81«å\87ºå\8a\9b
 # make check   : ↓
-# make prepare : CMDで設定されたコマンドを実行した出力結果を0.txt(テストの想定結果)に出力
-# make clean   : 「make」で生成されたファイルをクリア
-# make cleanall: 「make」と「make prepare」で生成されたファイルをクリア
+# make set     : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない
+# make reset   : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き
+# make time    : CMDの実行にかかった時間をTIME_FILEに保存し、出力
+# make cleantime: "make time" で作成されたファイルをクリア
+# make clean   : "make" で作成されたファイルをクリア
+# make cleanall: "make" と "make set" で作成されたファイルをクリア
 
-.PHONY: check set reset clean cleanall
+# テスト名。カレントディレクトリー名から取得
+TEST = $(notdir $(shell pwd))
+
+.PHONY: check set reset time cleantime clean cleanall
 
 check: clean $(LOG_FILE)
 
@@ -18,18 +24,27 @@ set: $(TEST0_FILE)
 
 reset: cleanall $(TEST0_FILE)
 
+time: cleantime $(TIME_FILE)
+
+cleantime:
+       @$(RM) $(TIME_FILE)
+
 clean:
-       @rm -f $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE)
+       @$(RM) $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE) $(TIME_FILE)
 
 cleanall: clean
-       @rm -f $(TEST0_FILE)
+       @$(RM) $(TEST0_FILE)
 
-$(TEST0_FILE) $(TEST1_FILE):
-       @if test ! -s $(CMD_FILE); then echo "set command file: $(CMD_FILE)."; else $(CMD); fi
+$(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE)
+       @$(call exec_cmd,$^,$@,$(ERR_FILE))
 
 $(DIFF_FILE): $(TEST1_FILE)
-       @-diff -c $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1
+       @$(call diff_testfiles,$(TEST0_FILE),$(TEST1_FILE),$@)
 
 $(LOG_FILE): $(DIFF_FILE)
-       @if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi;
-       @if test ! -s $^; then echo "$(TEST): Test Success $(DATE)"  >>$@; else echo "$(TEST): Test Failure $(DATE)" >>$@; fi;
+       @$(call desc_log,$@)
+       @$(call test_log,$(TEST),$^,$@)
+
+$(TIME_FILE): $(CMD_FILE)
+       @$(call desc_log,$@)
+       @$(call time_cmd,$(TEST),./$^,$@)
diff --git a/sample/hoc1/test/add2/Makefile b/sample/hoc1/test/add2/Makefile
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/sample/hoc1/test/bignum/0.txt b/sample/hoc1/test/bignum/0.txt
new file mode 100644 (file)
index 0000000..e168ad3
--- /dev/null
@@ -0,0 +1,4 @@
+cat in.txt && ../../hoc1 < in.txt
+9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1
+
+       9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000
diff --git a/sample/hoc1/test/bignum/Makefile b/sample/hoc1/test/bignum/Makefile
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/sample/hoc1/test/bignum/cmd b/sample/hoc1/test/bignum/cmd
new file mode 100755 (executable)
index 0000000..ea36034
--- /dev/null
@@ -0,0 +1 @@
+cat in.txt && ../../hoc1 < in.txt
diff --git a/sample/hoc1/test/bignum/in.txt b/sample/hoc1/test/bignum/in.txt
new file mode 100644 (file)
index 0000000..6547670
--- /dev/null
@@ -0,0 +1,2 @@
+9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1
+
index c0dbd3e..3aa600e 100644 (file)
@@ -11,14 +11,14 @@ cat in.txt && ../../hoc1 < in.txt
 4 * (1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + 1/17 - 1/19 + 1/21 - 1/23 + 1/25 - 1/27 + 1/29 - 1/31 + 1/33 - 1/35 + 1/37 - 1/39 + 1/41 - 1/43 + 1/45 - 1/47 + 1/49 - 1/51 + 1/53 - 1/55 + 1/57 - 1/59 + 1/61 - 1/63 + 1/65 - 1/67 + 1/69 - 1/71 + 1/73 - 1/75 + 1/77 - 1/79 + 1/81 - 1/83 + 1/85 - 1/87 + 1/89 - 1/91 + 1/93 - 1/95 + 1/97 - 1/99 + 1/101 - 1/103 + 1/105 - 1/107 + 1/109 - 1/111 + 1/113 - 1/115 + 1/117 - 1/119 + 1/121 - 1/123 + 1/125 - 1/127 + 1/129 - 1/131 + 1/133 - 1/135 + 1/137 - 1/139 + 1/141 - 1/143 + 1/145 - 1/147 + 1/149 - 1/151 + 1/153 - 1/155 + 1/157 - 1/159 + 1/161 - 1/163 + 1/165 - 1/167 + 1/169 - 1/171 + 1/173 - 1/175 + 1/177 - 1/179 + 1/181 - 1/183 + 1/185 - 1/187 + 1/189 - 1/191 + 1/193 - 1/195 + 1/197 - 1/199 + 1/201 - 1/203 + 1/205 - 1/207 + 1/209 - 1/211 + 1/213 - 1/215 + 1/217 - 1/219 + 1/221 - 1/223 + 1/225 - 1/227 + 1/229 - 1/231 + 1/233 - 1/235 + 1/237 - 1/239 + 1/241 - 1/243 + 1/245 - 1/247 + 1/249 - 1/251 + 1/253 - 1/255 + 1/257 - 1/259 + 1/261 - 1/263 + 1/265 - 1/267 + 1/269 - 1/271 + 1/273 - 1/275 + 1/277 - 1/279 + 1/281 - 1/283 + 1/285 - 1/287 + 1/289 - 1/291 + 1/293 - 1/295 + 1/297 - 1/299 + 1/301 - 1/303 + 1/305 - 1/307 + 1/309 - 1/311 + 1/313 - 1/315 + 1/317 - 1/319 + 1/321 - 1/323 + 1/325 - 1/327 + 1/329 - 1/331 + 1/333 - 1/335 + 1/337 - 1/339 + 1/341 - 1/343 + 1/345 - 1/347 + 1/349 - 1/351 + 1/353 - 1/355 + 1/357 - 1/359 + 1/361 - 1/363 + 1/365 - 1/367 + 1/369 - 1/371 + 1/373 - 1/375 + 1/377 - 1/379 + 1/381 - 1/383 + 1/385 - 1/387 + 1/389 - 1/391 + 1/393 - 1/395 + 1/397 - 1/399 + 1/401 - 1/403 + 1/405 - 1/407 + 1/409 - 1/411 + 1/413 - 1/415 + 1/417 - 1/419 + 1/421 - 1/423 + 1/425 - 1/427 + 1/429 - 1/431 + 1/433 - 1/435 + 1/437 - 1/439 + 1/441 - 1/443 + 1/445 - 1/447 + 1/449 - 1/451 + 1/453 - 1/455 + 1/457 - 1/459 + 1/461 - 1/463 + 1/465 - 1/467 + 1/469 - 1/471 + 1/473 - 1/475 + 1/477 - 1/479 + 1/481 - 1/483 + 1/485 - 1/487 + 1/489 - 1/491 + 1/493 - 1/495 + 1/497 - 1/499 + 1/501 - 1/503 + 1/505 - 1/507 + 1/509 - 1/511 + 1/513 - 1/515 + 1/517 - 1/519 + 1/521 - 1/523 + 1/525 - 1/527 + 1/529 - 1/531 + 1/533 - 1/535 + 1/537 - 1/539 + 1/541 - 1/543 + 1/545 - 1/547 + 1/549 - 1/551 + 1/553 - 1/555 + 1/557 - 1/559 + 1/561 - 1/563 + 1/565 - 1/567 + 1/569 - 1/571 + 1/573 - 1/575 + 1/577 - 1/579 + 1/581 - 1/583 + 1/585 - 1/587 + 1/589 - 1/591 + 1/593 - 1/595 + 1/597 - 1/599 + 1/601 - 1/603 + 1/605 - 1/607 + 1/609 - 1/611 + 1/613 - 1/615 + 1/617 - 1/619 + 1/621 - 1/623 + 1/625 - 1/627 + 1/629 - 1/631 + 1/633 - 1/635 + 1/637 - 1/639 + 1/641 - 1/643 + 1/645 - 1/647 + 1/649 - 1/651 + 1/653 - 1/655 + 1/657 - 1/659 + 1/661 - 1/663 + 1/665 - 1/667 + 1/669 - 1/671 + 1/673 - 1/675 + 1/677 - 1/679 + 1/681 - 1/683 + 1/685 - 1/687 + 1/689 - 1/691 + 1/693 - 1/695 + 1/697 - 1/699 + 1/701 - 1/703 + 1/705 - 1/707 + 1/709 - 1/711 + 1/713 - 1/715 + 1/717 - 1/719 + 1/721 - 1/723 + 1/725 - 1/727 + 1/729 - 1/731 + 1/733 - 1/735 + 1/737 - 1/739 + 1/741 - 1/743 + 1/745 - 1/747 + 1/749 - 1/751 + 1/753 - 1/755 + 1/757 - 1/759 + 1/761 - 1/763 + 1/765 - 1/767 + 1/769 - 1/771 + 1/773 - 1/775 + 1/777 - 1/779 + 1/781 - 1/783 + 1/785 - 1/787 + 1/789 - 1/791 + 1/793 - 1/795 + 1/797 - 1/799 + 1/801 - 1/803 + 1/805 - 1/807 + 1/809 - 1/811 + 1/813 - 1/815 + 1/817 - 1/819 + 1/821 - 1/823 + 1/825 - 1/827 + 1/829 - 1/831 + 1/833 - 1/835 + 1/837 - 1/839 + 1/841 - 1/843 + 1/845 - 1/847 + 1/849 - 1/851 + 1/853 - 1/855 + 1/857 - 1/859 + 1/861 - 1/863 + 1/865 - 1/867 + 1/869 - 1/871 + 1/873 - 1/875 + 1/877 - 1/879 + 1/881 - 1/883 + 1/885 - 1/887 + 1/889 - 1/891 + 1/893 - 1/895 + 1/897 - 1/899 + 1/901 - 1/903 + 1/905 - 1/907 + 1/909 - 1/911 + 1/913 - 1/915 + 1/917 - 1/919 + 1/921 - 1/923 + 1/925 - 1/927 + 1/929 - 1/931 + 1/933 - 1/935 + 1/937 - 1/939 + 1/941 - 1/943 + 1/945 - 1/947 + 1/949 - 1/951 + 1/953 - 1/955 + 1/957 - 1/959 + 1/961 - 1/963 + 1/965 - 1/967 + 1/969 - 1/971 + 1/973 - 1/975 + 1/977 - 1/979 + 1/981 - 1/983 + 1/985 - 1/987 + 1/989 - 1/991 + 1/993 - 1/995 + 1/997 - 1/999)
 4 * (1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + 1/17 - 1/19 + 1/21 - 1/23 + 1/25 - 1/27 + 1/29 - 1/31 + 1/33 - 1/35 + 1/37 - 1/39 + 1/41 - 1/43 + 1/45 - 1/47 + 1/49 - 1/51 + 1/53 - 1/55 + 1/57 - 1/59 + 1/61 - 1/63 + 1/65 - 1/67 + 1/69 - 1/71 + 1/73 - 1/75 + 1/77 - 1/79 + 1/81 - 1/83 + 1/85 - 1/87 + 1/89 - 1/91 + 1/93 - 1/95 + 1/97 - 1/99 + 1/101 - 1/103 + 1/105 - 1/107 + 1/109 - 1/111 + 1/113 - 1/115 + 1/117 - 1/119 + 1/121 - 1/123 + 1/125 - 1/127 + 1/129 - 1/131 + 1/133 - 1/135 + 1/137 - 1/139 + 1/141 - 1/143 + 1/145 - 1/147 + 1/149 - 1/151 + 1/153 - 1/155 + 1/157 - 1/159 + 1/161 - 1/163 + 1/165 - 1/167 + 1/169 - 1/171 + 1/173 - 1/175 + 1/177 - 1/179 + 1/181 - 1/183 + 1/185 - 1/187 + 1/189 - 1/191 + 1/193 - 1/195 + 1/197 - 1/199 + 1/201 - 1/203 + 1/205 - 1/207 + 1/209 - 1/211 + 1/213 - 1/215 + 1/217 - 1/219 + 1/221 - 1/223 + 1/225 - 1/227 + 1/229 - 1/231 + 1/233 - 1/235 + 1/237 - 1/239 + 1/241 - 1/243 + 1/245 - 1/247 + 1/249 - 1/251 + 1/253 - 1/255 + 1/257 - 1/259 + 1/261 - 1/263 + 1/265 - 1/267 + 1/269 - 1/271 + 1/273 - 1/275 + 1/277 - 1/279 + 1/281 - 1/283 + 1/285 - 1/287 + 1/289 - 1/291 + 1/293 - 1/295 + 1/297 - 1/299 + 1/301 - 1/303 + 1/305 - 1/307 + 1/309 - 1/311 + 1/313 - 1/315 + 1/317 - 1/319 + 1/321 - 1/323 + 1/325 - 1/327 + 1/329 - 1/331 + 1/333 - 1/335 + 1/337 - 1/339 + 1/341 - 1/343 + 1/345 - 1/347 + 1/349 - 1/351 + 1/353 - 1/355 + 1/357 - 1/359 + 1/361 - 1/363 + 1/365 - 1/367 + 1/369 - 1/371 + 1/373 - 1/375 + 1/377 - 1/379 + 1/381 - 1/383 + 1/385 - 1/387 + 1/389 - 1/391 + 1/393 - 1/395 + 1/397 - 1/399 + 1/401 - 1/403 + 1/405 - 1/407 + 1/409 - 1/411 + 1/413 - 1/415 + 1/417 - 1/419 + 1/421 - 1/423 + 1/425 - 1/427 + 1/429 - 1/431 + 1/433 - 1/435 + 1/437 - 1/439 + 1/441 - 1/443 + 1/445 - 1/447 + 1/449 - 1/451 + 1/453 - 1/455 + 1/457 - 1/459 + 1/461 - 1/463 + 1/465 - 1/467 + 1/469 - 1/471 + 1/473 - 1/475 + 1/477 - 1/479 + 1/481 - 1/483 + 1/485 - 1/487 + 1/489 - 1/491 + 1/493 - 1/495 + 1/497 - 1/499 + 1/501 - 1/503 + 1/505 - 1/507 + 1/509 - 1/511 + 1/513 - 1/515 + 1/517 - 1/519 + 1/521 - 1/523 + 1/525 - 1/527 + 1/529 - 1/531 + 1/533 - 1/535 + 1/537 - 1/539 + 1/541 - 1/543 + 1/545 - 1/547 + 1/549 - 1/551 + 1/553 - 1/555 + 1/557 - 1/559 + 1/561 - 1/563 + 1/565 - 1/567 + 1/569 - 1/571 + 1/573 - 1/575 + 1/577 - 1/579 + 1/581 - 1/583 + 1/585 - 1/587 + 1/589 - 1/591 + 1/593 - 1/595 + 1/597 - 1/599 + 1/601 - 1/603 + 1/605 - 1/607 + 1/609 - 1/611 + 1/613 - 1/615 + 1/617 - 1/619 + 1/621 - 1/623 + 1/625 - 1/627 + 1/629 - 1/631 + 1/633 - 1/635 + 1/637 - 1/639 + 1/641 - 1/643 + 1/645 - 1/647 + 1/649 - 1/651 + 1/653 - 1/655 + 1/657 - 1/659 + 1/661 - 1/663 + 1/665 - 1/667 + 1/669 - 1/671 + 1/673 - 1/675 + 1/677 - 1/679 + 1/681 - 1/683 + 1/685 - 1/687 + 1/689 - 1/691 + 1/693 - 1/695 + 1/697 - 1/699 + 1/701 - 1/703 + 1/705 - 1/707 + 1/709 - 1/711 + 1/713 - 1/715 + 1/717 - 1/719 + 1/721 - 1/723 + 1/725 - 1/727 + 1/729 - 1/731 + 1/733 - 1/735 + 1/737 - 1/739 + 1/741 - 1/743 + 1/745 - 1/747 + 1/749 - 1/751 + 1/753 - 1/755 + 1/757 - 1/759 + 1/761 - 1/763 + 1/765 - 1/767 + 1/769 - 1/771 + 1/773 - 1/775 + 1/777 - 1/779 + 1/781 - 1/783 + 1/785 - 1/787 + 1/789 - 1/791 + 1/793 - 1/795 + 1/797 - 1/799 + 1/801 - 1/803 + 1/805 - 1/807 + 1/809 - 1/811 + 1/813 - 1/815 + 1/817 - 1/819 + 1/821 - 1/823 + 1/825 - 1/827 + 1/829 - 1/831 + 1/833 - 1/835 + 1/837 - 1/839 + 1/841 - 1/843 + 1/845 - 1/847 + 1/849 - 1/851 + 1/853 - 1/855 + 1/857 - 1/859 + 1/861 - 1/863 + 1/865 - 1/867 + 1/869 - 1/871 + 1/873 - 1/875 + 1/877 - 1/879 + 1/881 - 1/883 + 1/885 - 1/887 + 1/889 - 1/891 + 1/893 - 1/895 + 1/897 - 1/899 + 1/901 - 1/903 + 1/905 - 1/907 + 1/909 - 1/911 + 1/913 - 1/915 + 1/917 - 1/919 + 1/921 - 1/923 + 1/925 - 1/927 + 1/929 - 1/931 + 1/933 - 1/935 + 1/937 - 1/939 + 1/941 - 1/943 + 1/945 - 1/947 + 1/949 - 1/951 + 1/953 - 1/955 + 1/957 - 1/959 + 1/961 - 1/963 + 1/965 - 1/967 + 1/969 - 1/971 + 1/973 - 1/975 + 1/977 - 1/979 + 1/981 - 1/983 + 1/985 - 1/987 + 1/989 - 1/991 + 1/993 - 1/995 + 1/997 - 1/999 + 1/1001)
 
-       3.3396825
-       3.0418396
-       3.1891848
-       3.1638121
-       3.1198561
-       3.1628668
-       3.1207616
-       3.1619987
-       3.1215947
-       3.1395927
-       3.1435887
+       3.339683
+       3.041840
+       3.189185
+       3.163812
+       3.119856
+       3.162867
+       3.120762
+       3.161999
+       3.121595
+       3.139593
+       3.143589
diff --git a/sample/hoc1/test/test/Makefile b/sample/hoc1/test/test/Makefile
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/selftest/unittest/Define.beta.mk b/selftest/unittest/Define.beta.mk
new file mode 100644 (file)
index 0000000..b9ba0ff
--- /dev/null
@@ -0,0 +1,149 @@
+######################################################################
+# テストグループのディレクトリー
+######################################################################
+# テストグループとテストの両方で使う変数を定義したファイル
+DEF_FILE := Define.mk
+
+# テストのMakefileにインクルードするファイル
+TEST_MAKEFILE := Test.mk
+
+# テストグループログファイル
+GROUP_LOG_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
+
+# テストグループ実行時間ファイル
+GROUP_TIME_FILE := $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]')_time.log
+
+######################################################################
+# テストのディレクトリー
+######################################################################
+# Makefile
+MAKEFILE := Makefile
+
+# 現在の日時
+DATE = $(shell date +"%F %T")
+
+# テストコマンドファイル
+CMD_FILE := cmd
+
+# テスト説明ファイル
+DESC_FILE := desc.txt
+
+# テスト想定結果ファイル
+TEST0_FILE := 0.txt
+
+# テスト結果ファイル
+TEST1_FILE := 1.txt
+
+# テストの、想定結果と結果の差分ファイル
+DIFF_FILE := diff.txt
+
+# テストエラーファイル
+ERR_FILE := err.txt
+
+# テストログファイル
+LOG_FILE := test.log
+
+# 実行時間ファイル
+TIME_FILE := time.log
+
+######################################################################
+# コマンド
+######################################################################
+
+CP := cp
+
+CAT := cat
+
+MKDIR := mkdir
+
+RM := rm -f
+
+ECHO := echo
+
+TIME := /usr/bin/time
+
+DIFF := diff -c
+
+DEV_NULL := /dev/null
+
+CHMOD := chmod
+
+# TESTディレクトリーのMakefileを作成
+# 用例: $(call create_testmakefile,file)
+define create_testmkfile
+    $(RM) $1
+    $(foreach mkfile, $(DEF_FILE) $(TEST_MAKEFILE), $(ECHO) "include ../$(mkfile)" >>$1; )
+endef
+
+# 説明ファイルの内容を、引数のファイルに出力。
+# 用例: $(call desc_log,file_out)
+define desc_log
+    $(if $(wildcard $(DESC_FILE)),$(CAT) $(DESC_FILE) >>$1)
+endef
+
+# テスト実行の経過時間をファイルに出力。引数は、テスト名、コマンドファイル、出力ファイル
+# 用例: $(call time_cmd,name,file_cmd,file_out)
+define time_cmd
+    $(TIME) -f "$1: %E" >>$3 $2>$(DEV_NULL)
+    $(CAT) $3
+endef
+
+# テスト実行コマンド。引数は、コマンドファイル、出力ファイル、エラーファイル
+# ファイルの内容と、CMD_FILE実行の標準出力を、出力ファイルに保存。
+# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。
+# 用例: $(call exec_cmd,file_cmd,file_out,file_err)
+define exec_cmd
+    $(CHMOD) u+x $1
+    $(CAT) $1 >$2
+    ./$1 >>$2 2>$3
+    if test -s $3; then $(CAT) $3 >>$2; else $(RM) $3; fi
+endef
+
+# 2つのファイルを比較し、差分ファイルを作成。引数は、ファイル0、ファイル1、差分ファイル
+# 用例: $(call diff_testfiles,file0,file1)
+define diff_testfiles
+    diff $1 $2 >$3 2>&1
+    if test ! -s $3; then $(RM) $3; fi
+endef
+
+# 差分ファイルの内容をログファイルに出力。引数は、テスト名、差分ファイル、ログファイル
+# 用例: $(call test_log,name,file_diff,file_log)
+define test_log
+    $(ECHO) "$1: Test $(if $(wildcard $2),Failure,Success) $(DATE)" >>$3
+endef
+
+# テストごとのログファイルをグループログファイルに出力。引数は、テストのリスト、グループログファイル
+# 用例: $(call group_log_each,tests,file_group_log)
+define group_log_each
+    $(foreach target,$1,$(call group_log,$(target),$2))
+endef
+
+# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル
+# 用例: $(call group_log_each,tests,file_group_log)
+define group_log
+    $(ECHO) >>$2
+    if test -s $1/$(LOG_FILE); then $(CAT) $1/$(LOG_FILE) >>$2; else $(ECHO) $1 ": no log." >>$2; fi
+endef
+
+LOG_GROUP = for target in $^; do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done
+
+REPORT_GROUP = $(ECHO) "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
+               if test $(FAIL_TEST) -eq 0; then $(ECHO) "$(GROUP): All tests are succeded."; fi
+
+LOG_TIME_REPORT = for target in ^; do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done
+
+######################################################################
+# エラー
+######################################################################
+
+# chk_var_null: 変数がNULLの場合、エラー
+# 用例: $(call chk_var_null, var)
+define chk_var_null
+    $(if $($1),,$(error $1 is NULL))
+endef
+
+# chk_file_ext: 変数で指定されたファイルが実在する場合、エラー
+# 用例: $(call chk_file_ext, var)
+define chk_file_ext
+    $(if $(wildcard $($1)),$(error $(wildcard $($1)) exists))
+endef
diff --git a/selftest/unittest/Define.mk b/selftest/unittest/Define.mk
new file mode 100644 (file)
index 0000000..943f724
--- /dev/null
@@ -0,0 +1,114 @@
+######################################################################
+# テストテンプレートのディレクトリー
+######################################################################
+# テストグループのMakefileとしてコピーされるファイル
+GROUP_MAKEFILE = Group.mk
+
+######################################################################
+# テストグループのディレクトリー
+######################################################################
+# グループディレクトリー
+GROUP_DIR = $(shell pwd)
+
+# グループ名。ディレクトリ名から取得
+GROUP = $(notdir $(GROUP_DIR))
+
+# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー
+TESTS = $(notdir $(shell find -maxdepth 1 -name "[^A-Z.]*" -type d))
+
+# テストグループとテストの両方で使う変数を定義したファイル
+DEF_FILE = Define.mk
+
+# テストのMakefileにインクルードするファイル
+TEST_MAKEFILE = Test.mk
+
+# テストグループログファイル
+GROUP_LOG_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
+
+# 成功したテストの数。テストグループログファイルから取得
+SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l)
+
+# 失敗したテストの数。テストグループログファイルから取得
+FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l)
+
+# すべてのテストの数
+ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST))
+
+#テストグループ計時ファイル
+GROUP_TIME_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
+
+######################################################################
+# テストのディレクトリー
+######################################################################
+# テスト名。カレントディレクトリー名から取得
+TEST = $(notdir $(shell pwd))
+
+# 現在の日時
+DATE = $(shell date +"%F %T")
+
+# テストコマンドファイル
+CMD_FILE = cmd
+
+# テスト説明ファイル
+DESC_FILE = desc.txt
+
+# テスト想定結果ファイル
+TEST0_FILE = 0.txt
+
+# テスト結果ファイル
+TEST1_FILE = 1.txt
+
+# テストの、想定結果と結果の差分ファイル
+DIFF_FILE = diff.txt
+
+# テストエラーファイル
+ERR_FILE = err.txt
+
+# テストログファイル
+LOG_FILE = test.log
+
+# 実行時間ファイル
+TIME_FILE = time.log
+
+######################################################################
+# コマンド
+######################################################################
+
+CP := cp
+
+CAT := cat
+
+MKDIR := mkdir
+
+RM := rm -f
+
+ECHO := echo
+
+TIME := /usr/bin/time
+
+DIFF := diff -c
+
+DEV_NULL := /dev/null
+
+CHMOD := chmod
+
+DESC = if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi;
+
+# 2ファイルの差分を出力。引数は2ファイル
+DIFF = diff -c
+
+# ファイルを実行可能にする。引数は1ファイル
+CHMOD = chmod u+x
+
+# テスト実行コマンド。
+# ファイルの内容と、CMD_FILE実行の標準出力を、ターゲットファイルに保存。
+# エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。
+# ターゲットファイルは、TEST0_FILEまたはTEST1_FILE
+CMD = \
+    $(CHMOD) $(CMD_FILE); \
+    $(CAT) $(CMD_FILE) >$@; \
+    ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \
+    if test -s $(ERR_FILE); then $(CAT) $(ERR_FILE) >>$@; else $(RM) $(ERR_FILE); fi
+
+# テストの結果をログに出力
+REPORT_TEST = if test ! -s $^; then $(ECHO) "$(TEST): Test Success $(DATE)"  >>$@; else $(ECHO) "$(TEST): Test Failure $(DATE)" >>$@; fi;
diff --git a/selftest/unittest/Makefile b/selftest/unittest/Makefile
new file mode 100644 (file)
index 0000000..f31df90
--- /dev/null
@@ -0,0 +1,53 @@
+# autotest.mk > template > Group.mk
+# テストグループのMakefile
+#
+# オペレーター
+# make         : すべてのテストを実施し、ログファイルを作成
+# make check   : ↓
+# make create  : TESTNAMEで指定されたテストを新規に作成
+# make set     : すべてのテストの、想定結果を出力
+# make checkeach: すべてのテストを実施
+# make report  : ログファイルから、テストの結果をレポート
+# make clean   : すべてのテストで、"make" で生成されたファイルをクリア
+# make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア
+
+include Define.beta.mk
+
+.PHONY: check create set checkeach report clean cleanall
+
+check: checkeach report
+
+create:
+ifndef TEST
+       @$(ECHO) "no test created. set TEST."
+else
+       @$(MKDIR) $(TEST)
+       @for ifile in $(DEF_FILE) $(TEST_MAKEFILE); do $(ECHO) "include ../$$ifile" >>$(TEST)/Makefile; done
+endif
+
+set:
+       @for target in $(TESTS); do $(MAKE) set -C $$target; done
+
+checkeach:
+       @$(RM) $(GROUP_LOG_FILE)
+       @for target in $(TESTS); do $(MAKE) check -C $$target; done
+
+$(GROUP_LOG_FILE):
+       @for target in $(TESTS); do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done
+
+report: $(GROUP_LOG_FILE)
+       @$(ECHO) "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
+         if test $(FAIL_TEST) -eq 0; then $(ECHO) "$(GROUP): All tests are succeded."; fi
+
+time: timeeach $(GROUP_TIME_FILE)
+       @$(CAT) $(GROUP_TIME_FILE)
+
+$(GROUP_TIME_FILE):
+       @for target in $(TESTS); do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done
+
+timeeach:
+       @for target in $(TESTS); do $(MAKE) time -C $$target; done
+
+clean:
+       @for target in $(TESTS); do $(MAKE) clean -C $$target; done
+       @$(RM) $(GROUP_LOG_FILE)
diff --git a/selftest/unittest/Test.mk b/selftest/unittest/Test.mk
new file mode 100644 (file)
index 0000000..0237f11
--- /dev/null
@@ -0,0 +1,46 @@
+# autotest.mk > test_template > Test.mk
+# 自動テスト用のMakefile
+#
+# 要: Define.mk
+#
+# オペレーター
+# make         : CMDの標準出力をTEST1_FILEに保存したあと、TEST0_FILEとの差分を比較し、結果をLOG_FILEに出力
+# make check   : ↓
+# make set     : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない
+# make reset   : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き
+# make time    : CMDの実行にかかった時間をTIME_FILEに保存し、出力
+# make cleantime: "make time" で作成されたファイルをクリア
+# make clean   : "make" で作成されたファイルをクリア
+# make cleanall: "make" と "make set" で作成されたファイルをクリア
+
+.PHONY: check set reset time cleantime clean cleanall
+
+check: clean $(LOG_FILE)
+
+set: $(TEST0_FILE)
+
+reset: cleanall $(TEST0_FILE)
+
+time: cleantime $(TIME_FILE)
+
+cleantime:
+       @$(RM) $(TIME_FILE)
+
+clean:
+       @$(RM) $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE) $(TIME_FILE)
+
+cleanall: clean
+       @$(RM) $(TEST0_FILE)
+
+$(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE)
+       @$(call exec_cmd,$^,$@,$(ERR_FILE))
+
+$(DIFF_FILE): $(TEST1_FILE)
+       @-$(DIFF) $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1
+
+$(LOG_FILE): $(DIFF_FILE)
+       @$(DESC)
+       @$(REPORT_TEST)
+
+$(TIME_FILE): $(CMD_FILE)
+       @$(TIME) ./$(CMD_FILE) 1>/dev/null && $(CAT) $@
diff --git a/selftest/unittest/UNITTEST.log b/selftest/unittest/UNITTEST.log
new file mode 100644 (file)
index 0000000..073685d
--- /dev/null
@@ -0,0 +1 @@
+create_testmkfile : no time.
diff --git a/selftest/unittest/create_testmkfile/0.mk b/selftest/unittest/create_testmkfile/0.mk
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/selftest/unittest/create_testmkfile/0.txt b/selftest/unittest/create_testmkfile/0.txt
new file mode 100644 (file)
index 0000000..52c493f
--- /dev/null
@@ -0,0 +1,3 @@
+make -s utest && cat 0.mk
+include ../Define.mk
+include ../Test.mk
diff --git a/selftest/unittest/create_testmkfile/Makefile b/selftest/unittest/create_testmkfile/Makefile
new file mode 100644 (file)
index 0000000..04dbf90
--- /dev/null
@@ -0,0 +1,5 @@
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+       $(call create_testmkfile,0.mk)
diff --git a/selftest/unittest/create_testmkfile/cmd b/selftest/unittest/create_testmkfile/cmd
new file mode 100755 (executable)
index 0000000..af4f97e
--- /dev/null
@@ -0,0 +1 @@
+make -s utest && cat 0.mk
diff --git a/selftest/unittest/create_testmkfile/desc.txt b/selftest/unittest/create_testmkfile/desc.txt
new file mode 100644 (file)
index 0000000..a9ada04
--- /dev/null
@@ -0,0 +1 @@
+TESTディレクトリーのMakefileを作成
diff --git a/selftest/unittest/create_testmkfile/testmkfile.mk b/selftest/unittest/create_testmkfile/testmkfile.mk
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/selftest/unittest/desc_log/0.log b/selftest/unittest/desc_log/0.log
new file mode 100644 (file)
index 0000000..2669eb2
--- /dev/null
@@ -0,0 +1 @@
+説明ファイルの内容を、引数のファイルに出力
diff --git a/selftest/unittest/desc_log/0.txt b/selftest/unittest/desc_log/0.txt
new file mode 100644 (file)
index 0000000..b49f821
--- /dev/null
@@ -0,0 +1,2 @@
+make -s utest && cat 0.log
+説明ファイルの内容を、引数のファイルに出力
diff --git a/selftest/unittest/desc_log/Makefile b/selftest/unittest/desc_log/Makefile
new file mode 100644 (file)
index 0000000..34bed81
--- /dev/null
@@ -0,0 +1,6 @@
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+       $(RM) 0.log
+       $(call desc_log,0.log)
diff --git a/selftest/unittest/desc_log/cmd b/selftest/unittest/desc_log/cmd
new file mode 100755 (executable)
index 0000000..79c4c9e
--- /dev/null
@@ -0,0 +1 @@
+make -s utest && cat 0.log
diff --git a/selftest/unittest/desc_log/desc.txt b/selftest/unittest/desc_log/desc.txt
new file mode 100644 (file)
index 0000000..2669eb2
--- /dev/null
@@ -0,0 +1 @@
+説明ファイルの内容を、引数のファイルに出力
diff --git a/selftest/unittest/exec_cmd/0.txt b/selftest/unittest/exec_cmd/0.txt
new file mode 100644 (file)
index 0000000..02c12fb
--- /dev/null
@@ -0,0 +1,3 @@
+make -s utest && cat 00.txt
+expr 2 + 3
+5
diff --git a/selftest/unittest/exec_cmd/00.txt b/selftest/unittest/exec_cmd/00.txt
new file mode 100644 (file)
index 0000000..2333bdb
--- /dev/null
@@ -0,0 +1,2 @@
+expr 2 + 3
+5
diff --git a/selftest/unittest/exec_cmd/Makefile b/selftest/unittest/exec_cmd/Makefile
new file mode 100644 (file)
index 0000000..4c6f8b6
--- /dev/null
@@ -0,0 +1,5 @@
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+       $(call exec_cmd,cmd0,00.txt,uerr.txt)
diff --git a/selftest/unittest/exec_cmd/cmd b/selftest/unittest/exec_cmd/cmd
new file mode 100755 (executable)
index 0000000..52943b1
--- /dev/null
@@ -0,0 +1 @@
+make -s utest && cat 00.txt
diff --git a/selftest/unittest/exec_cmd/cmd0 b/selftest/unittest/exec_cmd/cmd0
new file mode 100755 (executable)
index 0000000..e7457ab
--- /dev/null
@@ -0,0 +1 @@
+expr 2 + 3
diff --git a/selftest/unittest/exec_cmd/desc.txt b/selftest/unittest/exec_cmd/desc.txt
new file mode 100644 (file)
index 0000000..a9ada04
--- /dev/null
@@ -0,0 +1 @@
+TESTディレクトリーのMakefileを作成
index e114af6..943f724 100644 (file)
@@ -31,15 +31,21 @@ SUCCESS_TEST = $(shell grep "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | wc -l
 # 失敗したテストの数。テストグループログファイルから取得
 FAIL_TEST = $(shell grep "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | wc -l)
 
-# すべてのテストの数
+# すべてのテストの数
 ALL_TEST = $(shell expr $(SUCCESS_TEST) + $(FAIL_TEST))
 
+#テストグループ計時ファイル
+GROUP_TIME_FILE = $(shell echo $(GROUP) | tr '[a-z]' '[A-Z]').log
+
 ######################################################################
 # テストのディレクトリー
 ######################################################################
 # テスト名。カレントディレクトリー名から取得
 TEST = $(notdir $(shell pwd))
 
+# 現在の日時
+DATE = $(shell date +"%F %T")
+
 # テストコマンドファイル
 CMD_FILE = cmd
 
@@ -61,15 +67,48 @@ ERR_FILE = err.txt
 # テストログファイル
 LOG_FILE = test.log
 
-# 現在の日時
-DATE = `date +"%F %T"`
+# 実行時間ファイル
+TIME_FILE = time.log
+
+######################################################################
+# コマンド
+######################################################################
+
+CP := cp
+
+CAT := cat
+
+MKDIR := mkdir
 
-# テスト実行コマンド。CMD_FILEを実行する。
-# ファイルの内容と、テスト結果を表す標準出力を、ターゲットファイルに保存。
+RM := rm -f
+
+ECHO := echo
+
+TIME := /usr/bin/time
+
+DIFF := diff -c
+
+DEV_NULL := /dev/null
+
+CHMOD := chmod
+
+DESC = if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi;
+
+# 2ファイルの差分を出力。引数は2ファイル
+DIFF = diff -c
+
+# ファイルを実行可能にする。引数は1ファイル
+CHMOD = chmod u+x
+
+# テスト実行コマンド。
+# ファイルの内容と、CMD_FILE実行の標準出力を、ターゲットファイルに保存。
 # エラー発生時は、エラー出力をターゲットファイルとERR_FILEに保存。
 # ターゲットファイルは、TEST0_FILEまたはTEST1_FILE
 CMD = \
-    chmod u+x $(CMD_FILE); \
-    cat $(CMD_FILE) >$@; \
+    $(CHMOD) $(CMD_FILE); \
+    $(CAT) $(CMD_FILE) >$@; \
     ./$(CMD_FILE) >>$@ 2>$(ERR_FILE); \
-    if test -s $(ERR_FILE); then cat $(ERR_FILE) >>$@; else rm -f $(ERR_FILE); fi
+    if test -s $(ERR_FILE); then $(CAT) $(ERR_FILE) >>$@; else $(RM) $(ERR_FILE); fi
+
+# テストの結果をログに出力
+REPORT_TEST = if test ! -s $^; then $(ECHO) "$(TEST): Test Success $(DATE)"  >>$@; else $(ECHO) "$(TEST): Test Failure $(DATE)" >>$@; fi;
index a66c1f8..ef976d2 100644 (file)
@@ -19,30 +19,35 @@ check: checkeach report
 
 create:
 ifndef TEST
-       @echo "no test created. set TEST."
+       @$(ECHO) "no test created. set TEST."
 else
-       @mkdir $(TEST)
-       @for ifile in $(DEF_FILE) $(TEST_MAKEFILE); do echo "include ../$$ifile" >>$(TEST)/Makefile; done
+       @$(MKDIR) $(TEST)
+       @for ifile in $(DEF_FILE) $(TEST_MAKEFILE); do $(ECHO) "include ../$$ifile" >>$(TEST)/Makefile; done
 endif
 
 set:
        @for target in $(TESTS); do $(MAKE) set -C $$target; done
 
 checkeach:
-       @rm -f $(GROUP_LOG_FILE)
+       @$(RM) $(GROUP_LOG_FILE)
        @for target in $(TESTS); do $(MAKE) check -C $$target; done
 
 $(GROUP_LOG_FILE):
-       @for target in $(TESTS); do (echo<$$target/$(LOG_FILE) && cat <$$target/$(LOG_FILE)) >>$@ || echo $$target ": no log." >>$@; done
+       @for target in $(TESTS); do ($(ECHO) <$$target/$(LOG_FILE) && $(CAT) <$$target/$(LOG_FILE)) >>$@ || $(ECHO) $$target ": no log." >>$@; done
 
 report: $(GROUP_LOG_FILE)
-       @echo "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
-         if test $(FAIL_TEST) -eq 0; then echo "$(GROUP): All tests are succeded."; fi
+       @$(ECHO) "$(GROUP): $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in `pwd`/$(GROUP_LOG_FILE)"; \
+         if test $(FAIL_TEST) -eq 0; then $(ECHO) "$(GROUP): All tests are succeded."; fi
+
+time: timeeach $(GROUP_TIME_FILE)
+       @$(CAT) $(GROUP_TIME_FILE)
+
+$(GROUP_TIME_FILE):
+       @for target in $(TESTS); do ($(ECHO)<$$target/$(LOG_FILE) && $(CAT) <$$target/$(TIME_FILE)) >>$@ || $(ECHO) $$target ": no time." >>$@; done
+
+timeeach:
+       @for target in $(TESTS); do $(MAKE) time -C $$target; done
 
 clean:
        @for target in $(TESTS); do $(MAKE) clean -C $$target; done
-       @rm -f $(GROUP_LOG_FILE)
-
-cleanall:
-       @for target in $(TESTS); do $(MAKE) cleanall -C $$target; done
-       @rm -f $(GROUP_LOG_FILE)
+       @$(RM) $(GROUP_LOG_FILE)
index 92f36c5..0385c8f 100644 (file)
@@ -5,14 +5,17 @@
 # make            : テストグループディレクトリーを作成
 # make creategroup: ↓
 
+# 変数やマクロの定義
 include Define.mk
 
+# テストグループのMakefileとしてコピーされるファイル
+GROUP_MAKEFILE := Group.mk
+
+# テストグループディレクトリーを作成
 creategroup:
-ifndef GROUPDIR
-       @echo "no test group created. set GROUPDIR."
-else
-       @mkdir $(GROUPDIR)
-       @cp $(GROUP_MAKEFILE) $(GROUPDIR)/Makefile
-       @cp $(TEST_MAKEFILE) $(GROUPDIR)/
-       @cp $(DEF_FILE) $(GROUPDIR)/
-endif
+       @$(call err_var_null,GROUPDIR)
+       @$(call err_file_ext,GROUPDIR)
+       @$(MKDIR) $(GROUPDIR)
+       @$(CP) $(GROUP_MAKEFILE) $(GROUPDIR)/Makefile
+       @$(CP) $(TEST_MAKEFILE) $(GROUPDIR)/
+       @$(CP) $(DEF_FILE) $(GROUPDIR)/
index cf5979b..5962b23 100644 (file)
@@ -1,16 +1,19 @@
-# autotest.mk > test_template > test.mk
+# autotest.mk > test_template > Test.mk
 # 自動テスト用のMakefile
 #
 # 要: Define.mk
 #
 # オペレーター
-# make         : CMDã\81§è¨­å®\9aã\81\95ã\82\8cã\81\9fã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cã\81\97ã\81\9få\87ºå\8a\9bçµ\90æ\9e\9cã\82\921.txtã\81«å\87ºå\8a\9bã\81\97ã\80\810.txtã\81¨æ¯\94è¼\83ã\81\97ã\80\81ã\83¬ã\83\9dã\83¼ã\83\88
+# make         : CMDã\81®æ¨\99æº\96å\87ºå\8a\9bã\82\92TEST1_FILEã\81«ä¿\9då­\98ã\81\97ã\81\9fã\81\82ã\81¨ã\80\81TEST0_FILEã\81¨ã\81®å·®å\88\86ã\82\92æ¯\94è¼\83ã\81\97ã\80\81çµ\90æ\9e\9cã\82\92LOG_FILEã\81«å\87ºå\8a\9b
 # make check   : ↓
-# make prepare : CMDで設定されたコマンドを実行した出力結果を0.txt(テストの想定結果)に出力
-# make clean   : 「make」で生成されたファイルをクリア
-# make cleanall: 「make」と「make prepare」で生成されたファイルをクリア
+# make set     : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない
+# make reset   : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き
+# make time    : CMDの実行にかかった時間をTIME_FILEに保存し、出力
+# make cleantime: "make time" で作成されたファイルをクリア
+# make clean   : "make" で作成されたファイルをクリア
+# make cleanall: "make" と "make set" で作成されたファイルをクリア
 
-.PHONY: check set reset clean cleanall
+.PHONY: check set reset time cleantime clean cleanall
 
 check: clean $(LOG_FILE)
 
@@ -18,18 +21,26 @@ set: $(TEST0_FILE)
 
 reset: cleanall $(TEST0_FILE)
 
+time: cleantime $(TIME_FILE)
+
+cleantime:
+       @$(RM) $(TIME_FILE)
+
 clean:
-       @rm -f $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE)
+       @$(RM) $(TEST1_FILE) $(DIFF_FILE) $(LOG_FILE) $(ERR_FILE) $(TIME_FILE)
 
 cleanall: clean
-       @rm -f $(TEST0_FILE)
+       @$(RM) $(TEST0_FILE)
 
-$(TEST0_FILE) $(TEST1_FILE):
-       @if test ! -s $(CMD_FILE); then echo "set command file: $(CMD_FILE)."; else $(CMD); fi
+$(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE)
+       @-$(CMD)
 
 $(DIFF_FILE): $(TEST1_FILE)
-       @-diff -c $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1
+       @-$(DIFF) $(TEST0_FILE) $(TEST1_FILE) >$@ 2>&1
 
 $(LOG_FILE): $(DIFF_FILE)
-       @if test -s $(DESC_FILE); then cat $(DESC_FILE) >>$@; fi;
-       @if test ! -s $^; then echo "$(TEST): Test Success $(DATE)"  >>$@; else echo "$(TEST): Test Failure $(DATE)" >>$@; fi;
+       @$(DESC)
+       @$(REPORT_TEST)
+
+$(TIME_FILE): $(CMD_FILE)
+       @$(TIME) ./$(CMD_FILE) 1>/dev/null && $(CAT) $@