d4dfcd70f127f61a3e8d4515bcf3c0bfa621f619
[p5sagit/p5-mst-13.2.git] / ext / List / Util / t / refaddr.t
1 #!./perl
2
3 BEGIN {
4     unless (-d 'blib') {
5         chdir 't' if -d 't';
6         @INC = '../lib';
7         require Config; import Config;
8         keys %Config; # Silence warning
9         if ($Config{extensions} !~ /\bList\/Util\b/) {
10             print "1..0 # Skip: List::Util was not built\n";
11             exit 0;
12         }
13     }
14 }
15
16
17 use Test::More tests => 19;
18
19 use Scalar::Util qw(refaddr);
20 use vars qw($t $y $x *F $v $r);
21 use Symbol qw(gensym);
22
23 # Ensure we do not trigger and tied methods
24 tie *F, 'MyTie';
25
26 my $i = 1;
27 foreach $v (undef, 10, 'string') {
28   is(refaddr($v), undef, "not " . (defined($v) ? "'$v'" : "undef"));
29 }
30
31 foreach $r ({}, \$t, [], \*F, sub {}) {
32   my $n = "$r";
33   $n =~ /0x(\w+)/;
34   my $addr = do { local $^W; hex $1 };
35   is( refaddr($r), $addr, $n);
36
37   my $obj = bless $r, 'FooBar';
38   is( refaddr($r), $addr, "blessed with overload $n");
39 }
40
41 {
42   my $z = '77';
43   my $y = \$z;
44   my $a = '78';
45   my $b = \$a;
46   tie my %x, 'Hash3', {};
47   $x{$y} = 22;
48   $x{$b} = 23;
49   my $xy = $x{$y};
50   my $xb = $x{$b}; 
51   ok(ref($x{$y}));
52   ok(ref($x{$b}));
53   ok(refaddr($xy) == refaddr($y));
54   ok(refaddr($xb) == refaddr($b));
55   ok(refaddr($x{$y}));
56   ok(refaddr($x{$b}));
57 }
58
59 package FooBar;
60
61 use overload  '0+' => sub { 10 },
62                 '+' => sub { 10 + $_[1] };
63
64 package MyTie;
65
66 sub TIEHANDLE { bless {} }
67 sub DESTROY {}
68
69 sub AUTOLOAD {
70   warn "$AUTOLOAD called";
71   exit 1; # May be in an eval
72 }
73
74 package Hash3;
75
76 use Scalar::Util qw(refaddr);
77
78 sub TIEHASH
79 {
80         my $pkg = shift;
81         return bless [ @_ ], $pkg;
82 }
83 sub FETCH
84 {
85         my $self = shift;
86         my $key = shift;
87         my ($underlying) = @$self;
88         return $underlying->{refaddr($key)};
89 }
90 sub STORE
91 {
92         my $self = shift;
93         my $key = shift;
94         my $value = shift;
95         my ($underlying) = @$self;
96         return ($underlying->{refaddr($key)} = $key);
97 }