#!/usr/bin/make
#
# This is a makefile to automatise most of the testing.
# It is language independent within the framework of the Sámi language
# technology project. See further user documentation (and technical as well)
# in $CVSROOT/gt/doc/ling/docu-testing.html
# 
# test the generation of a single lemma:
# make -f make-gen-dict paradigm POS=a WORD=ođas PARATYPE=dict

# VARIABLE DEFINITIONS
# ====================

null      :=
SPACE     := $(null) $(null)

# Tools used when compiling
XFST = xfst -utf8

# Where all the perl scripts are:
BINDIR = ../../script/testing

# Directory where all the compiled fst's are:
FSTDIR = ../bin

DIALOGUE = GG

# Directory for the source files (which compile into fst's):
# Changed this to point into the directory where the common makefile is:
SRCDIR = ../../

# The temp directory:
TEMP = ../../tmp

# We define the default paradigm generation type:
PARATYPE=default

# Default POS:
POS=n

# The temp directories for the generated paradigms:
GEN_TMP = Gen_tmp
PARA_TMP = Para_tmp

PARATYPE=default

ifeq ($(strip $(PARATYPE)),dict)
TYPEPREF = dict-
endif

ifeq ($(strip $(PARATYPE)),oahpa)
TYPEPREF = oahpa-
endif

ifeq ($(strip $(PARATYPE)),default)
TYPEPREF = 
endif

# This variable is holding the filename of the save file:
# (makes the Makefile truly language independent for
# the Sami languages)

SAVEFILE = $(wildcard $(FSTDIR)/$(TYPEPREF)is??-norm.fst)

# The savetarget is derived from the savefile:
SAVETARGET=`basename $(SAVEFILE)`

# Where to find the paradigm codes:
codesdir=codes/$(PARATYPE)

# Copied from old LS makefile:
# Bond, James Bond
UMASK=umask 007

# Empty variable to be overridden by the user when
# generating paradigms:
WORD =

# These variables define  the relationship between the source files
# and the final output files (the reports), such that one can con-
# struct a list of targets for the main target
NGenFiles := $(patsubst %.txt,%.greport,$(wildcard n-*.txt))
NAnaFiles := $(patsubst %.txt,%.areport,$(wildcard n-*.txt))
VGenFiles := $(patsubst %.txt,%.greport,$(wildcard v-*.txt))
VAnaFiles := $(patsubst %.txt,%.areport,$(wildcard v-*.txt))
AGenFiles := $(patsubst %.txt,%.greport,$(wildcard a-*.txt))
AAnaFiles := $(patsubst %.txt,%.areport,$(wildcard a-*.txt))


# MAJOR TARGETS, HOUSEKEEPING TARGETS
# ===================================

# Default target:
# Remove the comments in front of the verb and adjective
# targets when you have codes and test cases for them
.PHONY: all

all: twol-test

#all: n-g.summary \
#	 n-a.summary \
#	 v-g.summary \
#	 v-a.summary \
#	 num-a.summary \
#	 num-g.summary
#	 a-g.summary \
#	 a-a.summary

# If you only want to test nouns:
.PHONY: all-n
all-n: POS=n
all-n: n-g.summary n-a.summary

# If you only want to test verbs:
.PHONY: all-v
all-v: v-g.summary v-a.summary

# If you only want to test adjectives:
.PHONY: all-a
all-a: a-g.summary a-a.summary

# If you only want to test numerals:
.PHONY: all-num
all-num: num-g.summary num-a.summary

paradigm: $(POS)-paradigm

# If you only want to test verbal generation, use v-g.summary
# as target. Etc. for the other cases. And do you only want to
# test a specific word or inflection class, type the name of
# the file containing the infl. word, but replace the suffix
# .txt with .greport for generation, and .areport for analysis.


# POS SPECIFIC SECTIONS
# =====================

# NOUNS
# =====

# Create all the POS test file bases:
$(POS)-%.testbase: $(POS)-%.txt $(codesdir)/$(POS)-codes.txt
	@echo
	@echo "*** Creating the test base for $(POS)-$*.txt ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/merge-codesNforms.pl $(codesdir)/$(POS)-codes.txt $< > $@
	@chmod 660 $@

# Finally, we concatenate all *.greports
$(POS)-g.summary: $(NGenFiles)
	@cat $^ > $@
	@echo
	@echo "*** All $(POS) word form generation testing is done.      ***"
	@echo "*** The concatenated reports are stored in $@. ***"
	@echo
#	@less $@

# Finally, we concatenate all *.areports:
$(POS)-a.summary: $(NAnaFiles)
	@cat $^ > $@
	@echo
	@echo "*** All $(POS) word form analysis testing is done.        ***"
	@echo "*** The concatenated reports are stored in $@. ***"
	@echo
#	@less $@

# Create POS paradigm generation input file:
$(POS)-para.ptest: $(codesdir)/$(POS)-codes.txt
	@echo
	@echo "*** Creating the $(POS) paradigm input file for '$(WORD)' ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/merge-codesNword.pl $< '$(WORD)' > $@
	@chmod 660 $@

# Paradigm generation:
.PHONY: $(POS)-paradigm
$(POS)-paradigm: $(POS)-para.ptest savefile
	@echo
	@echo "*** Running the paradigm generator for '$(WORD)' ***"
	@echo
	@if [ ! -d "$(GEN_TMP)/$(PARA_TMP)/" ]; then mkdir -p "$(GEN_TMP)/$(PARA_TMP)"; fi
	@printf "load $(SAVEFILE) \n\
	apply up < $< \n\
	quit \n" > $(TEMP)/$@-gtest-script
	$(XFST) < $(TEMP)/$@-gtest-script > $(GEN_TMP)/$(PARA_TMP)/$(subst $(SPACE),_,$(WORD))_$(POS).paradigm
	@rm -f $(TEMP)/$@-gtest-script
	@rm -f $<
#	@less $(GEN_TMP)/$(PARA_TMP)/$(WORD)_n.paradigm


# Make sure there is an available smX.save in the parallel bin directory:
savefile:
	@cd $(SRCDIR)/ && $(MAKE) $(SAVETARGET) GTLANG=sme
#	@cd $(SRCDIR)/ && $(MAKE) ifst-restr GTLANG=sme
#	@cd $(SRCDIR)/ && $(MAKE) ifst GTLANG=sme
# Harmonize the choice here with the choice of SAVEFILE at appr line 30

# Word form generation:
# ---------------------

# Make test cases for word form generation tests,
# based on the test file bases:
$(POS)-%.gtest: $(POS)-%.testbase
	@echo
	@echo "*** Creating test cases for word form generation for $*.txt ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/make-gen-test.pl $< > $@
	@chmod 660 $@

# Make facit files containing the expected output from the
# word form generation test run:
$(POS)-%.gfacit: $(POS)-%.testbase
	@echo
	@echo "*** Creating facit file for word form generation for $*.txt ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/make-gen-test-facit.pl $< > $@
	@chmod 660 $@

# Here we run the actual generation test:
$(POS)-%.gresult: $(POS)-%.gtest savefile
	@echo
	@echo "*** Running the word form generator test for $*.txt ***"
	@echo
	@printf "load $(SAVEFILE) \n\
	apply up < $< \n\
	quit \n" > $(TEMP)/$*-gtest-script
	$(XFST) < $(TEMP)/$*-gtest-script > $@
	@rm -f $(TEMP)/$*-gtest-script

# Then we compare with the facit, and report any differences:
$(POS)-%.greport: $(POS)-%.gresult $(POS)-%.gfacit
	@echo
	@echo "*** Diffing the test result and the facit file for   ***"
	@echo "*** word form generation for $*.txt ***"
	@echo "*** \"Error 1 (ignored)\" means that there were diffs. ***"
	@echo
	@rm -f $@
	-$(UMASK) && \
	diff --side-by-side --width=70 $^ > $@
	@chmod 660 $@


# Word form analysis:
# -------------------

# First, create the needed test file
# NB! The sorting specified does not work completely as intended!
# This will lead to small differences between the facit file and
# the analysis output. This happens when one input string gives
# more than one analysis. The expected output is according to the
# order in the inflection lexicon, but the tags in the facit file
# are sorted alphabetically (due to the way sorting is performed -
# there is no way to tell GNU sort to ONLY sort on a specified key).
# For a completely satisfactory result we need a different solution.
# The present solution will have to be good enough for now.
$(POS)-%.atest: $(POS)-%.testbase
	@echo
	@echo "*** Creating test cases for word form analysis for $*.txt ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/make-ana-test.pl $< \
	| sort -t '\t' -k 1 | cut -f 1 | uniq > $@
	@chmod 660 $@

# Make facit files containing the expected output from the
# word form analysis test run:
$(POS)-%.afacit: $(POS)-%.testbase
	@echo
	@echo "*** Creating facit file for word form analysis for $*.txt ***"
	@echo
	@rm -f $@
	$(UMASK) && \
	$(BINDIR)/make-ana-test.pl $< \
	| sort -t '\t' -k 1 | cut -f 2 > $@
	@chmod 660 $@

# Here we run the actual analysis test:
$(POS)-%.aresult: $(POS)-%.atest savefile
	@echo
	@echo "*** Running the word form analysis test ***"
	@echo
	@printf "load $(SAVEFILE) \n\
	apply down < $< \n\
	quit \n" > $(TEMP)/$*-atest-script
	$(XFST) < $(TEMP)/$*-atest-script > $@
	@rm -f $(TEMP)/$*-atest-script

# Finally, we compare with the facit, and report any differences:
# Due to the sorting problems mentioned above, there will always (?)
# be (small) differences.
$(POS)-%.areport: $(POS)-%.aresult $(POS)-%.afacit
	@echo
	@echo "*** Diffing the test result and the facit file for ***"
	@echo "*** word form analysis for $*.txt       ***"
	@echo "*** \"Error 1 (ignored)\" means that there were diffs.   ***"
	@echo
	-@diff --side-by-side --width=70 $^ > $@


# Clean up all the mess created during a test pass, to prepare for new tests:
#		  *.tgz	\	# just to remove archive files used for file transfering
#		  *~		# to remove backup copies that may clutter the directory
.PHONY: clean
clean:
	@echo
	@echo "*** Now deleting ALL the generated files ***"
	@echo
	@rm -f *.testbase \
		  *.gtest \
		  *.atest \
		  *.gfacit \
		  *.afacit \
		  *.greport \
		  *.areport \
		  *.gresult \
		  *.aresult \
		  *.summary \
		  *.ptest \
#		  paradigm* \
		  *.tgz	\
		  *~ \
		  *.in \
		  *.out \
		  $(TEMP)/*test-script

.PHONY: almost-clean
almost-clean:
	@echo
	@echo "*** Now deleting all generated files but the summary & parad. files ***"
	@echo
	@rm -f *.testbase \
		  *.gtest \
		  *.atest \
		  *.gfacit \
		  *.afacit \
		  *.greport \
		  *.areport \
		  *.gresult \
		  *.aresult \
		  *.ptest \
		  *.tgz	\
		  *~ \
		  *.in \
		  *.out \
		  $(TEMP)/*test-script
