# Semana 13: principios de diseño y refactoring guiado por pruebas.
#   make         compila todo a build/
#   make test    comprueba que los pasos del refactoring tienen las mismas
#                pruebas, corre las demostraciones y todas las pruebas JUnit
#   make clean   borra build/
JAVAC  = javac
JFLAGS = -Xlint:all -Werror
SRC    = $(shell find invoice library lab -name '*.java')
DEMOS  = invoice.after.InvoiceDemo library.LibraryDemo lab.GradeBookDemo
STEPS  = step1 step2 step3 step4 step5

all: build/.stamp

build/.stamp: $(SRC)
	mkdir -p build
	$(JAVAC) $(JFLAGS) -cp $(JUNIT_JAR) -d build $(SRC)
	touch $@

# Las pruebas de cada paso deben ser las de step0, salvo la línea del paquete.
same-tests: all
	@sed 1d library/step0/LibraryDeskTest.java > build/step0-tests.txt
	@for s in $(STEPS); do \
	  sed 1d library/$$s/LibraryDeskTest.java | cmp -s - build/step0-tests.txt \
	    || { echo "library/$$s: sus pruebas no son las de step0"; exit 1; }; \
	done
	@echo "== las pruebas de step1..step5 son idénticas a las de step0"

JUNIT = java -jar $(JUNIT_JAR) execute --class-path build --disable-banner --disable-ansi-colors

# Cada paso del refactoring se prueba por separado, con un resumen de una línea.
test: same-tests
	@for d in $(DEMOS); do echo "== $$d"; java -cp build $$d || exit 1; done
	@for s in step0 $(STEPS); do \
	  out=$$($(JUNIT) --select-package library.$$s --details=summary) || { echo "$$out"; exit 1; }; \
	  echo "== pruebas de library.$$s: $$(echo "$$out" | grep -o '[0-9]* tests successful')"; \
	done
	$(JUNIT) --select-package invoice --select-package lab --details=tree

clean:
	rm -rf build

.PHONY: all same-tests test clean
