File Coverage

blib/lib/Object/HashBase/Test.pm
Criterion Covered Total %
statement 115 120 95.8
branch 3 4 75.0
condition 1 2 50.0
subroutine 39 44 88.6
pod 0 7 0.0
total 158 177 89.2


line stmt bran cond sub pod time code
1             package Object::HashBase::Test;
2 2     2   5982 use strict;
  2         4  
  2         79  
3 2     2   10 use warnings;
  2         3  
  2         177  
4              
5 2     2   13 use vars qw/$NO_RUN $TODO/;
  2         4  
  2         429  
6              
7             BEGIN {
8 2 100   2   11 if ($NO_RUN) {
9 1     0   6 *ok = sub { };
10 1     14   4 *is = sub { };
11 1     0   15 *is_deeply = sub { };
12 1     0   4 *like = sub { };
13 1     0   325 *done_testing = sub { };
14             }
15             else {
16 1         734 require Test::More;
17 1         124646 Test::More->import;
18             }
19             }
20              
21             return 1 if $NO_RUN;
22              
23             our $VERSION = '0.015';
24             # <-- START -->
25              
26             sub warnings(&) {
27 1     1 0 3 my $code = shift;
28 1         3 my @warnings;
29 1     1   8 local $SIG{__WARN__} = sub { push @warnings => @_ };
  1         8  
30 1         4 $code->();
31 1         449 return \@warnings;
32             }
33              
34             sub exception(&) {
35 2     2 0 5 my $code = shift;
36 2         11 local ($@, $!, $SIG{__DIE__});
37 2         5 my $ok = eval { $code->(); 1 };
  2         6  
  0         0  
38 2   50     12 my $error = $@ || 'SQUASHED ERROR';
39 2 50       21 return $ok ? undef : $error;
40             }
41              
42             BEGIN {
43 2     2   9 $INC{'Object/HashBase/Test/HBase.pm'} = __FILE__;
44              
45             package
46             Object::HashBase::Test::HBase;
47 2     2   1390 use Object::HashBase qw/foo bar baz/;
  2         6  
  2         14  
48              
49 2         15 Object::HashBase::Test::is(FOO, 'foo', "FOO CONSTANT");
50 2         596 Object::HashBase::Test::is(BAR, 'bar', "BAR CONSTANT");
51 2         483 Object::HashBase::Test::is(BAZ, 'baz', "BAZ CONSTANT");
52             }
53              
54             {
55             BEGIN {
56 2     2   543 $INC{'Object/HashBase/Test/HBaseINIT.pm'} = __FILE__;
57 2         103 $INC{'Object/HashBase/Test/HBaseINIT2.pm'} = __FILE__;
58             }
59              
60             package
61             Object::HashBase::Test::HBaseINIT;
62 2     2   16 use Object::HashBase qw/foo bar baz/;
  2         5  
  2         10  
63              
64             $main::counter = 0;
65             add_pre_init { shift->{pre_init_1} = $main::counter++ };
66             add_pre_init { shift->{pre_init_2} = $main::counter++ };
67 2     2 0 6 sub init { shift->{init} = $main::counter++ };
68             add_post_init { shift->{post_init_1} = $main::counter++ };
69             add_post_init { shift->{post_init_2} = $main::counter++ };
70              
71             package
72             Object::HashBase::Test::HBaseINIT2;
73 2     2   1299 use parent 'Object::HashBase::Test::HBaseINIT';
  2         724  
  2         13  
74 2     2   205 use Object::HashBase qw/boop/;
  2         4  
  2         13  
75              
76             add_pre_init { shift->{pre_init_3} = $main::counter++ };
77 1     1 0 8 sub init { $_[0]->SUPER::init(); $_[0]->{init2} = $main::counter++ };
  1         3  
78             add_post_init { shift->{post_init_3} = $main::counter++ };
79              
80             }
81              
82             BEGIN {
83             package
84             Object::HashBase::Test::HBaseSub;
85 2     2   18 use base 'Object::HashBase::Test::HBase';
  2         5  
  2         371  
86 2     2   15 use Object::HashBase qw/apple pear/;
  2         18  
  2         10  
87              
88 2     2   13 Object::HashBase::Test::is(FOO, 'foo', "FOO CONSTANT");
89 2         441 Object::HashBase::Test::is(BAR, 'bar', "BAR CONSTANT");
90 2         412 Object::HashBase::Test::is(BAZ, 'baz', "BAZ CONSTANT");
91 2         454 Object::HashBase::Test::is(APPLE, 'apple', "APPLE CONSTANT");
92 2         442 Object::HashBase::Test::is(PEAR, 'pear', "PEAR CONSTANT");
93             }
94              
95             my $one = Object::HashBase::Test::HBase->new(foo => 'a', bar => 'b', baz => 'c');
96             is($one->foo, 'a', "Accessor");
97             is($one->bar, 'b', "Accessor");
98             is($one->baz, 'c', "Accessor");
99             $one->set_foo('x');
100             is($one->foo, 'x', "Accessor set");
101             $one->set_foo(undef);
102              
103             is_deeply(
104             $one,
105             {
106             foo => undef,
107             bar => 'b',
108             baz => 'c',
109             },
110             'hash'
111             );
112              
113             {
114             my @warns;
115             local $SIG{__WARN__} = sub { push @warns => @_ };
116             Object::HashBase::Test::HBaseINIT->add_post_init(sub { shift->{late_post} = 'yes' });
117             ok(!@warns, "No Warnings adding a post-init") or diag(@_);
118             }
119              
120             $main::counter = 0;
121             my $two = Object::HashBase::Test::HBaseINIT->new();
122             is_deeply(
123             $two,
124             {
125             pre_init_1 => 0,
126             pre_init_2 => 1,
127             init => 2,
128             post_init_2 => 3,
129             post_init_1 => 4,
130             late_post => 'yes',
131             },
132             "inits ran in the correct order"
133             );
134              
135             $main::counter = 0;
136             my $three = Object::HashBase::Test::HBaseINIT2->new();
137             is_deeply(
138             $three,
139             {
140             pre_init_1 => 0,
141             pre_init_2 => 1,
142             pre_init_3 => 2,
143             init => 3,
144             init2 => 4,
145             post_init_3 => 5,
146             post_init_2 => 6,
147             post_init_1 => 7,
148             late_post => 'yes',
149             },
150             "inits ran in the correct order"
151             );
152              
153              
154 0         0 BEGIN {
155             package
156             Object::HashBase::Test::Const::Test;
157 2     2   856 use Object::HashBase qw/foo/;
  2     0   5  
  2         39  
158              
159             sub do_it {
160 2     2   5 if (FOO()) {
161 2         11 return 'const';
162             }
163 0         0 return 'not const'
164             }
165             }
166              
167             my $pkg = 'Object::HashBase::Test::Const::Test';
168             is($pkg->do_it, 'const', "worked as expected");
169             {
170             local $SIG{__WARN__} = sub { };
171 1     1   25 *Object::HashBase::Test::Const::Test::FOO = sub { 0 };
172             }
173             ok(!$pkg->FOO, "overrode const sub");
174             {
175             local $TODO = "known to fail on $]" if $] le "5.006002";
176             is($pkg->do_it, 'const', "worked as expected, const was constant");
177             }
178              
179             BEGIN {
180 2     2   10 $INC{'Object/HashBase/Test/HBase/Wrapped.pm'} = __FILE__;
181              
182             package
183             Object::HashBase::Test::HBase::Wrapped;
184 2     2   17 use Object::HashBase qw/foo bar dup/;
  2         13  
  2         10  
185              
186 2         14 my $foo = __PACKAGE__->can('foo');
187 2     2   16 no warnings 'redefine';
  2         37  
  2         276  
188             *foo = sub {
189 4     4   8 my $self = shift;
190 4         14 $self->set_bar(1);
191 4         19 $self->$foo(@_);
192 2         197 };
193             }
194              
195 0         0 BEGIN {
196 2     2   245 $INC{'Object/HashBase/Test/HBase/Wrapped/Inherit.pm'} = __FILE__;
197              
198             package
199             Object::HashBase::Test::HBase::Wrapped::Inherit;
200 2     2   18 use base 'Object::HashBase::Test::HBase::Wrapped';
  2         4  
  2         293  
201 2     2   28 use Object::HashBase qw/baz dup/;
  2         4  
  2         15  
202             }
203              
204             my $o = Object::HashBase::Test::HBase::Wrapped::Inherit->new(foo => 1);
205             my $foo = $o->foo;
206             is($o->bar, 1, 'parent attribute sub not overridden');
207              
208             {
209             package
210             Foo;
211              
212             sub new;
213              
214 2     2   17 use Object::HashBase qw/foo bar baz/;
  2         6  
  2         10  
215              
216 1     1   5 sub new { 'foo' };
217             }
218              
219             is(Foo->new, 'foo', "Did not override existing 'new' method");
220              
221             BEGIN {
222 2     2   11 $INC{'Object/HashBase/Test/HBase2.pm'} = __FILE__;
223              
224             package
225             Object::HashBase::Test::HBase2;
226 2     2   18 use Object::HashBase qw/foo -bar ^baz ban +boo/;
  2         5  
  2         11  
227              
228 2         14 Object::HashBase::Test::is(FOO, 'foo', "FOO CONSTANT");
229 2         446 Object::HashBase::Test::is(BAR, 'bar', "BAR CONSTANT");
230 2         451 Object::HashBase::Test::is(BAZ, 'baz', "BAZ CONSTANT");
231 2         436 Object::HashBase::Test::is(BAT, 'bat', "BAT CONSTANT");
232 2         443 Object::HashBase::Test::is(BAN, 'ban', "BAN CONSTANT");
233 2         436 Object::HashBase::Test::is(BOO, 'boo', "BOO CONSTANT");
234             }
235              
236             my $ro = Object::HashBase::Test::HBase2->new(foo => 'foo', bar => 'bar', baz => 'baz', bat => 'bat', ban => 'ban');
237             is($ro->foo, 'foo', "got foo");
238             is($ro->bar, 'bar', "got bar");
239             is($ro->baz, 'baz', "got baz");
240             is($ro->bat, 'bat', "got bat");
241             ok(!$ro->can('set_bat'), "No setter for bat");
242             ok(!$ro->can('ban'), "No reader for ban");
243             ok(!$ro->can('boo'), "No reader for boo");
244             ok(!$ro->can('set_boo'), "No setter for boo");
245             is($ro->{ban}, 'ban', "ban attribute is set");
246             $ro->set_ban('xxx');
247             is($ro->{ban}, 'xxx', "ban attribute can be set");
248              
249             is($ro->set_foo('xxx'), 'xxx', "Can set foo");
250             is($ro->foo, 'xxx', "got foo");
251              
252             like(exception { $ro->set_bar('xxx') }, qr/'bar' is read-only/, "Cannot set bar");
253              
254             my $warnings = warnings { is($ro->set_baz('xxx'), 'xxx', 'set baz') };
255             like($warnings->[0], qr/set_baz\(\) is deprecated/, "Deprecation warning");
256              
257              
258              
259             is_deeply(
260             [Object::HashBase::attr_list('Object::HashBase::Test::HBase::Wrapped::Inherit')],
261             [qw/foo bar dup baz/],
262             "Got a list of attributes in order starting from base class, duplicates removed",
263             );
264              
265             my $x = Object::HashBase::Test::HBase::Wrapped::Inherit->new(foo => 1, baz => 2);
266             is($x->foo, 1, "set foo via pairs");
267             is($x->baz, 2, "set baz via pairs");
268              
269             # Now with hashref
270             my $y = Object::HashBase::Test::HBase::Wrapped::Inherit->new({foo => 1, baz => 2});
271             is($y->foo, 1, "set foo via hashref");
272             is($y->baz, 2, "set baz via hashref");
273              
274             # Now with hashref
275             my $z = Object::HashBase::Test::HBase::Wrapped::Inherit->new([
276             1, # foo
277             2, # bar
278             3, # dup
279             4, # baz
280             ]);
281             is($z->foo, 1, "set foo via arrayref");
282             is($z->baz, 4, "set baz via arrayref");
283              
284             like(
285             exception { Object::HashBase::Test::HBase::Wrapped::Inherit->new([1 .. 10]) },
286             qr/Too many arguments for Object::HashBase::Test::HBase::Wrapped::Inherit constructor/,
287             "Too many args in array form"
288             );
289              
290              
291             my $CAN_COUNT = 0;
292             my $CAN_COUNT2 = 0;
293             my $INIT_COUNT = 0;
294 0         0 BEGIN {
295 2     2   10 $INC{'Object/HashBase/Test/HBase3.pm'} = __FILE__;
296             package
297             Object::HashBase::Test::HBase3;
298 2     2   1011 use Object::HashBase qw/foo/;
  2         4  
  2         12  
299              
300             sub can {
301 1     1 0 2 my $self = shift;
302 1         1 $CAN_COUNT++;
303 1         27 $self->SUPER::can(@_);
304             }
305              
306 2         581 $INC{'Object/HashBase/Test/HBase4.pm'} = __FILE__;
307             package
308             Object::HashBase::Test::HBase4;
309 2     2   16 use Object::HashBase qw/foo/;
  2         4  
  2         10  
310              
311             sub can {
312 1     1 0 1 my $self = shift;
313 1         2 $CAN_COUNT2++;
314 1         8 $self->SUPER::can(@_);
315             }
316              
317 2     2 0 3 sub init { $INIT_COUNT++ }
318             }
319              
320             is($CAN_COUNT, 0, "->can has not been called yet");
321             my $it = Object::HashBase::Test::HBase3->new;
322             is($CAN_COUNT, 1, "->can has been called once to check for init");
323             $it = Object::HashBase::Test::HBase3->new;
324             is($CAN_COUNT, 1, "->can was not called again, we cached it");
325              
326             is($CAN_COUNT2, 0, "->can has not been called yet");
327             is($INIT_COUNT, 0, "->init has not been called yet");
328             $it = Object::HashBase::Test::HBase4->new;
329             is($CAN_COUNT2, 1, "->can has been called once to check for init");
330             is($INIT_COUNT, 1, "->init has been called once");
331             $it = Object::HashBase::Test::HBase4->new;
332             is($CAN_COUNT2, 1, "->can was not called again, we cached it");
333             is($INIT_COUNT, 2, "->init has been called again");
334              
335             done_testing;
336              
337             1;