15759b3d2Safresh1use strict; 25759b3d2Safresh1use warnings; 35759b3d2Safresh1 45759b3d2Safresh1use Test::More; 55759b3d2Safresh1 65759b3d2Safresh1 75759b3d2Safresh1sub warnings(&) { 85759b3d2Safresh1 my $code = shift; 95759b3d2Safresh1 my @warnings; 105759b3d2Safresh1 local $SIG{__WARN__} = sub { push @warnings => @_ }; 115759b3d2Safresh1 $code->(); 125759b3d2Safresh1 return \@warnings; 135759b3d2Safresh1} 145759b3d2Safresh1 155759b3d2Safresh1sub exception(&) { 165759b3d2Safresh1 my $code = shift; 175759b3d2Safresh1 local ($@, $!, $SIG{__DIE__}); 185759b3d2Safresh1 my $ok = eval { $code->(); 1 }; 195759b3d2Safresh1 my $error = $@ || 'SQUASHED ERROR'; 205759b3d2Safresh1 return $ok ? undef : $error; 215759b3d2Safresh1} 225759b3d2Safresh1 235759b3d2Safresh1BEGIN { 245759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase.pm'} = __FILE__; 255759b3d2Safresh1 265759b3d2Safresh1 package 275759b3d2Safresh1 main::HBase; 285759b3d2Safresh1 use Test2::Util::HashBase qw/foo bar baz/; 295759b3d2Safresh1 305759b3d2Safresh1 main::is(FOO, 'foo', "FOO CONSTANT"); 315759b3d2Safresh1 main::is(BAR, 'bar', "BAR CONSTANT"); 325759b3d2Safresh1 main::is(BAZ, 'baz', "BAZ CONSTANT"); 335759b3d2Safresh1} 345759b3d2Safresh1 355759b3d2Safresh1BEGIN { 365759b3d2Safresh1 package 375759b3d2Safresh1 main::HBaseSub; 385759b3d2Safresh1 use base 'main::HBase'; 395759b3d2Safresh1 use Test2::Util::HashBase qw/apple pear/; 405759b3d2Safresh1 415759b3d2Safresh1 main::is(FOO, 'foo', "FOO CONSTANT"); 425759b3d2Safresh1 main::is(BAR, 'bar', "BAR CONSTANT"); 435759b3d2Safresh1 main::is(BAZ, 'baz', "BAZ CONSTANT"); 445759b3d2Safresh1 main::is(APPLE, 'apple', "APPLE CONSTANT"); 455759b3d2Safresh1 main::is(PEAR, 'pear', "PEAR CONSTANT"); 465759b3d2Safresh1} 475759b3d2Safresh1 485759b3d2Safresh1my $one = main::HBase->new(foo => 'a', bar => 'b', baz => 'c'); 495759b3d2Safresh1is($one->foo, 'a', "Accessor"); 505759b3d2Safresh1is($one->bar, 'b', "Accessor"); 515759b3d2Safresh1is($one->baz, 'c', "Accessor"); 525759b3d2Safresh1$one->set_foo('x'); 535759b3d2Safresh1is($one->foo, 'x', "Accessor set"); 545759b3d2Safresh1$one->set_foo(undef); 555759b3d2Safresh1 565759b3d2Safresh1is_deeply( 575759b3d2Safresh1 $one, 585759b3d2Safresh1 { 595759b3d2Safresh1 foo => undef, 605759b3d2Safresh1 bar => 'b', 615759b3d2Safresh1 baz => 'c', 625759b3d2Safresh1 }, 635759b3d2Safresh1 'hash' 645759b3d2Safresh1); 655759b3d2Safresh1 665759b3d2Safresh1BEGIN { 675759b3d2Safresh1 package 685759b3d2Safresh1 main::Const::Test; 695759b3d2Safresh1 use Test2::Util::HashBase qw/foo/; 705759b3d2Safresh1 715759b3d2Safresh1 sub do_it { 725759b3d2Safresh1 if (FOO()) { 735759b3d2Safresh1 return 'const'; 745759b3d2Safresh1 } 755759b3d2Safresh1 return 'not const' 765759b3d2Safresh1 } 775759b3d2Safresh1} 785759b3d2Safresh1 795759b3d2Safresh1my $pkg = 'main::Const::Test'; 805759b3d2Safresh1is($pkg->do_it, 'const', "worked as expected"); 815759b3d2Safresh1{ 825759b3d2Safresh1 local $SIG{__WARN__} = sub { }; 835759b3d2Safresh1 *main::Const::Test::FOO = sub { 0 }; 845759b3d2Safresh1} 855759b3d2Safresh1ok(!$pkg->FOO, "overrode const sub"); 865759b3d2Safresh1{ 875759b3d2Safresh1local $TODO = "known to fail on $]" if $] le "5.006002"; 885759b3d2Safresh1is($pkg->do_it, 'const', "worked as expected, const was constant"); 895759b3d2Safresh1} 905759b3d2Safresh1 915759b3d2Safresh1BEGIN { 925759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase/Wrapped.pm'} = __FILE__; 935759b3d2Safresh1 945759b3d2Safresh1 package 955759b3d2Safresh1 main::HBase::Wrapped; 965759b3d2Safresh1 use Test2::Util::HashBase qw/foo bar dup/; 975759b3d2Safresh1 985759b3d2Safresh1 my $foo = __PACKAGE__->can('foo'); 995759b3d2Safresh1 no warnings 'redefine'; 1005759b3d2Safresh1 *foo = sub { 1015759b3d2Safresh1 my $self = shift; 1025759b3d2Safresh1 $self->set_bar(1); 1035759b3d2Safresh1 $self->$foo(@_); 1045759b3d2Safresh1 }; 1055759b3d2Safresh1} 1065759b3d2Safresh1 1075759b3d2Safresh1BEGIN { 1085759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase/Wrapped/Inherit.pm'} = __FILE__; 1095759b3d2Safresh1 1105759b3d2Safresh1 package 1115759b3d2Safresh1 main::HBase::Wrapped::Inherit; 1125759b3d2Safresh1 use base 'main::HBase::Wrapped'; 1135759b3d2Safresh1 use Test2::Util::HashBase qw/baz dup/; 1145759b3d2Safresh1} 1155759b3d2Safresh1 1165759b3d2Safresh1my $o = main::HBase::Wrapped::Inherit->new(foo => 1); 1175759b3d2Safresh1my $foo = $o->foo; 1185759b3d2Safresh1is($o->bar, 1, 'parent attribute sub not overridden'); 1195759b3d2Safresh1 1205759b3d2Safresh1{ 1215759b3d2Safresh1 package 1225759b3d2Safresh1 Foo; 1235759b3d2Safresh1 1245759b3d2Safresh1 sub new; 1255759b3d2Safresh1 1265759b3d2Safresh1 use Test2::Util::HashBase qw/foo bar baz/; 1275759b3d2Safresh1 1285759b3d2Safresh1 sub new { 'foo' }; 1295759b3d2Safresh1} 1305759b3d2Safresh1 1315759b3d2Safresh1is(Foo->new, 'foo', "Did not override existing 'new' method"); 1325759b3d2Safresh1 1335759b3d2Safresh1BEGIN { 1345759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase2.pm'} = __FILE__; 1355759b3d2Safresh1 1365759b3d2Safresh1 package 1375759b3d2Safresh1 main::HBase2; 138*de8cc8edSafresh1 use Test2::Util::HashBase qw/foo -bar ^baz <bat >ban +boo/; 1395759b3d2Safresh1 1405759b3d2Safresh1 main::is(FOO, 'foo', "FOO CONSTANT"); 1415759b3d2Safresh1 main::is(BAR, 'bar', "BAR CONSTANT"); 1425759b3d2Safresh1 main::is(BAZ, 'baz', "BAZ CONSTANT"); 143*de8cc8edSafresh1 main::is(BAT, 'bat', "BAT CONSTANT"); 144*de8cc8edSafresh1 main::is(BAN, 'ban', "BAN CONSTANT"); 145*de8cc8edSafresh1 main::is(BOO, 'boo', "BOO CONSTANT"); 1465759b3d2Safresh1} 1475759b3d2Safresh1 148*de8cc8edSafresh1my $ro = main::HBase2->new(foo => 'foo', bar => 'bar', baz => 'baz', bat => 'bat', ban => 'ban'); 1495759b3d2Safresh1is($ro->foo, 'foo', "got foo"); 1505759b3d2Safresh1is($ro->bar, 'bar', "got bar"); 1515759b3d2Safresh1is($ro->baz, 'baz', "got baz"); 152*de8cc8edSafresh1is($ro->bat, 'bat', "got bat"); 153*de8cc8edSafresh1ok(!$ro->can('set_bat'), "No setter for bat"); 154*de8cc8edSafresh1ok(!$ro->can('ban'), "No reader for ban"); 155*de8cc8edSafresh1ok(!$ro->can('boo'), "No reader for boo"); 156*de8cc8edSafresh1ok(!$ro->can('set_boo'), "No setter for boo"); 157*de8cc8edSafresh1is($ro->{ban}, 'ban', "ban attribute is set"); 158*de8cc8edSafresh1$ro->set_ban('xxx'); 159*de8cc8edSafresh1is($ro->{ban}, 'xxx', "ban attribute can be set"); 1605759b3d2Safresh1 1615759b3d2Safresh1is($ro->set_foo('xxx'), 'xxx', "Can set foo"); 1625759b3d2Safresh1is($ro->foo, 'xxx', "got foo"); 1635759b3d2Safresh1 1645759b3d2Safresh1like(exception { $ro->set_bar('xxx') }, qr/'bar' is read-only/, "Cannot set bar"); 1655759b3d2Safresh1 1665759b3d2Safresh1my $warnings = warnings { is($ro->set_baz('xxx'), 'xxx', 'set baz') }; 1675759b3d2Safresh1like($warnings->[0], qr/set_baz\(\) is deprecated/, "Deprecation warning"); 1685759b3d2Safresh1 1695759b3d2Safresh1 1705759b3d2Safresh1 1715759b3d2Safresh1is_deeply( 1725759b3d2Safresh1 [Test2::Util::HashBase::attr_list('main::HBase::Wrapped::Inherit')], 1735759b3d2Safresh1 [qw/foo bar dup baz/], 1745759b3d2Safresh1 "Got a list of attributes in order starting from base class, duplicates removed", 1755759b3d2Safresh1); 1765759b3d2Safresh1 1775759b3d2Safresh1my $x = main::HBase::Wrapped::Inherit->new(foo => 1, baz => 2); 1785759b3d2Safresh1is($x->foo, 1, "set foo via pairs"); 1795759b3d2Safresh1is($x->baz, 2, "set baz via pairs"); 1805759b3d2Safresh1 1815759b3d2Safresh1# Now with hashref 1825759b3d2Safresh1my $y = main::HBase::Wrapped::Inherit->new({foo => 1, baz => 2}); 1835759b3d2Safresh1is($y->foo, 1, "set foo via hashref"); 1845759b3d2Safresh1is($y->baz, 2, "set baz via hashref"); 1855759b3d2Safresh1 1865759b3d2Safresh1# Now with hashref 1875759b3d2Safresh1my $z = main::HBase::Wrapped::Inherit->new([ 1885759b3d2Safresh1 1, # foo 1895759b3d2Safresh1 2, # bar 1905759b3d2Safresh1 3, # dup 1915759b3d2Safresh1 4, # baz 1925759b3d2Safresh1]); 1935759b3d2Safresh1is($z->foo, 1, "set foo via arrayref"); 1945759b3d2Safresh1is($z->baz, 4, "set baz via arrayref"); 1955759b3d2Safresh1 1965759b3d2Safresh1like( 1975759b3d2Safresh1 exception { main::HBase::Wrapped::Inherit->new([1 .. 10]) }, 1985759b3d2Safresh1 qr/Too many arguments for main::HBase::Wrapped::Inherit constructor/, 1995759b3d2Safresh1 "Too many args in array form" 2005759b3d2Safresh1); 2015759b3d2Safresh1 2025759b3d2Safresh1 2035759b3d2Safresh1my $CAN_COUNT = 0; 2045759b3d2Safresh1my $CAN_COUNT2 = 0; 2055759b3d2Safresh1my $INIT_COUNT = 0; 2065759b3d2Safresh1BEGIN { 2075759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase3.pm'} = __FILE__; 2085759b3d2Safresh1 package 2095759b3d2Safresh1 main::HBase3; 2105759b3d2Safresh1 use Test2::Util::HashBase qw/foo/; 2115759b3d2Safresh1 2125759b3d2Safresh1 sub can { 2135759b3d2Safresh1 my $self = shift; 2145759b3d2Safresh1 $CAN_COUNT++; 2155759b3d2Safresh1 $self->SUPER::can(@_); 2165759b3d2Safresh1 } 2175759b3d2Safresh1 2185759b3d2Safresh1 $INC{'Object/HashBase/Test/HBase4.pm'} = __FILE__; 2195759b3d2Safresh1 package 2205759b3d2Safresh1 main::HBase4; 2215759b3d2Safresh1 use Test2::Util::HashBase qw/foo/; 2225759b3d2Safresh1 2235759b3d2Safresh1 sub can { 2245759b3d2Safresh1 my $self = shift; 2255759b3d2Safresh1 $CAN_COUNT2++; 2265759b3d2Safresh1 $self->SUPER::can(@_); 2275759b3d2Safresh1 } 2285759b3d2Safresh1 2295759b3d2Safresh1 sub init { $INIT_COUNT++ } 2305759b3d2Safresh1} 2315759b3d2Safresh1 2325759b3d2Safresh1is($CAN_COUNT, 0, "->can has not been called yet"); 2335759b3d2Safresh1my $it = main::HBase3->new; 2345759b3d2Safresh1is($CAN_COUNT, 1, "->can has been called once to check for init"); 2355759b3d2Safresh1$it = main::HBase3->new; 2365759b3d2Safresh1is($CAN_COUNT, 1, "->can was not called again, we cached it"); 2375759b3d2Safresh1 2385759b3d2Safresh1is($CAN_COUNT2, 0, "->can has not been called yet"); 2395759b3d2Safresh1is($INIT_COUNT, 0, "->init has not been called yet"); 2405759b3d2Safresh1$it = main::HBase4->new; 2415759b3d2Safresh1is($CAN_COUNT2, 1, "->can has been called once to check for init"); 2425759b3d2Safresh1is($INIT_COUNT, 1, "->init has been called once"); 2435759b3d2Safresh1$it = main::HBase4->new; 2445759b3d2Safresh1is($CAN_COUNT2, 1, "->can was not called again, we cached it"); 2455759b3d2Safresh1is($INIT_COUNT, 2, "->init has been called again"); 2465759b3d2Safresh1 2475759b3d2Safresh1done_testing; 2485759b3d2Safresh1 2495759b3d2Safresh11; 250