Improve regex stringification code
[p5sagit/p5-mst-13.2.git] / ext / re / t / regop.t
CommitLineData
3dab1dad 1#!./perl
2
3BEGIN {
8e11feef 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 }
3dab1dad 11}
12
13use strict;
1e2e3d02 14BEGIN { require "./test.pl"; }
07be1b83 15our $NUM_SECTS;
16chomp(my @strs= grep { !/^\s*\#/ } <DATA>);
17my $out = runperl(progfile => "../ext/re/t/regop.pl", stderr => 1 );
18my @tests = grep { /\S/ } split /(?=Compiling REx)/, $out;
19# on debug builds we get an EXECUTING... message in there at the top
20shift @tests
21 if $tests[0] =~ /EXECUTING.../;
3dab1dad 22
07be1b83 23plan( @tests + 2 + ( @strs - grep { !$_ or /^---/ } @strs ));
3dab1dad 24
07be1b83 25is( scalar @tests, $NUM_SECTS,
26 "Expecting output for $NUM_SECTS patterns" );
27ok( defined $out, 'regop.pl returned something defined' );
3dab1dad 28
07be1b83 29$out ||= "";
30my $test= 1;
31foreach my $testout ( @tests ) {
32 my ( $pattern )= $testout=~/Compiling REx "([^"]+)"/;
33 ok( $pattern, "Pattern for test " . ($test++) );
1e2e3d02 34 my $diaged;
8e11feef 35 while (@strs) {
07be1b83 36 local $_= shift @strs;
37 last if !$_
38 or /^---/;
39 next if /^\s*#/;
40 s/^\s+//;
41 s/\s+$//;
1e2e3d02 42 ok( $testout=~/\Q$_\E/, "$_: /$pattern/" )
43 or do {
44 !$diaged++ and diag("$_: /$pattern/\n$testout");
45 };
8e11feef 46 }
47}
3dab1dad 48
07be1b83 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
56BEGIN{ $NUM_SECTS= 6 }
57
3dab1dad 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"
91Compiling REx "X(A|[B]Q||C|D)Y"
1e2e3d02 92[A-D]
3dab1dad 93TRIE-EXACT
94<BQ>
95matched empty string
96Match successful!
97Found floating substr "Y" at offset 1...
98Found anchored substr "X" at offset 0...
99Guessed: match at offset 0
100checking floating
101minlen 2
1e2e3d02 102S:1/6
103W:5
104L:0/2
105C:5/5
3dab1dad 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]"
118foobar
119checking anchored isall
120minlen 6
121anchored "foobar" at 0
122Guessed: match at offset 0
123Compiling REx "[f][o][o][b][a][r]"
124Freeing 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%
138minlen 3
139---
1e2e3d02 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)
de734bd5 158# <P>
159# <G>
160# <E>
161# <B>
162# <A>
163# <D>
1e2e3d02 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
de734bd5 177# only one match left: #6 <D>
1e2e3d02 178# 4 <ABCD> <> | 20:END(0)
179# Match successful!
180# %MATCHED%
181# Freeing REx: "(?:ABCP|ABCG|ABCE|ABCB|ABCA|ABCD)"
3dab1dad 182%MATCHED%
183EXACT <ABC>
1e2e3d02 184TRIEC-EXACT
185[A-EGP]
de734bd5 186only one match left: #6 <D>
1e2e3d02 187S:4/10
188W:6
189L:1/1
190C:24/7
3dab1dad 191minlen 4
1e2e3d02 192(checking anchored)
193anchored "ABC" at 0
07be1b83 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%
233floating ""$ at 3..4 (checking floating)
1e2e3d02 2341:1[1] 3:2[1] 5:2[64] 45:83[1] 47:84[1] 48:85[0]
235stclass EXACTF <.> minlen 3
07be1b83 236Found floating substr ""$ at offset 30...
237Does not contradict STCLASS...
238Guessed: match at offset 26
1e2e3d02 239Matching stclass EXACTF <.> against ".exe"
07be1b83 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]"
e2e6a0f1 255Got 108 bytes for offset annotations.
256Offsets: [13]
07be1b83 2571:1[3] 3:4[0]
258%MATCHED%
7122b237 259Freeing REx: "[q]"