1#!perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 31;
7
8use_ok('XS::APItest');
9
10my $method = 0;
11my @types  = map { 'gv_autoload' . $_ } qw( 4 _sv _pv _pvn );
12
13sub AUTOLOAD {
14    our $AUTOLOAD;
15    my ($subname, $message) = @_;
16    is $subname, $AUTOLOAD, $message;
17}
18
19my $sub = "nothing";
20
21ok my $glob = XS::APItest::gv_autoload_type(\%::, $sub, 1, $method);
22*{$glob}{CODE}->( __PACKAGE__ . "::" . $sub, '$AUTOLOAD set correctly' );
23
24$sub = "some_sub";
25for my $type ( 0..3 ) {
26    is $glob = XS::APItest::gv_autoload_type(\%::, $sub, $type, $method), "*main::AUTOLOAD", "*main::AUTOLOAD if autoload is true in $types[$type].";
27    *{$glob}{CODE}->( __PACKAGE__ . "::" . $sub, '$AUTOLOAD set correctly' );
28}
29
30$sub = "method\0not quite!";
31
32ok $glob = XS::APItest::gv_autoload_type(\%::, $sub, 0, $method);
33*{$glob}{CODE}->( __PACKAGE__ . "::" . $sub, "gv_autoload4() is nul-clean");
34
35ok $glob = XS::APItest::gv_autoload_type(\%::, $sub, 1, $method);
36*{$glob}{CODE}->( __PACKAGE__ . "::" . $sub, "gv_autoload_sv() is nul-clean");
37
38ok $glob = XS::APItest::gv_autoload_type(\%::, $sub, 2, $method);
39*{$glob}{CODE}->( __PACKAGE__ . "::" . ($sub =~ s/\0.*//r), "gv_autoload_pv() is not nul-clean");
40
41ok $glob = XS::APItest::gv_autoload_type(\%::, $sub, 3, $method);
42*{$glob}{CODE}->( __PACKAGE__ . "::" . $sub, "gv_autoload_pvn() is nul-clean");
43
44{
45    use utf8;
46    use open qw( :utf8 :std );
47
48    package main;
49
50    sub AUTOLOAD {
51        our $AUTOLOAD;
52        my ($subname, $message) = @_;
53        ::is $subname, $AUTOLOAD, $message;
54    }
55
56    for my $type ( 1..3 ) {
57        ::ok $glob = XS::APItest::gv_autoload_type(\%main::, $sub = "method", $type, $method);
58        *{$glob}{CODE}->( "main::" . $sub, "$types[$type]() is UTF8-clean when both the stash and the sub are in UTF-8");
59        ::ok $glob = XS::APItest::gv_autoload_type(\%main::, $sub = "method", $type, $method);
60        *{$glob}{CODE}->( "main::" . $sub, "$types[$type]() is UTF8-clean when only the stash is in UTF-8");
61    }
62}
63