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