Silence ill-behaved Test::Harness test on VMS.
[p5sagit/p5-mst-13.2.git] / lib / Test / Harness / Util.pm
1 package Test::Harness::Util;
2
3 use strict;
4 use vars qw($VERSION);
5 $VERSION = '0.01';
6
7 use File::Spec;
8 use Exporter;
9 use vars qw( @ISA @EXPORT @EXPORT_OK );
10
11 @ISA = qw( Exporter );
12 @EXPORT = ();
13 @EXPORT_OK = qw( all_in shuffle blibdirs );
14
15 =head1 NAME
16
17 Test::Harness::Util - Utility functions for Test::Harness::*
18
19 =head1 SYNOPSIS
20
21 Utility functions for Test::Harness::*
22
23 =head1 PUBLIC FUNCTIONS
24
25 The following are all available to be imported to your module.  No symbols
26 are exported by default.
27
28 =head2 all_in( {parm => value, parm => value} )
29
30 Finds all the F<*.t> in a directory.  Knows to skip F<.svn> and F<CVS>
31 directories.
32
33 Valid parms are:
34
35 =over
36
37 =item start
38
39 Starting point for the search.  Defaults to ".".
40
41 =item recurse
42
43 Flag to say whether it should recurse.  Default to true.
44
45 =back
46
47 =cut
48
49 sub all_in {
50     my $parms = shift;
51     my %parms = (
52         start => ".",
53         recurse => 1,
54         %$parms,
55     );
56
57     my @hits = ();
58     my $start = $parms{start};
59
60     local *DH;
61     if ( opendir( DH, $start ) ) {
62         my @files = sort readdir DH;
63         closedir DH;
64         for my $file ( @files ) {
65             next if $file eq File::Spec->updir || $file eq File::Spec->curdir;
66             next if $file eq ".svn";
67             next if $file eq "CVS";
68
69             my $currfile = File::Spec->catfile( $start, $file );
70             if ( -d $currfile ) {
71                 push( @hits, all_in( { %parms, start => $currfile } ) ) if $parms{recurse};
72             }
73             else {
74                 push( @hits, $currfile ) if $currfile =~ /\.t$/;
75             }
76         }
77     }
78     else {
79         warn "$start: $!\n";
80     }
81
82     return @hits;
83 }
84
85 =head1 shuffle( @list )
86
87 Returns a shuffled copy of I<@list>.
88
89 =cut
90
91 sub shuffle {
92     # Fisher-Yates shuffle
93     my $i = @_;
94     while ($i) {
95         my $j = rand $i--;
96         @_[$i, $j] = @_[$j, $i];
97     }
98 }
99
100
101 =head2 blibdir()
102
103 Finds all the blib directories.  Stolen directly from blib.pm
104
105 =cut
106
107 sub blibdirs {
108     my $dir = File::Spec->curdir;
109     if ($^O eq 'VMS') {
110         ($dir = VMS::Filespec::unixify($dir)) =~ s-/\z--;
111     }
112     my $archdir = "arch";
113     if ( $^O eq "MacOS" ) {
114         # Double up the MP::A so that it's not used only once.
115         $archdir = $MacPerl::Architecture = $MacPerl::Architecture;
116     }
117
118     my $i = 5;
119     while ($i--) {
120         my $blib      = File::Spec->catdir( $dir, "blib" );
121         my $blib_lib  = File::Spec->catdir( $blib, "lib" );
122         my $blib_arch = File::Spec->catdir( $blib, $archdir );
123
124         if ( -d $blib && -d $blib_arch && -d $blib_lib ) {
125             return ($blib_arch,$blib_lib);
126         }
127         $dir = File::Spec->catdir($dir, File::Spec->updir);
128     }
129     warn "$0: Cannot find blib\n";
130     return;
131 }
132
133 1;