Disable error message tests on older perls until Class::XSA is fixed
[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;