]> git.vpit.fr Git - perl/modules/VPIT-TestHelpers.git/blob - lib/VPIT/TestHelpers.pm
Make diag() and skip_all() use Test::Leaner if it is loaded
[perl/modules/VPIT-TestHelpers.git] / lib / VPIT / TestHelpers.pm
1 package VPIT::TestHelpers;
2
3 use strict;
4 use warnings;
5
6 my %exports = (
7  load_or_skip => \&load_or_skip,
8  skip_all     => \&skip_all,
9 );
10
11 sub import {
12  my $pkg = caller;
13  while (my ($name, $code) = each %exports) {
14   no strict 'refs';
15   *{$pkg.'::'.$name} = $code;
16  }
17 }
18
19 my $test_sub = sub {
20  my $sub = shift;
21  my $stash;
22  if ($INC{'Test/Leaner.pm'}) {
23   $stash = \%Test::Leaner::;
24  } else {
25   require Test::More;
26   $stash = \%Test::More::;
27  }
28  return $stash->{$sub};
29 };
30
31 sub skip_all { $test_sub->('plan')->(skip_all => $_[0]) }
32
33 sub diag {
34  my $diag = $test_sub->('diag');
35  $diag->($_) for @_;
36 }
37
38 our $TODO;
39 local $TODO;
40
41 sub load_or_skip {
42  my ($pkg, $ver, $imports, $desc) = @_;
43  my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg;
44  local $@;
45  if (eval "use $spec (); 1") {
46   $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} };
47   $ver = 'undef' unless defined $ver;
48   if ($imports) {
49    my @imports = @$imports;
50    my $caller  = (caller 0)[0];
51    local $@;
52    my $res = eval <<"IMPORTER";
53 package
54         $caller;
55 BEGIN { \$pkg->import(\@imports) }
56 1;
57 IMPORTER
58    skip_all "Could not import '@imports' from $pkg $ver: $@" unless $res;
59   }
60   diag "Using $pkg $ver";
61  } else {
62   (my $file = "$pkg.pm") =~ s{::}{/}g;
63   delete $INC{$file};
64   skip_all "$spec $desc";
65  }
66 }
67
68 package VPIT::TestHelpers::Guard;
69
70 sub new {
71  my ($class, $code) = @_;
72
73  bless { code => $code }, $class;
74 }
75
76 sub DESTROY { $_[0]->{code}->() }
77
78 1;