#!/bin/sh
#
# Wrapper script to run tests from inside the Wine tree
#
# Usage: runtest [options] input_file
#
# Copyright 2002 Alexandre Julliard
# Copyright 2002 Dimitrie O. Paun
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#

usage()
{
    cat >&2 <<EOF

Usage: $0 [options] [input_file]

input_file:  the source code for the test program

Options:
    -q       quiet mode
    -v       verbose mode (can be specified multiple times)
    -i       interactive mode (runs even more tests)
    -s       announce successful tests
    -p prog  name of the program to run for C tests
    -P name  set the current platform name
    -M names set the module names to be tested
    -T dir   set Wine tree top directory (autodetected if not specified)

EOF
    exit 1
}

# Default values
platform=$WINETEST_PLATFORM
WINETEST_DEBUG=${WINETEST_DEBUG:-1}

# parse command-line options
while [ "$#" -gt 0 ]; do
    case "$1" in
    -h)
	usage
    ;;
    -p)
	shift; program="$1"
    ;;
    -q)
	WINETEST_DEBUG=0
    ;;
    -v)
	WINETEST_DEBUG=`expr $WINETEST_DEBUG + 1`
    ;;
    -i)
	WINETEST_INTERACTIVE=1
	export WINETEST_INTERACTIVE
    ;;
    -s)
	WINETEST_REPORT_SUCCESS=1
	export WINETEST_REPORT_SUCCESS
    ;;
    -P)
	shift; platform="$1"
    ;;
    -M)
	shift; modules="$1"
    ;;
    -T)
	shift; topobjdir="$1"
	if [ ! -d "$topobjdir" ]; then usage; fi
    ;;
    *)
	break
    ;;
    esac
    shift
done	    
	
if [ -z "$program" ]; then
    # try to autodetect the test program name based on the working directory
    working_path=`pwd`
    case $working_path in
        */dlls/*/tests)
          parent_path=`dirname "$working_path"`
          program=`basename "$parent_path"`_test.exe.so
          ;;
        */dlls/*)
          program=tests/`basename "$working_path"`_test.exe.so
          ;;
        */programs/*/tests)
          parent_path=`dirname "$working_path"`
          program=`basename "$parent_path"`.exe_test.exe.so
          ;;
        */programs/*)
          program=tests/`basename "$working_path"`.exe_test.exe.so
          ;;
    esac
fi
if [ ! -f "$program" ]; then
    echo "Can't find the test program, use the -p argument to specify one" 1>&2
    usage
fi

# check/detect topobjdir
if [ -n "$topobjdir" ]; then
    if [ ! -f "$topobjdir/server/wineserver" ]
    then
	echo "Wrong -T argument, $topobjdir/server/wineserver does not exist" 1>&2
	usage
    fi
else
    if [ -f "./server/wineserver" ]; then topobjdir="."
    elif [ -f "../server/wineserver" ]; then topobjdir=".."
    elif [ -f "../../server/wineserver" ]; then topobjdir="../.."
    elif [ -f "../../../server/wineserver" ]; then topobjdir="../../.."
    else
        echo "Can't find the top of the Wine tree (use the -T argument)" 1>&2
        usage
    fi
fi

# set environment variables needed for Wine

if [ -n "$modules" ]; then
    WINEDLLOVERRIDES="$WINEDLLOVERRIDES;$modules=b"
    export WINEDLLOVERRIDES
fi
WINETEST_PLATFORM=${platform:-wine}
export WINETEST_PLATFORM WINETEST_DEBUG

# WINETEST_WRAPPER is normally empty, but can be set by caller, e.g.
#  WINETEST_WRAPPER=time
# would give data about how long each test takes, and
#  WINETEST_WRAPPER=valgrind
# would run the tests under valgrind to look for memory errors.

exec $WINETEST_WRAPPER "$topobjdir/wine" "$program" "$@"
