The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;

use Test::More;
use Test::Command;

use File::Spec;
use FindBin;
use Config;
use Cwd ();

plan tests => 4;

my ( $script_dir, $perl, $script, $script_options, $cmd, $tc );

{
    my ( @candidate_dirs );

    foreach my $startdir ( Cwd::cwd(), $FindBin::Bin )
    {
        push @candidate_dirs,
            File::Spec->catdir( $startdir, '..', 'script' ),
            File::Spec->catdir( $startdir, 'script' );
    }

    @candidate_dirs = grep { -d $_ } @candidate_dirs;

    plan skip_all => ( 'unable to find script dir relative to bin: ' .
        $FindBin::Bin . ' or cwd: ' . Cwd::cwd() )
        unless @candidate_dirs;

    $script_dir = $candidate_dirs[ 0 ];
}

$script = File::Spec->catfile( $script_dir, 'benchmark_template_engines' );

#  Untaint stuff so -T doesn't complain.
delete @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)};   # Make %ENV safer

#  We trust their Cwd info and so forth, so blindly untaint this.
( $script ) = $script =~ /^(.*)$/;

#  Ditto their perl location.
#  We run the script via the currently invoked perl, because the
#  shebang perl at the top of the script is probably the wrong version
#  under a smoke tester.
( $perl ) = $^X =~ /^(.*)$/;


#  Some smoke-test setups seem to set @INC so subcommands can't see
#  where they've installed the required modules.
local $ENV{ PERL5LIB } = join( $Config{ path_sep } || ':', @INC );
#diag( "Settinng PERL5LIB: $ENV{PERL5LIB}" );


#
#  1:  Script file exists.
ok( ( -e $script ), 'benchmark_template_engines found' );

#
#  2:  Script file is executable.
SKIP:
{
    skip 'Skip "is executable?" check for MSWin', 1 if $^O =~ /^MSWin/;
    ok( ( -x $script ), 'benchmark_template_engines is executable' );
}

#
#  3:  Does script compile as valid perl?
$cmd = "$perl -c $script";
#diag( "Testing script compiles with command: $cmd" );
$tc = Test::Command->new( cmd => $cmd );
$tc->stderr_like( qr/syntax OK$/, 'script compiles ok' );

#
#  4:  Check that it runs with some "safe" options set.
$cmd = "$perl $script --nofeatures --scalar_variable --featurematrix";
#diag( "Testing script output with command: $cmd" );
$tc = Test::Command->new( cmd => $cmd );
$tc->stdout_like( qr/^--- (Engine errors|Feature Matrix)/, 'command runs ok' );
#  Too many upstream failures in plugins, maybe needs to be an author test.
#$tc->stderr_is_eq( '', 'command produces no warnings' );