#!/bin/bash

# This script runs all the test scripts it finds in the current folder
# Tests are identified as having a file name of *-in.txt
# For failed tests, the collected output is kept in the corresponding folder

export LYX_ROOT=../../..
export LYX_EXE=$LYX_ROOT/src/lyx

if [ "$XVKBD_HACKED" != "" ]; then
    export XVKBD_EXE=${XVKBD:-./xvkbd/xvkbd};
    if [ ! -x $XVKBD_EXE ]; then
	echo "You need to build XVKBD first, try: cd xvkbd && xmkmf && make"
	exit -1;
    fi
fi

if [ "$(which wmctrl)" == "" ]; then
    echo "You need to install wmctrl first, try:"
    echo "  sudo apt-get install wmctrl"
    exit -1;
fi

if [ "$(which pcregrep)" == "" ]; then
    echo "You need to install pcregrep first, try:"
    echo "  sudo apt-get install pcregrep"
    exit -1;
fi

PROGRAM_SUFFIX=$(grep -e '#define PACKAGE ' ../../config.h | sed -e 's/#define PACKAGE "lyx\(.*\)"/\1/')

export XVKBD_EXE=../$XVKBD_EXE
export KEYTEST=../keytest.py
LYX_HOME=out-home
export LYX_USERDIR=$(pwd)/$LYX_HOME/.lyx$PROGRAM_SUFFIX
# Create locale links 
export LOCALE_DIR=../locale

if [ ! -d ../../locale ]; then
    echo "Some tests may require the GUI showing up in a specified language."
    echo "In order to make it work, I'm going to run this command:"
    mkdir -p locale
    cmd="ln -s `pwd`/locale ../../"
    echo "  $cmd"
    ans=""
    while [ "$ans" != "y" -a "$ans" != "n" ]; do
	echo "Should I proceed (y/n) ?"
	read ans;
    done
    if [ "$ans" == "y" ]; then
	$cmd;
    fi;
fi

if [ "$#" -eq 0 ]; then
    TESTS=$(ls *-in.txt *-in.sh | sed -e 's/hello-world-in.txt\|first-time-in.txt\|export-in.sh//')
    rm -rf out-*;
else
    TESTS=$*
fi

echo

if [ ! -d $LYX_HOME ]; then
    mkdir -p $LYX_HOME
    mkdir -p $LYX_USERDIR
#    cp preferences $LYX_USERDIR
    cd $LYX_HOME
    echo "Initializing testing environment . . ."
    if ! ../single-test.sh "../first-time-in.txt" > test-log.txt 2>&1; then
	echo "Some error occurred: check $(pwd)"
	exit -1;
    fi
    cd ..
fi

# Launch the emergency STOP button
./stop_autotests.tcl &
pid=$!

function stop_button() {
    kill $pid
    wait $pid > /dev/null 2>&1
}

echo "Running test cases . . ."
failed=0
for tf in $(echo "$TESTS"); do
    t=$(echo $tf | sed -e 's/-in.txt//g' | sed -e 's/-in.sh//g')
    printf "%40s: " $tf
    if [ -f "$t-in.txt" ]; then
	cmd="../single-test.sh ../$t-in.txt";
    elif [ -f "$t-in.sh" ]; then
	if [ ! -x "$t-in.sh" ]; then
	    echo "ERROR: $t-in.sh is not executable"
	    stop_button
	    exit -1;
	fi
	cmd="../$tf";
    else
	echo "ERROR: File not found: $t-in.txt or $t-in.sh"
	stop_button
	exit -1;
    fi
    rm -rf "out-$t"
    mkdir "out-$t"
    cd "out-$t"
    if $cmd > test-log.txt 2>&1; then
	echo Ok
	cd ..
	if [ "$V" != "" ]; then rm -rf "out-$t"; fi
    else
	echo FAILED
	cd ..
	failed=$[$failed+1];
    fi;
done

stop_button

echo
if [ $failed -eq 0 ]; then
    echo "All tests SUCCESSFUL"
else
    echo "There were $failed FAILED tests";
fi

echo