eecc8dff23908ec4a07fec0366b57434d24a1f59
[p5sagit/Class-Accessor-Grouped.git] / t / accessors_xs_cachedwarn.t
1 my $has_threads;
2 BEGIN { eval '
3   use 5.008004; # older perls get confused by $SIG fiddling
4   use threads;
5   use threads::shared;
6   $has_threads = 1;
7 ' }
8
9 use strict;
10 use warnings;
11 use Test::More;
12 use lib 't/lib';
13
14 BEGIN {
15   plan skip_all => "Sub::Name not available"
16     unless eval { require Sub::Name };
17
18   require Class::Accessor::Grouped;
19
20   my $xsa_ver = $Class::Accessor::Grouped::__minimum_xsa_version;
21   eval {
22     require Class::XSAccessor;
23     Class::XSAccessor->VERSION ($xsa_ver);
24   };
25   plan skip_all => "Class::XSAccessor >= $xsa_ver not available"
26     if $@;
27 }
28
29 use AccessorGroupsSubclass;
30
31 my @w;
32 share(@w) if $has_threads;
33
34 {
35   my $obj = AccessorGroupsSubclass->new;
36   my $deferred_stub = AccessorGroupsSubclass->can('singlefield');
37   my $obj2 = AccessorGroups->new;
38
39   my $todo = sub {
40     local $SIG{__WARN__} = sub { push @w, @_ };
41     is ($obj->$deferred_stub(1), 1, 'Set');
42     is ($obj->$deferred_stub, 1, 'Get');
43     is ($obj->$deferred_stub(2), 2, 'ReSet');
44     is ($obj->$deferred_stub, 2, 'ReGet');
45
46     is ($obj->singlefield, 2, 'Normal get');
47     is ($obj2->singlefield, undef, 'Normal get on unrelated object');
48   };
49
50   $has_threads ? threads->create( $todo )->join : $todo->();
51 }
52
53 is (@w, 3, '3 warnings total');
54
55 is (
56   scalar (grep { $_ =~ /^\QDeferred version of method AccessorGroupsParent::singlefield invoked more than once/ } @w),
57   3,
58   '3 warnings produced as expected on cached invocation during testing',
59 ) or do {
60   require Data::Dumper;
61   diag "\n \$0 is: " . Data::Dumper->new([$0])->Useqq(1)->Terse(1)->Dump;
62 };
63
64 done_testing;