1N/A#!./perl
1N/A
1N/Aprint "1..31\n";
1N/A
1N/ABEGIN {
1N/A chdir 't' if -d 't';
1N/A @INC = '../lib';
1N/A}
1N/A
1N/Asub expected {
1N/A my($object, $package, $type) = @_;
1N/A return "" if (
1N/A ref($object) eq $package
1N/A && "$object" =~ /^\Q$package\E=(\w+)\(0x([0-9a-f]+)\)$/
1N/A && $1 eq $type
1N/A # in 64-bit platforms hex warns for 32+ -bit values
1N/A && do { no warnings 'portable'; hex($2) == $object }
1N/A );
1N/A print "# $object $package $type\n";
1N/A return "not ";
1N/A}
1N/A
1N/A# test blessing simple types
1N/A
1N/A$a1 = bless {}, "A";
1N/Aprint expected($a1, "A", "HASH"), "ok 1\n";
1N/A$b1 = bless [], "B";
1N/Aprint expected($b1, "B", "ARRAY"), "ok 2\n";
1N/A$c1 = bless \(map "$_", "test"), "C";
1N/Aprint expected($c1, "C", "SCALAR"), "ok 3\n";
1N/Aour $test = "foo"; $d1 = bless \*test, "D";
1N/Aprint expected($d1, "D", "GLOB"), "ok 4\n";
1N/A$e1 = bless sub { 1 }, "E";
1N/Aprint expected($e1, "E", "CODE"), "ok 5\n";
1N/A$f1 = bless \[], "F";
1N/Aprint expected($f1, "F", "REF"), "ok 6\n";
1N/A$g1 = bless \substr("test", 1, 2), "G";
1N/Aprint expected($g1, "G", "LVALUE"), "ok 7\n";
1N/A
1N/A# blessing ref to object doesn't modify object
1N/A
1N/Aprint expected(bless(\$a1, "F"), "F", "REF"), "ok 8\n";
1N/Aprint expected($a1, "A", "HASH"), "ok 9\n";
1N/A
1N/A# reblessing does modify object
1N/A
1N/Abless $a1, "A2";
1N/Aprint expected($a1, "A2", "HASH"), "ok 10\n";
1N/A
1N/A# local and my
1N/A{
1N/A local $a1 = bless $a1, "A3"; # should rebless outer $a1
1N/A local $b1 = bless [], "B3";
1N/A my $c1 = bless $c1, "C3"; # should rebless outer $c1
1N/A our $test2 = ""; my $d1 = bless \*test2, "D3";
1N/A print expected($a1, "A3", "HASH"), "ok 11\n";
1N/A print expected($b1, "B3", "ARRAY"), "ok 12\n";
1N/A print expected($c1, "C3", "SCALAR"), "ok 13\n";
1N/A print expected($d1, "D3", "GLOB"), "ok 14\n";
1N/A}
1N/Aprint expected($a1, "A3", "HASH"), "ok 15\n";
1N/Aprint expected($b1, "B", "ARRAY"), "ok 16\n";
1N/Aprint expected($c1, "C3", "SCALAR"), "ok 17\n";
1N/Aprint expected($d1, "D", "GLOB"), "ok 18\n";
1N/A
1N/A# class is magic
1N/A"E" =~ /(.)/;
1N/Aprint expected(bless({}, $1), "E", "HASH"), "ok 19\n";
1N/A{
1N/A local $! = 1;
1N/A my $string = "$!";
1N/A $! = 2; # attempt to avoid cached string
1N/A $! = 1;
1N/A print expected(bless({}, $!), $string, "HASH"), "ok 20\n";
1N/A
1N/A# ref is ref to magic
1N/A {
1N/A {
1N/A package F;
1N/A sub test { ${$_[0]} eq $string or print "not " }
1N/A }
1N/A $! = 2;
1N/A $f1 = bless \$!, "F";
1N/A $! = 1;
1N/A $f1->test;
1N/A print "ok 21\n";
1N/A }
1N/A}
1N/A
1N/A# ref is magic
1N/A### example of magic variable that is a reference??
1N/A
1N/A# no class, or empty string (with a warning), or undef (with two)
1N/Aprint expected(bless([]), 'main', "ARRAY"), "ok 22\n";
1N/A{
1N/A local $SIG{__WARN__} = sub { push @w, join '', @_ };
1N/A use warnings;
1N/A
1N/A $m = bless [];
1N/A print expected($m, 'main', "ARRAY"), "ok 23\n";
1N/A print @w ? "not ok 24\t# @w\n" : "ok 24\n";
1N/A
1N/A @w = ();
1N/A $m = bless [], '';
1N/A print expected($m, 'main', "ARRAY"), "ok 25\n";
1N/A print @w != 1 ? "not ok 26\t# @w\n" : "ok 26\n";
1N/A
1N/A @w = ();
1N/A $m = bless [], undef;
1N/A print expected($m, 'main', "ARRAY"), "ok 27\n";
1N/A print @w != 2 ? "not ok 28\t# @w\n" : "ok 28\n";
1N/A}
1N/A
1N/A# class is a ref
1N/A$a1 = bless {}, "A4";
1N/A$b1 = eval { bless {}, $a1 };
1N/Aprint $@ ? "ok 29\n" : "not ok 29\t# $b1\n";
1N/A
1N/A# class is an overloaded ref
1N/A{
1N/A package H4;
1N/A use overload '""' => sub { "C4" };
1N/A}
1N/A$h1 = bless {}, "H4";
1N/A$c4 = eval { bless \$test, $h1 };
1N/Aprint expected($c4, 'C4', "SCALAR"), "ok 30\n";
1N/Aprint $@ ? "not ok 31\t# $@" : "ok 31\n";