Get rid of subtests so we can test threads
[p5sagit/Class-Accessor-Grouped.git] / t / accessors.t
CommitLineData
5808b224 1use Test::More;
e7d391a8 2use strict;
3use warnings;
ed606987 4no warnings 'once';
e7d391a8 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
5fc5d14f 20require AccessorGroupsSubclass;
1ee74bdd 21
28344104 22my $test_accessors = {
ba8c183b 23 singlefield => {
5fc5d14f 24 is_simple => 1,
ba8c183b 25 has_extra => 1,
26 },
27 runtime_around => {
5fc5d14f 28 # even though this accessor is declared as simple it will *not* be
29 # reinstalled due to the runtime 'around'
5808b224 30 forced_class => 'AccessorGroups',
31 is_simple => 1,
ba8c183b 32 has_extra => 1,
33 },
34 multiple1 => {
35 },
36 multiple2 => {
37 },
38 lr1name => {
39 custom_field => 'lr1;field',
40 },
41 lr2name => {
42 custom_field => "lr2'field",
43 },
4d70ba11 44 fieldname_torture => {
5fc5d14f 45 is_simple => 1,
4d70ba11 46 custom_field => join ('', map { chr($_) } (0..255) ),
4d70ba11 47 },
28344104 48};
49
5808b224 50for my $class (qw(
51 AccessorGroupsSubclass
52 AccessorGroups
53 AccessorGroupsParent
54)) {
55 my $obj = $class->new;
56
5fc5d14f 57 for my $name (sort keys %$test_accessors) {
58 my $alias = "_${name}_accessor";
59 my $field = $test_accessors->{$name}{custom_field} || $name;
60 my $extra = $test_accessors->{$name}{has_extra};
5808b224 61 my $origin_class = 'AccessorGroupsParent';
62
63 if ( $class eq 'AccessorGroupsParent' ) {
64 next if $name eq 'runtime_around'; # implemented in the AG subclass
65 $extra = 0;
66 }
67 elsif ($name eq 'fieldname_torture') {
68 $field = reverse $field;
69 $origin_class = 'AccessorGroups';
70 }
ba8c183b 71
5fc5d14f 72 can_ok($obj, $name, $alias);
5808b224 73 ok(!$obj->can($field), "field for $name is not a method on $class")
5fc5d14f 74 if $field ne $name;
ba8c183b 75
5808b224 76 my $init_shims;
77
5fc5d14f 78 # initial method name
79 for my $meth ($name, $alias) {
5808b224 80 my $cv = svref_2object( $init_shims->{$meth} = $obj->can($meth) );
81 is($cv->GV->NAME, $meth, "initial ${class}::$meth accessor is named");
5fc5d14f 82 is(
83 $cv->GV->STASH->NAME,
5808b224 84 $test_accessors->{$name}{forced_class} || $origin_class,
85 "initial ${class}::$meth origin class correct",
5fc5d14f 86 );
87 }
ba8c183b 88
5808b224 89 is($obj->$name, undef, "${class}::$name begins undef");
90 is($obj->$alias, undef, "${class}::$alias begins undef");
ba8c183b 91
5fc5d14f 92 # get/set via name
5808b224 93 is($obj->$name('a'), 'a', "${class}::$name setter RV correct");
94 is($obj->$name, 'a', "${class}::$name getter correct");
95 is($obj->{$field}, $extra ? 'a Extra tackled on' : 'a', "${class}::$name corresponding field correct");
ba8c183b 96
5fc5d14f 97 # alias gets same as name
5808b224 98 is($obj->$alias, 'a', "${class}::$alias getter correct after ${class}::$name setter");
ba8c183b 99
5fc5d14f 100 # get/set via alias
5808b224 101 is($obj->$alias('b'), 'b', "${class}::$alias setter RV correct");
102 is($obj->$alias, 'b', "${class}::$alias getter correct");
103 is($obj->{$field}, $extra ? 'b Extra tackled on' : 'b', "${class}::$alias corresponding field still correct");
ba8c183b 104
5fc5d14f 105 # alias gets same as name
5808b224 106 is($obj->$name, 'b', "${class}::$name getter correct after ${class}::$alias setter");
ba8c183b 107
5fc5d14f 108 for my $meth ($name, $alias) {
5808b224 109 my $resolved = $obj->can($meth);
110
111 my $cv = svref_2object($resolved);
5fc5d14f 112 is($cv->GV->NAME, $meth, "$meth accessor is named after operations");
113 is(
114 $cv->GV->STASH->NAME,
115 # XS deferred subs install into each caller, not into the original parent
5808b224 116 $test_accessors->{$name}{forced_class} || (
117 ($use_xs and $test_accessors->{$name}{is_simple})
118 ? (ref $obj)
119 : $origin_class
120 ),
121 "${class}::$meth origin class correct after operations",
5fc5d14f 122 );
5808b224 123
124 # just simple for now
125 if ($use_xs and $test_accessors->{$name}{is_simple} and ! $test_accessors->{$name}{forced_class}) {
126 ok ($resolved != $init_shims->{$meth}, "$meth was replaced with a resolved version");
127 if ($class eq 'AccessorGroupsParent') {
128 ok ($cv->XSUB, "${class}::$meth is an XSUB");
129 }
130 else {
131 ok (!$cv->XSUB, "${class}::$meth is *not* an XSUB (due to get_simple overrides)");
132 }
133 }
5fc5d14f 134 }
ba8c183b 135 }
5fc5d14f 136}
e7d391a8 137
ed606987 138done_testing unless $::SUBTESTING;