Also check BEGIN/UNITCHECK/CHECK/INIT/END for require.
Nicholas Clark [Mon, 29 Jan 2007 23:36:02 +0000 (23:36 +0000)]
p4raw-id: //depot/perl@30076

MANIFEST
ext/XS/APItest/t/xs_special_subs.t
ext/XS/APItest/t/xs_special_subs_require.t [new file with mode: 0644]

index 7069e83..de0fe88 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -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
index bc99122..9283093 100644 (file)
@@ -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 (file)
index 0000000..b868f33
--- /dev/null
@@ -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");
+}