1 package VPIT::TestHelpers;
11 while (my ($name, $code) = each %$subs) {
13 *{$pkg.'::'.$name} = $code;
19 my %default_exports = (
20 load_or_skip => \&load_or_skip,
21 load_or_skip_all => \&load_or_skip_all,
22 run_perl => \&run_perl,
23 skip_all => \&skip_all,
32 my %exports = %default_exports;
34 for (my $i = 0; $i <= $#opts; ++$i) {
35 my $feature = $opts[$i];
36 next unless defined $feature;
39 if ($i < $#opts and defined $opts[$i+1] and ref $opts[$i+1] eq 'ARRAY') {
46 my $handler = $features{$feature};
47 die "Unknown feature '$feature'" unless defined $handler;
49 my %syms = $handler->(@$args);
51 $exports{$_} = $syms{$_} for sort keys %syms;
54 export_to_pkg \%exports => scalar caller;
61 if ($INC{'Test/Leaner.pm'}) {
62 $stash = \%Test::Leaner::;
65 $stash = \%Test::More::;
68 my $glob = $stash->{$sub};
69 return $glob ? *$glob{CODE} : undef;
72 sub skip { $test_sub->('skip')->(@_) }
74 sub skip_all { $test_sub->('plan')->(skip_all => $_[0]) }
77 my $diag = $test_sub->('diag');
85 my ($pkg, $ver, $imports) = @_;
87 my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg;
91 if (eval "use $spec (); 1") {
92 $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} };
93 $ver = 'undef' unless defined $ver;
96 my @imports = @$imports;
97 my $caller = (caller 1)[0];
99 my $res = eval <<"IMPORTER";
102 BEGIN { \$pkg->import(\@imports) }
105 $err = "Could not import '@imports' from $pkg $ver: $@" unless $res;
108 (my $file = "$pkg.pm") =~ s{::}{/}g;
110 $err = "Could not load $spec";
114 return wantarray ? (0, $err) : 0;
116 diag "Using $pkg $ver";
122 my ($pkg, $ver, $imports, $tests) = @_;
124 die 'You must specify how many tests to skip' unless defined $tests;
126 my ($loaded, $err) = load($pkg, $ver, $imports);
127 skip $err => $tests unless $loaded;
132 sub load_or_skip_all {
133 my ($pkg, $ver, $imports) = @_;
135 my ($loaded, $err) = load($pkg, $ver, $imports);
136 skip_all $err unless $loaded;
144 my ($SystemRoot, $PATH) = @ENV{qw<SystemRoot PATH>};
145 my $ld_name = $Config::Config{ldlibpthname};
146 my $ldlibpth = $ENV{$ld_name};
149 $ENV{$ld_name} = $ldlibpth if defined $ldlibpth;
150 $ENV{SystemRoot} = $SystemRoot if $^O eq 'MSWin32' and defined $SystemRoot;
151 $ENV{PATH} = $PATH if $^O eq 'cygwin' and defined $PATH;
153 system { $^X } $^X, '-T', map("-I$_", @INC), '-e', $code;
156 package VPIT::TestHelpers::Guard;
159 my ($class, $code) = @_;
161 bless { code => $code }, $class;
164 sub DESTROY { $_[0]->{code}->() }