This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #112966] Crash on delete local; other local bugs
[perl5.git] / t / uni / bless.t
CommitLineData
e69c50fe
BF
1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6 require './test.pl';
7}
8
9use utf8;
10use open qw( :utf8 :std );
11plan (84);
12
13sub expected {
14 my($object, $package, $type) = @_;
15 print "# $object $package $type\n";
a15456de 16 is(ref($object), $package);
e69c50fe
BF
17 my $r = qr/^\Q$package\E=(\w+)\(0x([0-9a-f]+)\)$/u;
18 like("$object", $r);
19 if ("$object" =~ $r) {
20 is($1, $type);
21 # in 64-bit platforms hex warns for 32+ -bit values
22 cmp_ok(do {no warnings 'portable'; hex($2)}, '==', $object);
23 }
24 else {
25 fail(); fail();
26 }
27}
28
29# test blessing simple types
30
31$a1 = bless {}, "ዐ";
32expected($a1, "ዐ", "HASH");
33$b1 = bless [], "B";
34expected($b1, "B", "ARRAY");
35$c1 = bless \(map "$_", "test"), "ᶜ";
36expected($c1, "ᶜ", "SCALAR");
37$tèst = "foo"; $d1 = bless \*tèst, "ɖ";
38expected($d1, "ɖ", "GLOB");
39$e1 = bless sub { 1 }, "ಎ";
40expected($e1, "ಎ", "CODE");
41$f1 = bless \[], "ḟ";
42expected($f1, "ḟ", "REF");
43$g1 = bless \substr("test", 1, 2), "ㄍ";
44expected($g1, "ㄍ", "LVALUE");
45
46# blessing ref to object doesn't modify object
47
48expected(bless(\$a1, "ḟ"), "ḟ", "REF");
49expected($a1, "ዐ", "HASH");
50
51# reblessing does modify object
52
53bless $a1, "ዐ2";
54expected($a1, "ዐ2", "HASH");
55
56# local and my
57{
58 local $a1 = bless $a1, "ዐ3"; # should rebless outer $a1
59 local $b1 = bless [], "B3";
60 my $c1 = bless $c1, "ᶜ3"; # should rebless outer $c1
61 our $test2 = ""; my $d1 = bless \*test2, "ɖ3";
62 expected($a1, "ዐ3", "HASH");
63 expected($b1, "B3", "ARRAY");
64 expected($c1, "ᶜ3", "SCALAR");
65 expected($d1, "ɖ3", "GLOB");
66}
67expected($a1, "ዐ3", "HASH");
68expected($b1, "B", "ARRAY");
69expected($c1, "ᶜ3", "SCALAR");
70expected($d1, "ɖ", "GLOB");
71
72# class is magic
73"ಎ" =~ /(.)/;
74expected(bless({}, $1), "ಎ", "HASH");
75{
76 local $! = 1;
77 my $string = "$!";
78 $! = 2; # attempt to avoid cached string
79 $! = 1;
80 expected(bless({}, $!), $string, "HASH");
81
82# ref is ref to magic
83 {
84 {
85 package ḟ;
86 sub test { main::is(${$_[0]}, $string) }
87 }
88 $! = 2;
89 $f1 = bless \$!, "ḟ";
90 $! = 1;
91 $f1->test;
92 }
93}
94
95# ref is magic
96
97# class is a ref
98$a1 = bless {}, "ዐ4";
99$b1 = eval { bless {}, $a1 };
100isnt ($@, '', "class is a ref");
101
102# class is an overloaded ref
103=begin
104$TODO = "Package not yet clean";
105{
106 package ᚺ4;
107 use overload '""' => sub { "ᶜ4" };
108}
109$h1 = bless {}, "ᚺ4";
110$c4 = eval { bless \$test, $h1 };
111is ($@, '', "class is an overloaded ref");
112expected($c4, 'ᶜ4', "SCALAR");
113=cut
114
115{
116 my %h = 1..2;
117 my($k) = keys %h;
118 my $x=\$k;
119 bless $x, 'pàm';
120 is(ref $x, 'pàm');
121
122 my $a = bless \(keys %h), 'zàp';
123 is(ref $a, 'zàp');
124}