5 @INC = ('../lib', '../ext/B/t');
11 =head1 OptreeCheck selftest harness
13 This file is primarily to test services of OptreeCheck itself, ie
14 checkOptree(). %gOpts provides test-state info, it is 'exported' into
17 doing use OptreeCheck runs import(), which processes @ARGV to process
18 cmdline args in 'standard' way across all clients of OptreeCheck.
25 plan tests => 5 + 19 + 14 * $gOpts{selftest}; # fudged
27 pass("REGEX TEST HARNESS SELFTEST");
29 checkOptree ( name => "bare minimum opcode search",
33 expect_nt => 'leavesub');
35 checkOptree ( name => "found print opcode",
37 code => sub {print 1},
39 expect_nt => 'leavesub');
41 checkOptree ( name => 'test skip itself',
44 code => sub {print 1},
45 expect => 'dont-care, skipping',
46 expect_nt => 'this insures failure');
48 checkOptree ( name => 'test todo itself',
49 todo => "your excuse here ;-)",
51 code => sub {print 1},
53 expect_nt => 'print');
55 checkOptree ( name => 'impossible match, remove skip to see failure',
56 todo => "see! it breaks!",
57 skip => 1, # but skip it 1st
58 code => sub {print 1},
59 expect => 'look out ! Boy Wonder',
60 expect_nt => 'holy near earth asteroid Batman !');
62 pass ("TEST FATAL ERRS");
65 # test for fatal errors. Im unsettled on fail vs die.
66 # calling fail isnt good enough by itself.
69 checkOptree ( name => 'empty code or prog',
70 todo => "your excuse here ;-)",
75 like($@, 'code or prog is required', 'empty code or prog prevented');
79 checkOptree ( name => 'test against empty expectations',
81 code => sub {print 1},
85 like($@, 'no reftext found for', "empty expectations prevented");
89 checkOptree ( name => 'prevent whitespace only expectations',
96 like($@, 'no reftext found for', "just whitespace expectations prevented");
99 pass ("TEST -e \$srcCode");
101 checkOptree ( name => '-w errors seen',
102 prog => 'sort our @a',
103 expect => 'Useless use of sort in void context',
104 expect_nt => 'Useless use of sort in void context');
106 checkOptree ( name => "self strict, catch err",
107 prog => 'use strict; bogus',
108 expect => 'strict subs',
109 expect_nt => 'strict subs');
111 checkOptree ( name => "sort vK - flag specific search",
112 prog => 'sort our @a',
113 expect => '<@> sort vK ',
114 expect_nt => '<@> sort vK ');
116 checkOptree ( name => "'prog' => 'sort our \@a'",
117 prog => 'sort our @a',
118 expect => '<@> sort vK',
119 expect_nt => '<@> sort vK');
121 checkOptree ( name => "'code' => 'sort our \@a'",
122 code => 'sort our @a',
123 expect => '<@> sort K',
124 expect_nt => '<@> sort K');
126 pass ("REFTEXT FIXUP TESTS");
128 checkOptree ( name => 'fixup nextstate (in reftext)',
131 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
133 # 1 <;> nextstate( NOTE THAT THIS CAN BE ANYTHING ) v
134 # 2 <0> padsv[$a:54,55] M/LVINTRO
135 # 3 <1> leavesub[1 ref] K/REFC,1
138 # 1 <;> nextstate(main 54 optree_concise.t:84) v
139 # 2 <0> padsv[$a:54,55] M/LVINTRO
140 # 3 <1> leavesub[1 ref] K/REFC,1
143 checkOptree ( name => 'fixup square-bracket args',
145 todo => 'not done in rexpedant mode',
148 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
150 # 1 <;> nextstate(main 56 optree_concise.t:96) v
151 # 2 <0> padsv[$a:56,57] M/LVINTRO
152 # 3 <1> leavesub[1 ref] K/REFC,1
155 # 1 <;> nextstate(main 56 optree_concise.t:96) v
156 # 2 <0> padsv[$a:56,57] M/LVINTRO
157 # 3 <1> leavesub[1 ref] K/REFC,1
160 checkOptree ( name => 'unneeded manual rex-ify by test author',
161 # args in 1,2 are manually edited, unnecessarily
164 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
165 # 1 <;> nextstate(.*?) v
166 # 2 <0> padsv[.*?] M/LVINTRO
167 # 3 <1> leavesub[1 ref] K/REFC,1
169 # 1 <;> nextstate(main 57 optree_concise.t:108) v
170 # 2 <0> padsv[$a:57,58] M/LVINTRO
171 # 3 <1> leavesub[1 ref] K/REFC,1
174 #################################
175 pass("CANONICAL B::Concise EXAMPLE");
177 checkOptree ( name => 'canonical example w -basic',
179 code => sub{$a=$b+42},
182 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
183 # 7 <1> leavesub[1 ref] K/REFC,1 ->(end)
184 # - <@> lineseq KP ->7
185 # 1 <;> nextstate(main 380 optree_selftest.t:139) v ->2
186 # 6 <2> sassign sKS/2 ->7
187 # 4 <2> add[t3] sK/2 ->5
188 # - <1> ex-rv2sv sK/1 ->3
189 # 2 <#> gvsv[*b] s ->3
190 # 3 <$> const[IV 42] s ->4
191 # - <1> ex-rv2sv sKRM*/1 ->6
192 # 5 <#> gvsv[*a] s ->6
194 # 7 <1> leavesub[1 ref] K/REFC,1 ->(end)
195 # - <@> lineseq KP ->7
196 # 1 <;> nextstate(main 60 optree_concise.t:122) v ->2
197 # 6 <2> sassign sKS/2 ->7
198 # 4 <2> add[t1] sK/2 ->5
199 # - <1> ex-rv2sv sK/1 ->3
200 # 2 <$> gvsv(*b) s ->3
201 # 3 <$> const(IV 42) s ->4
202 # - <1> ex-rv2sv sKRM*/1 ->6
203 # 5 <$> gvsv(*a) s ->6
206 checkOptree ( name => 'canonical example w -exec',
208 code => sub{$a=$b+42},
213 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
215 # 1 <;> nextstate(main 61 optree_concise.t:139) v
217 # 3 <$> const[IV 42] s
220 # 6 <2> sassign sKS/2
221 # 7 <1> leavesub[1 ref] K/REFC,1
224 # 1 <;> nextstate(main 61 optree_concise.t:139) v
226 # 3 <$> const(IV 42) s
229 # 6 <2> sassign sKS/2
230 # 7 <1> leavesub[1 ref] K/REFC,1
233 checkOptree ( name => 'tree reftext is messy cut-paste',