#*******************************************************************************
#prueba.sh
#*******************************************************************************
#This file is part of the Orb compiler,
#Copyright (C) 2007 Adrian Fraga Fernandez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#*******************************************************************************

#########################################

DIRPRUEBAS=pruebas			# directorio de pruebas
DIRRESULTADOS=${DIRPRUEBAS}/resultados	# directorio de resultados
OJAVAPATH=${DIRPRUEBAS}/java		# directorio de salida Java
OJAVAFILE=Main				# clase de salida Java
OJAVA=${OJAVAPATH}/${OJAVAFILE}.java	# fichero de salida para traduccion
TMPF=/tmp/pruebas3155			# fichero temporal
EJECUTABLE=./main 			# ejecutable del compilador

#########################################

function Barra() {
	for ((x=1;x<64;x=x+1)); do echo -n '-'; done >> ${TMPF}
}

function DoAll() {
	echo -n '' > ${TMPF}
	echo '' >> ${TMPF}	
	Barra
	echo '' >> ${TMPF}	
	echo '' >> ${TMPF}	
	echo 'Realizada(s) la(s) prueba(s): ' >> ${TMPF}
	echo -n '    ' >> ${TMPF}
	for x in $*
		do 
			PRUEBA=${x%.txt}	# borrar extension
			PRUEBA=${PRUEBA/#*\/}	# borrar path
			
			echo -n ${PRUEBA} >> ${TMPF};
			echo -n ' ' >> ${TMPF};
		done
	echo '' >> ${TMPF}	
	echo '' >> ${TMPF}	
	for x in $*
		do
			PRUEBA=${x%.txt}	# borrar extension
			PRUEBA=${PRUEBA/#*\/}	# borrar path
			
			REVRAIZ=${DIRRESULTADOS}/${PRUEBA}.salidaPrueba.revisar
			REVSALIDA=${DIRRESULTADOS}/${PRUEBA}.salidaCompilador.revisar.txt
			REVTOKENS=${DIRRESULTADOS}/${PRUEBA}.salidaPrueba.revisar.txt
			REVDOT=${DIRRESULTADOS}/${PRUEBA}.salidaPrueba.revisar.dot
			OKSALIDA=${DIRRESULTADOS}/${PRUEBA}.salidaCompilador.ok.txt
			OKTOKENS=${DIRRESULTADOS}/${PRUEBA}.salidaPrueba.ok.txt

			rm -f ${REVRAIZ} ${REVSALIDA} ${REVTOKENS} ${REVDOT}

			if (test ${PRUEBA/%-*} == prueba1 || test ${PRUEBA/%-*} == prueba2 || test ${PRUEBA/%-*} == prueba3 || test ${PRUEBA/%-*} == prueba4)
			then
				${EJECUTABLE} --${PRUEBA/%-*}=${REVRAIZ} ${x} 2> ${REVSALIDA}
			else
				${EJECUTABLE} -o=${OJAVA} ${x} 2> ${REVSALIDA} && javac ${OJAVA} 2>> ${REVSALIDA} && java -classpath ${OJAVAPATH} ${OJAVAFILE} >> ${REVTOKENS} 2>> ${REVTOKENS}
			fi
				
			if (test -e ${OKTOKENS} && test -e ${OKSALIDA})
			then
				if !(cmp -s ${REVTOKENS} ${OKTOKENS} && cmp -s ${REVSALIDA} ${OKSALIDA})
				then
					echo -- Revisar: ${PRUEBA} -- la nueva salida no coincide con la salida previa >> ${TMPF}
				fi
			else
					echo -- Revisar: ${PRUEBA} -- no existe salida previa >> ${TMPF}
			fi
		done
	echo '' >> ${TMPF}	
	Barra
	echo '' >> ${TMPF}	
	echo '' >> ${TMPF}	
	cat ${TMPF}
}

## SCRIPT

if (($#==0))
then
	echo ''
	echo 'Sintaxis:'
	echo ''
	echo '    ./prueba.sh [opciones] [fichero1] [fichero2] ... [ficheroN]'
	echo ''
	echo 'Opciones:'
	echo ''
	echo '       Si no se proporciona ninguna opcion, simplemente se realizaran las'
	echo '   pruebas correspondientes para cada uno de los ficheros proporcionados,'
	echo '   mostrando aquellas cuyo resultado no coincide con el esperado o para'
	echo '   las cuales todavia no se ha almacenado ninguna salida valida.'
	echo ''	
	echo '    all:   Realiza todas las pruebas del directorio, mostrando aquellas'
	echo '           cuyo resultado no coincide con el esperado o para las cuales'
	echo '           todavia no se ha almacenado ninguna salida como valida'
	echo '    cat:   Muestra por pantalla los resultados de las pruebas'
	echo '    ok:    Marca como validos los resultados de las pruebas'
	echo '    edit:  Edita los ficheros asociados con "kwrite"'
	echo '    clean: Elimina todos los resultados válidos almacenados'
	echo ''
	echo 'Ficheros:'
	echo ''
	echo '       Los ficheros "fichero1", "fichero2", etc deben ser estar pre-'
	echo '  sentes en el directorio "./pruebas" y tener extension ".txt". La ex-'
	echo '  tension no debe formar parte del nombre proporcionado para el fichero.'
	echo '       El tipo de prueba a realizar se extrara del nombre del fichero:'
	echo ''
	echo '        prueba1* -> Se realizara la traduccion con la opcion --prueba1'	
	echo '        prueba2* -> Se realizara la traduccion con la opcion --prueba2'	
	echo '        prueba3* -> Se realizara la traduccion con la opcion --prueba3'	
	echo '        prueba4* -> Se realizara la traduccion con la opcion --prueba4'	
	echo '        prueba5* -> Se realizara la traduccion y se ejecutara el resultado'
	echo ''
	echo 'Ejemplos:'
	echo ''
	echo '    ./prueba.sh prueba2-1    : Realiza la prueba "./pruebas/prueba2-1.txt"'
	echo '    ./prueba.sh ok prueba2-1 : Almacena como valido el resultado de la'
	echo '                               prueba "./pruebas/prueba2-1.txt"'
	echo ''
elif (test $1 == ok || test $1 == marcar); 		
then
	i=1;
	for x in $*
		do
			if !(test ${x} == ok || test ${x} == marcar)
			then
				TEMP=${DIRPRUEBAS}/${x}.txt
				if (test -e ${TEMP}) 
				then
					for y in ${DIRRESULTADOS}/${x}*.revisar.txt
					do
						cp ${y} ${y%.revisar.txt}.ok.txt
					done
				else	
					echo No se encuentra el fichero
				fi
				
			fi
		done	
elif (test $1 == cat || test $1 == mostrar || test $1 == ver); 		
then
	i=1;
	for x in $*
		do
			if !(test ${x} == cat || test ${x} == mostrar || test ${x} == ver)
			then
				TEMP=${DIRPRUEBAS}/${x}.txt
				if (test -e ${TEMP}) 
				then			
					
					for y in ${DIRRESULTADOS}/${x}.*.revisar.dot
					do
						if (test -e ${y})
						then
							dotty ${y} &
							#dot -TPs -o ${y%.dot}.ps ${y}
							#kghostview ${y%.dot}.ps &
						fi
					done	
				
					
					echo -n '' > ${TMPF}	
						
					echo '' >> ${TMPF}
					for ((i=1;i<64;i=i+1)); do 
						echo -n '-' >> ${TMPF}; 
						done;
					echo '' >> ${TMPF}
					echo ${TEMP} >> ${TMPF}
					for ((i=1;i<64;i=i+1)); do 
						echo -n '-' >> ${TMPF}; 
						done;
					echo '' >> ${TMPF}
					echo '' >> ${TMPF}
					cat -n ${TEMP} >> ${TMPF}
					echo '' >> ${TMPF}
						
					for y in ${DIRRESULTADOS}/${x}.*.revisar.txt
					do
						echo '' >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo ${y} >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo '' >> ${TMPF}
						cat ${y} >> ${TMPF}
						echo '' >> ${TMPF}
					done		
					
					for y in ${DIRRESULTADOS}/${x}.*.ok.txt
					do
						echo '' >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo ${y} >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo '' >> ${TMPF}
						cat ${y} >> ${TMPF}
						echo '' >> ${TMPF}
					done		
					
					if (test -e ${OJAVA})
					then
						echo '' >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo ${OJAVA} >> ${TMPF}
						for ((i=1;i<64;i=i+1)); do 
							echo -n '-' >> ${TMPF}; 
							done;
						echo '' >> ${TMPF}
						echo '' >> ${TMPF}
						cat -n ${OJAVA} >> ${TMPF}
						echo '' >> ${TMPF}
					fi				
			
					less ${TMPF}	
				else	
					echo No se encuentra el fichero
				fi
			fi
		done	
elif (test $1 == edit || test $1 == editar); 		
then
	i=1;
	for x in $*
		do
			if !(test ${x} == edit || test ${x} == editar)
			then
				TEMP=${DIRPRUEBAS}/${x}.txt
				if (test -e ${TEMP}) 
				then			
					kwrite ${TEMP} &
				else	
					echo No se encuentra el fichero
				fi
			fi
		done	
elif (test $1 == clean); 		
then
	rm ${DIRRESULTADOS}/*.revisar.*
	rm ${DIRRESULTADOS}/*.ok.*
elif (test $1 == all);
then
	i=1;
	for x in ${DIRPRUEBAS}/*.txt
		do
		LISTA[i]=${x}
		((i=i+1))
		done	
	
	DoAll ${LISTA[@]}
	
else				
	i=1;
	for x in $*
		do
			TEMP=${DIRPRUEBAS}/${x}.txt
			if (test -e ${TEMP}) 
			then
				LISTA[i]=${TEMP}
				((i=i+1))
			fi
		done	
	
	if ((${i}!=1)) 
	then
		DoAll ${LISTA[@]}
	else
		echo No se encuentra el fichero
	fi
fi
	
