#!/usr/bin/perl
#
# Wrapper script to run tests from inside the Wine tree
#
# Usage: runtest [options] input_file [perl_args...]
#
# Copyright 2002 Alexandre Julliard
#
# 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

use strict;

sub usage
{
    print STDERR <<EOF;

Usage: $0 [options] input_file [perl_args...]

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
    -I dir   prepend dir to Perl include path
    -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
my $platform = $ENV{WINETEST_PLATFORM};
$ENV{WINETEST_DEBUG} ||= 1;

my $topobjdir;
my $infile;
my $program;
my @include_dirs;
my @modules;

# parse command-line options
while ($#ARGV >= 0)
{
    my $arg = shift @ARGV;
    if ($arg eq "-h") { usage; }
    if ($arg eq "-p") { $program = shift @ARGV; next; }
    if ($arg eq "-q") { $ENV{WINETEST_DEBUG} = 0; next; }
    if ($arg eq "-v") { $ENV{WINETEST_DEBUG}++; next; }
    if ($arg eq "-s") { $ENV{WINETEST_REPORT_SUCCESS} = 1; next;}
    if ($arg eq "-P") { $platform = shift @ARGV; next; }
    if ($arg eq "-M") { push @modules, split /,/, shift @ARGV; next; }
    if ($arg eq "-I") { push @include_dirs, shift @ARGV; next; }
    if ($arg eq "-T")
    {
        $topobjdir = shift @ARGV;
        usage unless (-d $topobjdir);
        next;
    }
    $infile = $arg;
    last;
}

# we must have found an input file
usage unless defined($infile);

if ($infile =~ /\.c$/ && !defined($program))
{
    # set program to the .c file base name if not specified otherwise
    ($program = $infile) =~ s/\.c$//;
}

# check/detect topobjdir
if (defined($topobjdir))
{
    unless (-f $topobjdir . "/server/wineserver")
    {
        printf STDERR "Wrong -T argument, %s/server/wineserver does not exist\n", $topobjdir;
        usage;
    }
}
else  # try to detect it automatically
{
    if (-f "./server/wineserver") { $topobjdir = "."; }
    elsif (-f "../server/wineserver") { $topobjdir = ".."; }
    elsif (-f "../../server/wineserver") { $topobjdir = "../.."; }
    elsif (-f "../../../server/wineserver") { $topobjdir = "../../.."; }
}

# check for include/ dir in script source directory and append it to search path
my $basedir = $0;
if ($basedir =~ /\//) { $basedir =~ s!/[^/]+$!!; }
else { $basedir = "."; }
if (-d $basedir . "/include") { push @include_dirs, $basedir . "/include"; }

$ENV{PERL5LIB} = join( ":", @include_dirs, split( ":", $ENV{PERL5LIB} ) );
if (@modules)
{
    if (defined($ENV{WINEOPTIONS})) { $ENV{WINEOPTIONS} .= " "; }
    $ENV{WINEOPTIONS} .= "--dll " . join(',',@modules) . "=b";
}

# set environment variables needed for Wine
if (defined($topobjdir) && defined($program))
{
    chop($topobjdir = `cd $topobjdir && pwd`);
    $ENV{LD_LIBRARY_PATH} = $topobjdir . ":" . $ENV{LD_LIBRARY_PATH};
    $ENV{WINEDLLPATH} = $topobjdir . "/dlls:" . $topobjdir . "/programs";
    $ENV{WINESERVER} = $topobjdir . "/server/wineserver";
    $ENV{WINELOADER} = $topobjdir . "/wine";
    $ENV{WINETEST_PLATFORM} = $platform || "wine";
    exec $ENV{WINELOADER}, $program, $infile, @ARGV;
}
else
{
    $ENV{WINETEST_PLATFORM} = $platform || "windows";
}

# and now exec the program
$program ||= "perl";
exec $program, $infile, @ARGV;
print STDERR "Could not exec $program\n";
exit 1;
