From 547efbd5c0b7927f35fd0f418280ec7483c7ed24 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Thu, 16 Jul 2026 15:03:21 +0900 Subject: [PATCH] =?utf8?q?inl.casl=E3=81=AA=E3=81=A9=E3=81=AE=E4=BF=AE?= =?utf8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit https://claude.ai/chat/a24e368a-2a83-425d-9c6b-7c1bd950e4fd --- .gitignore | 1 + as/sample/call_abs.casl | 2 +- as/sample/call_inl.casl | 16 ++-- as/sample/call_inl0.casl | 7 ++ as/sample/call_inl1.casl | 21 +++++ as/sample/call_mull1.casl | 5 ++ as/sample/call_outa.casl | 2 +- as/src/inl.casl | 7 +- as/src/str2l.casl | 31 +++---- test/Define.mk | 169 ++++++++++++++++++++++++++++++++++++++ test/Makefile | 155 ++++++++++++++++++++++++++++++++++ test/Test.mk | 168 +++++++++++++++++++++++++++++++++++++ test/inl1/0.txt | 11 +++ test/inl1/1.txt | 11 +++ test/inl1/Makefile | 2 + test/inl1/cmd | 1 + test/inl1/detail.log | 41 +++++++++ test/inl1/input.txt | 11 +++ test/inl1/summary.log | 2 + 19 files changed, 639 insertions(+), 24 deletions(-) create mode 100644 .gitignore create mode 100644 as/sample/call_inl0.casl create mode 100644 as/sample/call_inl1.casl create mode 100644 as/sample/call_mull1.casl create mode 100644 test/Define.mk create mode 100644 test/Makefile create mode 100644 test/Test.mk create mode 100644 test/inl1/0.txt create mode 100644 test/inl1/1.txt create mode 100644 test/inl1/Makefile create mode 100755 test/inl1/cmd create mode 100644 test/inl1/detail.log create mode 100644 test/inl1/input.txt create mode 100644 test/inl1/summary.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5761abc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/as/sample/call_abs.casl b/as/sample/call_abs.casl index 476e902..96a21a2 100644 --- a/as/sample/call_abs.casl +++ b/as/sample/call_abs.casl @@ -1,5 +1,5 @@ ;;; ABSを呼び出す -;;; casl2 call_abs.casl ../stdlib.casl +;;; casl2 call_abs.casl ../outa.casl MAIN START LAD GR2,0 MLOOP CPA GR2,MLEN diff --git a/as/sample/call_inl.casl b/as/sample/call_inl.casl index 6c770fa..aca44fd 100644 --- a/as/sample/call_inl.casl +++ b/as/sample/call_inl.casl @@ -2,18 +2,24 @@ MAIN START LOOP CALL INL ; GR1に数値、GR2に文字列の長さ JOV NAN - JMI BIG + CPL GR2,EOF + JZE FIN LD GR2,GR2 JZE FIN CALL OUTL JUMP LOOP -NAN OUT NANMSG,NANLEN +NAN CPL GR4,NANNUM + JNZ OV + OUT NANMSG,NANLEN JUMP LOOP -BIG OUT BIGMSG,BIGLEN +OV OUT OVMSG,OVLEN JUMP LOOP FIN RET +EOF DC #FFFF +OVNUM DC #0001 +OVMSG DC 'Over 65535' +OVLEN DC 10 +NANNUM DC #FFFF NANMSG DC 'Not a number' NANLEN DC 12 -BIGMSG DC 'Over 65535' -BIGLEN DC 10 END diff --git a/as/sample/call_inl0.casl b/as/sample/call_inl0.casl new file mode 100644 index 0000000..fd16c85 --- /dev/null +++ b/as/sample/call_inl0.casl @@ -0,0 +1,7 @@ +;;; casl2 call_inl0.casl ../inl.casl +MAIN START + CALL INL ; GR1に数値、GR2に文字列の長さ + ST GR1,A + RET +A DS 1 + END diff --git a/as/sample/call_inl1.casl b/as/sample/call_inl1.casl new file mode 100644 index 0000000..be507a7 --- /dev/null +++ b/as/sample/call_inl1.casl @@ -0,0 +1,21 @@ +;;; casl2 inl.casl ../casl2lib/inl.casl ../casl2lib/outl.casl +MAIN START +LOOP CALL INL ; GR1に数値、GR2に文字列の長さ + JOV NAN + JMI BIG + CPL GR2,EOF + JZE FIN + LD GR2,GR2 + JZE FIN + JUMP LOOP +NAN OUT NANMSG,NANLEN + JUMP LOOP +BIG OUT BIGMSG,BIGLEN + JUMP LOOP +FIN RET +EOF DC #FFFF +NANMSG DC 'Not a number' +NANLEN DC 12 +BIGMSG DC 'Over 65535' +BIGLEN DC 10 + END diff --git a/as/sample/call_mull1.casl b/as/sample/call_mull1.casl new file mode 100644 index 0000000..46f9ac8 --- /dev/null +++ b/as/sample/call_mull1.casl @@ -0,0 +1,5 @@ +MAIN START + LAD GR1,9999 + LAD GR2,10 + CALL MULL ; GR3 <- GR1 * GR2 + END diff --git a/as/sample/call_outa.casl b/as/sample/call_outa.casl index b2aaf05..be444fd 100644 --- a/as/sample/call_outa.casl +++ b/as/sample/call_outa.casl @@ -1,4 +1,4 @@ -;; casl2 outi_call.casl outi.casl +;; casl2 call_outa.casl ../outa.casl MAIN START LAD GR1,VAL LAD GR2,0 diff --git a/as/src/inl.casl b/as/src/inl.casl index 5e13109..1969577 100644 --- a/as/src/inl.casl +++ b/as/src/inl.casl @@ -7,15 +7,16 @@ INL START PUSH 0,GR3 IN IBUF,ILEN ; 入力文字列を格納 - LAD GR1,IBUF LD GR2,ILEN + CPL GR2,EOF + JZE FIN + LAD GR1,IBUF CALL STR2L JOV FIN - JMI FIN LD GR1,GR3 FIN POP GR3 RET IBUF DS 5 ILEN DS 1 -MAXLEN DC 5 +EOF DC #FFFF END diff --git a/as/src/str2l.casl b/as/src/str2l.casl index dec0b9d..73a4fb5 100644 --- a/as/src/str2l.casl +++ b/as/src/str2l.casl @@ -1,22 +1,20 @@ ;;; 10進数の整数を表す文字列を数値に変換 ;;; 数値の範囲は、0から65535 ;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス -;;; GR2: 文字列の長さ。最大5けた +;;; 入力 GR2: 文字列の長さ。最大5けた ;;; 出力 GR3: 数値 -;;; 文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1 -;;; 数値以外の場合、OFは1 +;;; 出力 GR4: エラーコード 0:範囲内の数値 #0001:エラー範囲外数値 #FFFF:エラー ;;; 依存プログラム: MULL STR2L START PUSH 0,GR1 PUSH 0,GR2 - PUSH 0,GR4 PUSH 0,GR5 PUSH 0,GR6 PUSH 0,GR7 XOR GR3,GR3 ; GR3の初期化 AND GR2,GR2 ; GR2 = 0の場合、OVへジャンプ JZE OV ; ↓ - CPL GR2,=5 ; GR2 > 5の場合、OVへジャンプ + CPL GR2,MAXLEN ; GR2 > MAXLENの場合、OVへジャンプ JPL OV ; ↓ XOR GR4,GR4 ; GR4: インデックスの初期化 LD GR5,GR1 ; GR5 <- GR1 @@ -25,31 +23,36 @@ STR2L START STOL LD GR1,GR5 ; GR1に、入力文字列中の次の桁を格納 ADDL GR1,GR4 ; ↓ LD GR1,0,GR1 ; ↓ - LD GR7,ZERO ; GR1 < '0'の場合、FINへジャンプ + LD GR7,ZERO ; GR1 < '0'の場合、NANへジャンプ CPL GR1,GR7 ; ↓ - JMI FIN ; ↓ - LD GR7,NINE ; GR1 > '9'の場合、FINへジャンプ + JMI NAN ; ↓ + LD GR7,NINE ; GR1 > '9'の場合、NANへジャンプ CPL GR7,GR1 ; ↓ - JMI FIN ; ↓ + JMI NAN ; ↓ SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換 - ADDL GR3,GR1 - JOV FIN + ADDL GR3,GR1 ; GR3 <- GR1 + JOV OV ; 足し算の結果がオーバーフローの場合、OVへジャンプ LAD GR4,1,GR4 ; GR4 <- GR4 + 1 CPL GR4,GR6 ; GR4 = GR6の場合、ループ脱出 JZE FIN ; ↓ -MUL10 LAD GR2,10 ; GR2:10進数の 10 +MUL10 LD GR2,BASE ; GR2:BASE LD GR1,GR3 ; GR1 <- GR3 CALL MULL ; MULLを呼び出し、GR3 <- GR1 * GR2 + JOV OV ; MULLのオーバーフロー時はOVにジャンプ JUMP STOL ; ループ終端 -OV LAD GR7,1 ; オーバーフロー発生 +NAN LAD GR4,#FFFF ; GR4 <- #FFFF + JUMP SETOV ; SETOVへ無条件ジャンプ +OV LAD GR4,1 ; GR4 <- 1 +SETOV LAD GR7,1 ; 強制オーバーフロー SRL GR7,1 ; ↓ FIN POP GR7 POP GR6 POP GR5 - POP GR4 POP GR2 POP GR1 RET ZERO DC '0' NINE DC '9' +MAXLEN DC 5 +BASE DC 10 END diff --git a/test/Define.mk b/test/Define.mk new file mode 100644 index 0000000..74f4c33 --- /dev/null +++ b/test/Define.mk @@ -0,0 +1,169 @@ +# autotest.mk > test_template > Define.mk +# 自動テスト用の変数、マクロ定義 + +ifndef DEFINE_INCLUDED +DEFINE_INCLUDED = 1 + +# シェルコマンドをデバッグするときは、DEBUGSH変数を設定してmakeを実行する +# 例: DEBUGSH=1 make +ifdef DEBUGSH + SHELL := /bin/sh -x +endif + +# 現在の日時 +DATE = $(shell date +"%F %T") + +# Makefile +MAKEFILE := Makefile + +###################################################################### +# コマンド +###################################################################### + +CAT := cat +CHMOD := chmod +CP := cp +DEV_NULL := /dev/null +DIFF := diff -c +ECHO := echo +EXPR := expr +FILE := file -b -e ascii +FIND := find +GREP := grep +LINECOUNT := wc -l +LN := ln -s +MKDIR := mkdir -p +MV := mv +PRINTF := printf +REALPATH := realpath +SED := sed +TEST := test +TIME := time +TR := tr +VALGRIND := valgrind +VALGRIND_LOGFILE := _valgrind.log +VALGRINDFLAG := -q --leak-check=full --show-leak-kinds=all --log-file=$(VALGRIND_LOGFILE) +VALGRIND_CMDLOGFILE := valgrind.log + +###################################################################### +# テストグループとテストでの共通マクロ +###################################################################### + +# chk_var_null: 引数がNULLの場合、エラー +# 用例: $(call chk_var_null,var) +define chk_var_null + $(if $1,,$(error NULL argument)) +endef + +# chk_file_ext: 指定されたファイルが実在する場合、エラー +# 用例: $(call chk_file_ext,file) +define chk_file_ext + $(if $(wildcard $1),$(error $1 exists in $(CURDIR))) +endef + +# 指定したディレクトリーを作成 +# 引数は、ディレクトリー名 +# 用例: $(call create_dir,name) +define create_dir + $(call chk_var_null,$1) + $(call chk_file_ext,$1) + $(MKDIR) $1 +endef + + +# ファイル1からファイル2への相対パス +# 引数は、ファイル名1、ファイル名2 +# 用例: $(call rel_to,file1,file2) +define rel_to + $(strip $(shell $(REALPATH) --relative-to=$1 $2)) +endef + +# テストディレクトリーのMakefileを作成 +# 引数は、Makefile名、依存ファイル群 +# 用例: $(call create_makefile,file,list_include_file) +define create_makefile + $(RM) $1 + $(foreach infile,$2,$(ECHO) "include ../$(infile)" >>$1; ) + $(if $(filter $(SRC),c),$(call puts_cmd_c,$1)) +endef + +# C言語の関数をテストするための設定を、指定されたファイルに出力 +# 引数は、ファイル名 +# 用例: $(call puts_cmd_c,file) +define puts_cmd_c + $(ECHO) >>$1 + $(ECHO) "CC := gcc" >>$1 + $(ECHO) "CFLAGS := -Wall" >>$1 + $(ECHO) >>$1 + $(ECHO) ".INTERMEDIATE:" "$$""(CMD_FILE)" >>$1 + $(ECHO) >>$1 + $(ECHO) "CMDSRC_FILE := cmd.c" >>$1 + $(ECHO) "TESTTARGET_FILES := # Set test target files" >>$1 + $(ECHO) >>$1 + $(ECHO) "$$""(CMD_FILE):" "$$""(CMDSRC_FILE)" "$$""(TESTTARGET_FILES)" >>$1 + $(ECHO) " ""$$""(CC)" "$$""(CFLAGS)" "-o" "$$""@" "$$""^" >>$1 +endef + +###################################################################### +# テストグループのディレクトリー +###################################################################### + +# テストグループとテストの変数を定義したMakefile +DEFINE_FILE := Define.mk + +# テストのターゲットを定義したMakefile +TEST_MAKEFILE := Test.mk + +# テストグループのMakefileとしてコピーされるファイル +GROUP_MAKEFILE := Group.mk + +# DEFINE_FILEの相対パス +DEFINE_FILE_REL = $(call rel_to,$(GROUPDIR),$(DEFINE_FILE)) + +# TEST_MAKEFILEの相対パス +TEST_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(TEST_MAKEFILE)) + +# GROUP_MAKEFILEの相対パス +GROUP_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(GROUP_MAKEFILE)) + +###################################################################### +# テストのディレクトリー +###################################################################### + +# テストコマンドファイル +CMD_FILE := cmd + +# valgrindテストコマンドファイル +VALGRIND_CMD_FILE := cmd_valgrind + +# テスト説明ファイル +DESC_FILE := desc.txt + +# テスト想定ファイル +TEST0_FILE := 0.txt + +# テスト結果ファイル +TEST1_FILE := 1.txt + +# テストの、想定結果と結果の差分ファイル +DIFF_FILE := diff.log + +# テストエラーファイル +ERR_FILE := err.log + +# テストログファイル +LOG_FILE := summary.log + +# 実行時間ファイル +TIME_FILE := time.log + +# valgrindによるメモリーチェックファイル +VALGRIND_FILE := valgrind.log + +# テスト詳細レポートファイル +DETAIL_FILE := detail.log + +# テストの結果として作成されるファイル群 +TEST_RES_FILES := $(TEST1_FILE) $(DIFF_FILE) $(ERR_FILE) $(LOG_FILE) $(DETAIL_FILE) $(TIME_FILE) + +endif diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..d143c7e --- /dev/null +++ b/test/Makefile @@ -0,0 +1,155 @@ +# autotest.mk > template > Group.mk +# テストグループのMakefile +# +# オペレーター +# make : すべてのテストを実行し、結果をログファイルに出力 +# make check : ↓ +# make checkall : すべてのテストを実行し、結果と実行時間をログファイルに出力 +# make time : すべてのテストを実行し、実行時間をログファイルに出力 +# make create : TESTNAMEで指定されたテストを新規に作成 +# make clean : すべてのテストで、"make" で生成されたファイルをクリア +# make time-clean: すべてのテストで、実行時間のログファイルをクリア +# make valgrind: すべてのテストで、valgrindによるメモリリークチェックを実行する +# make valgrind-clean: すべてのテストで、valgrindのログファイルをクリア + +include Define.mk + +verbose ?= 1 + +###################################################################### +# テストグループのディレクトリー +###################################################################### + +# グループディレクトリー +GROUP_DIR := $(CURDIR) + +# グループ名。ディレクトリ名から取得 +GROUP := $(notdir $(GROUP_DIR)) + +# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー +TESTS := $(notdir $(shell $(FIND) . -maxdepth 1 -name "[^A-Z.]*" -type d)) + +# テストグループログファイル +GROUP_LOG_FILE := $(shell $(ECHO) $(GROUP) | $(TR) '[a-z]' '[A-Z]').log + +# テストグループレポートファイル +GROUP_REPORT_FILE := Summary.log + +# テストグループ実行時間ファイル +GROUP_TIME_FILE := $(shell echo $(GROUP) | $(TR) '[a-z]' '[A-Z]')_time.log + +# テストグループvalgrindファイル +GROUP_VALGRIND_FILE := $(shell echo $(GROUP) | $(TR) '[a-z]' '[A-Z]')_valgrind.log + +# グループで、テスト結果として作成されるファイル群 +GROUP_RES_FILES := $(GROUP_LOG_FILE) $(GROUP_REPORT_FILE) $(GROUP_TIME_FILE) $(GROUP_VALGRIND_FILE) + +# テストごとのログファイル +TEST_LOG_FILES := $(foreach test,$(TESTS),$(test)/$(LOG_FILE)) + +###################################################################### +# テストグループのマクロ +###################################################################### + +# テストごとのファイルをグループファイルに出力 +# 引数は、テストのリスト、グループファイル、テストファイル +# 用例: $(call group_log,files_test_log,file_group_log) +define group_log + $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $(words $1) tests') + $(foreach target,$1,$(call group_log_each,$(target),$2)) +endef + +# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル +# 用例: $(call group_log_each,file_test_log,file_group_log) +define group_log_each + $(ECHO) $(dir $1) >>$2; + if $(TEST) -s $1; then $(CAT) $1 >>$2; else $(ECHO) $(dir $1)": no log" >>$2; fi + $(ECHO) >>$2; +endef + +# 成功したテストの数。テストグループログファイルから取得 +SUCCESS_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | $(LINECOUNT)) + +# 失敗したテストの数。テストグループログファイルから取得 +FAIL_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | $(LINECOUNT)) + +# すべてのテストの数 +ALL_TEST = $(shell $(EXPR) $(SUCCESS_TEST) + $(FAIL_TEST)) + +# テストごとの実行時間ファイル +TEST_TIME_FILES := $(foreach test,$(TESTS),$(test)/$(TIME_FILE)) + +# テストごとのvalgrindファイル +TEST_VALGRIND_FILES := $(foreach test,$(TESTS),$(test)/$(VALGRIND_FILE)) + +# テストの結果を、グループログファイルを元にレポート。 +# 引数は、グループ名、グループログファイル、グループレポートファイル +# 用例: $(call group_report,name,file_log,file_report) +define group_report + $(ECHO) '$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Details in $(GROUP_DIR)/$2' >$3 + if $(TEST) $(FAIL_TEST) -eq 0; then $(ECHO) "$1: All tests are succeeded." >>$3; fi +endef + +# リストで指定したディレクトリーでmakeを実行 +# 用例: $(call make_targets,list_dir,target) +define make_targets + $(if $(filter 1,$(verbose)),$(ECHO) '$(CURDIR) - $2';) + $(foreach dir,$1,$(call make_target_each,$(dir),$2)) +endef + +# 指定したディレクトリーでmakeを実行 +# 用例: $(call make_target_each,tests,target) +define make_target_each + $(MAKE) $2 -sC $1; +endef + +.PHONY: check checkall time valgrind create clean time-clean valgrind-clean + +check checkall: clean $(GROUP_REPORT_FILE) + @$(CAT) $(GROUP_REPORT_FILE) + @(if $(TEST) $(FAIL_TEST) -gt 0; then $(GREP) 'Failure' $(GROUP_LOG_FILE); fi) + @exit $(FAIL_TEST) + +time: time-clean $(GROUP_TIME_FILE) + @$(CAT) $(GROUP_TIME_FILE) + +create: + @$(call create_dir,$(TEST)) + @$(call create_makefile,$(TEST)/$(MAKEFILE),$(MAKEFILES)) + +clean: + @$(call make_targets,$(TESTS),$@) + @$(RM) $(GROUP_RES_FILES); + +time-clean: + @$(call make_targets,$(TESTS),$@) + @$(RM) $(GROUP_TIME_FILE); + +valgrind: + @$(call make_targets,$(TESTS),$@) + @$(RM) $(GROUP_RES_FILES); + +valgrind-clean: + @$(call make_targets,$(TESTS),$@) + @$(RM) $(GROUP_VALGRIND_FILE); + +$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE) + @$(call group_report,$(GROUP),$^,$@) + +$(GROUP_LOG_FILE): $(TEST_LOG_FILES) + @$(call group_log,$^,$@) + +$(TEST_LOG_FILES): + @$(MAKE) $(MAKECMDGOALS) -sC $(dir $@) NODISP=1 + +$(GROUP_TIME_FILE): $(TEST_TIME_FILES) + @$(call group_log,$^,$@) + +$(TEST_TIME_FILES): + @$(MAKE) time -sC $(dir $@) + +$(GROUP_VALGRIND_FILE): $(TEST_VALGRIND_FILES) + @$(call group_log,$^,$@) + +$(TEST_VALGRIND_FILES): + @$(MAKE) time -sC $(dir $@) diff --git a/test/Test.mk b/test/Test.mk new file mode 100644 index 0000000..e8a3135 --- /dev/null +++ b/test/Test.mk @@ -0,0 +1,168 @@ +# 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 time-clean: "make time" で作成されたファイルをクリア +# make valgrind: valgrind CMDの標準出力をVARGRIND_FILEに保存 +# make clean : "make" で作成されたファイルをクリア +# make all-clean: "make" と "make set" で作成されたファイルをクリア + +###################################################################### +# マクロ +###################################################################### +# 指定されたファイルをチェックし、空の場合は削除 +# 引数は、対象ファイル +# 用例: $(call rm_null,file_target) +define rm_null + if test ! -s $1; then $(RM) $1; fi +endef + +# 説明ファイルの内容を、指定されたファイルに出力 +# 引数は、出力ファイル +# 用例: $(call desc_log,file_out) +define desc_log + if test -s $(DESC_FILE); then $(CAT) $(DESC_FILE) >>$1; fi +endef + +# テスト実行の経過時間を、指定されたファイルに出力して表示 +# 引数は、テスト名、コマンドファイル、出力ファイル +# 用例: $(call time_cmd,file_cmd,file_out) +define time_cmd + if test ! -x $1; then $(CHMOD) u+x $1; fi + ($(TIME) ./$1 1>$(DEV_NULL) 2>$(DEV_NULL)) 2>&1 | $(GREP) '^real' >$2 +endef + +VALGRIND_CMD = $(strip $(shell if test -s $(VALGRIND_CMD_FILE); then $(CAT) $(VALGRIND_CMD_FILE); elif test "`$(FILE) $(CMD_FILE)`" = "data"; then $(CAT) $(CMD_FILE); else $(PRINTF) "./$(CMD_FILE)"; fi)) + +# valgrindによるメモリーチェック結果を、指定されたファイルに出力して表示 +# 引数は、テスト名、コマンドファイル、出力ファイル +# 用例: $(call valgrind_cmd,file_cmd,file_out) +define valgrind_cmd + -$(VALGRIND) $(VALGRINDFLAG) $(VALGRIND_CMD) 1>/dev/null 2>&1 +endef + +# テスト実行コマンド +# コマンドファイルを実行し、標準出力を指定されたファイルに保存。 +# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。 +# 引数は、コマンドファイル、出力ファイル、エラーファイル +# 用例: $(call exec_cmd,file_cmd,file_out,file_err) +define exec_cmd + if test ! -x $1; then $(CHMOD) u+x $1; fi + ./$1 >>$2 2>$3 + if test -s $3; then $(CAT) $3 >>$2; fi + $(MV) $2 $2.tmp && $(SED) -e "s%$(CURDIR)%\$$PWD%g" $2.tmp >$2 && $(RM) $2.tmp + $(call rm_null,$3) +endef + +# 2つのファイルを比較し、差分ファイルを作成 +# 引数は、2ファイルのリスト、差分ファイル +# 用例: $(call diff_files,files,file_out) +define diff_files + $(DIFF) $1 >$2 2>&1 + $(call rm_null,$2) +endef + +# 差分ファイルの内容をログファイルに出力 +# 引数は、テスト名、差分ファイル、ログファイル +# 用例: $(call test_log,name,file_diff,file_log) +define test_log + $(call desc_log,$3) + if test ! -s $2; then RES=Success; else RES=Failure; fi; $(ECHO) "$1: Test $$RES $(DATE)" >>$3 + $(ECHO) "Details in $(CURDIR)/$(DETAIL_FILE)" >>$3 +endef + +# NODISPが設定されていない時は、ログファイルを表示 +# 引数は、ログファイル +# 用例: $(call disp_test_log,file_log) +define disp_test_log + $(if $(NODISP),,$(CAT) $1) +endef + +# ファイル群から、ファイル名とファイルの内容を指定されたファイルに出力 +# 引数は、対象ファイル群、出力ファイル +# 用例: $(call report_files,list_file_target,file_out) +define report_files + $(foreach tfile,$1,$(call report_file,$(tfile),$2)) +endef + +# ファイル名とファイルの内容を指定されたファイルに出力 +# 引数は、対象ファイル、出力ファイル +# 用例: $(call report_file,file_target,file_out) +define report_file + $(call chk_var_null,$1) + if test -s $1; then $(ECHO) "== $1 ==" >>$2; $(call echo_hr,$2); cat $1 >>$2; $(call echo_hr,$2); $(ECHO) >>$2; fi +endef + +define echo_hr + $(ECHO) "----------------------------------------------------------------------" >>$1 +endef + +# テスト名。カレントディレクトリー名から取得 +TEST = $(notdir $(CURDIR)) + +# コマンドファイルのソース +CMDSRC_FILE ?= $(CMD_FILE) + +.PHONY: check set reset clean all-clean time time-clean valgrind valgrind-clean + +check: clean $(DETAIL_FILE) + @$(call disp_test_log,$(LOG_FILE)) + +checkall: clean $(DETAIL_FILE) $(TIME_FILE) + @$(CAT) $(TIME_FILE) >>$(LOG_FILE) + @$(call disp_test_log,$(LOG_FILE)) + +set: $(CMD_FILE) + @$(call chk_file_ext,$(TEST0_FILE)) + @-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE)) + @$(CAT) $(TEST0_FILE) + +reset: all-clean $(CMD_FILE) + @-$(call exec_cmd,$(CMD_FILE),$(TEST0_FILE),$(ERR_FILE)) + @$(CAT) $(TEST0_FILE) + +clean: + @$(RM) $(TEST_RES_FILES) $(TIME_FILE) $(VALGRIND_LOGFILE) $(VALGRIND_CMDLOGFILE) core + +all-clean: clean + @$(RM) $(TEST0_FILE) + +time: time-clean $(TIME_FILE) + @$(CAT) $(TIME_FILE) + +time-clean: + @$(RM) $(TIME_FILE) + +valgrind: valgrind-clean $(VALGRIND_LOGFILE) $(VALGRIND_CMDLOGFILE) + if test -s $(VALGRIND_LOGFILE); then $(ECHO) $(CURDIR) && $(CAT) $(VALGRIND_LOGFILE); else $(RM) $(VALGRIND_LOGFILE); fi + +$(VALGRIND_CMDLOGFILE): $(VALGRIND_LOGFILE) + @$(PRINTF) "$(VALGRIND) $(VALGRINDFLAG) $(VALGRIND_CMD)\n" | $(CAT) - $(VALGRIND_LOGFILE) >$(VALGRIND_CMDLOGFILE) + +valgrind-clean: + @$(RM) $(VALGRIND_LOGFILE) + +$(TEST1_FILE): $(CMD_FILE) + @-$(call exec_cmd,$^,$@,$(ERR_FILE)) + +$(DIFF_FILE): $(TEST0_FILE) $(TEST1_FILE) + @-$(call diff_files,$^,$@) + +$(LOG_FILE): $(DIFF_FILE) + @$(call test_log,$(TEST),$^,$@) + +$(DETAIL_FILE): $(LOG_FILE) + @$(call report_files,$(LOG_FILE) $(CMDSRC_FILE) $(TEST0_FILE) $(ERR_FILE) $(DIFF_FILE) $(TEST1_FILE),$@) + +$(TIME_FILE): $(CMD_FILE) + @$(call time_cmd,$^,$@) + +$(VALGRIND_LOGFILE): $(CMD_FILE) + $(call valgrind_cmd,$^,$@) diff --git a/test/inl1/0.txt b/test/inl1/0.txt new file mode 100644 index 0000000..624f9a8 --- /dev/null +++ b/test/inl1/0.txt @@ -0,0 +1,11 @@ +0 +1 +32768 +65535 +Over 65535 +Over 65535 +Over 65535 +Not a number +Not a number +Not a number +Over 65535 diff --git a/test/inl1/1.txt b/test/inl1/1.txt new file mode 100644 index 0000000..624f9a8 --- /dev/null +++ b/test/inl1/1.txt @@ -0,0 +1,11 @@ +0 +1 +32768 +65535 +Over 65535 +Over 65535 +Over 65535 +Not a number +Not a number +Not a number +Over 65535 diff --git a/test/inl1/Makefile b/test/inl1/Makefile new file mode 100644 index 0000000..b6dac59 --- /dev/null +++ b/test/inl1/Makefile @@ -0,0 +1,2 @@ +include ../Define.mk +include ../Test.mk diff --git a/test/inl1/cmd b/test/inl1/cmd new file mode 100755 index 0000000..c367412 --- /dev/null +++ b/test/inl1/cmd @@ -0,0 +1 @@ +casl2 -M640 ../../as/sample/call_inl.casl ../../as/inl.casl ../../as/outl.casl