The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Symbol qw/gensym/;
my ($save_out, $save_err);
BEGIN { 
    $save_out = gensym();
    $save_err = gensym();
    open $save_out, ">&main::STDOUT";
    open $save_err, ">&main::STDERR";
}

use Test::More tests => 7;

#--------------------------------------------------------------------------#
# close and restore console
#--------------------------------------------------------------------------#

sub _close_console {
    close STDOUT or die "Can't close STDOUT";
    close STDERR or die "Can't close STDERR";
    return;
}

sub _restore_console {
    open STDOUT, ">&" . fileno($save_out) or die "Can't restore STDOUT";
    open STDERR, ">&" . fileno($save_err) or die "Can't restore STDERR";
    return;
}

#--------------------------------------------------------------------------#
# _test_print
#--------------------------------------------------------------------------#

sub _test_print {
    print STDOUT "Test to STDOUT\n";
    print STDERR "Test to STDERR\n";
    return;
}

#--------------------------------------------------------------------------#

my ($stdout, $stderr, $err);

BEGIN{ use_ok("IO::CaptureOutput", "capture") }

eval { capture \&_test_print, \$stdout, \$stderr; };
$err = $@;

is( $err, q{}, "no errors capturing with console open" );
is( $stdout, "Test to STDOUT\n", "STDOUT test with console open" );
is( $stderr, "Test to STDERR\n", "STDERR test with console open" );
$stdout = $stderr = q{};

_close_console;

eval { capture \&_test_print, \$stdout, \$stderr; };
$err = $@;

_restore_console;

is( $err, q{}, "no errors capturing with console closed" );
is( $stdout, "Test to STDOUT\n", "STDOUT test with console closed" );
is( $stderr, "Test to STDERR\n", "STDERR test with console closed" );