#!/bin/sh

### cross format waypoint check ###

PNAME=${PNAME:-./gpsbabel}
REFGPX="reference/expertgps.gpx"	# reference file for all tests
EXCL="ozi vitosmt"			# exclude formats from test
CAPS=""
TEMPDIR=/tmp/gb-testw
CATALOG=/tmp/gb-testw.done
LOGFILE=/tmp/gb-testw.log

# options
vg=0
prep=0

function log_entry()
{
    touch $LOGFILE
    echo "-----------------------------------------------------------------------" >> ${LOGFILE}
    date >> ${LOGFILE}
    echo "$*" >> ${LOGFILE}
}

function try_run() # command line
{
    local CMD="$*"
    local RES=0
    
    [ $vg -ne 0 ] && CMD="valgrind -q $CMD"

    ${CMD} > $TEMPDIR/.result 2>&1
    RES=$?
    if [ $RES -ne 0 -o -s $TEMPDIR/.result ]; then
	if [ $RES -ne 0 ]; then
	    echo " -- Uhps --"
	    echo "-----------------------------------------------------------------------"
	    test -s $TEMPDIR/.result && cat $TEMPDIR/.result
	    echo "-----------------------------------------------------------------------"
	else
	    echo ""
	fi
	log_entry "cmd($RES): $CMD"
	test -s $TEMPDIR/.result && cat $TEMPDIR/.result >> ${LOGFILE}
	return 1
    else
	return 0
    fi
}

function STAGE_1 () # format
{
    local FMT=$1
    local CMD1 CMD2
    
    echo "$CAPS" |
    
    while read type caps format comment; do
    
	for i in $EXCL; do
	    if [ "$format" = "$i" ]; then
		caps="------"
	    fi
	done
	
	grep "$FMT & $format" ${CATALOG} > /dev/null && continue
	
	echo -n "testing \"$FMT\" with \"$format\" "
	
	case $caps in
	
	    -w*)
		echo -n "*"
		CMD1="${PNAME} -i $FMT -f $TEMPDIR/$FMT -o $format -F $TEMPDIR/$FMT.$format"
		try_run "${CMD1}" || continue
		;;
		
	    rw*)
		echo -n "*"
		CMD1="${PNAME} -i $FMT -f $TEMPDIR/$FMT -o $format -F $TEMPDIR/$FMT.$format"
		try_run "${CMD1}" || continue
		echo -n "*"
		CMD2="${PNAME} -i $format -f $TEMPDIR/$FMT.$format -o $FMT -F $TEMPDIR/$FMT.$format.$FMT"
		try_run "${CMD2}" || continue
		;;
	esac
	echo "*"
	echo "$FMT & $format" >> $CATALOG
    done
    return 0
}

function STAGE_0 ()
{
    echo "$CAPS" |
    
    while read type caps format comment; do
    
	for i in $EXCL; do
		if [ "$format" = "$i" ]; then
			caps="------"
		fi
	done
	
	case $caps in
	    rw*)
		CMD="${PNAME} -i gpx -f $REFGPX -x nuketypes,routes,tracks -o $format -F $TEMPDIR/$format"
		try_run "${CMD}" || continue
		STAGE_1 $format || exit 1
		;;
	esac
	case $caps in
	    -w*)
		CMD="${PNAME} -i gpx -f $REFGPX -x nuketypes,routes,tracks -o $format -F $TEMPDIR/$format"
		try_run "${CMD}" || continue
		;;
	esac
    done
    rm -f $TEMPDIR/.result
}

rm -rf $TEMPDIR > /dev/null
mkdir -p $TEMPDIR > /dev/null

while [ $# -gt 0 ]; do
    case $1 in
	-s|--start)	# remove catalog. run the full test.
	    rm -f $CATALOG
	    ;;
	-v|--valgrind)
	    vg=1
	    ;;
	-p|--prepare)	# prepare for valgrind check.
	    prep=1
	    ;;
	-c|--clean)
	    trap "rm -fr $TEMPDIR; exit 1" 0 1 2 3 15
	    ;;
	-r|--reference)
	    shift
	    REFGPX=$1
	    ;;
    esac
    shift
done

if [ $prep -ne 0 ]; then
    test -s Makefile && make clean
    CFLAGS="-O0" ./configure || exit 1	#  -O0 is suggested by vg.
    make || exit 1
    echo "All fine. You can do now a 'testw -v'"
    exit 0
fi

if test ! -s $REFGPX; then
    echo "GPX reference \"$REFGPX\" doesn't exist!"
    exit 1
fi

touch $CATALOG

log_entry "testw started."
echo "Catalog: $CATALOG" >> $LOGFILE

CAPS=`${PNAME} -^2 | grep "^file"`
STAGE_0
