File Coverage

blib/lib/Test/Load/Helper.pm
Criterion Covered Total %
statement 70 72 97.2
branch 22 26 84.6
condition 5 6 83.3
subroutine 15 15 100.0
pod 0 5 0.0
total 112 124 90.3


line stmt bran cond sub pod time code
1              
2 13     13   5095103 use v5.14;
  13         44  
3 13     13   63 use warnings;
  13         20  
  13         768  
4              
5             package Test::Load::Helper v1.0.0 {
6              
7 13     12   340 use Carp qw (croak);
  12         42  
  12         652  
8 12     12   49 use Path::Tiny qw ();
  12         20  
  12         1066  
9              
10             our $DEFAULT_FILENAME = q (test-helper.pl);
11              
12             sub eval_helper {
13 17     17 0 61 my ($class, %args) = @_;
14              
15 17         50 my $key = $class->inc_key (%args);
16              
17             return 1
18 17 100       171 if exists $INC{$key}
19             ;
20              
21 15         32 my $file = $args{file};
22 15         47 my $code = $file->slurp_utf8;
23              
24             {
25 12     12   59 no strict q (refs);
  12         15  
  12         6682  
  15         13367  
26 10     10   921 eval <<"END_OF_EVAL";
  10     10   18  
  10     4   205  
  10     4   31  
  10         13  
  10         2332  
  4         366  
  4         4  
  4         115  
  4         12  
  4         6  
  4         717  
  15         82  
27             package $args{into};
28             use strict;
29             use warnings;
30             #line 1 "$file"
31             $code;
32             1;
33             END_OF_EVAL
34             }
35              
36 15 100       772 croak qq (Test::Load::Helper: Error compiling '$file': $@)
37             if $@
38             ;
39              
40 14         50 $INC{$key} = "$file";
41 14         392 return 1;
42             }
43              
44             sub identify_caller_file {
45 19     19 0 32 my ($class, %args) = @_;
46              
47 19         24 my $level = 0;
48 19         68 while (my @info = caller ($level++)) {
49 57         67 my $file = $info[1];
50 57 100       174 next if $file eq __FILE__;
51 19 50       522 return Path::Tiny::->new ($file)
52             if -f $file
53             ;
54             }
55              
56 0         0 return path ('.');
57             }
58              
59             sub identify_caller_package {
60 19     19 0 32 my ($class, %args) = @_;
61              
62             return $args{into}
63             if exists $args{into}
64 19 100       90 ;
65              
66 18         29 my $level = 0;
67 18         133 while (my @info = caller ($level++)) {
68 36         55 my $package = $info[0];
69 36 100       151 next if $package eq __PACKAGE__;
70 18         119 return $package;
71             }
72              
73 0         0 return q (main);
74             }
75              
76             sub identify_helper_file {
77 19     19 0 35 my ($class, %args) = @_;
78 19   66     84 my $file = $args{file} // $DEFAULT_FILENAME;
79              
80             my $caller_file = exists $args{caller_file}
81             ? Path::Tiny::->new ($args{caller_file})
82 19 50       60 : $class->identify_caller_file (%args)
83             ;
84              
85 19         743 my $caller_dir = $caller_file->parent->absolute;
86              
87             my $root = $ENV{TEST_LOAD_ROOT}
88 19 100       1418 ? Path::Tiny::->new ($ENV{TEST_LOAD_ROOT})->absolute
89             : Path::Tiny::->new (q (/))
90             ;
91              
92 19         735 while (1) {
93 30         62 my $candidate = $caller_dir->child ($file);
94              
95 30 100 100     809 return $candidate
96             if $candidate ne $caller_file
97             && $candidate->exists
98             ;
99              
100             last
101 13 100       558 if $caller_dir eq $root
102             ;
103              
104 11         87 my $parent = $caller_dir->parent;
105              
106             last
107 11 50       381 if $parent eq $caller_dir
108             ;
109              
110 11         72 $caller_dir = $parent;
111             }
112              
113 2         97 return;
114             }
115              
116             sub import {
117 19     19   177 my ($class, %args) = @_;
118              
119             return
120 19 50       48 unless my $caller_package = $class->identify_caller_package (%args)
121             ;
122              
123 19 100       46 return 1
124             unless my $helper_file = $class->identify_helper_file (%args)
125             ;
126              
127 17         596 $class->eval_helper (
128             into => $caller_package,
129             file => $helper_file,
130             );
131             }
132              
133             sub inc_key {
134 17     17 0 36 my ($class, %args) = @_;
135              
136 17         30 my $into = $args{into};
137 17         23 my $file = $args{file};
138              
139             # File can be loaded into multiple target packages
140 17         77 qq (${file}{${into}});
141             }
142              
143             1;
144             }
145              
146             __END__