]> git.vpit.fr Git - perl/modules/VPIT-TestHelpers.git/blob - lib/VPIT/TestHelpers.pm
591adf2182fd90d3f57feb9c56e857e080fe65f3
[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 sub skip_all {
20  my ($msg) = @_;
21  require Test::More;
22  Test::More::plan(skip_all => $msg);
23 }
24
25 sub diag {
26  require Test::More;
27  Test::More::diag($_) for @_;
28 }
29
30 our $TODO;
31 local $TODO;
32
33 sub load_or_skip {
34  my ($pkg, $ver, $imports, $desc) = @_;
35  my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg;
36  local $@;
37  if (eval "use $spec (); 1") {
38   $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} };
39   $ver = 'undef' unless defined $ver;
40   if ($imports) {
41    my @imports = @$imports;
42    my $caller  = (caller 0)[0];
43    local $@;
44    my $res = eval <<"IMPORTER";
45 package
46         $caller;
47 BEGIN { \$pkg->import(\@imports) }
48 1;
49 IMPORTER
50    skip_all "Could not import '@imports' from $pkg $ver: $@" unless $res;
51   }
52   diag "Using $pkg $ver";
53  } else {
54   (my $file = "$pkg.pm") =~ s{::}{/}g;
55   delete $INC{$file};
56   skip_all "$spec $desc";
57  }
58 }
59
60 package VPIT::TestHelpers::Guard;
61
62 sub new {
63  my ($class, $code) = @_;
64
65  bless { code => $code }, $class;
66 }
67
68 sub DESTROY { $_[0]->{code}->() }
69
70 1;