File: simple.t

package info (click to toggle)
libclass-std-perl 0.011-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 352 kB
  • ctags: 122
  • sloc: perl: 871; makefile: 2
file content (141 lines) | stat: -rw-r--r-- 4,291 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
use Test::More 'no_plan';

package MyBase;
use Class::Std;
{
    my %name : ATTR( :init_arg<name>    :get<name>             );
    my %rank : ATTR( init_arg => 'rank' :get<rank> :set<rank>  );
    my %snum : ATTR( :init_arg('snum')  :get<snum>             );
    my %priv : ATTR;
    my %def  : ATTR( :default<MyBase::def> :get<default>       );
    my %dval : ATTR( :default('dval') :get<dval>               );

    sub BUILD {
        my ($self, $ident, $arg_ref) = @_;

        ::is ref $arg_ref, 'HASH'  => 'Args passed to MyBase::BUILD in hash-ref';
        ::is ident $self, $ident   => 'Identity correct in MyBase::BUILD';

        $priv{$ident} = $arg_ref->{priv};
        ::is $priv{$ident}, 'MyBase::priv'  => 'MyBase priv arg unpacked correctly';

        $snum{$ident} = $arg_ref->{snum} . '!';
        ::is $snum{$ident}, 'MyBase::snum!'  => 'MyBase snum arg unpacked correctly';
    }

    sub DEMOLISH {
        my ($self, $ident) = @_;

        ::is ident $self, $ident   => 'Identity correct in MyBase::DEMOLISH'
    }

    sub verify :CUMULATIVE {
        my ($self) = @_;
        my $ident = ident $self;

        ::is $name{$ident}, 'MyBase::name'    => 'MyBase::name initialized';
        ::is $rank{$ident}, 'MyBase::rank'    => 'MyBase::rank initialized';
        ::is $snum{$ident}, 'MyBase::snum!'   => 'MyBase::snum initialized';
        ::is $priv{$ident}, 'MyBase::priv'    => 'MyBase::name initialized';
        ::is $def{$ident},  'MyBase::def'     => 'MyBase::def initialized';
    }
}

package Der;
use Class::Std;
use base qw( MyBase );
{
    my %name : ATTR( :init_arg<name>                );
    my %rank : ATTR( init_arg => 'rank'             );
    my %snum : ATTR( :init_arg('snum')  :get<snum> );
    my %priv : ATTR( :init_arg<priv>    :get<priv> );
    my %def  : ATTR( :init_arg<def> :default<default def> :get<default>  );

    sub BUILD {
        my ($self, $ident, $arg_ref) = @_;

        ::is ref $arg_ref, 'HASH'  => 'Args passed to Der::BUILD in hash-ref';
        ::is ident $self, $ident   => 'Identity correct in Der::BUILD';
    }

    sub DEMOLISH {
        my ($self, $ident) = @_;

        ::is ident $self, $ident   => 'Identity correct in Der::DEMOLISH'
    }

    sub verify :CUMULATIVE {
        my ($self) = @_;
        my $ident = ident $self;

        ::is $name{$ident}, 'MyBase::name'   => 'Der::name initialized';
        ::is $rank{$ident}, 'generic rank'   => 'Der::rank initialized';
        ::is $snum{$ident}, 'Der::snum'      => 'Der::snum initialized';
        ::is $priv{$ident}, 'Der::priv'      => 'Der::name initialized';
        ::is $def{$ident},  'Der::def'       => 'Der::def initialized';
    }
}

package main;

my $obj = MyBase->new({
    name => 'MyBase::name',
    snum => 'MyBase::snum',
    rank => 'generic rank',
    priv => 'generic priv',
    MyBase => {
        rank => 'MyBase::rank',
        priv => 'MyBase::priv',
    }
});

$obj->verify();

my $derobj = Der->new({
    name => 'MyBase::name',
    snum => 'MyBase::snum',
    rank => 'generic rank',
    priv => 'generic priv',
    MyBase => {
        rank => 'MyBase::rank',
        priv => 'MyBase::priv',
    },
    Der => {
        snum => 'Der::snum',
        priv => 'Der::priv',
        def  => 'Der::def',
    },
});

$derobj->verify();

is $derobj->get_name(), 'MyBase::name'  => 'Der name read accessor';
is $derobj->get_rank(), 'MyBase::rank'  => 'Der rank read accessor';
is $derobj->get_snum(), 'Der::snum'     => 'Der rank read accessor';
is $derobj->get_priv(), 'Der::priv'     => 'Der priv read accessor';

$derobj->set_rank('new rank');
is $derobj->get_rank(), 'new rank'      => 'Der rank write accessor';

eval { $derobj->setname('new name') };
ok $@ =~ m/\ACan't locate object method "setname" via package "Der"/
                                        => 'Read only name attribute';

my $der2 = Der->new({
    name => 'MyBase::name',
    snum => 'MyBase::snum',
    rank => 'generic rank',
    priv => 'generic priv',
    MyBase => {
        rank => 'MyBase::rank',
        priv => 'MyBase::priv',
    },
    Der => {
        snum => 0,
        priv => 'Der::priv',
    },
});
is( $der2->get_snum(), 0, 'false values allowable as attribute parameters' );

is( $der2->get_dval, 'dval', 'default values evaled correctly' );