a525715a1dde0b80b59b198f4be5434a5d2ff08e
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
1 use Test::More tests => 137;
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   fieldname_torture => {
65     custom_field => join ('', map { chr($_) } (0..255) ),
66     is_xs => $use_xs,
67   },
68 };
69
70 for my $name (sort keys %$test_accessors) {
71   my $alias = "_${name}_accessor";
72   my $field = $test_accessors->{$name}{custom_field} || $name;
73   my $extra = $test_accessors->{$name}{has_extra};
74
75   can_ok($obj, $name, $alias);
76   ok(!$obj->can($field))
77     if $field ne $name;
78
79   for my $meth ($name, $alias) {
80     my $cv = svref_2object( $obj->can($meth) );
81     is($cv->GV->NAME, $meth, "$meth accessor is named");
82     is($cv->GV->STASH->NAME, 'AccessorGroups', "$meth class correct");
83   }
84
85   is($obj->$name, undef);
86   is($obj->$alias, undef);
87
88   # get/set via name
89   is($obj->$name('a'), 'a');
90   is($obj->$name, 'a');
91   is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
92
93   # alias gets same as name
94   is($obj->$alias, 'a');
95
96   # get/set via alias
97   is($obj->$alias('b'), 'b');
98   is($obj->$alias, 'b');
99   is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
100
101   # alias gets same as name
102   is($obj->$name, 'b');
103
104   for my $meth ($name, $alias) {
105     my $cv = svref_2object( $obj->can($meth) );
106     is($cv->GV->NAME, $meth, "$meth accessor is named after operations");
107     is(
108       $cv->GV->STASH->NAME,
109       # XS lazyinstalls install into each caller, not into the original parent
110       $test_accessors->{$name}{is_xs} ? 'AccessorGroupsSubclass' :'AccessorGroups',
111       "$meth class correct after operations",
112     );
113   }
114 };
115
116 # important
117 1;