include ../../../inc/common.mk

#blastToPsl = valgrind --tool=memcheck  ${DESTDIR}${BINDIR}/blastToPsl
blastToPsl = ${DESTDIR}${BINDIR}/blastToPsl

#blastXmlToPsl = valgrind --tool=memcheck  ${DESTDIR}${BINDIR}/blastXmlToPsl
blastXmlToPsl =  ${DESTDIR}${BINDIR}/blastXmlToPsl

all:

test: testBlastToPsl testBlastXmlToPsl

###
# blastToPsl
###
testBlastToPsl:	protMrnaTest protDnaTest mrnaDnaTest mrnaDnaxTest \
	blockBugTest identityBugTest protMrnaEval1Test protMrnaEval2Test \
	longDbNameTest multiLineDescTest tblastxTest tblastnTest \
	blastpPsiTest psiNoHitsTest psiBadFormatTest blastpPsiWrapTest

protMrnaTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/kgProtMRna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

protDnaTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/kgProtDna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

mrnaDnaTest: mkdirs
	${blastToPsl} input/mrnaDna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

mrnaDnaxTest: mkdirs
	${blastToPsl} -pslx input/mrnaDna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# test case that cause huge target block start.
blockBugTest: mkdirs
	${blastToPsl} input/blockBug.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# handle id
identityBugTest: mkdirs
	${blastToPsl} input/identityBug.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# test E-value threshold filter
protMrnaEval1Test: mkdirs
	${blastToPsl} -eVal=1 -scores=output/$@.bscores input/kgProtMRna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

protMrnaEval2Test: mkdirs
	${blastToPsl} -eVal=1e-10 -scores=output/$@.bscores input/kgProtMRna1.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

longDbNameTest: mkdirs
	${blastToPsl} input/longDbName.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# multiline description broke parser
multiLineDescTest: mkdirs
	${blastToPsl} input/multiLineDesc.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# tblastx
tblastxTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/tblastx.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

# tblastn
tblastnTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/tblastn.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores


# this test is currently disabled.  This file has Database: before Query= and
# there are multiple queries for each Database:
tblastnDbFirstTest: mkdirs
	${blastToPsl} input/tblastnDbFirst.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl


# this test is currently disabled, mega-blast is painful because
# Database: comes before Query= and there are multiple queries for each
# Database:.
megaBlastTest: mkdirs
	${blastToPsl} input/970.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# PSI-BLASTP 
blastpPsiTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/blastpPsi.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

# PSI-BLASTP with Identities line wrapping
blastpPsiWrapTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/blastpPsiWrap.blast output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

# PSI-BLASTP with no hits
psiNoHitsTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/psiNoHits.blast output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

# PSI-BLASTP produces bogus blocks where query starts at 0 and there is not
# ending number on the line. Sbjct may be empty or have sequence.  These 
# are ignored
psiBadFormatTest: mkdirs
	${blastToPsl} -scores=output/$@.bscores input/psiBadFormat.blast output/$@.psl >output/$@.err 2>&1
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores
	diff -u expected/$@.err output/$@.err

###
# blastXmlToPsl
###
testBlastXmlToPsl: mrna1Test prot1Test prot2Test prot1NucCoordTest sp1PsiBlastTest qtName1Test qtName2Test misclassedPsiBlastTest

mrna1Test: mkdirs
	${blastXmlToPsl} -scores=output/$@.bscores input/mrna1.blastn.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

prot1Test: mkdirs
	${blastXmlToPsl} -scores=output/$@.bscores input/prot1.tblastn.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

prot2Test: mkdirs
	${blastXmlToPsl} -scores=output/$@.bscores input/prot2.psiblast.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

prot1NucCoordTest: mkdirs
	${blastXmlToPsl} -convertToNucCoords input/prot1.tblastn.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

sp1PsiBlastTest: mkdirs
	${blastXmlToPsl} -tName=Hit_accession input/sp1.psiBlast.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

qtName1Test: mkdirs
	${blastXmlToPsl} -qName=query-ID -tName=Hit_id input/sp1.psiBlast.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

qtName2Test: mkdirs
	${blastXmlToPsl} -qName=query-def0 -tName=Hit_def0 input/sp1.psiBlast.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl

# psiblast file that claimes to be blastp
misclassedPsiBlastTest: mkdirs
	${blastXmlToPsl} -forcePsiBlast -tName=Hit_accession -scores=output/$@.bscores input/misclassed.psiBlast.xml output/$@.psl
	pslCheck -verbose=0 output/$@.psl
	diff -u expected/$@.psl output/$@.psl
	diff -u expected/$@.bscores output/$@.bscores

clean::
	rm -rf output

mkdirs:
	@${MKDIR} -p output
