#---*- Makefile -*-------------------------------------------------------
#$Author: saulius $
#$Date: 2022-04-24 10:33:00 +0000 (Sun, 24 Apr 2022) $
#$Revision: 311 $
#$URL: svn+ssh://saulius-grazulis.lt/home/saulius/svn-repositories/makefiles/multiscript-testing-inp-opt/Makelocal-multiscript-testing-inp-opt $
#------------------------------------------------------------------------

# Run tests in a test directory (tests/ by default) and report if
# all tests pass.

# USAGE:
#     make clean
#     make distclean
#     make tests
#     make

#------------------------------------------------------------------------------

BIN_DIR  ?= .

TEST_DIR ?= tests/cases
OUTP_DIR ?= tests/outputs

INP_FILES ?= ${wildcard ${TEST_DIR}/*.inp}
OPT_FILES ?= ${wildcard ${TEST_DIR}/*.opt}

TEST_FILES ?= $(sort ${INP_FILES} ${OPT_FILES})

DIFF_FILES += $(sort \
	${INP_FILES:${TEST_DIR}/%.inp=${OUTP_DIR}/%.diff} \
	${OPT_FILES:${TEST_DIR}/%.opt=${OUTP_DIR}/%.diff} \
)

OUTP_FILES += $(sort \
	${INP_FILES:${TEST_DIR}/%.inp=${OUTP_DIR}/%.out} \
	${OPT_FILES:${TEST_DIR}/%.opt=${OUTP_DIR}/%.out} \
)

.PHONY: all clean cleanAll distclean test tests out outputs

all:

#------------------------------------------------------------------------------

test tests: ${DIFF_FILES}

out outputs: ${OUTP_FILES}

#------------------------------------------------------------------------------

# Dependencies for the test files:

TEST_DEPENDENCIES = .test-inp-opt-depend

include ${TEST_DEPENDENCIES}

${TEST_DEPENDENCIES}: ${INP_FILES} ${OPT_FILES}
	date '+# %F %T %Z' > $@
	for i in $^; do \
		echo "$$i: $$(echo $$i | sed -e 's/_[0-9]*\..*$$//' \
			| sed 's,${TEST_DIR},${BIN_DIR},')" \
			| sed 's,.inp,.diff,' \
			| sed 's,.opt,.diff,' \
			| sed 's,/cases/,/outputs/,' \
		; \
	done | sort | uniq >> $@

#------------------------------------------------------------------------------

# Rules to run script-specific tests:

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.inp ${TEST_DIR}/%.opt ${OUTP_DIR}/%.out | ${TEST_PREREQUISITES}
	-@printf "%-50s " "$<:" ; \
	if [ ! -e ${TEST_DIR}/$*.chk ] || ${TEST_DIR}/$*.chk; then \
		test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
		${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
		    $(shell grep -v '^#' ${word 2, $^}) \
	    	$< 2>&1 \
		| diff -I 'Expires:\|Date:' ${OUTP_DIR}/$*.out - > $@ ; \
		if [ $$? = 0 ]; then echo "OK"; else echo "FAILED:"; cat $@; fi; \
	else \
		touch $@; \
	fi

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.inp ${OUTP_DIR}/%.out | ${TEST_PREREQUISITES}
	-@printf "%-50s " "$<:" ; \
	if [ ! -e ${TEST_DIR}/$*.chk ] || ${TEST_DIR}/$*.chk; then \
		test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
		${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
		    $< 2>&1 \
		| diff -I 'Expires:\|Date:' ${OUTP_DIR}/$*.out - > $@ ; \
		if [ $$? = 0 ]; then echo "OK"; else echo "FAILED:"; cat $@; fi; \
	else \
		touch $@; \
	fi

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.opt ${OUTP_DIR}/%.out | ${TEST_PREREQUISITES}
	-@printf "%-50s " "$<:" ; \
	if [ ! -e ${TEST_DIR}/$*.chk ] || ${TEST_DIR}/$*.chk; then \
		test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
		${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
		    $(shell grep -v '^#' $<) \
		2>&1 \
		| diff -I 'Expires:\|Date:' ${OUTP_DIR}/$*.out - > $@ ; \
		if [ $$? = 0 ]; then echo "OK"; else echo "FAILED:"; cat $@; fi; \
	else \
		touch $@; \
	fi

# Rules to generate sample test outputs:

${OUTP_DIR}/%.out: ${TEST_DIR}/%.inp ${TEST_DIR}/%.opt | ${TEST_PREREQUISITES}
	-@test -f $@ || echo "$@:"
	-@test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
	test -f $@ || \
	${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
	    $(shell grep -v '^#' ${word 2, $^}) \
	    $< \
	2>&1 \
	| tee $@
	-@touch $@

${OUTP_DIR}/%.out: ${TEST_DIR}/%.inp | ${TEST_PREREQUISITES}
	-@test -f $@ || echo "$@:"
	-@test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
	test -f $@ || \
	${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
	    $< \
	2>&1 \
	| tee $@
	-@touch $@

${OUTP_DIR}/%.out: ${TEST_DIR}/%.opt | ${TEST_PREREQUISITES}
	-@test -f $@ || echo "$@:"
	-@test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
	test -f $@ || \
	${BIN_DIR}/$(shell echo $* | sed -e 's/_[0-9]*$$//') \
	    $(shell grep -v '^#' $<) \
	2>&1 \
	| tee $@
	-@touch $@

#------------------------------------------------------------------------------

.PHONY: test-inp-opt-clean test-inp-opt-distclean

test-inp-opt-clean:
	rm -f ${DIFF_FILES}

test-inp-opt-distclean: test-inp-opt-clean
	rm -f ${TEST_DEPENDENCIES}

clean: test-inp-opt-clean

distclean cleanAll: test-inp-opt-distclean
