Make cref registry thread-safe and a ton of tests
[p5sagit/Class-Accessor-Grouped.git] / t / accessors_pp.t
1 my $has_threads;
2 BEGIN { eval '
3   use 5.008001;
4   use threads;
5   use threads::shared;
6   $has_threads = 1;
7 ' }
8
9 use strict;
10 use warnings;
11 no warnings 'once';
12 use FindBin qw($Bin);
13 use File::Spec::Functions;
14 use File::Spec::Unix (); # need this for %INC munging
15 use Test::More;
16 use lib 't/lib';
17
18 BEGIN {
19   local $ENV{DEVEL_HIDE_VERBOSE} = 0;
20   eval { require Devel::Hide };
21   if ($@) {
22     eval { require Sub::Name };
23     plan skip_all => "Devel::Hide required for this test in presence of Sub::Name"
24       if ! $@;
25   }
26   else {
27     Devel::Hide->import('Sub/Name.pm');
28   }
29   require Class::Accessor::Grouped;
30 }
31
32
33 # rerun the regular 3 tests under the assumption of no Sub::Name
34 our $SUBTESTING = 1;
35 for my $tname (qw/accessors.t accessors_ro.t accessors_wo.t/) {
36
37   my $pass = 1;
38   share($pass) if $has_threads;
39
40   my $todo = sub {
41     note "\nTesting $tname without Sub::Name (pass @{[ $pass ++ ]})\n\n";
42
43     my $tfn = catfile($Bin, $tname);
44
45     delete $INC{$_} for (
46       qw/AccessorGroups.pm AccessorGroupsRO.pm AccessorGroupsSubclass.pm AccessorGroupsParent.pm AccessorGroupsWO.pm/,
47       File::Spec::Unix->catfile ($tfn),
48     );
49
50     local $SIG{__WARN__} = sub { warn @_ unless $_[0] =~ /subroutine .+ redefined/i };
51
52     do($tfn);
53   };
54
55   if ($has_threads) {
56     threads->create(sub {
57       threads->create(sub {
58         $todo->() for (1,2) }
59       )->join;
60       $todo->() for (1,2);
61     })->join for (1,2)
62   }
63   else {
64     $todo->() for (1, 2);
65   }
66 }
67
68 done_testing;