#!perl -w
use strict;
# Test the load_module() core API function.
#
# Note that this function can be passed arbitrary and illegal module
# names which would already have been caught if a require statement had
# been compiled. So check that load_module() can catch such bad things.
use Test::More;
use XS::APItest;
# This isn't complete yet. In particular, we don't test import lists, or
# the other flags. But it's better than nothing.
is($INC{'less.pm'}, undef, "less isn't loaded");
load_module(PERL_LOADMOD_NOIMPORT, 'less');
like($INC{'less.pm'}, qr!(?:\A|/)lib/less\.pm\z!, "less is now loaded");
delete $INC{'less.pm'};
delete $::{'less::'};
is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 1); 1}, undef,
"expect load_module() to fail");
like($@, qr/less version 1 required--this is only version 0\./,
'with the correct error message');
is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 0.03); 1}, 1,
"expect load_module() not to fail");
#
# Check for illegal module names
for (["", qr!\ABareword in require maps to empty filename!],
["::", qr!\ABareword in require must not start with a double-colon: "::"!],
["::::", qr!\ABareword in require must not start with a double-colon: "::::"!],
["::/", qr!\ABareword in require must not start with a double-colon: "::/!],
["/", qr!\ABareword in require maps to disallowed filename "/\.pm"!],
["::/WOOSH", qr!\ABareword in require must not start with a double-colon: "::/WOOSH!],
[".WOOSH", qr!\ABareword in require maps to disallowed filename "\.WOOSH\.pm"!],
["::.WOOSH", qr!\ABareword in require must not start with a double-colon: "::.WOOSH!],
["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
["WOOSH/.sock", qr!\ABareword in require contains "/\."!],
["WOOSH/..sock", qr!\ABareword in require contains "/\."!],
["WOOSH/../sock", qr!\ABareword in require contains "/\."!],
["WOOSH::..::sock", qr!\ABareword in require contains "/\."!],
["WOOSH::.::sock", qr!\ABareword in require contains "/\."!],
["WOOSH::./sock", qr!\ABareword in require contains "/\."!],
["WOOSH/./sock", qr!\ABareword in require contains "/\."!],
["WOOSH/.::sock", qr!\ABareword in require contains "/\."!],
["WOOSH/..::sock", qr!\ABareword in require contains "/\."!],
["WOOSH::../sock", qr!\ABareword in require contains "/\."!],
["WOOSH::../..::sock", qr!\ABareword in require contains "/\."!],
["WOOSH\0sock", qr!\ACan't locate WOOSH\\0sock.pm:!],
)
{
my ($module, $error) = @$_;
my $module2 = $module; # load_module mangles its first argument
no warnings 'syscalls';
is(eval { load_module(PERL_LOADMOD_NOIMPORT, $module); 1}, undef,
"expect load_module() for '$module2' to fail");
like($@, $error, "check expected error for $module2");
}
done_testing();