cf219b0fc6f7cfc5e78d4ef7d0441691d10baed1
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
1 use Test::More tests => 117;
2 use strict;
3 use warnings;
4 use lib 't/lib';
5 use B qw/svref_2object/;
6
7 # we test the pure-perl versions only, but allow overrides
8 # from the accessor_xs test-umbrella
9 # Also make sure a rogue envvar will not interfere with
10 # things
11 my $use_xs;
12 BEGIN {
13     $Class::Accessor::Grouped::USE_XS = 0
14         unless defined $Class::Accessor::Grouped::USE_XS;
15     $ENV{CAG_USE_XS} = 1;
16     $use_xs = $Class::Accessor::Grouped::USE_XS;
17 };
18
19 use AccessorGroupsSubclass;
20
21 {
22     my $obj = AccessorGroupsSubclass->new;
23     my $class = ref $obj;
24     my $name = 'multiple1';
25     my $alias = "_${name}_accessor";
26
27     my $warned = 0;
28     local $SIG{__WARN__} = sub {
29         if  (shift =~ /DESTROY/i) {
30             $warned++;
31         };
32     };
33
34     no warnings qw/once/;
35     local *AccessorGroupsSubclass::DESTROY = sub {};
36
37     $class->mk_group_accessors('warnings', 'DESTROY');
38     ok($warned);
39 };
40
41 my $obj = AccessorGroupsSubclass->new;
42
43 my $test_accessors = {
44     singlefield => {
45         is_xs => $use_xs,
46         has_extra => 1,
47     },
48     runtime_around => {
49         # even though this accessor is simple it will *not* be XSified
50         # due to the runtime 'around'
51         is_xs => 0,
52         has_extra => 1,
53     },
54     multiple1 => {
55     },
56     multiple2 => {
57     },
58     lr1name => {
59         custom_field => 'lr1;field',
60     },
61     lr2name => {
62         custom_field => "lr2'field",
63     },
64 };
65
66 for my $name (sort keys %$test_accessors) {
67     my $alias = "_${name}_accessor";
68     my $field = $test_accessors->{$name}{custom_field} || $name;
69     my $extra = $test_accessors->{$name}{has_extra};
70
71     can_ok($obj, $name, $alias);
72     ok(!$obj->can($field))
73       if $field ne $name;
74
75     for my $meth ($name, $alias) {
76         my $cv = svref_2object( $obj->can($meth) );
77         is($cv->GV->NAME, $meth, "$meth accessor is named");
78         is($cv->GV->STASH->NAME, 'AccessorGroups', "$meth class correct");
79     }
80
81     is($obj->$name, undef);
82     is($obj->$alias, undef);
83
84     # get/set via name
85     is($obj->$name('a'), 'a');
86     is($obj->$name, 'a');
87     is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
88
89     # alias gets same as name
90     is($obj->$alias, 'a');
91
92     # get/set via alias
93     is($obj->$alias('b'), 'b');
94     is($obj->$alias, 'b');
95     is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
96
97     # alias gets same as name
98     is($obj->$name, 'b');
99
100     for my $meth ($name, $alias) {
101         my $cv = svref_2object( $obj->can($meth) );
102         is($cv->GV->NAME, $meth, "$meth accessor is named after operations");
103         is(
104           $cv->GV->STASH->NAME,
105           # XS lazyinstalls install into each caller, not into the original parent
106           $test_accessors->{$name}{is_xs} ? 'AccessorGroupsSubclass' :'AccessorGroups',
107           "$meth class correct after operations",
108         );
109     }
110 };
111
112 # important
113 1;