xref: /openbsd-src/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth_autoload.t (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
1*898184e3Ssthen#!perl
2*898184e3Ssthen
3*898184e3Ssthenuse strict;
4*898184e3Ssthenuse warnings;
5*898184e3Ssthen
6*898184e3Ssthenuse Test::More tests => 53;
7*898184e3Ssthen
8*898184e3Ssthenuse_ok('XS::APItest');
9*898184e3Ssthen
10*898184e3Ssthenmy $level = -1;
11*898184e3Ssthenmy @types = map { 'gv_fetchmeth' . $_ . "_autoload" } '', qw( _sv _pv _pvn );
12*898184e3Ssthen
13*898184e3Ssthensub test { "Sanity check" }
14*898184e3Ssthen
15*898184e3Ssthenfor my $type ( 0..3 ) {
16*898184e3Ssthen    is *{XS::APItest::gv_fetchmeth_autoload_type(
17*898184e3Ssthen           \%::, "test", $type, $level, 0
18*898184e3Ssthen        )}{CODE}->(), "Sanity check";
19*898184e3Ssthen}
20*898184e3Ssthen
21*898184e3Ssthen{
22*898184e3Ssthen    ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "etc", 1, $level, 0), "fails when the glob doesn't exist and AUTOLOAD is undefined,";
23*898184e3Ssthen    local *AUTOLOAD = sub { 1 };
24*898184e3Ssthen    is XS::APItest::gv_fetchmeth_autoload_type(\%::, "etc", 1, $level, 0), "*main::etc", "..but defining AUTOLOAD makes it succeed.";
25*898184e3Ssthen}
26*898184e3Ssthen
27*898184e3Ssthenfor my $type ( 0..3 ) {
28*898184e3Ssthen    my $meth = "gen$type";
29*898184e3Ssthen    ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth, $type, -1, 0), "With level = -1, $types[$type] returns false.";
30*898184e3Ssthen    ok !$::{$meth}, "...and doesn't vivify the glob.";
31*898184e3Ssthen
32*898184e3Ssthen    ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth, $type, 0, 0), "With level = 0, $types[$type] still returns false.";
33*898184e3Ssthen    ok $::{$meth}, "...but does vivify the glob.";
34*898184e3Ssthen
35*898184e3Ssthen    ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth . $type, $type, $level, 0), "$types[$type] fails when the glob doesn't exist and AUTOLOAD is undefined,";
36*898184e3Ssthen    local *AUTOLOAD = sub { 1 };
37*898184e3Ssthen    is XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth . $type, $type, $level, 0), "*main::$meth$type", "..but defining AUTOLOAD makes it succeed.";
38*898184e3Ssthen}
39*898184e3Ssthen
40*898184e3Ssthen{
41*898184e3Ssthen    no warnings 'once';
42*898184e3Ssthen    *method = sub { 1 };
43*898184e3Ssthen}
44*898184e3Ssthen
45*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 0, $level, 0), "gv_fetchmeth() is nul-clean";
46*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 1, $level, 0), "gv_fetchmeth_autoload_sv() is nul-clean";
47*898184e3Ssthenis XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 2, $level, 0), "*main::method", "gv_fetchmeth_autoload_pv() is not nul-clean";
48*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 3, $level, 0), "gv_fetchmeth_autoload_pvn() is nul-clean";
49*898184e3Ssthen
50*898184e3Ssthen{
51*898184e3Ssthen    use utf8;
52*898184e3Ssthen    use open qw( :utf8 :std );
53*898184e3Ssthen
54*898184e3Ssthen    package main;
55*898184e3Ssthen
56*898184e3Ssthen    sub method { 1 }
57*898184e3Ssthen
58*898184e3Ssthen    my $meth_as_octets =
59*898184e3Ssthen            "\357\275\215\357\275\205\357\275\224\357\275\210\357\275\217\357\275\204";
60*898184e3Ssthen
61*898184e3Ssthen    $level = -1;
62*898184e3Ssthen    for my $type ( 1..3 ) {
63*898184e3Ssthen        ::is XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method", $type, $level, 0), "*main::method", "$types[$type] is UTF-8 clean";
64*898184e3Ssthen        ::ok !XS::APItest::gv_fetchmeth_autoload_type(\%main::, $meth_as_octets, $type, $level, 0);
65*898184e3Ssthen        ::ok !XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method", $type, $level, 0);
66*898184e3Ssthen
67*898184e3Ssthen        {
68*898184e3Ssthen            no warnings 'once';
69*898184e3Ssthen            local *AUTOLOAD = sub { 1 };
70*898184e3Ssthen            ::is XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method$type", $type, $level, 0), "*main::method$type", "Autoloading UTF-8 subs works";
71*898184e3Ssthen        }
72*898184e3Ssthen
73*898184e3Ssthen        {
74*898184e3Ssthen            no strict 'refs';
75*898184e3Ssthen            ::ok !XS::APItest::gv_fetchmeth_autoload_type(
76*898184e3Ssthen                            \%{"\357\275\215\357\275\201\357\275\211\357\275\216::"},
77*898184e3Ssthen                            "method", $type, $level, 0);
78*898184e3Ssthen            ::ok !XS::APItest::gv_fetchmeth_autoload_type(
79*898184e3Ssthen                            \%{"\357\275\215\357\275\201\357\275\211\357\275\216::"},
80*898184e3Ssthen                            "method", $type, $level, 0);
81*898184e3Ssthen        }
82*898184e3Ssthen    }
83*898184e3Ssthen}
84