#!perl

use strict;
use warnings;

use Test::More tests => 5;
BEGIN { use_ok('Shell::GetEnv') };

use Env::Path;
use Time::Out qw( timeout );
my $timeout_time = $ENV{TIMEOUT_TIME} || 10;

my ( $env, $envs, %env0, $env1 );

$ENV{SHELL_GETENV_TEST} = 1;

my %opt = ( Startup => 0,
	    Verbose => 1,
	    STDERR => 't/exclude.stderr',
	    STDOUT => 't/exclude.stdout' );

$ENV{SHELL_GETENV_TEST} = 1;
$env = timeout $timeout_time => 
  sub { Shell::GetEnv->new( 'sh',  ". t/testenv.sh", \%opt ) };

my $err = $@;
ok ( ! $err, "run subshell" ) 
  or diag( "unexpected time out: $err\n",
	   "please check $opt{STDOUT} and $opt{STDERR} for possible clues\n" );

SKIP: {
    skip "failed subprocess run", 2 if $err;

    $envs = $env->envs( );

    %env0 = %$envs;
    $env1 = $env->envs( Exclude => qr/^SHELL_GETENV/ );

    ok( 'sh' eq delete( $env0{SHELL_GETENV} )
	&& eq_hash( $env1, \%env0 ),
	'exclude regexp' );


    %env0 = %$envs;
    $env1 = $env->envs( Exclude => 'SHELL_GETENV' );

    ok( 'sh' eq delete( $env0{SHELL_GETENV} )
	&& eq_hash( $env1, \%env0 ),
	'exclude scalar' );

    %env0 = %$envs;
    $env1 = $env->envs( Exclude => 
			sub { my( $var, $val ) = @_;
			      return $var eq 'SHELL_GETENV' ? 1 : 0 } );

    ok( 'sh' eq delete( $env0{SHELL_GETENV} )
	&& eq_hash( $env1, \%env0 ),
	'exclude code' );


}
