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,
27 usleep => \&init_usleep,
34 my %exports = %default_exports;
36 for (my $i = 0; $i <= $#opts; ++$i) {
37 my $feature = $opts[$i];
38 next unless defined $feature;
41 if ($i < $#opts and defined $opts[$i+1] and ref $opts[$i+1] eq 'ARRAY') {
48 my $handler = $features{$feature};
49 die "Unknown feature '$feature'" unless defined $handler;
51 my %syms = $handler->(@$args);
53 $exports{$_} = $syms{$_} for sort keys %syms;
56 export_to_pkg \%exports => scalar caller;
63 if ($INC{'Test/Leaner.pm'}) {
64 $stash = \%Test::Leaner::;
67 $stash = \%Test::More::;
70 my $glob = $stash->{$sub};
71 return $glob ? *$glob{CODE} : undef;
74 sub skip { $test_sub->('skip')->(@_) }
76 sub skip_all { $test_sub->('plan')->(skip_all => $_[0]) }
79 my $diag = $test_sub->('diag');
87 my ($pkg, $ver, $imports) = @_;
89 my $spec = $ver && $ver !~ /^[0._]*$/ ? "$pkg $ver" : $pkg;
93 if (eval "use $spec (); 1") {
94 $ver = do { no strict 'refs'; ${"${pkg}::VERSION"} };
95 $ver = 'undef' unless defined $ver;
98 my @imports = @$imports;
99 my $caller = (caller 1)[0];
101 my $res = eval <<"IMPORTER";
104 BEGIN { \$pkg->import(\@imports) }
107 $err = "Could not import '@imports' from $pkg $ver: $@" unless $res;
110 (my $file = "$pkg.pm") =~ s{::}{/}g;
112 $err = "Could not load $spec";
116 return wantarray ? (0, $err) : 0;
118 diag "Using $pkg $ver";
124 my ($pkg, $ver, $imports, $tests) = @_;
126 die 'You must specify how many tests to skip' unless defined $tests;
128 my ($loaded, $err) = load($pkg, $ver, $imports);
129 skip $err => $tests unless $loaded;
134 sub load_or_skip_all {
135 my ($pkg, $ver, $imports) = @_;
137 my ($loaded, $err) = load($pkg, $ver, $imports);
138 skip_all $err unless $loaded;
146 my ($SystemRoot, $PATH) = @ENV{qw<SystemRoot PATH>};
147 my $ld_name = $Config::Config{ldlibpthname};
148 my $ldlibpth = $ENV{$ld_name};
151 $ENV{$ld_name} = $ldlibpth if defined $ldlibpth;
152 $ENV{SystemRoot} = $SystemRoot if $^O eq 'MSWin32' and defined $SystemRoot;
153 $ENV{PATH} = $PATH if $^O eq 'cygwin' and defined $PATH;
155 system { $^X } $^X, '-T', map("-I$_", @INC), '-e', $code;
161 if (do { local $@; eval { require Time::HiRes; 1 } }) {
162 defined and diag "Using usleep() from Time::HiRes $_"
163 for $Time::HiRes::VERSION;
164 $usleep = \&Time::HiRes::usleep;
166 diag 'Using fallback usleep()';
168 my $s = int($_[0] / 2.5e5);
173 return usleep => $usleep;
176 package VPIT::TestHelpers::Guard;
179 my ($class, $code) = @_;
181 bless { code => $code }, $class;
184 sub DESTROY { $_[0]->{code}->() }