Get rid of subtests so we can test threads
[p5sagit/Class-Accessor-Grouped.git] / t / accessors_ro.t
CommitLineData
ed606987 1use Test::More;
8019c4d8 2use Test::Exception;
6a48652b 3use strict;
4use warnings;
ed606987 5no warnings 'once';
395c3fdb 6use Config;
6a48652b 7use lib 't/lib';
8019c4d8 8
9# we test the pure-perl versions only, but allow overrides
10# from the accessor_xs test-umbrella
11# Also make sure a rogue envvar will not interfere with
12# things
13my $use_xs;
14BEGIN {
ba8c183b 15 $Class::Accessor::Grouped::USE_XS = 0
16 unless defined $Class::Accessor::Grouped::USE_XS;
17 $ENV{CAG_USE_XS} = 1;
18 $use_xs = $Class::Accessor::Grouped::USE_XS;
8019c4d8 19};
20
6a48652b 21use AccessorGroupsRO;
22
84430300 23my $obj = AccessorGroupsRO->new;
6a48652b 24
25{
ba8c183b 26 my $warned = 0;
6a48652b 27
ba8c183b 28 local $SIG{__WARN__} = sub {
29 if (shift =~ /DESTROY/i) {
30 $warned++;
6a48652b 31 };
ba8c183b 32 };
6a48652b 33
ba8c183b 34 no warnings qw/once/;
35 local *AccessorGroupsRO::DESTROY = sub {};
6a48652b 36
ba8c183b 37 $obj->mk_group_ro_accessors('warnings', 'DESTROY');
c26cc2b9 38
ba8c183b 39 ok($warned);
6a48652b 40};
41
8019c4d8 42my $test_accessors = {
ba8c183b 43 singlefield => {
44 is_xs => $use_xs,
45 },
46 multiple1 => {
47 },
48 multiple2 => {
49 },
50 lr1name => {
51 custom_field => 'lr1;field',
52 },
53 lr2name => {
54 custom_field => "lr2'field",
55 },
4d70ba11 56 fieldname_torture => {
79f0ccb0 57 custom_field => join ('', map { chr($_) } (0..255) ),
4d70ba11 58 is_xs => $use_xs,
59 },
8019c4d8 60};
61
62for my $name (sort keys %$test_accessors) {
63
ba8c183b 64 my $alias = "_${name}_accessor";
65 my $field = $test_accessors->{$name}{custom_field} || $name;
6a48652b 66
ba8c183b 67 can_ok($obj, $name, $alias);
6a48652b 68
ba8c183b 69 ok(!$obj->can($field))
70 if $field ne $name;
8019c4d8 71
ba8c183b 72 is($obj->$name, undef);
73 is($obj->$alias, undef);
6a48652b 74
ba8c183b 75 # get via name
76 $obj->{$field} = 'a';
77 is($obj->$name, 'a');
6a48652b 78
ba8c183b 79 # alias gets same as name
80 is($obj->$alias, 'a');
6a48652b 81
ba8c183b 82 my $ro_regex = $test_accessors->{$name}{is_xs}
83 ? qr/Usage\:.+$name.*\(self\)/
da609a46 84 : qr/$name(:?_accessor)?\Q' cannot alter its value (read-only attribute of class AccessorGroupsRO)/
ba8c183b 85 ;
8019c4d8 86
395c3fdb 87 {
88 local $TODO = "Class::XSAccessor emits broken error messages on 5.10 or -DDEBUGGING 5.8"
89 if (
90 $test_accessors->{$name}{is_xs}
91 and
92 $] < '5.011'
93 and
94 ( $] > '5.009' or $Config{config_args} =~ /DEBUGGING/ )
95 );
96
97 # die on set via name/alias
98 throws_ok {
99 $obj->$name('b');
100 } $ro_regex;
101
102 throws_ok {
103 $obj->$alias('b');
104 } $ro_regex;
105 }
6a48652b 106
ba8c183b 107 # value should be unchanged
108 is($obj->$name, 'a');
109 is($obj->$alias, 'a');
6a48652b 110};
111
ed606987 112done_testing unless $::SUBTESTING;