Blame t/hints.t

Packit 6427f8
#!/usr/bin/perl -w
Packit 6427f8
use strict;
Packit 6427f8
use warnings;
Packit 6427f8
use autodie::hints;
Packit 6427f8
Packit 6427f8
use FindBin;
Packit 6427f8
use lib "$FindBin::Bin/lib";
Packit 6427f8
Packit 6427f8
use File::Copy qw(copy move cp mv);
Packit 6427f8
Packit 6427f8
use Test::More 'no_plan';
Packit 6427f8
Packit 6427f8
use constant NO_SUCH_FILE  => "this_file_had_better_not_exist";
Packit 6427f8
use constant NO_SUCH_FILE2 => "this_file_had_better_not_exist_xyzzy";
Packit 6427f8
Packit 6427f8
use constant PERL510  => ( $] >= 5.0100 );
Packit 6427f8
use constant PERL5101 => ( $] >= 5.0101 );
Packit 6427f8
use constant PERL5102 => ( $] >= 5.0102 );
Packit 6427f8
Packit 6427f8
# File::Copy states that all subroutines return '0' on failure.
Packit 6427f8
# However both Windows and VMS may return other false values
Packit 6427f8
# (notably empty-string) on failure.  This constant indicates
Packit 6427f8
# whether we should skip some tests because the return values
Packit 6427f8
# from File::Copy may not be what's in the documentation.
Packit 6427f8
Packit 6427f8
use constant WEIRDO_FILE_COPY =>
Packit 6427f8
    ( ! PERL5102 and ( $^O eq "MSWin32" or $^O eq "VMS" ));
Packit 6427f8
Packit 6427f8
use Hints_test qw(
Packit 6427f8
    fail_on_empty fail_on_false fail_on_undef
Packit 6427f8
);
Packit 6427f8
Packit 6427f8
use autodie qw(fail_on_empty fail_on_false fail_on_undef);
Packit 6427f8
Packit 6427f8
diag("Sub::Identify ", exists( $INC{'Sub/Identify.pm'} ) ? "is" : "is not",
Packit 6427f8
     " loaded") if (! $ENV{PERL_CORE});
Packit 6427f8
Packit 6427f8
my $hints = "autodie::hints";
Packit 6427f8
Packit 6427f8
# Basic hinting tests
Packit 6427f8
Packit 6427f8
is( $hints->sub_fullname(\&copy), 'File::Copy::copy' , "Id: copy" );
Packit 6427f8
is(
Packit 6427f8
    $hints->sub_fullname(\&cp),
Packit 6427f8
    PERL5101 ? 'File::Copy::cp' : 'File::Copy::copy' , "Id: cp"
Packit 6427f8
);
Packit 6427f8
Packit 6427f8
is( $hints->sub_fullname(\&move), 'File::Copy::move' , "Id: move" );
Packit 6427f8
is( $hints->sub_fullname(\&mv),
Packit 6427f8
    PERL5101 ? 'File::Copy::mv' : 'File::Copy::move' , "Id: mv"
Packit 6427f8
);
Packit 6427f8
Packit 6427f8
if (PERL510) {
Packit 6427f8
    ok( $hints->get_hints_for(\&copy)->{scalar}->(0) ,
Packit 6427f8
        "copy() hints should fail on 0 for scalars."
Packit 6427f8
    );
Packit 6427f8
    ok( $hints->get_hints_for(\&copy)->{list}->(0) ,
Packit 6427f8
        "copy() hints should fail on 0 for lists."
Packit 6427f8
    );
Packit 6427f8
}
Packit 6427f8
Packit 6427f8
# Scalar context test
Packit 6427f8
Packit 6427f8
eval {
Packit 6427f8
    use autodie qw(copy);
Packit 6427f8
Packit 6427f8
    my $scalar_context = copy(NO_SUCH_FILE, NO_SUCH_FILE2);
Packit 6427f8
};
Packit 6427f8
Packit 6427f8
isnt("$@", "", "Copying in scalar context should throw an error.");
Packit 6427f8
isa_ok($@, "autodie::exception");
Packit 6427f8
Packit 6427f8
is($@->function, "File::Copy::copy", "Function should be original name");
Packit 6427f8
Packit 6427f8
SKIP: {
Packit 6427f8
    skip("File::Copy is weird on Win32/VMS before 5.10.1", 1)
Packit 6427f8
        if WEIRDO_FILE_COPY;
Packit 6427f8
Packit 6427f8
    is($@->return, 0, "File::Copy returns zero on failure");
Packit 6427f8
}
Packit 6427f8
Packit 6427f8
is($@->context, "scalar", "File::Copy called in scalar context");
Packit 6427f8
Packit 6427f8
# List context test.
Packit 6427f8
Packit 6427f8
eval {
Packit 6427f8
    use autodie qw(copy);
Packit 6427f8
Packit 6427f8
    my @list_context = copy(NO_SUCH_FILE, NO_SUCH_FILE2);
Packit 6427f8
};
Packit 6427f8
Packit 6427f8
isnt("$@", "", "Copying in list context should throw an error.");
Packit 6427f8
isa_ok($@, "autodie::exception");
Packit 6427f8
Packit 6427f8
is($@->function, "File::Copy::copy", "Function should be original name");
Packit 6427f8
Packit 6427f8
SKIP: {
Packit 6427f8
    skip("File::Copy is weird on Win32/VMS before 5.10.1", 1)
Packit 6427f8
        if WEIRDO_FILE_COPY;
Packit 6427f8
Packit 6427f8
    is_deeply($@->return, [0], "File::Copy returns zero on failure");
Packit 6427f8
}
Packit 6427f8
is($@->context, "list", "File::Copy called in list context");
Packit 6427f8
Packit 6427f8
# Tests on loaded funcs.
Packit 6427f8
Packit 6427f8
my %tests = (
Packit 6427f8
Packit 6427f8
    # Test code             # Exception expected?
Packit 6427f8
Packit 6427f8
    'fail_on_empty()'       => 1,
Packit 6427f8
    'fail_on_empty(0)'      => 0,
Packit 6427f8
    'fail_on_empty(undef)'  => 0,
Packit 6427f8
    'fail_on_empty(1)'      => 0,
Packit 6427f8
Packit 6427f8
    'fail_on_false()'       => 1,
Packit 6427f8
    'fail_on_false(0)'      => 1,
Packit 6427f8
    'fail_on_false(undef)'  => 1,
Packit 6427f8
    'fail_on_false(1)'      => 0,
Packit 6427f8
Packit 6427f8
    'fail_on_undef()'       => 1,
Packit 6427f8
    'fail_on_undef(0)'      => 0,
Packit 6427f8
    'fail_on_undef(undef)'  => 1,
Packit 6427f8
    'fail_on_undef(1)'      => 0,
Packit 6427f8
Packit 6427f8
);
Packit 6427f8
Packit 6427f8
# On Perl 5.8, autodie doesn't correctly propagate into string evals.
Packit 6427f8
# The following snippet forces the use of autodie inside the eval if
Packit 6427f8
# we really really have to.  For 5.10+, we don't want to include this
Packit 6427f8
# fix, because the tests will act as a canary if we screw up string
Packit 6427f8
# eval propagation.
Packit 6427f8
Packit 6427f8
my $perl58_fix = (
Packit 6427f8
    $] >= 5.010 ?
Packit 6427f8
    "" :
Packit 6427f8
    "use autodie qw(fail_on_empty fail_on_false fail_on_undef); "
Packit 6427f8
);
Packit 6427f8
Packit 6427f8
while (my ($test, $exception_expected) = each %tests) {
Packit 6427f8
    eval "
Packit 6427f8
        $perl58_fix
Packit 6427f8
        my \@array = $test;
Packit 6427f8
    ";
Packit 6427f8
Packit 6427f8
Packit 6427f8
    if ($exception_expected) {
Packit 6427f8
        isnt("$@", "", $test);
Packit 6427f8
    }
Packit 6427f8
    else {
Packit 6427f8
        is($@, "", $test);
Packit 6427f8
    }
Packit 6427f8
}
Packit 6427f8
Packit 6427f8
1;