Ref-Util
view release on metacpan or search on metacpan
t/all-permutations.t view on Meta::CPAN
use strict;
use warnings;
use Test::More 'tests' => 5;
use Ref::Util ':all';
use constant FORMAT_REFS_WORK => ("$]" >= 5.007);
# FIXME: plain regular expressions, blessed regular expressions
my $plain_formatref = do {
format FH1 =
.
*FH1{'FORMAT'};
};
my $blessed_formatref = !FORMAT_REFS_WORK ? undef : bless do {
format FH2 =
.
*FH2{'FORMAT'};
}, 'FormatRef';
my $evil_blessed_formatref = !FORMAT_REFS_WORK ? undef : bless do {
format FH3 =
.
*FH3{'FORMAT'};
}, '0';
my ( $var_for_globref, $var_for_blessed_globref, $var_for_evil_globref );
my $plain_scalar = 'string';
my $var_for_scalarref = 'stringy';
my $blessed_scalarref = bless \$var_for_scalarref, 'ScalarRef';
my %all;
{;
# globref causes this warning
no warnings qw<once>;
%all = (
'plain_scalarref' => \$plain_scalar,
'plain_scalarref_vstring' => \v1.2.3,
'plain_arrayref' => [],
'plain_hashref' => +{},
'plain_coderef' => sub {'plain_code'},
#'plain_regexpref' => qr{plain},
'plain_globref' => \*::var_for_globref,
'plain_formatref' => $plain_formatref,
'plain_refref' => \\$plain_scalar,
'plain_refref_sub' => \sub{},
'blessed_scalarref' => $blessed_scalarref,
'blessed_scalarref_vstring' => bless( \ do { my $x = v1.2.3 }, 'ScalarRef' ),
'blessed_arrayref' => bless( [], 'ArrayRef' ),
'blessed_hashref' => bless( +{}, 'HashRef' ),
'blessed_coderef' => bless( sub {'blessed_code'}, 'CodeRef' ),
#'blessed_regexp' => bless( qr{blessed}, 'BlessedRegexp' ),
'blessed_globref' => bless( \*::var_for_blessed_globref, 'GlobRef' ),
'blessed_formatref' => $blessed_formatref,
'blessed_refref' => bless( \\$blessed_scalarref, 'RefRef' ),
'blessed_refref_sub' => bless( \sub {}, 'RefRef' ),
'evil_blessed_scalarref' => bless( \ do { my $x = 'evil' }, '0' ),
'evil_blessed_scalarref_vstring' => bless( \ do { my $x = v1.2.3 }, '0' ),
'evil_blessed_arrayref' => bless( [], '0' ),
'evil_blessed_hashref' => bless( +{}, '0' ),
'evil_blessed_coderef' => bless( sub {'blessed_code'}, '0' ),
#'evil_blessed_regexp' => bless( qr{evil}, '0' ),
'evil_blessed_globref' => bless( \*::var_for_evil_globref, '0' ),
'evil_blessed_formatref' => $evil_blessed_formatref,
'evil_blessed_refref' => bless( \\do { my $x = 'evil' }, '0' ),
);
}
my ( %plain, %blessed );
foreach my $key ( keys %all ) {
if (!FORMAT_REFS_WORK && $key =~ /formatref/) {
delete $all{$key};
}
else {
$key =~ /^plain_/ and $plain{$key} = $all{$key};
$key =~ /blessed_/ and $blessed{$key} = $all{$key};
}
}
my @all_keys = sort keys %all;
my @plain_keys = sort keys %plain;
my @blessed_keys = sort keys %blessed;
subtest 'non-refs' => sub {
foreach my $value ( 0, 1, 'string', '', undef, '0', '0e0' ) {
# better string representation for test output
my $rep = defined $value ? $value eq '' ? q{''} : $value : '(undef)';
for my $name (grep /^is_/, @Ref::Util::EXPORT_OK) {
next if !FORMAT_REFS_WORK && $name =~ /formatref/;
my $func = do { no strict 'refs'; \&{"Ref::Util::$name"} };
ok( !$func->($value), "$name($rep) is false" );
}
}
done_testing();
};
subtest 'plain references only work on is_plain functions' => sub {
# each %plain should fail each test of the %blessed
foreach my $plain_type (@plain_keys) {
my $value = $plain{$plain_type};
ok(
!is_blessed_ref($value),
"is_blessed_ref($plain_type) is false",
);
ok(
!is_blessed_scalarref($value),
"is_blessed_scalarref($plain_type) is false",
);
ok(
!is_blessed_arrayref($value),
"is_blessed_arrayref($plain_type) is false",
);
ok(
!is_blessed_hashref($value),
"is_blessed_hashref($plain_type) is false",
);
ok(
!is_blessed_coderef($value),
"is_blessed_coderef($plain_type) is false",
);
ok(
!is_blessed_globref($value),
"is_blessed_coderef($plain_type) is false",
);
ok(
!is_blessed_formatref($value),
"is_blessed_formatref($plain_type) is false",
) if FORMAT_REFS_WORK;
ok(
!is_blessed_refref($value),
"is_blessed_refref($plain_type) is false",
);
}
done_testing();
};
subtest 'plain references' => sub {
# each should fail everything except their own
foreach my $plain_type (@plain_keys) {
my $value = $plain{$plain_type};
( run in 2.556 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )