Update VPIT::TestHelpers to e8344578
[perl/modules/indirect.git] / t / 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  load_or_skip_all => \&load_or_skip_all,
9  skip_all         => \&skip_all,
10 );
11
12 sub import {
13  my $pkg = caller;
14
15  while (my ($name, $code) = each %exports) {
16   no strict 'refs';
17   *{$pkg.'::'.$name} = $code;
18  }
19 }
20
21 my $test_sub = sub {
22  my $sub = shift;
23
24  my $stash;
25  if ($INC{'Test/Leaner.pm'}) {
26   $stash = \%Test::Leaner::;
27  } else {
28   require Test::More;
29   $stash = \%Test::More::;
30  }
31
32  my $glob = $stash->{$sub};
33  return $glob ? *$glob{CODE} : undef;
34 };
35
36 sub skip { $test_sub->('skip')->(@_) }
37
38 sub skip_all { $test_sub->('plan')->(skip_all => $_[0]) }
39
40 sub diag {
41  my $diag = $test_sub->('diag');
42  $diag->($_) for @_;
43 }
44
45 our $TODO;
46 local $TODO;
47
48 sub load {
49  my ($pkg, $ver, $imports) = @_;
50
51  my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg;
52  my $err;
53
54  local $@;
55  if (eval "use $spec (); 1") {
56   $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} };
57   $ver = 'undef' unless defined $ver;
58
59   if ($imports) {
60    my @imports = @$imports;
61    my $caller  = (caller 1)[0];
62    local $@;
63    my $res = eval <<"IMPORTER";
64 package
65         $caller;
66 BEGIN { \$pkg->import(\@imports) }
67 1;
68 IMPORTER
69    $err = "Could not import '@imports' from $pkg $ver: $@" unless $res;
70   }
71  } else {
72   (my $file = "$pkg.pm") =~ s{::}{/}g;
73   delete $INC{$file};
74   $err = "Could not load $spec";
75  }
76
77  if ($err) {
78   return wantarray ? (0, $err) : 0;
79  } else {
80   diag "Using $pkg $ver";
81   return 1;
82  }
83 }
84
85 sub load_or_skip {
86  my ($pkg, $ver, $imports, $tests) = @_;
87
88  die 'You must specify how many tests to skip' unless defined $tests;
89
90  my ($loaded, $err) = load($pkg, $ver, $imports);
91  skip $err => $tests unless $loaded;
92
93  return $loaded;
94 }
95
96 sub load_or_skip_all {
97  my ($pkg, $ver, $imports) = @_;
98
99  my ($loaded, $err) = load($pkg, $ver, $imports);
100  skip_all $err unless $loaded;
101
102  return $loaded;
103 }
104
105 package VPIT::TestHelpers::Guard;
106
107 sub new {
108  my ($class, $code) = @_;
109
110  bless { code => $code }, $class;
111 }
112
113 sub DESTROY { $_[0]->{code}->() }
114
115 1;