Improve regex stringification code
[p5sagit/p5-mst-13.2.git] / ext / re / t / regop.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6     require Config;
7     if (($Config::Config{'extensions'} !~ /\bre\b/) ){
8         print "1..0 # Skip -- Perl configured without re module\n";
9         exit 0;
10     }
11 }
12
13 use strict;
14 BEGIN { require "./test.pl"; }
15 our $NUM_SECTS;
16 chomp(my @strs= grep { !/^\s*\#/ } <DATA>);
17 my $out = runperl(progfile => "../ext/re/t/regop.pl", stderr => 1 );
18 my @tests = grep { /\S/ } split /(?=Compiling REx)/, $out;
19 # on debug builds we get an EXECUTING... message in there at the top
20 shift @tests
21     if $tests[0] =~ /EXECUTING.../;
22
23 plan( @tests + 2 + ( @strs - grep { !$_ or /^---/ } @strs ));
24
25 is( scalar @tests, $NUM_SECTS,
26     "Expecting output for $NUM_SECTS patterns" );
27 ok( defined $out, 'regop.pl returned something defined' );
28
29 $out ||= "";
30 my $test= 1;
31 foreach my $testout ( @tests ) {
32     my ( $pattern )= $testout=~/Compiling REx "([^"]+)"/;
33     ok( $pattern, "Pattern for test " . ($test++) );
34     my $diaged;
35     while (@strs) {
36         local $_= shift @strs;
37         last if !$_
38              or /^---/;
39         next if /^\s*#/;
40         s/^\s+//;
41         s/\s+$//;
42         ok( $testout=~/\Q$_\E/, "$_: /$pattern/" )
43             or do {
44                 !$diaged++ and diag("$_: /$pattern/\n$testout");
45             };
46     }
47 }
48
49 # The format below is simple. Each line is an exact
50 # string that must be found in the output.
51 # Lines starting the # are comments.
52 # Lines starting with --- are seperators indicating
53 # that the tests for this result set are finished.
54 # If you add a test make sure you update $NUM_SECTS
55 # the commented output is just for legacy/debugging purposes
56 BEGIN{ $NUM_SECTS= 6 }
57
58 __END__
59 #Compiling REx "X(A|[B]Q||C|D)Y"
60 #size 34
61 #first at 1
62 #   1: EXACT <X>(3)
63 #   3: OPEN1(5)
64 #   5:   TRIE-EXACT(21)
65 #        [Words:5 Chars:5 Unique:5 States:6 Start-Class:A-D]
66 #          <A>
67 #          <BQ>
68 #          <>
69 #          <C>
70 #          <D>
71 #  21: CLOSE1(23)
72 #  23: EXACT <Y>(25)
73 #  25: END(0)
74 #anchored "X" at 0 floating "Y" at 1..3 (checking floating) minlen 2
75 #Guessing start of match, REx "X(A|[B]Q||C|D)Y" against "XY"...
76 #Found floating substr "Y" at offset 1...
77 #Found anchored substr "X" at offset 0...
78 #Guessed: match at offset 0
79 #Matching REx "X(A|[B]Q||C|D)Y" against "XY"
80 #  Setting an EVAL scope, savestack=140
81 #   0 <> <XY>              |  1:  EXACT <X>
82 #   1 <X> <Y>              |  3:  OPEN1
83 #   1 <X> <Y>              |  5:  TRIE-EXACT
84 #                                 matched empty string...
85 #   1 <X> <Y>              | 21:  CLOSE1
86 #   1 <X> <Y>              | 23:  EXACT <Y>
87 #   2 <XY> <>              | 25:  END
88 #Match successful!
89 #%MATCHED%
90 #Freeing REx: "X(A|[B]Q||C|D)Y"
91 Compiling REx "X(A|[B]Q||C|D)Y"
92 [A-D]
93 TRIE-EXACT
94 <BQ>
95 matched empty string
96 Match successful!
97 Found floating substr "Y" at offset 1...
98 Found anchored substr "X" at offset 0...
99 Guessed: match at offset 0
100 checking floating
101 minlen 2
102 S:1/6   
103 W:5
104 L:0/2
105 C:5/5
106 %MATCHED%
107 ---
108 #Compiling REx "[f][o][o][b][a][r]"
109 #size 67
110 #first at 1
111 #   1: EXACT <foobar>(13)
112 #  13: END(0)
113 #anchored "foobar" at 0 (checking anchored isall) minlen 6
114 #Guessing start of match, REx "[f][o][o][b][a][r]" against "foobar"...
115 #Found anchored substr "foobar" at offset 0...
116 #Guessed: match at offset 0
117 #Freeing REx: "[f][o][o][b][a][r]"
118 foobar
119 checking anchored isall
120 minlen 6
121 anchored "foobar" at 0
122 Guessed: match at offset 0
123 Compiling REx "[f][o][o][b][a][r]"
124 Freeing REx: "[f][o][o][b][a][r]"
125 %MATCHED%
126 ---
127 #Compiling REx ".[XY]."
128 #size 14
129 #first at 1
130 #   1: REG_ANY(2)
131 #   2: ANYOF[XY](13)
132 #  13: REG_ANY(14)
133 #  14: END(0)
134 #minlen 3
135 #%FAILED%
136 #Freeing REx: ".[XY]."
137 %FAILED%
138 minlen 3
139 ---
140 # Compiling REx "(?:ABCP|ABCG|ABCE|ABCB|ABCA|ABCD)"
141 # Got 164 bytes for offset annotations.
142 #     TRIE(NATIVE): W:6 C:24 Uq:7 Min:4 Max:4
143 #       Char : Match Base  Ofs     A   B   C   P   G   E   D
144 #       State|---------------------------------------------------
145 #       #   1|       @   7 + 0[    2   .   .   .   .   .   .]
146 #       #   2|       @   7 + 1[    .   3   .   .   .   .   .]
147 #       #   3|       @   7 + 2[    .   .   4   .   .   .   .]
148 #       #   4|       @   A + 0[    9   8   0   5   6   7   A]
149 #       #   5| W   1 @   0 
150 #       #   6| W   2 @   0 
151 #       #   7| W   3 @   0 
152 #       #   8| W   4 @   0 
153 #       #   9| W   5 @   0 
154 #       #   A| W   6 @   0 
155 # Final program:
156 #    1: EXACT <ABC>(3)
157 #    3: TRIEC-EXACT<S:4/10 W:6 L:1/1 C:24/7>[A-EGP](20)
158 #       <P> 
159 #       <G> 
160 #       <E> 
161 #       <B> 
162 #       <A> 
163 #       <D> 
164 #   20: END(0)
165 # anchored "ABC" at 0 (checking anchored) minlen 4 
166 # Offsets: [20]
167 #       1:4[3] 3:4[15] 19:32[0] 20:34[0] 
168 # Guessing start of match in sv for REx "(?:ABCP|ABCG|ABCE|ABCB|ABCA|ABCD)" against "ABCD"
169 # Found anchored substr "ABC" at offset 0...
170 # Guessed: match at offset 0
171 # Matching REx "(?:ABCP|ABCG|ABCE|ABCB|ABCA|ABCD)" against "ABCD"
172 #    0 <> <ABCD>               |  1:EXACT <ABC>(3)
173 #    3 <ABC> <D>               |  3:TRIEC-EXACT<S:4/10 W:6 L:1/1 C:24/7>[A-EGP](20)
174 #    3 <ABC> <D>               |    State:    4 Accepted:    0 Charid:  7 CP:  44 After State:    a
175 #    4 <ABCD> <>               |    State:    a Accepted:    1 Charid:  6 CP:   0 After State:    0
176 #                                   got 1 possible matches
177 #                                   only one match left: #6 <D>
178 #    4 <ABCD> <>               | 20:END(0)
179 # Match successful!
180 # %MATCHED%
181 # Freeing REx: "(?:ABCP|ABCG|ABCE|ABCB|ABCA|ABCD)"
182 %MATCHED%
183 EXACT <ABC>
184 TRIEC-EXACT
185 [A-EGP]
186 only one match left: #6 <D>
187 S:4/10
188 W:6
189 L:1/1
190 C:24/7
191 minlen 4
192 (checking anchored)
193 anchored "ABC" at 0
194 ---
195 #Compiling REx "(\.COM|\.EXE|\.BAT|\.CMD|\.VBS|\.VBE|\.JS|\.JSE|\.WSF|\.WSH|\.pyo|\.pyc|\.pyw|\.py)$"
196 #size 48 nodes first at 3
197 #first at 3
198 #rarest char
199 # at 0
200 #   1: OPEN1(3)
201 #   3:   EXACTF <.>(5)
202 #   5:   TRIE-EXACTF(45)
203 #        [Start:2 Words:14 Chars:54 Unique:18 States:29 Minlen:2 Maxlen:3 Start-Class:BCEJPVWbcejpvw]
204 #          <.COM>
205 #          ...  yada yada ... (dmq)
206 #          <.py>
207 #  45: CLOSE1(47)
208 #  47: EOL(48)
209 #  48: END(0)
210 #floating ""$ at 3..4 (checking floating) stclass "EXACTF <.>" minlen 3
211 #Offsets: [48]
212 #        1:1[1] 3:2[1] 5:2[81] 45:83[1] 47:84[1] 48:85[0]
213 #Guessing start of match, REx "(\.COM|\.EXE|\.BAT|\.CMD|\.VBS|\.VBE|\.JS|\.JSE|\.WSF|\.WSH|..." against "D:dev/perl/ver/28321_/perl.exe"...
214 #Found floating substr ""$ at offset 30...
215 #Starting position does not contradict /^/m...
216 #Does not contradict STCLASS...
217 #Guessed: match at offset 26
218 #Matching REx "(\.COM|\.EXE|\.BAT|\.CMD|\.VBS|\.VBE|\.JS|\.JSE|\.WSF|\.WSH|\.pyo|\.pyc|\.pyw|\.py)$..." against ".exe"
219 #Matching stclass "EXACTF <.>" against ".exe"
220 #  Setting an EVAL scope, savestack=140
221 #  26 <21_/perl> <.exe>    |  1:  OPEN1
222 #  26 <21_/perl> <.exe>    |  3:  EXACTF <.>
223 #  27 <21_/perl.> <exe>    |  5:  TRIE-EXACTF
224 #                                 only one match : #2 <.EXE>
225 #  30 <21_/perl.exe> <>    | 45:    CLOSE1
226 #  30 <21_/perl.exe> <>    | 47:    EOL
227 #  30 <21_/perl.exe> <>    | 48:    END
228 #Match successful!
229 #POP STATE(1)
230 #%MATCHED%
231 #Freeing REx: "(\\.COM|\\.EXE|\\.BAT|\\.CMD|\\.VBS|\\.VBE|\\.JS|\\.JSE|\\."......
232 %MATCHED%
233 floating ""$ at 3..4 (checking floating)
234 1:1[1] 3:2[1] 5:2[64] 45:83[1] 47:84[1] 48:85[0]
235 stclass EXACTF <.> minlen 3
236 Found floating substr ""$ at offset 30...
237 Does not contradict STCLASS...
238 Guessed: match at offset 26
239 Matching stclass EXACTF <.> against ".exe"
240 ---
241 #Compiling REx "[q]"
242 #size 12 nodes Got 100 bytes for offset annotations.
243 #first at 1
244 #Final program:
245 #   1: EXACT <q>(3)
246 #   3: END(0)
247 #anchored "q" at 0 (checking anchored isall) minlen 1
248 #Offsets: [12]
249 #        1:1[3] 3:4[0]
250 #Guessing start of match, REx "[q]" against "q"...
251 #Found anchored substr "q" at offset 0...
252 #Guessed: match at offset 0
253 #%MATCHED%
254 #Freeing REx: "[q]"
255 Got 108 bytes for offset annotations.
256 Offsets: [13]
257 1:1[3] 3:4[0]
258 %MATCHED%        
259 Freeing REx: "[q]"