File Coverage

blib/lib/Test/Most.pm
Criterion Covered Total %
statement 179 206 86.8
branch 33 50 66.0
condition 8 12 66.6
subroutine 36 41 87.8
pod 10 10 100.0
total 266 319 83.3


line stmt bran cond sub pod time code
1             package Test::Most;
2              
3 19     19   188349 use warnings;
  17         26  
  17         909  
4 19     19   93 use strict;
  19         99  
  19         448  
5              
6 19     19   7481 use Test::Most::Exception 'throw_failure';
  19         51  
  19         1126  
7              
8             # XXX don't use 'base' as it can override signal handlers
9 19     19   7518 use Test::Builder::Module;
  19         1316917  
  19         151  
10             our ( @ISA, @EXPORT, $DATA_DUMPER_NAMES_INSTALLED );
11             my $HAVE_TIME_HIRES;
12              
13             BEGIN {
14              
15 19     19   30256 require Test::More;
16 19 50       79576 if (Test::More->can('TB_PROVIDER_META')) {
17 2         35 Test::More->import(import => [ '!explain' ]);
18             }
19             else {
20             # There's some strange fiddling around with import(), so this allows us to
21             # be nicely backwards compatible to earlier versions of Test::More.
22 17         38 local @Test::More::EXPORT = grep { $_ ne 'explain' } @Test::More::EXPORT;
  476         590  
23 17         107 Test::More->import;
24             }
25              
26 17     17   4941 eval "use Time::HiRes";
  17         137  
  17         42  
  17         143  
27 17 50       1056 $HAVE_TIME_HIRES = 1 unless $@;
28             }
29              
30 17     17   123 use Test::Builder;
  17         23  
  17         572  
31             my $OK_FUNC;
32             BEGIN {
33 17     17   2211 $OK_FUNC = \&Test::Builder::ok;
34             }
35              
36             our $VERSION = '0.41';
37             $VERSION = eval $VERSION;
38              
39             BEGIN {
40 17     17   357 @ISA = qw(Test::Builder::Module);
41             @EXPORT = (
42             Test::More->can('TB_PROVIDER_META')
43 17 50       3608 ? grep { $_ ne 'TODO' } keys( %{Test::More->TB_PROVIDER_META->{attrs}})
  0         0  
  0         0  
44             : @Test::More::EXPORT,
45             qw<
46             $TODO
47             all_done
48             bail_on_fail
49             die_on_fail
50             explain
51             always_explain
52             last_test_failed
53             restore_fail
54             set_failure_handler
55             show
56             always_show
57             >
58             );
59             }
60              
61             sub import {
62 19     19   2141 my $class = shift;
63 19         27 my $bail_set = 0;
64 19         242 local @EXPORT = @EXPORT; # localize effect of %exclude_symbol
65              
66 19         41 my %modules_to_load = map { $_ => 1 } qw/
  76         170  
67             Test::Differences
68             Test::Exception
69             Test::Deep
70             Test::Warn
71             /;
72 19         520 warnings->import;
73 19         99 strict->import;
74 17     17   2271 eval "use Data::Dumper::Names 0.03";
  0         0  
  0         0  
  19         1269  
75 19         61 $DATA_DUMPER_NAMES_INSTALLED = !$@;
76              
77 19 100       150 if ( $ENV{BAIL_ON_FAIL} ) {
78 1         1 $bail_set = 1;
79 1         2 bail_on_fail();
80             }
81 19 100 100     184 if ( !$bail_set and $ENV{DIE_ON_FAIL} ) {
82 1         2 die_on_fail();
83             }
84 19         110 for my $i ( 0 .. $#_ ) {
85 28 100       89 if ( 'bail' eq $_[$i] ) {
86 1         2 splice @_, $i, 1;
87 1         2 bail_on_fail();
88 1         1 $bail_set = 1;
89 1         1 last;
90             }
91             }
92 19         62 my $caller = caller;
93 19         32 for my $i ( 0 .. $#_ ) {
94 29 100       89 if ( 'timeit' eq $_[$i] ) {
95 1         2 splice @_, $i, 1;
96 17     17   93 no strict;
  17         23  
  17         6922  
97 1         1 *{"${caller}::timeit"} = \&timeit;
  1         5  
98 1         2 last;
99             }
100             }
101              
102 19         23 my %exclude_symbol;
103 19         41 my $i = 0;
104              
105 19         66 foreach my $do_not_import_by_default (qw/blessed reftype/) {
106 38 50       80 if ( grep { $_ eq $do_not_import_by_default } @_ ) {
  56         106  
107 0         0 @_ = grep { $_ ne $do_not_import_by_default } @_;
  0         0  
108             }
109             else {
110 38         88 $exclude_symbol{$do_not_import_by_default} = 1;
111             }
112             }
113              
114 19         65 while ($i < @_) {
115 32 100 100     103 if ( !$bail_set and ( 'die' eq $_[$i] ) ) {
116 1         2 splice @_, $i, 1;
117 1         2 die_on_fail();
118 1         1 $i = 0;
119 1         2 next;
120             }
121 31 100       69 if ( $_[$i] =~ /^-(.*)/ ) {
122 1         3 my $module = $1;
123 1         4 splice @_, $i, 1;
124 1 50       4 unless (exists $modules_to_load{$module}) {
125 0         0 require Carp;
126 0         0 Carp::croak("Cannot remove non-existent Test::Module ($module)");
127             }
128 1         2 delete $modules_to_load{$module};
129 1         2 $i = 0;
130 1         3 next;
131             }
132 30 100       64 if ( $_[$i] =~ /^!(.*)/ ) {
133 2         5 splice @_, $i, 1;
134 2         8 $exclude_symbol{$1} = 1;
135 2         4 $i = 0;
136 2         6 next;
137             }
138 28 100       48 if ( 'defer_plan' eq $_[$i] ) {
139 1         8 require Carp;
140 1 50       5 Carp::carp(<<'END') unless $ENV{DO_NOT_WARN_ON_DEFER_PLAN};
141             defer_plan() is deprecated and will be removed in a future release of
142             Test::Most. It's functionality is provided by Test::More's done_testing(),
143             first added in 2009 (0.88).
144             END
145 1         3 splice @_, $i, 1;
146              
147 1         6 my $builder = Test::Builder->new;
148              
149             # XXX I don't like setting this directly, but
150             # Test::Builder::has_plan isn't public
151 1         14 $builder->{Have_Plan} = 1;
152 1         4 $builder->{TEST_MOST_deferred_plan} = 1;
153 1         2 $builder->{TEST_MOST_all_done} = 0;
154 1         2 $i = 0;
155 1         3 next;
156             }
157 27         41 $i++;
158             }
159 19         127 local @EXPORT = @EXPORT; # localize effect of %exclude_symbol
160 19         55 foreach my $module (keys %modules_to_load) {
161 17     17   10968 eval "use $module";
  17     17   116049  
  17     17   2440  
  17     16   10395  
  17         183375  
  17         533  
  17         8759  
  17         147477  
  17         566  
  16         8572  
  16         132162  
  16         582  
  75         4089  
162              
163 75 50       7923 if ( my $error = $@) {
164 0         0 require Carp;
165 0         0 Carp::croak($error);
166             }
167 17     17   116 no strict 'refs';
  17         21  
  17         6345  
168 75         182 push @EXPORT => grep { !$exclude_symbol{$_} } @{"${module}::EXPORT"};
  1212         1786  
  75         260  
169             }
170              
171 19         258 my $test = $class->builder;
172 19         282 $test->exported_to($caller);
173 19         246 $test->plan(@_);
174              
175 19         27424 $class->export_to_level(1, $class, @EXPORT);
176             }
177              
178             sub explain {
179 6     6 1 346489 _explain(\&Test::More::note, @_);
180             }
181              
182              
183             sub timeit(&;$) {
184 2     2 1 123971 my ( $code, $message ) = @_;
185 2 50       6 unless($HAVE_TIME_HIRES) {
186 0         0 Test::Most::diag("timeit: Time::HiRes not installed");
187 0         0 $code->();
188             }
189 2 100       3 if ( !$message ) {
190 1         3 my ( $package, $filename, $line ) = caller;
191 1         14 $message = "$filename line $line";
192             }
193 2         7 my $start = [Time::HiRes::gettimeofday()];
194 2         4 $code->();
195 2         414 explain(
196             sprintf "$message: took %s seconds" => Time::HiRes::tv_interval($start) );
197             }
198              
199             sub always_explain {
200 2     2 1 1891 _explain(\&Test::More::diag, @_);
201             }
202              
203             sub _explain {
204 10     10   16 my $diag = shift;
205 17     17   94 no warnings 'once';
  17         27  
  17         3747  
206             $diag->(
207             map {
208 10         17 ref $_
209 14 100       144 ? do {
210 5         25 require Data::Dumper;
211 5         7 local $Data::Dumper::Indent = 1;
212 5         18 local $Data::Dumper::Sortkeys = 1;
213 5         5 local $Data::Dumper::Terse = 1;
214 5         15 Data::Dumper::Dumper($_);
215             }
216             : $_
217             } @_
218             );
219             }
220              
221             sub show {
222 1     1 1 883 _show(\&Test::More::note, @_);
223             }
224              
225             sub always_show {
226 1     1 1 843 _show(\&Test::More::diag, @_);
227             }
228              
229             sub _show {
230 2 50   2   5 unless ( $DATA_DUMPER_NAMES_INSTALLED ) {
231 2         40 require Carp;
232 2         27 Carp::carp("Data::Dumper::Names 0.03 not found. Use explain() instead of show()");
233 2         406 goto &_explain;
234             }
235 0         0 my $diag = shift;
236 17     17   86 no warnings 'once';
  17         27  
  17         2630  
237 0         0 local $Data::Dumper::Indent = 1;
238 0         0 local $Data::Dumper::Sortkeys = 1;
239 0         0 local $Data::Dumper::Names::UpLevel = $Data::Dumper::Names::UpLevel + 2;
240 0         0 $diag->(Data::Dumper::Names::Dumper(@_));
241             }
242              
243             sub die_on_fail {
244 0     0 1 0 set_failure_handler( sub { throw_failure } );
  3     3   155645  
245             }
246              
247             sub bail_on_fail {
248             set_failure_handler(
249 0     0 1 0 sub { Test::More::BAIL_OUT("Test failed. BAIL OUT!.\n") } );
  3     3   166390  
250             }
251              
252             sub restore_fail {
253 17     17   89 no warnings 'redefine';
  17         20  
  17         2223  
254 0     0 1 0 *Test::Builder::ok = $OK_FUNC;
255             }
256              
257             sub all_done {
258 1     1 1 208542 my $builder = Test::Builder->new;
259 1 50       11 if ($builder->{TEST_MOST_deferred_plan}) {
260 1         3 $builder->{TEST_MOST_all_done} = 1;
261 1 50       8 $builder->expected_tests(@_ ? $_[0] : $builder->current_test);
262             }
263             }
264              
265              
266             sub set_failure_handler {
267 6     6 1 7 my $action = shift;
268 17     17   82 no warnings 'redefine';
  17         22  
  17         2412  
269 6         26 Test::Builder->new->{TEST_MOST_failure_action} = $action; # for DESTROY
270             *Test::Builder::ok = sub {
271 38     38   763145 local $Test::Builder::Level = $Test::Builder::Level + 1;
272 38         148 my $builder = $_[0];
273 38 50       124 if ( $builder->{TEST_MOST_test_failed} ) {
274 0         0 $builder->{TEST_MOST_test_failed} = 0;
275 0         0 $action->($builder);
276             }
277 38         71 $builder->{TEST_MOST_test_failed} = 0;
278 38         98 my $result = $OK_FUNC->(@_);
279 38         16687 $builder->{TEST_MOST_test_failed} = !( $builder->summary )[-1];
280 38         5513 return $result;
281 6         81 };
282             }
283              
284             {
285 17     17   75 no warnings 'redefine';
  17         28  
  17         3630  
286             my $orig_destroy = Test::Builder->can('DESTROY');
287              
288             # we need this because if the failure is on the final test, we won't have
289             # a subsequent test triggering the behavior.
290             *Test::Builder::DESTROY = sub {
291 0     0   0 my $builder = $_[0];
292 0 0       0 if ( $builder->{TEST_MOST_test_failed} ) {
293 0   0 0   0 ( $builder->{TEST_MOST_failure_action} || sub {} )->();
294             }
295 0 0       0 $orig_destroy->(@_) if $orig_destroy;
296             };
297             }
298              
299             sub _deferred_plan_handler {
300 17     17   113 my $builder = Test::Builder->new;
301 17 50 66     692 if ($builder->{TEST_MOST_deferred_plan} and !$builder->{TEST_MOST_all_done})
302             {
303 0           $builder->expected_tests($builder->current_test + 1);
304             }
305             }
306              
307             # This should work because the END block defined by Test::Builder should be
308             # guaranteed to be run before t one, since we use'd Test::Builder way up top.
309             # The other two alternatives would be either to replace Test::Builder::_ending
310             # similar to how we did Test::Builder::ok, or to call Test::Builder::no_ending
311             # and basically rewrite _ending in our own image. Neither is very palatable,
312             # considering _ending's initial underscore.
313              
314             END {
315 17     17   1270924 _deferred_plan_handler();
316             }
317              
318             1;
319             __END__