This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: Change 29723 breaks t/op/inccode-tie.t on Win32
[perl5.git] / t / op / bless.t
CommitLineData
81689caa
HS
1#!./perl
2
81689caa
HS
3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
4a32f131 6 require './test.pl';
81689caa
HS
7}
8
4a32f131
NC
9plan (106);
10
81689caa
HS
11sub expected {
12 my($object, $package, $type) = @_;
81689caa 13 print "# $object $package $type\n";
4a32f131
NC
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
HS
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
HS
39
40# blessing ref to object doesn't modify object
41
4a32f131
NC
42expected(bless(\$a1, "F"), "F", "REF");
43expected($a1, "A", "HASH");
81689caa
HS
44
45# reblessing does modify object
46
016a42f3 47bless $a1, "A2";
4a32f131 48expected($a1, "A2", "HASH");
81689caa
HS
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
NC
56 expected($a1, "A3", "HASH");
57 expected($b1, "B3", "ARRAY");
58 expected($c1, "C3", "SCALAR");
59 expected($d1, "D3", "GLOB");
81689caa 60}
4a32f131
NC
61expected($a1, "A3", "HASH");
62expected($b1, "B", "ARRAY");
63expected($c1, "C3", "SCALAR");
64expected($d1, "D", "GLOB");
81689caa
HS
65
66# class is magic
67"E" =~ /(.)/;
4a32f131 68expected(bless({}, $1), "E", "HASH");
81689caa
HS
69{
70 local $! = 1;
71 my $string = "$!";
72 $! = 2; # attempt to avoid cached string
73 $! = 1;
4a32f131 74 expected(bless({}, $!), $string, "HASH");
81689caa
HS
75
76# ref is ref to magic
77 {
78 {
79 package F;
4a32f131 80 sub test { main::is(${$_[0]}, $string) }
81689caa
HS
81 }
82 $! = 2;
83 $f1 = bless \$!, "F";
84 $! = 1;
85 $f1->test;
81689caa
HS
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
HS
94{
95 local $SIG{__WARN__} = sub { push @w, join '', @_ };
43a954af 96 use warnings;
81689caa
HS
97
98 $m = bless [];
4a32f131
NC
99 expected($m, 'main', "ARRAY");
100 is (scalar @w, 0);
81689caa
HS
101
102 @w = ();
103 $m = bless [], '';
4a32f131
NC
104 expected($m, 'main', "ARRAY");
105 is (scalar @w, 1);
81689caa
HS
106
107 @w = ();
108 $m = bless [], undef;
4a32f131
NC
109 expected($m, 'main', "ARRAY");
110 is (scalar @w, 2);
81689caa
HS
111}
112
113# class is a ref
114$a1 = bless {}, "A4";
115$b1 = eval { bless {}, $a1 };
4a32f131 116isnt ($@, '', "class is a ref");
016a42f3
HS
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
NC
125is ($@, '', "class is an overloaded ref");
126expected($c4, 'C4', "SCALAR");