File Coverage

inc/Test/Requires.pm
Criterion Covered Total %
statement 42 58 72.4
branch 8 20 40.0
condition 3 14 21.4
subroutine 10 10 100.0
pod 0 1 0.0
total 63 103 61.1


line stmt bran cond sub pod time code
1             #line 1
2 1     1   21324 package Test::Requires;
  1         3  
  1         34  
3 1     1   5 use strict;
  1         2  
  1         40  
4             use warnings;
5 1     1   4 our $VERSION = '0.07';
  1         1  
  1         109  
6 1     1   20 use base 'Test::Builder::Module';
  1         2  
  1         66  
7             use 5.006000;
8              
9 1     1   6 sub import {
10 1         3 my $class = shift;
11             my $caller = caller(0);
12              
13             # export methods
14 1     1   5 {
  1         1  
  1         462  
  1         1  
15 1         2 no strict 'refs';
  1         5  
16             *{"$caller\::test_requires"} = \&test_requires;
17             }
18              
19 1 50 33     8 # test arguments
      33        
20 0         0 if (@_ == 1 && ref $_[0] && ref $_[0] eq 'HASH') {
  0         0  
21 0         0 while (my ($mod, $ver) = each %{$_[0]}) {
22             test_requires($mod, $ver, $caller);
23             }
24 1         2 } else {
25 2         6 for my $mod (@_) {
26             test_requires($mod, undef, $caller);
27             }
28             }
29             }
30              
31 2     2 0 5 sub test_requires {
32 2 50       8 my ( $mod, $ver, $caller ) = @_;
33 2 50       16 return if $mod eq __PACKAGE__;
34 0         0 if (@_ != 3) {
35             $caller = caller(0);
36 2   50     13 }
37             $ver ||= '';
38 1     1   1084  
  1     1   67405  
  1         21  
  1         439  
  0         0  
  0         0  
  2         124  
39 2 100       14 eval qq{package $caller; use $mod $ver}; ## no critic.
40             if (my $e = $@) {
41 1     1   19 my $skip_all = sub {
42             my $builder = __PACKAGE__->builder;
43 1 50       18  
    0          
44 1         13 if (not defined $builder->has_plan) {
45             $builder->skip_all(@_);
46 0         0 } elsif ($builder->has_plan eq 'no_plan') {
47 0 0 0     0 $builder->skip(@_);
48 0         0 if ( $builder->can('parent') && $builder->parent ) {
49             die bless {} => 'Test::Builder::Exception';
50 0         0 }
51             exit 0;
52 0         0 } else {
53 0         0 for (1..$builder->has_plan) {
54             $builder->skip(@_);
55 0 0 0     0 }
56 0         0 if ( $builder->can('parent') && $builder->parent ) {
57             die bless {} => 'Test::Builder::Exception';
58 0         0 }
59             exit 0;
60 1         8 }
61             };
62 1         4
63 1 50       6 my $msg = "$e";
64 1         4 if ( $e =~ /^Can't locate/ ) {
65             $msg = "Test requires module '$mod' but it's not found";
66             }
67 1 50       5
68 0         0 if ($ENV{RELEASE_TESTING}) {
69             __PACKAGE__->builder->BAIL_OUT($msg);
70             }
71 1         4 else {
72             $skip_all->($msg);
73             }
74             }
75             }
76              
77             1;
78             __END__