c04ece203a11b02d7afa46576a576a9617aba8a9
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
1 use Test::More tests => 98;
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     multiple1 => {
49     },
50     multiple2 => {
51     },
52     lr1name => {
53         custom_field => 'lr1;field',
54     },
55     lr2name => {
56         custom_field => "lr2'field",
57     },
58 };
59
60 for my $name (sort keys %$test_accessors) {
61     my $alias = "_${name}_accessor";
62     my $field = $test_accessors->{$name}{custom_field} || $name;
63     my $extra = $test_accessors->{$name}{has_extra};
64
65     can_ok($obj, $name, $alias);
66     ok(!$obj->can($field))
67       if $field ne $name;
68
69     for my $meth ($name, $alias) {
70         my $cv = svref_2object( $obj->can($meth) );
71         is($cv->GV->NAME, $meth, "$meth accessor is named");
72         is($cv->GV->STASH->NAME, 'AccessorGroups', "$meth class correct");
73     }
74
75     is($obj->$name, undef);
76     is($obj->$alias, undef);
77
78     # get/set via name
79     is($obj->$name('a'), 'a');
80     is($obj->$name, 'a');
81     is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
82
83     # alias gets same as name
84     is($obj->$alias, 'a');
85
86     # get/set via alias
87     is($obj->$alias('b'), 'b');
88     is($obj->$alias, 'b');
89     is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
90
91     # alias gets same as name
92     is($obj->$name, 'b');
93
94     for my $meth ($name, $alias) {
95         my $cv = svref_2object( $obj->can($meth) );
96         is($cv->GV->NAME, $meth, "$meth accessor is named after operations");
97         is(
98           $cv->GV->STASH->NAME,
99           # XS lazyinstalls install into each caller, not into the original parent
100           $test_accessors->{$name}{is_xs} ? 'AccessorGroupsSubclass' :'AccessorGroups',
101           "$meth class correct after operations",
102         );
103     }
104 };
105
106 # important
107 1;