mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-03-12 04:07:01 -04:00
202 lines
4.7 KiB
Perl
202 lines
4.7 KiB
Perl
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
use autodie;
|
|
|
|
use Cwd ();
|
|
use File::Spec ();
|
|
use File::Copy qw/ copy /;
|
|
use File::Path qw/ mkpath /;
|
|
use Getopt::Long qw/ GetOptions /;
|
|
use Env::Path ();
|
|
use Path::Tiny qw/ path /;
|
|
use File::Basename qw/ basename dirname /;
|
|
|
|
my $bindir = dirname(__FILE__);
|
|
my $abs_bindir = File::Spec->rel2abs($bindir);
|
|
|
|
# Whether to use prove instead of runprove.
|
|
my $use_prove = $ENV{FCS_USE_TEST_RUN} ? 0 : 1;
|
|
my $num_jobs = $ENV{TEST_JOBS};
|
|
|
|
sub _is_parallized
|
|
{
|
|
return ( $use_prove && $num_jobs );
|
|
}
|
|
|
|
sub _calc_prove
|
|
{
|
|
return [ 'prove',
|
|
( defined($num_jobs) ? sprintf( "-j%d", $num_jobs ) : () ) ];
|
|
}
|
|
|
|
my $exit_success;
|
|
|
|
sub run_tests
|
|
{
|
|
my $tests = shift;
|
|
|
|
my @cmd = ( ( $use_prove ? @{ _calc_prove() } : 'runprove' ), @$tests );
|
|
if ( $ENV{RUN_TESTS_VERBOSE} )
|
|
{
|
|
print "Running [@cmd]\n";
|
|
}
|
|
|
|
if ($use_prove)
|
|
{
|
|
# Workaround for Windows spawning-SNAFU.
|
|
my $exit_code = system(@cmd);
|
|
exit( $exit_success ? 0 : $exit_code ? (-1) : 0 );
|
|
}
|
|
else
|
|
{
|
|
require Test::Run::CmdLine::Prove;
|
|
|
|
my $p = Test::Run::CmdLine::Prove->create(
|
|
{
|
|
'args' => [@$tests],
|
|
'env_switches' => $ENV{'PROVE_SWITCHES'},
|
|
}
|
|
);
|
|
exit( !$p->run() );
|
|
}
|
|
}
|
|
|
|
my $tests_glob = "*.{t.exe,py,t}";
|
|
my $exclude_re_s = "__init__";
|
|
|
|
my @execute;
|
|
GetOptions(
|
|
'--exclude-re=s' => \$exclude_re_s,
|
|
'--execute|e=s' => \@execute,
|
|
'--exit0!' => \$exit_success,
|
|
'--glob=s' => \$tests_glob,
|
|
'--prove!' => \$use_prove,
|
|
'--jobs|j=n' => \$num_jobs,
|
|
) or die "Wrong opts - $!";
|
|
|
|
sub myglob
|
|
{
|
|
return glob( shift . "/$tests_glob" );
|
|
}
|
|
|
|
{
|
|
my $fcs_path = Cwd::getcwd();
|
|
local $ENV{FCS_PATH} = $fcs_path;
|
|
local $ENV{FCS_SRC_PATH} = $abs_bindir;
|
|
|
|
local $ENV{FREECELL_SOLVER_QUIET} = 1;
|
|
Env::Path->PATH->Prepend(
|
|
File::Spec->catdir( Cwd::getcwd(), "board_gen" ),
|
|
File::Spec->catdir( $abs_bindir, "t", "scripts" ),
|
|
);
|
|
|
|
my $IS_WIN = ( $^O eq "MSWin32" );
|
|
Env::Path->CPATH->Prepend( $abs_bindir, );
|
|
|
|
Env::Path->LD_LIBRARY_PATH->Prepend($fcs_path);
|
|
if ($IS_WIN)
|
|
{
|
|
# For the shared objects.
|
|
Env::Path->PATH->Append($fcs_path);
|
|
}
|
|
|
|
my $foo_lib_dir = File::Spec->catdir( $abs_bindir, "tests", "lib" );
|
|
foreach my $add_lib ( Env::Path->PERL5LIB(), Env::Path->PYTHONPATH() )
|
|
{
|
|
$add_lib->Append($foo_lib_dir);
|
|
$add_lib->Append($abs_bindir);
|
|
}
|
|
|
|
my $get_config_fn = sub {
|
|
my $basename = shift;
|
|
|
|
return File::Spec->rel2abs(
|
|
File::Spec->catdir( $bindir, "tests", "config", $basename ), );
|
|
};
|
|
|
|
local $ENV{HARNESS_ALT_INTRP_FILE} = $get_config_fn->(
|
|
$IS_WIN
|
|
? "alternate-interpreters--mswin.yml"
|
|
: "alternate-interpreters.yml"
|
|
);
|
|
|
|
local $ENV{HARNESS_TRIM_FNS} = 'keep:1';
|
|
|
|
local $ENV{HARNESS_PLUGINS} = join(
|
|
' ', qw(
|
|
BreakOnFailure ColorSummary ColorFileVerdicts AlternateInterpreters
|
|
TrimDisplayedFilenames
|
|
)
|
|
);
|
|
|
|
my $is_ninja = ( -e "build.ninja" );
|
|
my $MAKE = $IS_WIN ? 'gmake' : 'make';
|
|
if ($is_ninja)
|
|
{
|
|
system( "ninja", "pretest" );
|
|
}
|
|
else
|
|
{
|
|
if ( system( $MAKE, "-s", "pretest" ) )
|
|
{
|
|
die "$MAKE failed";
|
|
}
|
|
}
|
|
|
|
if ( !$is_ninja )
|
|
{
|
|
if ( system( $MAKE, "-s" ) )
|
|
{
|
|
die "$MAKE failed";
|
|
}
|
|
}
|
|
|
|
my @tests =
|
|
sort { ( basename($a) cmp basename($b) ) || ( $a cmp $b ) }
|
|
( myglob("$abs_bindir/tests/*") );
|
|
|
|
if ($IS_WIN)
|
|
{
|
|
@tests = grep { not( /pysolgtk/i or /import_v2/i ) } @tests;
|
|
}
|
|
|
|
if ( defined($exclude_re_s) )
|
|
{
|
|
my $re = qr/$exclude_re_s/ms;
|
|
@tests = grep { basename($_) !~ $re } @tests;
|
|
}
|
|
|
|
local $ENV{FCS_TEST_TAGS} = $ENV{FCS_TEST_TAGS} // '';
|
|
print STDERR "FCS_PATH = $ENV{FCS_PATH}\n";
|
|
print STDERR "FCS_SRC_PATH = $ENV{FCS_SRC_PATH}\n";
|
|
print STDERR "FCS_TEST_TAGS = <$ENV{FCS_TEST_TAGS}>\n";
|
|
if ( $ENV{FCS_TEST_SHELL} )
|
|
{
|
|
system("bash");
|
|
}
|
|
elsif (@execute)
|
|
{
|
|
system(@execute);
|
|
}
|
|
else
|
|
{
|
|
local @INC = ( Env::Path->PERL5LIB->List, @INC );
|
|
run_tests( \@tests );
|
|
}
|
|
}
|
|
|
|
__END__
|
|
|
|
=head1 COPYRIGHT AND LICENSE
|
|
|
|
This file is part of Freecell Solver. It is subject to the license terms in
|
|
the COPYING.txt file found in the top-level directory of this distribution
|
|
and at http://fc-solve.shlomifish.org/docs/distro/COPYING.html . No part of
|
|
Freecell Solver, including this file, may be copied, modified, propagated,
|
|
or distributed except according to the terms contained in the COPYING file.
|
|
|
|
Copyright (c) 2000 Shlomi Fish
|
|
|
|
=cut
|