Silence warnings resulting from incomplete can() overrides hiding
[p5sagit/Class-Accessor-Grouped.git] / t / accessors_wo.t
CommitLineData
c26cc2b9 1use Test::More tests => 38;
8019c4d8 2use Test::Exception;
c26cc2b9 3use strict;
4use warnings;
5use lib 't/lib';
8019c4d8 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
11my $use_xs;
12BEGIN {
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
c26cc2b9 19use AccessorGroupsWO;
20
84430300 21my $obj = AccessorGroupsWO->new;
c26cc2b9 22
23{
24 my $warned = 0;
25
26 local $SIG{__WARN__} = sub {
27 if (shift =~ /DESTROY/i) {
28 $warned++;
29 };
30 };
31
84430300 32 no warnings qw/once/;
33 local *AccessorGroupsWO::DESTROY = sub {};
c26cc2b9 34
84430300 35 $obj->mk_group_wo_accessors('warnings', 'DESTROY');
c26cc2b9 36 ok($warned);
c26cc2b9 37};
38
8019c4d8 39my $test_accessors = {
40 singlefield => {
41 is_xs => $use_xs,
42 },
43 multiple1 => {
44 },
45 multiple2 => {
46 },
47 lr1name => {
48 custom_field => 'lr1;field',
49 },
50 lr2name => {
51 custom_field => "lr2'field",
52 },
53};
54
55for my $name (sort keys %$test_accessors) {
56
c26cc2b9 57 my $alias = "_${name}_accessor";
8019c4d8 58 my $field = $test_accessors->{$name}{custom_field} || $name;
c26cc2b9 59
84430300 60 can_ok($obj, $name, $alias);
c26cc2b9 61
84430300 62 ok(!$obj->can($field))
8019c4d8 63 if $field ne $name;
64
c26cc2b9 65 # set via name
84430300 66 is($obj->$name('a'), 'a');
67 is($obj->{$field}, 'a');
c26cc2b9 68
69 # alias sets same as name
84430300 70 is($obj->$alias('b'), 'b');
71 is($obj->{$field}, 'b');
8ef9b3ff 72
8019c4d8 73 my $wo_regex = $test_accessors->{$name}{is_xs}
74 ? qr/Usage\:.+$name.*\(self, newvalue\)/
75 : qr/cannot access the value of '\Q$field\E'/
76 ;
c26cc2b9 77
78 # die on get via name/alias
8019c4d8 79 throws_ok {
84430300 80 $obj->$name;
8019c4d8 81 } $wo_regex;
c26cc2b9 82
8019c4d8 83 throws_ok {
84430300 84 $obj->$alias;
8019c4d8 85 } $wo_regex;
c26cc2b9 86};
8019c4d8 87
88# important
891;