1 use Test::More tests => 138;
6 use B qw/svref_2object/;
8 # we test the pure-perl versions only, but allow overrides
9 # from the accessor_xs test-umbrella
10 # Also make sure a rogue envvar will not interfere with
14 $Class::Accessor::Grouped::USE_XS = 0
15 unless defined $Class::Accessor::Grouped::USE_XS;
17 $use_xs = $Class::Accessor::Grouped::USE_XS;
20 use AccessorGroupsSubclass;
23 skip( 'Perl 5.6 does not like localizing globs', 1 )
26 my $obj = AccessorGroupsSubclass->new;
28 my $name = 'multiple1';
29 my $alias = "_${name}_accessor";
32 local $SIG{__WARN__} = sub {
33 $_[0] =~ /unwise/ ? $warned++ : warn(@_)
36 for (qw/DESTROY AUTOLOAD CLONE/) {
40 local *{"AccessorGroupsSubclass::$_"} = sub {};
42 $class->mk_group_accessors(warnings => $_);
45 is($warned, 3, 'Correct amount of warnings');
48 throws_ok { AccessorGroupsSubclass->mk_group_accessors(simple => '2wrvwrv;') }
49 qr/Illegal accessor name/;
51 my $obj = AccessorGroupsSubclass->new;
53 my $test_accessors = {
59 # even though this accessor is simple it will *not* be XSified
60 # due to the runtime 'around'
69 custom_field => 'lr1;field',
72 custom_field => "lr2'field",
74 fieldname_torture => {
75 custom_field => join ('', map { chr($_) } (0..255) ),
80 for my $name (sort keys %$test_accessors) {
81 my $alias = "_${name}_accessor";
82 my $field = $test_accessors->{$name}{custom_field} || $name;
83 my $extra = $test_accessors->{$name}{has_extra};
85 can_ok($obj, $name, $alias);
86 ok(!$obj->can($field))
89 for my $meth ($name, $alias) {
90 my $cv = svref_2object( $obj->can($meth) );
91 is($cv->GV->NAME, $meth, "$meth accessor is named");
92 is($cv->GV->STASH->NAME, 'AccessorGroups', "$meth class correct");
95 is($obj->$name, undef);
96 is($obj->$alias, undef);
99 is($obj->$name('a'), 'a');
100 is($obj->$name, 'a');
101 is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
103 # alias gets same as name
104 is($obj->$alias, 'a');
107 is($obj->$alias('b'), 'b');
108 is($obj->$alias, 'b');
109 is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
111 # alias gets same as name
112 is($obj->$name, 'b');
114 for my $meth ($name, $alias) {
115 my $cv = svref_2object( $obj->can($meth) );
116 is($cv->GV->NAME, $meth, "$meth accessor is named after operations");
118 $cv->GV->STASH->NAME,
119 # XS lazyinstalls install into each caller, not into the original parent
120 $test_accessors->{$name}{is_xs} ? 'AccessorGroupsSubclass' :'AccessorGroups',
121 "$meth class correct after operations",