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

# These tests were created to satisfy Devel::Cover reports.  They are not
# exhaustive and should not be considered as a complete test case.

use Test::Most tests => 22;
use Test::NoWarnings;
use Carp;

BEGIN { use_ok( 'IPC::Run3::Simple', ':all' ) }

my @subs = qw(

  chomp_err chomp_out croak_on_err default_stderr default_stdin
  default_stdout tee_systemcall

);

ok( exists $main::{ $_ }, "$_ seems to have been imported" ) for @subs, 'run3';

my %expected_default = (

  CHOMP_ERR      => 1,
  CHOMP_OUT      => 1,
  CROAK_ON_ERR   => 0,
  DEFAULT_STDIN  => undef,
  DEFAULT_STDOUT => \my $out,
  DEFAULT_STDERR => \my $err,
  TEE_SYSTEMCALL => 0,

);

my %got_default;
eval "\$got_default{ $_ } = \$IPC::Run3::Simple::$_\n" for keys %expected_default;

cmp_deeply( \%got_default, \%expected_default, 'defaults match' );

my %change_option = (

  CHOMP_ERR      => '',
  CHOMP_OUT      => '',
  CROAK_ON_ERR   => 1,
  DEFAULT_STDIN  => \my $test_change_in,
  DEFAULT_STDOUT => \my $test_change_out,
  DEFAULT_STDERR => \my $test_change_err,
  TEE_SYSTEMCALL => 1,

);

for my $sub ( @subs ) {

  my $key = uc $sub;
  eval "$sub( \$change_option{ $key } )";
  croak $@ if $@;

}

my %got_changed;
eval "\$got_changed{ $_ } = \$IPC::Run3::Simple::$_ || ''\n" for keys %change_option;

cmp_deeply( \%got_changed, \%change_option, 'change options worked' );

# reset defaults

for my $sub ( @subs ) {

  my $key = uc $sub;
  eval "$sub( \$expected_default{ $key } )";
  croak $@ if $@;

}

# run3 expecting array or hash ref
throws_ok { run3() } qr/Expecting either an array ref or a hash ref/, 'not an array or hash ref caught';

# test basic system call
my ( $basic_stdout, $basic_stderr, $basic_syserr, $basic_time ) = run3( [ 'ls', $0 ] );
ok( $basic_syserr == 0, 'ls did not cause system error' );
is( $basic_stderr, '', 'ls did not report error on stderr' );
like( $basic_stdout, qr{^$0$},            "ls dumped $basic_stdout to stdout" );
like( $basic_time,   qr/^\d+(?:\.\d+)?$/, "ls took $basic_time seconds to run" );

# test syserr
my $exit   = 3;
my $syserr = $exit * 256;
my ( $syserr_stdout, $syserr_stderr, $syserr_syserr, $syserr_time ) = run3( [ 'perl', '-e', "exit $exit" ] );
is( $syserr_syserr, $syserr, "perl exit $exit caused correct system error ($syserr)" );
is( $syserr_stderr, '',      'perl exit $exit did not report error on stderr' );
is( $syserr_stdout, '',      "perl exit $exit dumped nothing stdout" );
like( $syserr_time, qr/^\d+(?:\.\d+)?$/, "perl exit $exit took $syserr_time seconds to run" );

# test debugging variable
$ENV{ DEBUG_IPCR3S_CALL }++;
my ( $debug_stdout, $debug_stderr, $debug_syserr, $debug_time ) = run3( [ 'ls', $0 ] );

#ok( $debug_syserr == 0, 'ls did not cause system error' );
#is( $debug_stderr, '', 'ls did not report error on stderr' );
cmp_deeply( $debug_stdout, [ 'ls', $0 ], "got what would be called back (@$debug_stdout)" );

#like( $debug_time, qr/^\d+(?:\.\d+)?$/, "ls took $debug_time seconds to run");
delete $ENV{ DEBUG_IPCR3S_CALL };