Radically rewrite and tighten benchmarker, add more acc. makers
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
CommitLineData
510d7274 1use Test::More tests => 138;
2use Test::Exception;
e7d391a8 3use strict;
4use warnings;
5use lib 't/lib';
d1dc76a1 6use B qw/svref_2object/;
e7d391a8 7
8019c4d8 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
11# things
28344104 12my $use_xs;
9540f4e4 13BEGIN {
ba8c183b 14 $Class::Accessor::Grouped::USE_XS = 0
15 unless defined $Class::Accessor::Grouped::USE_XS;
16 $ENV{CAG_USE_XS} = 1;
17 $use_xs = $Class::Accessor::Grouped::USE_XS;
8019c4d8 18};
19
f7ce0ad4 20use AccessorGroupsSubclass;
e7d391a8 21
510d7274 22SKIP: {
23 skip( 'Perl 5.6 does not like localizing globs', 1 )
24 if $] < '5.008';
25
ba8c183b 26 my $obj = AccessorGroupsSubclass->new;
27 my $class = ref $obj;
28 my $name = 'multiple1';
29 my $alias = "_${name}_accessor";
30
31 my $warned = 0;
32 local $SIG{__WARN__} = sub {
510d7274 33 $_[0] =~ /unwise/ ? $warned++ : warn(@_)
ba8c183b 34 };
e7d391a8 35
510d7274 36 for (qw/DESTROY AUTOLOAD CLONE/) {
37 no warnings qw/once/;
38 no strict 'refs';
39
40 local *{"AccessorGroupsSubclass::$_"} = sub {};
e7d391a8 41
510d7274 42 $class->mk_group_accessors(warnings => $_);
43 }
44
45 is($warned, 3, 'Correct amount of warnings');
f7ce0ad4 46};
47
510d7274 48throws_ok { AccessorGroupsSubclass->mk_group_accessors(simple => '2wrvwrv;') }
49 qr/Illegal accessor name/;
50
f7ce0ad4 51my $obj = AccessorGroupsSubclass->new;
1ee74bdd 52
28344104 53my $test_accessors = {
ba8c183b 54 singlefield => {
55 is_xs => $use_xs,
56 has_extra => 1,
57 },
58 runtime_around => {
59 # even though this accessor is simple it will *not* be XSified
60 # due to the runtime 'around'
61 is_xs => 0,
62 has_extra => 1,
63 },
64 multiple1 => {
65 },
66 multiple2 => {
67 },
68 lr1name => {
69 custom_field => 'lr1;field',
70 },
71 lr2name => {
72 custom_field => "lr2'field",
73 },
4d70ba11 74 fieldname_torture => {
75 custom_field => join ('', map { chr($_) } (0..255) ),
76 is_xs => $use_xs,
77 },
28344104 78};
79
28344104 80for my $name (sort keys %$test_accessors) {
ba8c183b 81 my $alias = "_${name}_accessor";
82 my $field = $test_accessors->{$name}{custom_field} || $name;
83 my $extra = $test_accessors->{$name}{has_extra};
84
85 can_ok($obj, $name, $alias);
86 ok(!$obj->can($field))
87 if $field ne $name;
88
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");
93 }
94
95 is($obj->$name, undef);
96 is($obj->$alias, undef);
97
98 # get/set via name
99 is($obj->$name('a'), 'a');
100 is($obj->$name, 'a');
101 is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
102
103 # alias gets same as name
104 is($obj->$alias, 'a');
105
106 # get/set via alias
107 is($obj->$alias('b'), 'b');
108 is($obj->$alias, 'b');
109 is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
110
111 # alias gets same as name
112 is($obj->$name, 'b');
113
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");
117 is(
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",
122 );
123 }
e7d391a8 124};
125
8019c4d8 126# important
9540f4e4 1271;