This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Added porting tests for CUSTOMIZED files
[perl5.git] / t / op / override.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6     require './test.pl';
7 }
8
9 plan tests => 28;
10
11 #
12 # This file tries to test builtin override using CORE::GLOBAL
13 #
14 my $dirsep = "/";
15
16 BEGIN { package Foo; *main::getlogin = sub { "kilroy"; } }
17
18 is( getlogin, "kilroy" );
19
20 my $t = 42;
21 BEGIN { *CORE::GLOBAL::time = sub () { $t; } }
22
23 is( 45, time + 3 );
24
25 #
26 # require has special behaviour
27 #
28 my $r;
29 BEGIN { *CORE::GLOBAL::require = sub { $r = shift; 1; } }
30
31 require Foo;
32 is( $r, "Foo.pm" );
33
34 require Foo::Bar;
35 is( $r, join($dirsep, "Foo", "Bar.pm") );
36
37 require 'Foo';
38 is( $r, "Foo" );
39
40 require 5.006;
41 is( $r, "5.006" );
42
43 require v5.6;
44 ok( abs($r - 5.006) < 0.001 && $r eq "\x05\x06" );
45
46 eval "use Foo";
47 is( $r, "Foo.pm" );
48
49 eval "use Foo::Bar";
50 is( $r, join($dirsep, "Foo", "Bar.pm") );
51
52 # use VERSION also loads feature.pm.
53 {
54     my @r;
55     local *CORE::GLOBAL::require = sub { push @r, shift; 1; };
56     eval "use 5.006";
57     like( " @r ", qr " 5\.006 " );
58 }
59
60 {
61     local $_ = 'foo.pm';
62     require;
63     is( $r, 'foo.pm' );
64 }
65
66 {
67     my $_ = 'bar.pm';
68     require;
69     is( $r, 'bar.pm' );
70 }
71
72 # localizing *CORE::GLOBAL::foo should revert to finding CORE::foo
73 {
74     local(*CORE::GLOBAL::require);
75     $r = '';
76     eval "require NoNeXiSt;";
77     ok( ! ( $r or $@ !~ /^Can't locate NoNeXiSt/i ) );
78 }
79
80 #
81 # readline() has special behaviour too
82 #
83
84 $r = 11;
85 BEGIN { *CORE::GLOBAL::readline = sub (;*) { ++$r }; }
86 is( <FH>        , 12 );
87 is( <$fh>       , 13 );
88 my $pad_fh;
89 is( <$pad_fh>   , 14 );
90
91 # Non-global readline() override
92 BEGIN { *Rgs::readline = sub (;*) { --$r }; }
93 {
94     package Rgs;
95     ::is( <FH>  , 13 );
96     ::is( <$fh> , 12 );
97     ::is( <$pad_fh>     , 11 );
98 }
99
100 # Global readpipe() override
101 BEGIN { *CORE::GLOBAL::readpipe = sub ($) { "$_[0] " . --$r }; }
102 is( `rm`,           "rm 10", '``' );
103 is( qx/cp/,         "cp 9", 'qx' );
104
105 # Non-global readpipe() override
106 BEGIN { *Rgs::readpipe = sub ($) { ++$r . " $_[0]" }; }
107 {
108     package Rgs;
109     ::is( `rm`,           "10 rm", '``' );
110     ::is( qx/cp/,         "11 cp", 'qx' );
111 }
112
113 # Verify that the parsing of overridden keywords isn't messed up
114 # by the indirect object notation
115 {
116     local $SIG{__WARN__} = sub {
117         ::like( $_[0], qr/^ok overriden at/ );
118     };
119     BEGIN { *OverridenWarn::warn = sub { CORE::warn "@_ overriden"; }; }
120     package OverridenWarn;
121     sub foo { "ok" }
122     warn( OverridenWarn->foo() );
123     warn OverridenWarn->foo();
124 }
125 BEGIN { *OverridenPop::pop = sub { ::is( $_[0][0], "ok" ) }; }
126 {
127     package OverridenPop;
128     sub foo { [ "ok" ] }
129     pop( OverridenPop->foo() );
130     pop OverridenPop->foo();
131 }
132
133 {
134     eval {
135         local *CORE::GLOBAL::require = sub {
136             CORE::require($_[0]);
137         };
138         require 5;
139         require Text::ParseWords;
140     };
141     is $@, '';
142 }