CC = gcc
-CFLAGS = -g
+CFLAGS = -g -lm
.PHPNY: clean
hoc1: hoc.o
$(CC) $(CFLAGS) -o $@ $^
#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'
| 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; }
-######################################################################
-# テストテンプレートのディレクトリー
-######################################################################
-# テストグループの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
# 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 $@
-# 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)
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),./$^,$@)
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+cat in.txt && ../../hoc1 < in.txt
+9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1
+
+ 9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+cat in.txt && ../../hoc1 < in.txt
--- /dev/null
+9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1
+
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
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+######################################################################
+# テストグループのディレクトリー
+######################################################################
+# テストグループとテストの両方で使う変数を定義したファイル
+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
--- /dev/null
+######################################################################
+# テストテンプレートのディレクトリー
+######################################################################
+# テストグループの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;
--- /dev/null
+# 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)
--- /dev/null
+# 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) $@
--- /dev/null
+create_testmkfile : no time.
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+make -s utest && cat 0.mk
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+ $(call create_testmkfile,0.mk)
--- /dev/null
+make -s utest && cat 0.mk
--- /dev/null
+TESTディレクトリーのMakefileを作成
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+説明ファイルの内容を、引数のファイルに出力
--- /dev/null
+make -s utest && cat 0.log
+説明ファイルの内容を、引数のファイルに出力
--- /dev/null
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+ $(RM) 0.log
+ $(call desc_log,0.log)
--- /dev/null
+make -s utest && cat 0.log
--- /dev/null
+説明ファイルの内容を、引数のファイルに出力
--- /dev/null
+make -s utest && cat 00.txt
+expr 2 + 3
+5
--- /dev/null
+expr 2 + 3
+5
--- /dev/null
+include ../Define.beta.mk
+include ../Test.mk
+
+utest:
+ $(call exec_cmd,cmd0,00.txt,uerr.txt)
--- /dev/null
+make -s utest && cat 00.txt
--- /dev/null
+expr 2 + 3
--- /dev/null
+TESTディレクトリーのMakefileを作成
# 失敗したテストの数。テストグループログファイルから取得
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
# テストログファイル
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;
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)
# 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)/
-# 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)
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) $@