xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/t/HashBase.t (revision de8cc8edbc71bd3e3bc7fbffa27ba0e564c37d8b)
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