diff options
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | ext/XS/APItest/t/xs_special_subs.t | 6 | ||||
-rw-r--r-- | ext/XS/APItest/t/xs_special_subs_require.t | 167 |
3 files changed, 173 insertions, 1 deletions
@@ -1231,6 +1231,7 @@ ext/XS/APItest/t/printf.t XS::APItest extension ext/XS/APItest/t/push.t XS::APItest extension ext/XS/APItest/t/svsetsv.t Test behaviour of sv_setsv with/without PERL_CORE ext/XS/APItest/t/xs_special_subs.t Test that XS BEGIN/CHECK/INIT/END work +ext/XS/APItest/t/xs_special_subs_require.t for require too ext/XS/Typemap/Makefile.PL XS::Typemap extension ext/XS/Typemap/README XS::Typemap extension ext/XS/Typemap/stdio.c XS::Typemap extension diff --git a/ext/XS/APItest/t/xs_special_subs.t b/ext/XS/APItest/t/xs_special_subs.t index bc9912294f..9283093ec6 100644 --- a/ext/XS/APItest/t/xs_special_subs.t +++ b/ext/XS/APItest/t/xs_special_subs.t @@ -1,3 +1,5 @@ +#!perl -w + BEGIN { chdir 't' if -d 't'; @INC = '../lib'; @@ -7,7 +9,9 @@ BEGIN { print "1..0 # Skip: XS::APItest was not built\n"; exit 0; } - $XS::APItest::WARNINGS_ON_BOOTSTRAP++; + # Hush the used only once warning. + $XS::APItest::WARNINGS_ON_BOOTSTRAP = $MacPerl::Architecture; + $XS::APItest::WARNINGS_ON_BOOTSTRAP = 1; } use strict; diff --git a/ext/XS/APItest/t/xs_special_subs_require.t b/ext/XS/APItest/t/xs_special_subs_require.t new file mode 100644 index 0000000000..b868f33d91 --- /dev/null +++ b/ext/XS/APItest/t/xs_special_subs_require.t @@ -0,0 +1,167 @@ +#!perl -w +BEGIN { + chdir 't' if -d 't'; + @INC = '../lib'; + push @INC, "::lib:$MacPerl::Architecture:" if $^O eq 'MacOS'; + require Config; import Config; + if ($Config{'extensions'} !~ /\bXS\/APItest\b/) { + print "1..0 # Skip: XS::APItest was not built\n"; + exit 0; + } + # Hush the used only once warning. + $XS::APItest::WARNINGS_ON_BOOTSTRAP = $MacPerl::Architecture; + $XS::APItest::WARNINGS_ON_BOOTSTRAP = 1; +} + +use strict; +use warnings; +use Test::More tests => 103; + +# Doing this longhand cut&paste makes it clear +# BEGIN and INIT are FIFO, CHECK and END are LIFO +BEGIN { + print "# First BEGIN\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called"); + is($XS::APItest::INIT_called, undef, "INIT not called"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +CHECK { + print "# First CHECK\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); + is($XS::APItest::INIT_called, undef, "INIT not called"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +INIT { + print "# First INIT\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); + is($XS::APItest::INIT_called, undef, "INIT not called"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +END { + print "# First END\n"; + is($XS::APItest::BEGIN_called, 1, "BEGIN called"); + is($XS::APItest::BEGIN_called_PP, 1, "BEGIN called"); + is($XS::APItest::UNITCHECK_called, 1, "UNITCHECK called"); + is($XS::APItest::UNITCHECK_called_PP, 1, "UNITCHECK called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); + is($XS::APItest::INIT_called, undef, "INIT not called (too late)"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called (too late)"); + is($XS::APItest::END_called, 1, "END called"); + is($XS::APItest::END_called_PP, 1, "END called"); +} + +print "# First body\n"; +is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); +is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); +is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); +is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not called"); +is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); +is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); +is($XS::APItest::INIT_called, undef, "INIT not called (too late)"); +is($XS::APItest::INIT_called_PP, undef, "INIT not called (too late)"); +is($XS::APItest::END_called, undef, "END not yet called"); +is($XS::APItest::END_called_PP, undef, "END not yet called"); + +{ + my @trap; + local $SIG{__WARN__} = sub { push @trap, join "!", @_ }; + require XS::APItest; + + @trap = sort @trap; + is(scalar @trap, 2, "There were 2 warnings"); + is($trap[0], "Too late to run CHECK block.\n"); + is($trap[1], "Too late to run INIT block.\n"); +} + +print "# Second body\n"; +is($XS::APItest::BEGIN_called, 1, "BEGIN called"); +is($XS::APItest::BEGIN_called_PP, 1, "BEGIN called"); +is($XS::APItest::UNITCHECK_called, 1, "UNITCHECK called"); +is($XS::APItest::UNITCHECK_called_PP, 1, "UNITCHECK called"); +is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); +is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); +is($XS::APItest::INIT_called, undef, "INIT not called (too late)"); +is($XS::APItest::INIT_called_PP, undef, "INIT not called (too late)"); +is($XS::APItest::END_called, undef, "END not yet called"); +is($XS::APItest::END_called_PP, undef, "END not yet called"); + +BEGIN { + print "# Second BEGIN\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called"); + is($XS::APItest::INIT_called, undef, "INIT not called"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +CHECK { + print "# Second CHECK\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not yet called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called"); + is($XS::APItest::INIT_called, undef, "INIT not called"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +INIT { + print "# Second INIT\n"; + is($XS::APItest::BEGIN_called, undef, "BEGIN not yet called"); + is($XS::APItest::BEGIN_called_PP, undef, "BEGIN not yet called"); + is($XS::APItest::UNITCHECK_called, undef, "UNITCHECK not yet called"); + is($XS::APItest::UNITCHECK_called_PP, undef, "UNITCHECK not yet called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); + is($XS::APItest::INIT_called, undef, "INIT not called (too late)"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called (too late)"); + is($XS::APItest::END_called, undef, "END not yet called"); + is($XS::APItest::END_called_PP, undef, "END not yet called"); +} + +END { + print "# Second END\n"; + is($XS::APItest::BEGIN_called, 1, "BEGIN called"); + is($XS::APItest::BEGIN_called_PP, 1, "BEGIN called"); + is($XS::APItest::UNITCHECK_called, 1, "UNITCHECK called"); + is($XS::APItest::UNITCHECK_called_PP, 1, "UNITCHECK called"); + is($XS::APItest::CHECK_called, undef, "CHECK not called (too late)"); + is($XS::APItest::CHECK_called_PP, undef, "CHECK not called (too late)"); + is($XS::APItest::INIT_called, undef, "INIT not called (too late)"); + is($XS::APItest::INIT_called_PP, undef, "INIT not called (too late)"); + is($XS::APItest::END_called, 1, "END called"); + is($XS::APItest::END_called_PP, 1, "END called"); +} |