From: Vincent Pit Date: Wed, 30 Jan 2013 15:59:16 +0000 (-0200) Subject: Rename load_or_skip to load_or_skip_all, and implement the real load_or_skip X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FVPIT-TestHelpers.git;a=commitdiff_plain;h=04f59576053a0b9680c11ad6353d9f6d88bb1107 Rename load_or_skip to load_or_skip_all, and implement the real load_or_skip --- diff --git a/lib/VPIT/TestHelpers.pm b/lib/VPIT/TestHelpers.pm index 8e05629..3d545e8 100644 --- a/lib/VPIT/TestHelpers.pm +++ b/lib/VPIT/TestHelpers.pm @@ -4,8 +4,9 @@ use strict; use warnings; my %exports = ( - load_or_skip => \&load_or_skip, - skip_all => \&skip_all, + load_or_skip => \&load_or_skip, + load_or_skip_all => \&load_or_skip_all, + skip_all => \&skip_all, ); sub import { @@ -32,6 +33,8 @@ my $test_sub = sub { return $glob ? *$glob{CODE} : undef; }; +sub skip { $test_sub->('skip')->(@_) } + sub skip_all { $test_sub->('plan')->(skip_all => $_[0]) } sub diag { @@ -42,9 +45,12 @@ sub diag { our $TODO; local $TODO; -sub load_or_skip { - my ($pkg, $ver, $imports, $desc) = @_; +sub load { + my ($pkg, $ver, $imports) = @_; + my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg; + my $err; + local $@; if (eval "use $spec (); 1") { $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} }; @@ -52,7 +58,7 @@ sub load_or_skip { if ($imports) { my @imports = @$imports; - my $caller = (caller 0)[0]; + my $caller = (caller 1)[0]; local $@; my $res = eval <<"IMPORTER"; package @@ -60,14 +66,40 @@ package BEGIN { \$pkg->import(\@imports) } 1; IMPORTER - skip_all "Could not import '@imports' from $pkg $ver: $@" unless $res; + $err = "Could not import '@imports' from $pkg $ver: $@" unless $res; } - diag "Using $pkg $ver"; } else { (my $file = "$pkg.pm") =~ s{::}{/}g; delete $INC{$file}; - skip_all "$spec $desc"; + $err = "Could not load $spec"; } + + if ($err) { + return wantarray ? (0, $err) : 0; + } else { + diag "Using $pkg $ver"; + return 1; + } +} + +sub load_or_skip { + my ($pkg, $ver, $imports, $tests) = @_; + + die 'You must specify how many tests to skip' unless defined $tests; + + my ($loaded, $err) = load($pkg, $ver, $imports); + skip $err => $tests unless $loaded; + + return $loaded; +} + +sub load_or_skip_all { + my ($pkg, $ver, $imports) = @_; + + my ($loaded, $err) = load($pkg, $ver, $imports); + skip_all $err unless $loaded; + + return $loaded; } package VPIT::TestHelpers::Guard;