newHV doesn't need to turn off POK or NOK, as they will default to not
[p5sagit/p5-mst-13.2.git] / ext / B / t / optree_specials.t
index bceda7c..5db9d02 100644 (file)
@@ -1,16 +1,33 @@
 #!./perl
 
+# This tests the B:: module(s) with CHECK, BEGIN, END and INIT blocks. The
+# text excerpts below marked with "# " in front are the expected output. They
+# are there twice, EOT for threading, and EONT for a non-threading Perl. The
+# output is matched losely. If the match fails even though the "got" and
+# "expected" output look exactly the same, then watch for trailing, invisible
+# spaces.
+
 BEGIN {
-    chdir 't';
-    @INC = ('../lib', '../ext/B/t');
-    require './test.pl';
+    if ($ENV{PERL_CORE}){
+       chdir('t') if -d 't';
+       @INC = ('.', '../lib', '../ext/B/t');
+    } else {
+       unshift @INC, 't';
+       push @INC, "../../t";
+    }
+    require Config;
+    if (($Config::Config{'extensions'} !~ /\bB\b/) ){
+        print "1..0 # Skip -- Perl configured without B module\n";
+        exit 0;
+    }
+    # require 'test.pl'; # now done by OptreeCheck
 }
 
 # import checkOptree(), and %gOpts (containing test state)
 use OptreeCheck;       # ALSO DOES @ARGV HANDLING !!!!!!
 use Config;
 
-plan tests => 6;
+plan tests => 8;
 
 require_ok("B::Concise");
 
@@ -21,102 +38,76 @@ my $out = runperl(
 
 #print "out:$out\n";
 
-my $src = q{
-    our ($beg, $chk, $init, $end) = "'foo'";
-    BEGIN { $beg++ }
-    CHECK { $chk++ }
-    INIT  { $init++ }
-    END   { $end++ }
-};
+my $src = q[our ($beg, $chk, $init, $end, $uc) = qq{'foo'}; BEGIN { $beg++ } CHECK { $chk++ } INIT { $init++ } END { $end++ } UNITCHECK {$uc++}];
 
 
+my @warnings_todo;
+@warnings_todo = (todo =>
+   "Change 23768 (Remove Carp from warnings.pm) alters expected output, not"
+   . "propagated to 5.8.x")
+    if $] < 5.009;
 
 checkOptree ( name     => 'BEGIN',
              bcopts    => 'BEGIN',
              prog      => $src,
+             @warnings_todo,
+             @open_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # BEGIN 1:
 # b  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->b
-# 1        <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->2
+# 1        <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->2
 # 3        <1> require sK/1 ->4
-# 2           <$> const[PV "strict.pm"] s/BARE ->3
-# 4        <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->5
+# 2           <$> const[PV "warnings.pm"] s/BARE ->3
+# 4        <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->5
 # -        <@> lineseq K ->-
-# 5           <;> nextstate(B::Concise -242 Concise.pm:304) /2 ->6
+# 5           <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ ->6
 # a           <1> entersub[t1] KS*/TARG,2 ->b
 # 6              <0> pushmark s ->7
-# 7              <$> const[PV "strict"] sM ->8
-# 8              <$> const[PV "refs"] sM ->9
-# 9              <$> method_named[PVIV 1520340202] ->a
+# 7              <$> const[PV "warnings"] sM ->8
+# 8              <$> const[PV "qw"] sM ->9
+# 9              <$> method_named[PV "import"] ->a
 # BEGIN 2:
-# m  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->m
-# c        <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->d
-# e        <1> require sK/1 ->f
-# d           <$> const[PV "warnings.pm"] s/BARE ->e
-# f        <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->g
-# -        <@> lineseq K ->-
-# g           <;> nextstate(B::Concise -227 Concise.pm:327) /2 ->h
-# l           <1> entersub[t1] KS*/TARG,2 ->m
-# h              <0> pushmark s ->i
-# i              <$> const[PV "warnings"] sM ->j
-# j              <$> const[PV "qw"] sM ->k
-# k              <$> method_named[PVIV 1520340202] ->l
-# BEGIN 3:
-# q  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->q
-# n        <;> nextstate(main 2 -e:3) v ->o
-# p        <1> postinc[t3] sK/1 ->q
-# -           <1> ex-rv2sv sKRM/1 ->p
-# o              <#> gvsv[*beg] s ->p
+# f  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->f
+# c        <;> nextstate(main 2 -e:1) v:{ ->d
+# e        <1> postinc[t3] sK/1 ->f
+# -           <1> ex-rv2sv sKRM/1 ->e
+# d              <#> gvsv[*beg] s ->e
 EOT_EOT
 # BEGIN 1:
 # b  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->b
-# 1        <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->2
+# 1        <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->2
 # 3        <1> require sK/1 ->4
-# 2           <$> const(PV "strict.pm") s/BARE ->3
-# 4        <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->5
+# 2           <$> const(PV "warnings.pm") s/BARE ->3
+# 4        <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->5
 # -        <@> lineseq K ->-
-# 5           <;> nextstate(B::Concise -242 Concise.pm:304) /2 ->6
+# 5           <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ ->6
 # a           <1> entersub[t1] KS*/TARG,2 ->b
 # 6              <0> pushmark s ->7
-# 7              <$> const(PV "strict") sM ->8
-# 8              <$> const(PV "refs") sM ->9
-# 9              <$> method_named(PVIV 1520340202) ->a
+# 7              <$> const(PV "warnings") sM ->8
+# 8              <$> const(PV "qw") sM ->9
+# 9              <$> method_named(PV "import") ->a
 # BEGIN 2:
-# m  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->m
-# c        <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->d
-# e        <1> require sK/1 ->f
-# d           <$> const(PV "warnings.pm") s/BARE ->e
-# f        <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->g
-# -        <@> lineseq K ->-
-# g           <;> nextstate(B::Concise -227 Concise.pm:327) /2 ->h
-# l           <1> entersub[t1] KS*/TARG,2 ->m
-# h              <0> pushmark s ->i
-# i              <$> const(PV "warnings") sM ->j
-# j              <$> const(PV "qw") sM ->k
-# k              <$> method_named(PVIV 1520340202) ->l
-# BEGIN 3:
-# q  <1> leavesub[1 ref] K/REFC,1 ->(end)
-# -     <@> lineseq KP ->q
-# n        <;> nextstate(main 2 -e:3) v ->o
-# p        <1> postinc[t2] sK/1 ->q
-# -           <1> ex-rv2sv sKRM/1 ->p
-# o              <$> gvsv(*beg) s ->p
+# f  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->f
+# c        <;> nextstate(main 2 -e:1) v:{ ->d
+# e        <1> postinc[t2] sK/1 ->f
+# -           <1> ex-rv2sv sKRM/1 ->e
+# d              <$> gvsv(*beg) s ->e
 EONT_EONT
 
 
 checkOptree ( name     => 'END',
              bcopts    => 'END',
              prog      => $src,
+             @open_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # END 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 5 -e:6) v ->2
+# 1        <;> nextstate(main 5 -e:6) v:{ ->2
 # 3        <1> postinc[t3] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <#> gvsv[*end] s ->3
@@ -124,7 +115,7 @@ EOT_EOT
 # END 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 5 -e:6) v ->2
+# 1        <;> nextstate(main 5 -e:6) v:{ ->2
 # 3        <1> postinc[t2] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <$> gvsv(*end) s ->3
@@ -134,11 +125,12 @@ EONT_EONT
 checkOptree ( name     => 'CHECK',
              bcopts    => 'CHECK',
              prog      => $src,
+             @open_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # CHECK 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 3 -e:4) v ->2
+# 1        <;> nextstate(main 3 -e:4) v:{ ->2
 # 3        <1> postinc[t3] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <#> gvsv[*chk] s ->3
@@ -146,22 +138,45 @@ EOT_EOT
 # CHECK 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 3 -e:4) v ->2
+# 1        <;> nextstate(main 3 -e:4) v:{ ->2
 # 3        <1> postinc[t2] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <$> gvsv(*chk) s ->3
 EONT_EONT
 
+checkOptree ( name     => 'UNITCHECK',
+             bcopts    => 'UNITCHECK',
+             prog      => $src,
+             @open_todo,
+             expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
+# UNITCHECK 1:
+# 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->4
+# 1        <;> nextstate(main 3 -e:4) v:{ ->2
+# 3        <1> postinc[t3] sK/1 ->4
+# -           <1> ex-rv2sv sKRM/1 ->3
+# 2              <#> gvsv[*uc] s ->3
+EOT_EOT
+# UNITCHECK 1:
+# 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
+# -     <@> lineseq KP ->4
+# 1        <;> nextstate(main 3 -e:4) v:{ ->2
+# 3        <1> postinc[t2] sK/1 ->4
+# -           <1> ex-rv2sv sKRM/1 ->3
+# 2              <$> gvsv(*uc) s ->3
+EONT_EONT
+
 
 checkOptree ( name     => 'INIT',
              bcopts    => 'INIT',
              #todo     => 'get working',
              prog      => $src,
+             @open_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # INIT 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 4 -e:5) v ->2
+# 1        <;> nextstate(main 4 -e:5) v:{ ->2
 # 3        <1> postinc[t3] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <#> gvsv[*init] s ->3
@@ -169,105 +184,129 @@ EOT_EOT
 # INIT 1:
 # 4  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->4
-# 1        <;> nextstate(main 4 -e:5) v ->2
+# 1        <;> nextstate(main 4 -e:5) v:{ ->2
 # 3        <1> postinc[t2] sK/1 ->4
 # -           <1> ex-rv2sv sKRM/1 ->3
 # 2              <$> gvsv(*init) s ->3
 EONT_EONT
 
 
-checkOptree ( name     => 'all of BEGIN END INIT CHECK -exec',
-             bcopts    => [qw/ BEGIN END INIT CHECK -exec /],
-             #todo     => 'get working',
+checkOptree ( name     => 'all of BEGIN END INIT CHECK UNITCHECK -exec',
+             bcopts    => [qw/ BEGIN END INIT CHECK UNITCHECK -exec /],
              prog      => $src,
+             @warnings_todo,
+             @open_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -242 Concise.pm:304) v/2
-# 2  <$> const[PV "strict.pm"] s/BARE
+# 1  <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$
+# 2  <$> const[PV "warnings.pm"] s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -242 Concise.pm:304) v/2
-# 5  <;> nextstate(B::Concise -242 Concise.pm:304) /2
+# 4  <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$
+# 5  <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$
 # 6  <0> pushmark s
-# 7  <$> const[PV "strict"] sM
-# 8  <$> const[PV "refs"] sM
-# 9  <$> method_named[PVIV 1520340202] 
+# 7  <$> const[PV "warnings"] sM
+# 8  <$> const[PV "qw"] sM
+# 9  <$> method_named[PV "unimport"] 
 # a  <1> entersub[t1] KS*/TARG,2
 # b  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# c  <;> nextstate(B::Concise -227 Concise.pm:327) v/2
-# d  <$> const[PV "warnings.pm"] s/BARE
-# e  <1> require sK/1
-# f  <;> nextstate(B::Concise -227 Concise.pm:327) v/2
-# g  <;> nextstate(B::Concise -227 Concise.pm:327) /2
-# h  <0> pushmark s
-# i  <$> const[PV "warnings"] sM
-# j  <$> const[PV "qw"] sM
-# k  <$> method_named[PVIV 1520340202] 
-# l  <1> entersub[t1] KS*/TARG,2
-# m  <1> leavesub[1 ref] K/REFC,1
-# BEGIN 3:
-# n  <;> nextstate(main 2 -e:3) v
-# o  <#> gvsv[*beg] s
-# p  <1> postinc[t3] sK/1
-# q  <1> leavesub[1 ref] K/REFC,1
+# c  <;> nextstate(main 2 -e:1) v:{
+# d  <#> gvsv[*beg] s
+# e  <1> postinc[t3] sK/1
+# f  <1> leavesub[1 ref] K/REFC,1
 # END 1:
-# r  <;> nextstate(main 5 -e:6) v
-# s  <#> gvsv[*end] s
-# t  <1> postinc[t3] sK/1
-# u  <1> leavesub[1 ref] K/REFC,1
+# g  <;> nextstate(main 5 -e:1) v:{
+# h  <#> gvsv[*end] s
+# i  <1> postinc[t3] sK/1
+# j  <1> leavesub[1 ref] K/REFC,1
 # INIT 1:
-# v  <;> nextstate(main 4 -e:5) v
-# w  <#> gvsv[*init] s
-# x  <1> postinc[t3] sK/1
-# y  <1> leavesub[1 ref] K/REFC,1
+# k  <;> nextstate(main 4 -e:1) v:{
+# l  <#> gvsv[*init] s
+# m  <1> postinc[t3] sK/1
+# n  <1> leavesub[1 ref] K/REFC,1
 # CHECK 1:
-# z  <;> nextstate(main 3 -e:4) v
-# 10 <#> gvsv[*chk] s
-# 11 <1> postinc[t3] sK/1
-# 12 <1> leavesub[1 ref] K/REFC,1
+# o  <;> nextstate(main 3 -e:1) v:{
+# p  <#> gvsv[*chk] s
+# q  <1> postinc[t3] sK/1
+# r  <1> leavesub[1 ref] K/REFC,1
+# UNITCHECK 1:
+# s  <;> nextstate(main 6 -e:1) v:{
+# t  <#> gvsv[*uc] s
+# u  <1> postinc[t3] sK/1
+# v  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -242 Concise.pm:304) v/2
-# 2  <$> const(PV "strict.pm") s/BARE
+# 1  <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$
+# 2  <$> const(PV "warnings.pm") s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -242 Concise.pm:304) v/2
-# 5  <;> nextstate(B::Concise -242 Concise.pm:304) /2
+# 4  <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$
+# 5  <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$
 # 6  <0> pushmark s
-# 7  <$> const(PV "strict") sM
-# 8  <$> const(PV "refs") sM
-# 9  <$> method_named(PVIV 1520340202) 
+# 7  <$> const(PV "warnings") sM
+# 8  <$> const(PV "qw") sM
+# 9  <$> method_named(PV "unimport") 
 # a  <1> entersub[t1] KS*/TARG,2
 # b  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# c  <;> nextstate(B::Concise -227 Concise.pm:327) v/2
-# d  <$> const(PV "warnings.pm") s/BARE
-# e  <1> require sK/1
-# f  <;> nextstate(B::Concise -227 Concise.pm:327) v/2
-# g  <;> nextstate(B::Concise -227 Concise.pm:327) /2
-# h  <0> pushmark s
-# i  <$> const(PV "warnings") sM
-# j  <$> const(PV "qw") sM
-# k  <$> method_named(PVIV 1520340202) 
-# l  <1> entersub[t1] KS*/TARG,2
-# m  <1> leavesub[1 ref] K/REFC,1
-# BEGIN 3:
-# n  <;> nextstate(main 2 -e:3) v
-# o  <$> gvsv(*beg) s
-# p  <1> postinc[t2] sK/1
-# q  <1> leavesub[1 ref] K/REFC,1
+# c  <;> nextstate(main 2 -e:1) v:{
+# d  <$> gvsv(*beg) s
+# e  <1> postinc[t2] sK/1
+# f  <1> leavesub[1 ref] K/REFC,1
 # END 1:
-# r  <;> nextstate(main 5 -e:6) v
-# s  <$> gvsv(*end) s
-# t  <1> postinc[t2] sK/1
-# u  <1> leavesub[1 ref] K/REFC,1
+# g  <;> nextstate(main 5 -e:1) v:{
+# h  <$> gvsv(*end) s
+# i  <1> postinc[t2] sK/1
+# j  <1> leavesub[1 ref] K/REFC,1
 # INIT 1:
-# v  <;> nextstate(main 4 -e:5) v
-# w  <$> gvsv(*init) s
-# x  <1> postinc[t2] sK/1
-# y  <1> leavesub[1 ref] K/REFC,1
+# k  <;> nextstate(main 4 -e:1) v:{
+# l  <$> gvsv(*init) s
+# m  <1> postinc[t2] sK/1
+# n  <1> leavesub[1 ref] K/REFC,1
 # CHECK 1:
-# z  <;> nextstate(main 3 -e:4) v
-# 10 <$> gvsv(*chk) s
-# 11 <1> postinc[t2] sK/1
-# 12 <1> leavesub[1 ref] K/REFC,1
+# o  <;> nextstate(main 3 -e:1) v:{
+# p  <$> gvsv(*chk) s
+# q  <1> postinc[t2] sK/1
+# r  <1> leavesub[1 ref] K/REFC,1
+# UNITCHECK 1:
+# s  <;> nextstate(main 6 -e:1) v:{
+# t  <$> gvsv(*uc) s
+# u  <1> postinc[t2] sK/1
+# v  <1> leavesub[1 ref] K/REFC,1
+EONT_EONT
+
+
+# perl "-I../lib" -MO=Concise,BEGIN,CHECK,INIT,END,-exec -e '$a=$b && print q/foo/'
+
+
+
+checkOptree ( name     => 'regression test for patch 25352',
+             bcopts    => [qw/ BEGIN END INIT CHECK -exec /],
+             prog      => 'print q/foo/',
+             @warnings_todo,
+             expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
+# BEGIN 1:
+# 1  <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$
+# 2  <$> const[PV "warnings.pm"] s/BARE
+# 3  <1> require sK/1
+# 4  <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$
+# 5  <;> nextstate(B::Concise -234 Concise.pm:359) :*,&,{,$
+# 6  <0> pushmark s
+# 7  <$> const[PV "warnings"] sM
+# 8  <$> const[PV "qw"] sM
+# 9  <$> method_named[PV "unimport"] 
+# a  <1> entersub[t1] KS*/TARG,2
+# b  <1> leavesub[1 ref] K/REFC,1
+EOT_EOT
+# BEGIN 1:
+# 1  <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$
+# 2  <$> const(PV "warnings.pm") s/BARE
+# 3  <1> require sK/1
+# 4  <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$
+# 5  <;> nextstate(B::Concise -234 Concise.pm:359) :*,&,{,$
+# 6  <0> pushmark s
+# 7  <$> const(PV "warnings") sM
+# 8  <$> const(PV "qw") sM
+# 9  <$> method_named(PV "unimport") 
+# a  <1> entersub[t1] KS*/TARG,2
+# b  <1> leavesub[1 ref] K/REFC,1
 EONT_EONT