PENGUIN=../penguin/penguin

# put sum4 last because it's by far the slowest, even though it's less
# complicated than some of the others
TESTS=\
	trivial assign preval \
	cache \
	sketch1 sketch2 sketch3 sketch4 sketch5 \
	sum4s1 sum4s2 sum4s3 sum4s4 sum4s5 \
	sum2 sum3 sum4

CASES.sketch5.asm=1 2
CASES.sum3.asm=1 2 3
CASES.sum4s2.asm=1 2
CASES.sum4s4.asm=1 2

PENOPTS.trivial=-dv
PENOPTS.assign=-dv
PENOPTS.preval=-dv
PENOPTS.cache=-dv
PENOPTS.sketch4=-dv
PENOPTS.sketch5=-dv
PENOPTS.sum4s1=-dv
PENOPTS.sum4s2=-dv
PENOPTS.sum4s3=-dv
PENOPTS.sum2=-dv

.for T in $(TESTS)
PENOPTS.$(T)?=-d
.endfor

all: run-tests .WAIT show-diffs

run-tests:;
.for T in $(TESTS)
$(T).out: $(PENGUIN) $(T).pen
	rm -f $(T).asm
	$(PENGUIN) -q $(PENOPTS.$(T)) $(T).pen 2> $(T).out || \
		echo FAILED >> $(T).asm
$(T).asm: $(T).out
	@true
$(T).log: $(T).out
	@true
.for R in out asm log
.if defined(CASES.$(T).$(R))
.for C in $(CASES.$(T).$(R))
$(T).$(R).$(C).diff: $(T).$(R).$(C).good $(T).$(R)
	diff -u $(T).$(R).$(C).good $(T).$(R) > $@ || true
run-tests: $(T).$(R).$(C).diff
.endfor
.else # no CASES
$(T).$(R).diff: $(T).$(R).good $(T).$(R)
	diff -u $(T).$(R).good $(T).$(R) > $@ || true
run-tests: $(T).$(R).diff
.endif
.endfor
.endfor

show-diffs:
.for T in $(TESTS)
.for R in out asm log
.if defined(CASES.$(T).$(R))
	@ls -rS $(T).$(R).*.diff | head -1 | xargs cat
.else # no CASES
	@cat $(T).$(R).diff
.endif
.endfor
.endfor

good:
.for T in $(TESTS)
.for R in out asm log
	cp $(T).$(R) $(T).$(R).good
.endfor
.endfor

clean:
	rm -f *.out *.asm *.log *.diff

.PHONY: all run-tests show-diffs good clean

