Make sure the XSA buggery works on a subclass as well
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
CommitLineData
1ee74bdd 1use Test::More tests => 62;
e7d391a8 2use strict;
3use warnings;
4use lib 't/lib';
8019c4d8 5use Sub::Identify qw/sub_name sub_fullname/;
e7d391a8 6
8019c4d8 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
28344104 11my $use_xs;
9540f4e4 12BEGIN {
8019c4d8 13 $Class::Accessor::Grouped::USE_XS = 0
14 unless defined $Class::Accessor::Grouped::USE_XS;
15 $ENV{CAG_USE_XS} = 1;
28344104 16 $use_xs = $Class::Accessor::Grouped::USE_XS;
8019c4d8 17};
18
f7ce0ad4 19use AccessorGroupsSubclass;
e7d391a8 20
21{
f7ce0ad4 22 my $obj = AccessorGroups->new;
84430300 23 my $class = ref $obj;
24 my $name = 'multiple1';
25 my $alias = "_${name}_accessor";
26 my $accessor = $obj->can($name);
27 my $alias_accessor = $obj->can($alias);
28 isnt(sub_name($accessor), '__ANON__', 'accessor is named');
29 isnt(sub_name($alias_accessor), '__ANON__', 'alias is named');
30 is(sub_fullname($accessor), join('::',$class,$name), 'accessor FQ name');
31 is(sub_fullname($alias_accessor), join('::',$class,$alias), 'alias FQ name');
32
e7d391a8 33 my $warned = 0;
e7d391a8 34 local $SIG{__WARN__} = sub {
35 if (shift =~ /DESTROY/i) {
36 $warned++;
37 };
38 };
39
84430300 40 no warnings qw/once/;
41 local *AccessorGroups::DESTROY = sub {};
e7d391a8 42
f7ce0ad4 43 $class->mk_group_accessors('warnings', 'DESTROY');
e7d391a8 44 ok($warned);
f7ce0ad4 45};
46
47
48my $obj = AccessorGroupsSubclass->new;
1ee74bdd 49
28344104 50my $test_accessors = {
51 singlefield => {
52 is_xs => $use_xs,
fee7c68b 53 has_extra => 1,
28344104 54 },
55 multiple1 => {
56 },
57 multiple2 => {
58 },
59 lr1name => {
60 custom_field => 'lr1;field',
61 },
62 lr2name => {
63 custom_field => "lr2'field",
64 },
65};
66
67
68for my $name (sort keys %$test_accessors) {
e7d391a8 69 my $alias = "_${name}_accessor";
28344104 70 my $field = $test_accessors->{$name}{custom_field} || $name;
fee7c68b 71 my $extra = $test_accessors->{$name}{has_extra};
e7d391a8 72
84430300 73 can_ok($obj, $name, $alias);
74 ok(!$obj->can($field))
28344104 75 if $field ne $name;
e7d391a8 76
84430300 77 is($obj->$name, undef);
78 is($obj->$alias, undef);
e7d391a8 79
80 # get/set via name
84430300 81 is($obj->$name('a'), 'a');
82 is($obj->$name, 'a');
83 is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a');
e7d391a8 84
85 # alias gets same as name
84430300 86 is($obj->$alias, 'a');
e7d391a8 87
88 # get/set via alias
84430300 89 is($obj->$alias('b'), 'b');
90 is($obj->$alias, 'b');
91 is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b');
e7d391a8 92
93 # alias gets same as name
84430300 94 is($obj->$name, 'b');
e7d391a8 95};
96
8019c4d8 97# important
9540f4e4 981;