More memory lane.
[p5sagit/p5-mst-13.2.git] / t / op / inccode.t
CommitLineData
69026470 1#!./perl -w
e5d18500 2
3# Tests for the coderef-in-@INC feature
4
5BEGIN {
f8973f08 6 chdir 't' if -d 't';
69026470 7 @INC = qw(. ../lib);
e5d18500 8}
f8973f08 9
47de4e93 10use File::Spec;
69026470 11
12require "test.pl";
d820be44 13plan(tests => 44);
47de4e93 14
22e2837f 15my @tempfiles = ();
16
47de4e93 17sub get_temp_fh {
22e2837f 18 my $f = "DummyModule0000";
19 1 while -e ++$f;
20 push @tempfiles, $f;
21 open my $fh, ">$f" or die "Can't create $f: $!";
47de4e93 22 print $fh "package ".substr($_[0],0,-3)."; 1;";
d1e4d418 23 close $fh or die "Couldn't close: $!";
47de4e93 24 open $fh, $f or die "Can't open $f: $!";
25 return $fh;
26}
f8973f08 27
22e2837f 28END { 1 while unlink @tempfiles }
29
e5d18500 30sub fooinc {
31 my ($self, $filename) = @_;
32 if (substr($filename,0,3) eq 'Foo') {
47de4e93 33 return get_temp_fh($filename);
e5d18500 34 }
35 else {
f8973f08 36 return undef;
e5d18500 37 }
38}
39
40push @INC, \&fooinc;
41
d1e4d418 42my $evalret = eval { require Bar; 1 };
43ok( !$evalret, 'Trying non-magic package' );
44
45$evalret = eval { require Foo; 1 };
46die $@ if $@;
47ok( $evalret, 'require Foo; magic via code ref' );
48ok( exists $INC{'Foo.pm'}, ' %INC sees Foo.pm' );
49is( ref $INC{'Foo.pm'}, 'CODE', ' val Foo.pm is a coderef in %INC' );
50is( $INC{'Foo.pm'}, \&fooinc, ' val Foo.pm is correct in %INC' );
51
52$evalret = eval "use Foo1; 1;";
53die $@ if $@;
54ok( $evalret, 'use Foo1' );
55ok( exists $INC{'Foo1.pm'}, ' %INC sees Foo1.pm' );
56is( ref $INC{'Foo1.pm'}, 'CODE', ' val Foo1.pm is a coderef in %INC' );
57is( $INC{'Foo1.pm'}, \&fooinc, ' val Foo1.pm is correct in %INC' );
58
59$evalret = eval { do 'Foo2.pl'; 1 };
60die $@ if $@;
61ok( $evalret, 'do "Foo2.pl"' );
62ok( exists $INC{'Foo2.pl'}, ' %INC sees Foo2.pl' );
63is( ref $INC{'Foo2.pl'}, 'CODE', ' val Foo2.pl is a coderef in %INC' );
64is( $INC{'Foo2.pl'}, \&fooinc, ' val Foo2.pl is correct in %INC' );
e5d18500 65
66pop @INC;
67
f8973f08 68
e5d18500 69sub fooinc2 {
70 my ($self, $filename) = @_;
71 if (substr($filename, 0, length($self->[1])) eq $self->[1]) {
47de4e93 72 return get_temp_fh($filename);
e5d18500 73 }
74 else {
f8973f08 75 return undef;
e5d18500 76 }
77}
78
47de4e93 79my $arrayref = [ \&fooinc2, 'Bar' ];
80push @INC, $arrayref;
e5d18500 81
d1e4d418 82$evalret = eval { require Foo; 1; };
83die $@ if $@;
84ok( $evalret, 'Originally loaded packages preserved' );
85$evalret = eval { require Foo3; 1; };
86ok( !$evalret, 'Original magic INC purged' );
87
88$evalret = eval { require Bar; 1 };
89die $@ if $@;
90ok( $evalret, 'require Bar; magic via array ref' );
91ok( exists $INC{'Bar.pm'}, ' %INC sees Bar.pm' );
92is( ref $INC{'Bar.pm'}, 'ARRAY', ' val Bar.pm is an arrayref in %INC' );
93is( $INC{'Bar.pm'}, $arrayref, ' val Bar.pm is correct in %INC' );
94
95ok( eval "use Bar1; 1;", 'use Bar1' );
96ok( exists $INC{'Bar1.pm'}, ' %INC sees Bar1.pm' );
97is( ref $INC{'Bar1.pm'}, 'ARRAY', ' val Bar1.pm is an arrayref in %INC' );
98is( $INC{'Bar1.pm'}, $arrayref, ' val Bar1.pm is correct in %INC' );
99
100ok( eval { do 'Bar2.pl'; 1 }, 'do "Bar2.pl"' );
101ok( exists $INC{'Bar2.pl'}, ' %INC sees Bar2.pl' );
102is( ref $INC{'Bar2.pl'}, 'ARRAY', ' val Bar2.pl is an arrayref in %INC' );
103is( $INC{'Bar2.pl'}, $arrayref, ' val Bar2.pl is correct in %INC' );
e5d18500 104
105pop @INC;
106
107sub FooLoader::INC {
108 my ($self, $filename) = @_;
109 if (substr($filename,0,4) eq 'Quux') {
47de4e93 110 return get_temp_fh($filename);
e5d18500 111 }
112 else {
f8973f08 113 return undef;
e5d18500 114 }
115}
116
47de4e93 117my $href = bless( {}, 'FooLoader' );
118push @INC, $href;
e5d18500 119
d1e4d418 120$evalret = eval { require Quux; 1 };
121die $@ if $@;
122ok( $evalret, 'require Quux; magic via hash object' );
123ok( exists $INC{'Quux.pm'}, ' %INC sees Quux.pm' );
6ece0f6b 124is( ref $INC{'Quux.pm'}, 'FooLoader',
d1e4d418 125 ' val Quux.pm is an object in %INC' );
126is( $INC{'Quux.pm'}, $href, ' val Quux.pm is correct in %INC' );
e5d18500 127
128pop @INC;
129
47de4e93 130my $aref = bless( [], 'FooLoader' );
131push @INC, $aref;
e5d18500 132
d1e4d418 133$evalret = eval { require Quux1; 1 };
134die $@ if $@;
135ok( $evalret, 'require Quux1; magic via array object' );
136ok( exists $INC{'Quux1.pm'}, ' %INC sees Quux1.pm' );
6ece0f6b 137is( ref $INC{'Quux1.pm'}, 'FooLoader',
d1e4d418 138 ' val Quux1.pm is an object in %INC' );
139is( $INC{'Quux1.pm'}, $aref, ' val Quux1.pm is correct in %INC' );
e5d18500 140
141pop @INC;
142
47de4e93 143my $sref = bless( \(my $x = 1), 'FooLoader' );
144push @INC, $sref;
e5d18500 145
d1e4d418 146$evalret = eval { require Quux2; 1 };
147die $@ if $@;
148ok( $evalret, 'require Quux2; magic via scalar object' );
149ok( exists $INC{'Quux2.pm'}, ' %INC sees Quux2.pm' );
6ece0f6b 150is( ref $INC{'Quux2.pm'}, 'FooLoader',
d1e4d418 151 ' val Quux2.pm is an object in %INC' );
152is( $INC{'Quux2.pm'}, $sref, ' val Quux2.pm is correct in %INC' );
f8973f08 153
154pop @INC;
9ae8cd5b 155
156push @INC, sub {
157 my ($self, $filename) = @_;
158 if (substr($filename,0,4) eq 'Toto') {
159 $INC{$filename} = 'xyz';
160 return get_temp_fh($filename);
161 }
162 else {
163 return undef;
164 }
165};
166
d1e4d418 167$evalret = eval { require Toto; 1 };
168die $@ if $@;
169ok( $evalret, 'require Toto; magic via anonymous code ref' );
170ok( exists $INC{'Toto.pm'}, ' %INC sees Toto.pm' );
171ok( ! ref $INC{'Toto.pm'}, q/ val Toto.pm isn't a ref in %INC/ );
172is( $INC{'Toto.pm'}, 'xyz', ' val Toto.pm is correct in %INC' );
9ae8cd5b 173
174pop @INC;
d820be44 175
176my $filename = $^O eq 'MacOS' ? ':Foo:Foo.pm' : './Foo.pm';
177{
178 local @INC;
179 @INC = sub { $filename = 'seen'; return undef; };
180 eval { require $filename; };
181 is( $filename, 'seen', 'the coderef sees fully-qualified pathnames' );
182}