tests are expected to fail if dirfd () does not exist
[p5sagit/p5-mst-13.2.git] / t / op / bless.t
CommitLineData
81689caa 1#!./perl
2
81689caa 3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
4a32f131 6 require './test.pl';
81689caa 7}
8
4a32f131 9plan (106);
10
81689caa 11sub expected {
12 my($object, $package, $type) = @_;
81689caa 13 print "# $object $package $type\n";
4a32f131 14 is(ref($object), $package);
15 my $r = qr/^\Q$package\E=(\w+)\(0x([0-9a-f]+)\)$/;
16 like("$object", $r);
17 "$object" =~ $r;
18 is($1, $type);
19 # in 64-bit platforms hex warns for 32+ -bit values
20 cmp_ok(do {no warnings 'portable'; hex($2)}, '==', $object);
81689caa 21}
22
23# test blessing simple types
24
25$a1 = bless {}, "A";
4a32f131 26expected($a1, "A", "HASH");
81689caa 27$b1 = bless [], "B";
4a32f131 28expected($b1, "B", "ARRAY");
81689caa 29$c1 = bless \(map "$_", "test"), "C";
4a32f131 30expected($c1, "C", "SCALAR");
016a42f3 31our $test = "foo"; $d1 = bless \*test, "D";
4a32f131 32expected($d1, "D", "GLOB");
81689caa 33$e1 = bless sub { 1 }, "E";
4a32f131 34expected($e1, "E", "CODE");
81689caa 35$f1 = bless \[], "F";
4a32f131 36expected($f1, "F", "REF");
81689caa 37$g1 = bless \substr("test", 1, 2), "G";
4a32f131 38expected($g1, "G", "LVALUE");
81689caa 39
40# blessing ref to object doesn't modify object
41
4a32f131 42expected(bless(\$a1, "F"), "F", "REF");
43expected($a1, "A", "HASH");
81689caa 44
45# reblessing does modify object
46
016a42f3 47bless $a1, "A2";
4a32f131 48expected($a1, "A2", "HASH");
81689caa 49
50# local and my
51{
52 local $a1 = bless $a1, "A3"; # should rebless outer $a1
53 local $b1 = bless [], "B3";
54 my $c1 = bless $c1, "C3"; # should rebless outer $c1
016a42f3 55 our $test2 = ""; my $d1 = bless \*test2, "D3";
4a32f131 56 expected($a1, "A3", "HASH");
57 expected($b1, "B3", "ARRAY");
58 expected($c1, "C3", "SCALAR");
59 expected($d1, "D3", "GLOB");
81689caa 60}
4a32f131 61expected($a1, "A3", "HASH");
62expected($b1, "B", "ARRAY");
63expected($c1, "C3", "SCALAR");
64expected($d1, "D", "GLOB");
81689caa 65
66# class is magic
67"E" =~ /(.)/;
4a32f131 68expected(bless({}, $1), "E", "HASH");
81689caa 69{
70 local $! = 1;
71 my $string = "$!";
72 $! = 2; # attempt to avoid cached string
73 $! = 1;
4a32f131 74 expected(bless({}, $!), $string, "HASH");
81689caa 75
76# ref is ref to magic
77 {
78 {
79 package F;
4a32f131 80 sub test { main::is(${$_[0]}, $string) }
81689caa 81 }
82 $! = 2;
83 $f1 = bless \$!, "F";
84 $! = 1;
85 $f1->test;
81689caa 86 }
87}
88
89# ref is magic
90### example of magic variable that is a reference??
91
92# no class, or empty string (with a warning), or undef (with two)
4a32f131 93expected(bless([]), 'main', "ARRAY");
81689caa 94{
95 local $SIG{__WARN__} = sub { push @w, join '', @_ };
43a954af 96 use warnings;
81689caa 97
98 $m = bless [];
4a32f131 99 expected($m, 'main', "ARRAY");
100 is (scalar @w, 0);
81689caa 101
102 @w = ();
103 $m = bless [], '';
4a32f131 104 expected($m, 'main', "ARRAY");
105 is (scalar @w, 1);
81689caa 106
107 @w = ();
108 $m = bless [], undef;
4a32f131 109 expected($m, 'main', "ARRAY");
110 is (scalar @w, 2);
81689caa 111}
112
113# class is a ref
114$a1 = bless {}, "A4";
115$b1 = eval { bless {}, $a1 };
4a32f131 116isnt ($@, '', "class is a ref");
016a42f3 117
118# class is an overloaded ref
119{
120 package H4;
121 use overload '""' => sub { "C4" };
122}
123$h1 = bless {}, "H4";
124$c4 = eval { bless \$test, $h1 };
4a32f131 125is ($@, '', "class is an overloaded ref");
126expected($c4, 'C4', "SCALAR");