File Coverage

blib/lib/Test/Requires.pm
Criterion Covered Total %
statement 51 54 94.4
branch 16 20 80.0
condition 9 14 64.2
subroutine 9 9 100.0
pod 0 1 0.0
total 85 98 86.7


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