#!/usr/bin/perl
#
# Wrapper script to run tests from inside the Wine tree
#
# Usage: runtest [options] input_file [perl_args...]
#

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)
    -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 "-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))
{
    chop($topobjdir = `cd $topobjdir && pwd`);
    $ENV{LD_LIBRARY_PATH} = $topobjdir . "/dlls:" . $topobjdir . ":" . $ENV{LD_LIBRARY_PATH};
    $ENV{WINESERVER} ||= $topobjdir . "/server/wineserver";
    $ENV{WINELOADER} ||= $topobjdir . "/wine";
    $ENV{WINETEST_PLATFORM} = $platform || "wine";
    $ENV{WINEPRELOAD}=($program || ($topobjdir . "/programs/winetest/winetest")) . ".so";
    # try to exec the wine loader directly; if it fails continue on to normal exec
    exec $ENV{WINELOADER}, $infile, @ARGV;
}
else
{
    $ENV{WINETEST_PLATFORM} = $platform || "windows";
}

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