This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade Compress-Raw-Zlib from version 2.075 to 2.076
[perl5.git] / dist / autouse / t / autouse.t
1 #!./perl
2
3 BEGIN {
4     require Config;
5     if ($Config::Config{'extensions'} !~ m!\bList/Util\b!){
6         print "1..0 # Skip -- Perl configured without List::Util module\n";
7         exit 0;
8     }
9 }
10
11 my ($ok1, $ok2);
12 BEGIN {
13     require autouse;
14     eval {
15         "autouse"->import('Scalar::Util' => 'Scalar::Util::set_prototype(&$)');
16     };
17     $ok1 = !$@;
18
19     eval {
20         "autouse"->import('Scalar::Util' => 'Foo::min');
21     };
22     $ok2 = $@;
23
24     "autouse"->import('Scalar::Util' => qw(isdual set_prototype(&$)));
25 }
26
27 use Test::More tests => 15;
28
29 ok( $ok1, "Function from package with custom 'import()' correctly imported" );
30 like( $ok2, qr/^autouse into different package attempted/, "Catch autouse into different package" );
31
32 ok( isdual($!),
33     "Function imported via 'autouse' performs as expected");
34
35
36 # set_prototype() has a prototype of &$.  Make sure that's preserved.
37 sub sum { return $_[0] + $_[1] };
38 is( (set_prototype \&sum, '$$'), \&sum,
39     "Subroutine prototype preserved after import via 'autouse'");
40
41
42 # Example from the docs.
43 use autouse 'Carp' => qw(carp croak);
44
45 {
46     my @warning;
47     local $SIG{__WARN__} = sub { push @warning, @_ };
48     carp "this carp was predeclared and autoused\n";
49     is( scalar @warning, 1, "Expected number of warnings received" );
50     like( $warning[0], qr/^this carp was predeclared and autoused\n/,
51         "Warning received as expected" );
52
53     eval { croak "It is but a scratch!" };
54     like( $@, qr/^It is but a scratch!/,
55         "Failure message received as expected" );
56 }
57
58
59 # Test that autouse's lazy module loading works.
60 use autouse 'Errno' => qw(EPERM);
61
62 my $mod_file = 'Errno.pm';   # just fine and portable for %INC
63 ok( !exists $INC{$mod_file}, "Module not yet loaded" );
64 ok( EPERM, "Access a constant from that module" ); # test if non-zero
65 ok( exists $INC{$mod_file}, "Module has been lazily loaded" );
66
67 use autouse Env => "something";
68 eval { something() };
69 like( $@, qr/^\Qautoused module Env has unique import() method/,
70     "Module with unique import() method detected and error reported" );
71
72 # Check that UNIVERSAL.pm doesn't interfere with modules that don't use
73 # Exporter and have no import() of their own.
74 require UNIVERSAL;
75 require File::Spec;
76 unshift @INC, File::Spec->catdir('t', 'lib'), 'lib';
77 autouse->import("MyTestModule" => 'test_function');
78 my $ret = test_function();
79 is( $ret, 'works', "No interference from UNIVERSAL.pm" );
80
81 # Test that autouse is exempt from all methods of triggering the subroutine
82 # redefinition warning.
83 SKIP: {
84     skip "Fails in 5.15.5 and below (perl bug)", 2 if $] < 5.0150051;
85     use warnings; local $^W = 1; no warnings 'once';
86     my $w;
87     local $SIG{__WARN__} = sub { $w .= shift };
88     use autouse MyTestModule2 => 'test_function2';
89     *MyTestModule2::test_function2 = \&test_function2;
90     require MyTestModule2;
91     is $w, undef,
92        'no redefinition warning when clobbering autouse stub with new sub';
93     undef $w;
94     import MyTestModule2 'test_function2';
95     is $w, undef,
96        'no redefinition warning when clobbering autouse stub via *a=\&b';
97 }
98 SKIP: {
99     skip "Fails in 5.15.5 and below (perl bug)", 1 if $] < 5.0150051;
100     use Config;
101     skip "no B", 1 unless $Config{extensions} =~ /\bB\b/;
102     use warnings; local $^W = 1; no warnings 'once';
103     my $w;
104     local $SIG{__WARN__} = sub { $w .= shift };
105     use autouse B => "sv_undef";
106     *B::sv_undef = \&sv_undef;
107     require B;
108     is $w, undef,
109       'no redefinition warning when clobbering autouse stub with new XSUB';
110 }