#---*- Makefile -*-------------------------------------------------------
#$Author: saulius $
#$Date: 2020-05-05 08:06:51 +0000 (Tue, 05 May 2020) $
#$Revision: 6980 $
#$URL: file:///home/saulius/svn-repositories/paskaitos/VU/software/assignment-evaluation/trunk/Makefile $
#------------------------------------------------------------------------

MAKECONF_FILES = ${filter-out %~, ${wildcard Makeconf*}}

ifneq ("${MAKECONF_FILES}","")
include ${MAKECONF_FILES}
endif

TEST_DIR = tests/cases
OUTP_DIR = tests/outputs

# The folowing variable MUST be terminated with "/" if it is not empty:
SCRIPT_DIR = scripts/

TEST_CASES_INP = $(wildcard ${TEST_DIR}/*.inp)
TEST_CASES_SH  = $(wildcard ${TEST_DIR}/*.sh)

TEST_INP_OUTPUTS = ${TEST_CASES_INP:${TEST_DIR}/%.inp=${OUTP_DIR}/%.out}
TEST_SH_OUTPUTS  = ${TEST_CASES_SH:${TEST_DIR}/%.sh=${OUTP_DIR}/%.out}

OUTPUTS = $(sort ${TEST_INP_OUTPUTS} ${TEST_SH_OUTPUTS})
DIFFS   = ${OUTPUTS:%.out=%.diff}

.PHONY: all test tests out outputs clean cleanAll distclean

all: tests

.PHONY: display

display:
	@echo ${VARIABLE}=${${VARIABLE}}

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

tests test: ${DIFFS}

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.inp ${TEST_DIR}/%.opt ${OUTP_DIR}/%.out
	@printf "%-30s: " $*
	@${SCRIPT_DIR}$(shell echo $* | sed -e 's/_[0-9]*$$//') \
		$$(grep -v '^#' $(word 2,$^)) \
		$< 2>&1 \
	| diff -I 'Id: ' $(lastword $^) - > $@; \
	if [ $$? -eq 0 ]; then \
		echo OK; \
	else \
		echo FAILED:; cat $@; \
	fi

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.inp ${OUTP_DIR}/%.out
	@printf "%-30s: " $*
	@${SCRIPT_DIR}$(shell echo $* | sed -e 's/_[0-9]*$$//') $< 2>&1 \
	| diff -I 'Id: ' $(lastword $^) - > $@; \
	if [ $$? -eq 0 ]; then \
		echo OK; \
	else \
		echo FAILED:; cat $@; \
	fi

${OUTP_DIR}/%.diff: ${TEST_DIR}/%.sh ${OUTP_DIR}/%.out
	-@printf "%-30s: " $* ; \
	if [ ! -e ${TEST_DIR}/$*.chk ] || ${TEST_DIR}/$*.chk; then \
		test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
		$< 2>&1 | diff ${OUTP_DIR}/$*.out - > $@ ; \
		if [ $$? = 0 ]; then echo "OK"; else echo "FAILED:"; cat $@; fi; \
	else \
		touch $@; \
	fi

# Rules to generate sample test outputs:

out outputs: ${OUTPUTS}

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

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

${OUTP_DIR}/%.out: ${TEST_DIR}/%.sh
	-@test -f $@ || echo "$@:"
	-@test -f $(dir $<)/$*.env && . $(dir $<)/$*.env; \
	test -f $@ || \
	$< 2>&1 | tee $@
	-@touch $@

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

MAKELOCAL_FILES = ${filter-out %~, ${wildcard Makelocal*}}

ifneq ("${MAKELOCAL_FILES}","")
include ${MAKELOCAL_FILES}
endif

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

.PHONY: failed listdiff

failed listdiff:
	@find ${OUTP_DIR} -type f -name '*.diff' -size +0

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

clean:
	rm -f ${DIFFS}

cleanAll distclean: clean
