Commit | Line | Data |
---|---|---|
4343e7c3 | 1 | # This is a replacement for the old BEGIN preamble which heads (or |
db7c4376 | 2 | # should head) up every core test program to prepare it for running. |
4343e7c3 MS |
3 | # Now instead of: |
4 | # | |
5 | # BEGIN { | |
6 | # chdir 't' if -d 't'; | |
7 | # @INC = '../lib'; | |
8 | # } | |
9 | # | |
c1b78184 MS |
10 | # Its primary purpose is to clear @INC so core tests don't pick up |
11 | # modules from an installed Perl. | |
12 | # | |
db7c4376 PG |
13 | # t/TEST will use -MTestInit. You may "use TestInit" in the test |
14 | # programs but it is not required. | |
4343e7c3 | 15 | # |
db7c4376 PG |
16 | # P.S. This documentation is not in POD format in order to avoid |
17 | # problems when there are fundamental bugs in perl. | |
4343e7c3 | 18 | |
18fc9488 DM |
19 | package TestInit; |
20 | ||
5c9e8bc6 | 21 | $VERSION = 1.04; |
2af1ab88 | 22 | |
5ed59b83 NC |
23 | # Let tests know they're running in the perl core. Useful for modules |
24 | # which live dual lives on CPAN. | |
e447daf9 NC |
25 | # Don't interfere with the taintedness of %ENV, this could perturbate tests. |
26 | # This feels like a better solution than the original, from | |
27 | # http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-07/msg00154.html | |
28 | $ENV{PERL_CORE} = $^X; | |
2adbc9b6 NC |
29 | |
30 | sub new_inc { | |
31 | if (${^TAINT}) { | |
32 | @INC = @_; | |
33 | } else { | |
34 | @INC = (@_, '.'); | |
35 | } | |
36 | } | |
37 | ||
38 | sub set_opt { | |
39 | my $sep; | |
40 | if ($^O eq 'VMS') { | |
41 | $sep = '|'; | |
1ff5bc37 | 42 | } elsif ($^O eq 'MSWin32') { |
2adbc9b6 NC |
43 | $sep = ';'; |
44 | } else { | |
45 | $sep = ':'; | |
46 | } | |
47 | ||
48 | my $lib = join $sep, @_; | |
49 | if (exists $ENV{PERL5LIB}) { | |
50 | $ENV{PERL5LIB} = $lib . substr $ENV{PERL5LIB}, 0, 0; | |
51 | } else { | |
52 | $ENV{PERL5LIB} = $lib; | |
53 | } | |
54 | } | |
55 | ||
2adbc9b6 NC |
56 | sub import { |
57 | my $self = shift; | |
b6800926 NC |
58 | my @up_2_t = ('../../lib', '../../t'); |
59 | my @new_inc; | |
60 | my ($abs, $chdir, $setopt); | |
2adbc9b6 NC |
61 | foreach (@_) { |
62 | if ($_ eq 'U2T') { | |
8fcfece7 | 63 | @new_inc = @up_2_t; |
b6800926 | 64 | $setopt = 1; |
76cc22ec NC |
65 | } elsif ($_ eq 'U1') { |
66 | @new_inc = '../lib'; | |
b6800926 | 67 | $setopt = 1; |
2adbc9b6 NC |
68 | } elsif ($_ eq 'NC') { |
69 | delete $ENV{PERL_CORE} | |
70 | } elsif ($_ eq 'A') { | |
71 | $abs = 1; | |
72 | } else { | |
73 | die "Unknown option '$_'"; | |
74 | } | |
75 | } | |
76 | ||
b6800926 NC |
77 | # Need to default. This behaviour is consistent with previous behaviour, |
78 | # as the equivalent of this code used to be run at the top level, hence | |
79 | # would happen (unconditionally) before import() was called. | |
80 | unless (@new_inc) { | |
81 | if (-f 't/TEST' && -f 'MANIFEST' && -d 'lib' && -d 'ext') { | |
82 | # We're being run from the top level. Try to change directory, and | |
83 | # set things up correctly. This is a 90% solution, but for | |
84 | # hand-running tests, that's good enough | |
85 | if ($0 =~ s!^((?:ext|dist|cpan)[\\/][^\\/]+)[\//](.*\.t)$!$2!) { | |
86 | # Looks like a test in ext. | |
87 | $chdir = $1; | |
88 | @new_inc = @up_2_t; | |
89 | $setopt = 1; | |
90 | $^X =~ s!^\.([/\\])!..$1..$1!; | |
91 | } else { | |
92 | $chdir = 't'; | |
93 | @new_inc = '../lib'; | |
94 | $setopt = $0 =~ m!^lib/!; | |
95 | } | |
96 | } else { | |
97 | # (likely) we're being run by t/TEST or t/harness, and we're a test | |
98 | # in t/ | |
2adbc9b6 NC |
99 | @new_inc = '../lib'; |
100 | } | |
b6800926 NC |
101 | } |
102 | ||
103 | if (defined $chdir) { | |
104 | chdir $chdir or die "Can't chdir '$chdir': $!"; | |
105 | } | |
106 | ||
107 | if ($abs) { | |
2adbc9b6 NC |
108 | @INC = @new_inc; |
109 | require File::Spec::Functions; | |
110 | # Forcibly untaint this. | |
111 | @new_inc = map { $_ = File::Spec::Functions::rel2abs($_); /(.*)/; $1 } | |
112 | @new_inc; | |
113 | $^X = File::Spec::Functions::rel2abs($^X); | |
114 | } | |
115 | ||
b6800926 NC |
116 | new_inc(@new_inc); |
117 | set_opt(@new_inc) if $setopt; | |
5ed59b83 | 118 | } |
a1910616 | 119 | |
7a315204 | 120 | $0 =~ s/\.dp$//; # for the test.deparse make target |
ec5f1610 RH |
121 | 1; |
122 |