1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
use strict;
use warnings;
use Test::More tests => 52;
use UNIVERSAL::isa 'isa';
{
package Foo;
sub isa { 1 }
}
{
package Bar;
}
{
package Gorch;
sub isa
{
my ($self, $class) = @_;
$self->SUPER::isa($class) unless $class eq 'Glab';
}
}
{
package Baz;
sub isa
{
my ($self, $class) = @_;
UNIVERSAL::isa($self, $class) unless $class eq 'Glab';
}
}
my ($f, $b, $g, $x) = map { bless [], $_ } qw( Foo Bar Gorch Baz );
{
my $warning = '';
local $SIG{__WARN__} = sub { $warning = shift };
ok( !isa( undef, 'Foo' ), 'undef isa nothing' );
is( $warning, '', 'not warning by default' );
ok( isa( [], 'ARRAY' ), '[] is an array ref' );
is( $warning, '', 'not warning by default' );
$warning = '';
ok( isa( $b, 'Bar' ), 'bar is a Bar' );
is( $warning, '', 'not warning by default' );
$warning = '';
ok( isa( $f, 'Foo' ), 'foo is a Foo' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( !isa( $b, 'Zlap' ), 'bar is not Zlap' );
is( $warning, '', 'not warning by default' );
$warning = '';
ok( isa( $f, 'Zlap' ), 'neither is Foo' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( isa( $g, 'Gorch' ), 'Gorch is itself' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( !isa( $g, 'Zlap' ), 'gorch is not Zlap' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( isa( $g, 'Glab' ), '... it is dung' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( isa( $x, 'Baz' ), 'Baz is itself' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( !isa( $x, 'Zlap' ), 'baz is not Zlap' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
$warning = '';
ok( isa( $x, 'Glab' ), 'it is dung' );
like( $warning, qr/as a function.+basic.t/s, '... warning by default' );
}
{
use warnings 'UNIVERSAL::isa';
my $warning = '';
local $SIG{__WARN__} = sub { $warning = shift };
ok( !isa( undef, 'Foo' ), 'undef isa nothing' );
is( $warning, '', 'not warning by default' );
$warning = '';
ok( isa( {}, 'HASH' ), 'hash reference isa HASH' );
is( $warning, '', '... and no warning by default' );
$warning = '';
ok( isa( [], 'ARRAY' ), 'array reference isa ARRAY' );
is( $warning, '', '... and no warning by default' );
$warning = '';
ok( isa( sub {}, 'CODE' ), 'code reference isa CODE' );
is( $warning, '', '... and no warning by default' );
$warning = '';
ok( isa( \my $a, 'SCALAR' ), 'scalar reference isa SCALAR' );
is( $warning, '', '... and no warning by default' );
$warning = '';
ok( isa( qr//, 'Regexp' ), 'regexp reference isa Regexp' );
is( $warning, '', '... and no warning by default' );
$warning = '';
ok( isa( \local *FOO, 'GLOB' ), 'glob reference isa GLOB' );
is( $warning, '', '... and no warning by default' );
}
{
use warnings 'UNIVERSAL::isa';
UNIVERSAL::isa::->import( 'verbose' );
my $warning = '';
local $SIG{__WARN__} = sub { $warning = shift };
ok( !isa( undef, 'Foo' ), 'undef isa nothing' );
like( $warning, qr/Called.+as a function.+on invalid invocant.+basic.t/s,
'... warning in verbose mode' );
ok( isa( {}, 'HASH' ), 'hash reference isa HASH' );
like( $warning, qr/Called.+as a function.+reftyp.+basic.t/s,
'... warning in verbose mode' );
$warning = '';
ok( isa( [], 'ARRAY' ), 'array reference isa ARRAY' );
like( $warning, qr/Called.+as a function.+reftyp.+basic.t/s,
'... warning in verbose mode' );
$warning = '';
ok( isa( sub {}, 'CODE' ), 'code reference isa CODE' );
like( $warning, qr/Called.+as a function.+reftyp.+basic.t/s,
'... warning in verbose mode' );
$warning = '';
ok( isa( \my $a, 'SCALAR' ), 'scalar reference isa SCALAR' );
like( $warning, qr/Called.+as a function.+reftyp.+basic.t/s,
'... warning in verbose mode' );
$warning = '';
ok( isa( qr//, 'Regexp' ), 'regexp reference isa Regexp' );
like( $warning, qr/Called.+as a functio.+basic.t/s,
'... warning in verbose mode' );
$warning = '';
ok( isa( \local *FOO, 'GLOB' ), 'glob reference isa GLOB' );
like( $warning, qr/Called.+as a function.+reftyp.+basic.t/s,
'... warning in verbose mode' );
}
|