Fix braindead ro/wo accessor breakage when CXSA is available
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
1 use Test::More tests => 62;
2 use strict;
3 use warnings;
4 use lib 't/lib';
5 use Sub::Identify qw/sub_name sub_fullname/;
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
11 BEGIN {
12     $Class::Accessor::Grouped::USE_XS = 0
13         unless defined $Class::Accessor::Grouped::USE_XS;
14     $ENV{CAG_USE_XS} = 1;
15 };
16
17 use AccessorGroups;
18
19 my $class = AccessorGroups->new;
20
21 {
22     my $warned = 0;
23
24     local $SIG{__WARN__} = sub {
25         if  (shift =~ /DESTROY/i) {
26             $warned++;
27         };
28     };
29
30     $class->mk_group_accessors('warnings', 'DESTROY');
31
32     ok($warned);
33
34     # restore non-accessorized DESTROY
35     no warnings;
36     *AccessorGroups::DESTROY = sub {};
37 };
38
39 {
40   my $class_name = ref $class;
41   my $name = 'multiple1';
42   my $alias = "_${name}_accessor";
43   my $accessor = $class->can($name);
44   my $alias_accessor = $class->can($alias);
45   isnt(sub_name($accessor), '__ANON__', 'accessor is named');
46   isnt(sub_name($alias_accessor), '__ANON__', 'alias is named');
47   is(sub_fullname($accessor), join('::',$class_name,$name), 'accessor FQ name');
48   is(sub_fullname($alias_accessor), join('::',$class_name,$alias), 'alias FQ name');
49 }
50
51 foreach (qw/singlefield multiple1 multiple2/) {
52     my $name = $_;
53     my $alias = "_${name}_accessor";
54
55     can_ok($class, $name, $alias);
56
57     is($class->$name, undef);
58     is($class->$alias, undef);
59
60     # get/set via name
61     is($class->$name('a'), 'a');
62     is($class->$name, 'a');
63     is($class->{$name}, 'a');
64
65     # alias gets same as name
66     is($class->$alias, 'a');
67
68     # get/set via alias
69     is($class->$alias('b'), 'b');
70     is($class->$alias, 'b');
71     is($class->{$name}, 'b');
72
73     # alias gets same as name
74     is($class->$name, 'b');
75 };
76
77 foreach (qw/lr1 lr2/) {
78     my $name = "$_".'name';
79     my $alias = "_${name}_accessor";
80
81     my $field = { lr1 => 'lr1;field', lr2 => q{lr2'field} }->{$_};
82
83     can_ok($class, $name, $alias);
84     ok(!$class->can($field));
85
86     is($class->$name, undef);
87     is($class->$alias, undef);
88
89     # get/set via name
90     is($class->$name('c'), 'c');
91     is($class->$name, 'c');
92     is($class->{$field}, 'c');
93
94     # alias gets same as name
95     is($class->$alias, 'c');
96
97     # get/set via alias
98     is($class->$alias('d'), 'd');
99     is($class->$alias, 'd');
100     is($class->{$field}, 'd');
101
102     # alias gets same as name
103     is($class->$name, 'd');
104 };
105
106 # important
107 1;