#!/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)
    -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 [ "$#" != 0 ]; do
    case "$1" in
    -h)
	usage
    ;;
    -p)
	shift; program="$1"
    ;;
    -q)
	WINETEST_DEBUG=0
    ;;
    -v)
	WINETEST_DEBUG=`expr $WINETEST_DEBUG + 1`
    ;;
    -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
    ;;
    *)
	infile="$1"
    ;;
    esac
    shift
done	    
	
# we must have found an input file
if [ ! -f "$infile" ]; then usage; fi

# set program to the .c file base name if not specified otherwise
if [ -z "$program" ]; then
    program=`basename "$infile" .c`
fi

# check/detect topobjdir
if [ -n "$topobjdir" ]; then
    if [ ! -f "$topobjdir/server/wineserver" ]
    then
	echo "Wrong -T argument, $topobjdir/server/wineserver does not exist" 2>&1
	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="../../.."
    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

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