blob: b47c1059f8d4a4675e328afe5ed77f2b8942081d [file] [log] [blame]
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +00001#!/usr/local/bin/python
2# -*- mode: python -*-
3# $Id$
4
Guido van Rossum23b22571997-07-17 22:36:14 +00005from test_support import verbose, TestFailed
Guido van Rossum8e0ce301997-07-11 19:34:44 +00006import re
Guido van Rossume8b81311997-07-15 18:47:48 +00007import sys, os, string, traceback
Guido van Rossum8e0ce301997-07-11 19:34:44 +00008
Guido van Rossum23b22571997-07-17 22:36:14 +00009# Misc tests from Tim Peters' re.doc
10
Guido van Rossum49946571997-07-18 04:26:25 +000011if verbose:
12 print 'Running tests on re.sub'
13
Guido van Rossum23b22571997-07-17 22:36:14 +000014try:
Guido van Rossum23b22571997-07-17 22:36:14 +000015 assert re.sub("(?i)b+", "x", "bbbb BBBB") == 'x x'
Guido van Rossum49946571997-07-18 04:26:25 +000016
Guido van Rossum23b22571997-07-17 22:36:14 +000017 def bump_num(matchobj):
18 int_value = int(matchobj.group(0))
19 return str(int_value + 1)
20
Guido van Rossum49946571997-07-18 04:26:25 +000021 assert re.sub(r'\d+', bump_num, '08.2 -2 23x99y') == '9.3 -3 24x100y'
22
Guido van Rossum23b22571997-07-17 22:36:14 +000023 assert re.sub('.', lambda m: r"\n", 'x') == '\\n'
24 assert re.sub('.', r"\n", 'x') == '\n'
Guido van Rossumdfa67901997-12-08 17:12:06 +000025
Guido van Rossum23b22571997-07-17 22:36:14 +000026 s = r"\1\1"
27 assert re.sub('(.)', s, 'x') == 'xx'
28 assert re.sub('(.)', re.escape(s), 'x') == s
29 assert re.sub('(.)', lambda m: s, 'x') == s
30
Guido van Rossumdfa67901997-12-08 17:12:06 +000031 assert re.sub('(?P<a>x)', '\g<a>\g<a>', 'xx') == 'xxxx'
Guido van Rossum9ec2ed41997-10-08 04:05:08 +000032 assert re.sub('(?P<unk>x)', '\g<unk>\g<unk>', 'xx') == 'xxxx'
Guido van Rossum49946571997-07-18 04:26:25 +000033
Guido van Rossum95e80531997-08-13 22:34:14 +000034 assert re.sub('a', r'\t\n\v\r\f\a\b\B\Z\a\A\w\W\s\S\d\D', 'a') == '\t\n\v\r\f\a\bBZ\aAwWsSdD'
35 assert re.sub('a', '\t\n\v\r\f\a', 'a') == '\t\n\v\r\f\a'
36 assert re.sub('a', '\t\n\v\r\f\a', 'a') == (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7))
37
Guido van Rossum23b22571997-07-17 22:36:14 +000038except AssertionError:
39 raise TestFailed, "re.sub"
40
Guido van Rossumf473cb01998-01-14 16:42:17 +000041try:
42 assert re.sub('a', 'b', 'aaaaa') == 'bbbbb'
43 assert re.sub('a', 'b', 'aaaaa', 1) == 'baaaa'
44except AssertionError:
45 raise TestFailed, "qualified re.sub"
46
Guido van Rossum49946571997-07-18 04:26:25 +000047if verbose:
48 print 'Running tests on symbolic references'
49
50try:
51 re.sub('(?P<a>x)', '\g<a', 'xx')
52except re.error, reason:
53 pass
54else:
55 raise TestFailed, "symbolic reference"
56
57try:
58 re.sub('(?P<a>x)', '\g<', 'xx')
59except re.error, reason:
60 pass
61else:
62 raise TestFailed, "symbolic reference"
63
64try:
65 re.sub('(?P<a>x)', '\g', 'xx')
66except re.error, reason:
67 pass
68else:
69 raise TestFailed, "symbolic reference"
70
71try:
72 re.sub('(?P<a>x)', '\g<a a>', 'xx')
73except re.error, reason:
74 pass
75else:
76 raise TestFailed, "symbolic reference"
77
78try:
79 re.sub('(?P<a>x)', '\g<ab>', 'xx')
80except IndexError, reason:
81 pass
82else:
83 raise TestFailed, "symbolic reference"
84
85try:
86 re.sub('(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')
87except re.error, reason:
88 pass
89else:
90 raise TestFailed, "symbolic reference"
91
92try:
93 re.sub('(?P<a>x)|(?P<b>y)', '\\2', 'xx')
94except re.error, reason:
95 pass
96else:
97 raise TestFailed, "symbolic reference"
98
99if verbose:
100 print 'Running tests on re.subn'
101
Guido van Rossum23b22571997-07-17 22:36:14 +0000102try:
103 assert re.subn("(?i)b+", "x", "bbbb BBBB") == ('x x', 2)
104 assert re.subn("b+", "x", "bbbb BBBB") == ('x BBBB', 1)
105 assert re.subn("b+", "x", "xyz") == ('xyz', 0)
106 assert re.subn("b*", "x", "xyz") == ('xxxyxzx', 4)
Guido van Rossum23b22571997-07-17 22:36:14 +0000107except AssertionError:
108 raise TestFailed, "re.subn"
109
110try:
111 assert re.split(":", ":a:b::c") == ['', 'a', 'b', '', 'c']
112 assert re.split(":*", ":a:b::c") == ['', 'a', 'b', 'c']
113 assert re.split("(:*)", ":a:b::c") == ['', ':', 'a', ':', 'b', '::', 'c']
114 assert re.split("(?::*)", ":a:b::c") == ['', 'a', 'b', 'c']
115 assert re.split("(:)*", ":a:b::c") == ['', ':', 'a', ':', 'b', ':', 'c']
116 assert re.split("([b:]+)", ":a:b::c") == ['', ':', 'a', ':b::', 'c']
117 assert re.split("(b)|(:+)", ":a:b::c") == \
Guido van Rossum49946571997-07-18 04:26:25 +0000118 ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c']
Guido van Rossum23b22571997-07-17 22:36:14 +0000119 assert re.split("(?:b)|(?::+)", ":a:b::c") == ['', 'a', '', '', 'c']
Guido van Rossum49946571997-07-18 04:26:25 +0000120
Guido van Rossum23b22571997-07-17 22:36:14 +0000121except AssertionError:
122 raise TestFailed, "re.split"
123
Guido van Rossumf473cb01998-01-14 16:42:17 +0000124try:
125 assert re.split(":", ":a:b::c", 2) == ['', 'a', 'b::c']
126 assert re.split(':', 'a:b:c:d', 2) == ['a', 'b', 'c:d']
127
128 assert re.split("(:)", ":a:b::c", 2) == ['', ':', 'a', ':', 'b::c']
129 assert re.split("(:*)", ":a:b::c", 2) == ['', ':', 'a', ':', 'b::c']
130except AssertionError:
131 raise TestFailed, "qualified re.split"
132
Guido van Rossumdfa67901997-12-08 17:12:06 +0000133if verbose:
134 print 'Pickling a RegexObject instance'
135 import pickle
136 pat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')
137 s = pickle.dumps(pat)
138 pat = pickle.loads(s)
139
140if verbose:
141 print 'Running tests on re.split'
142
143try:
144 assert re.I == re.IGNORECASE
145 assert re.L == re.LOCALE
146 assert re.M == re.MULTILINE
147 assert re.S == re.DOTALL
148 assert re.X == re.VERBOSE
149except AssertionError:
150 raise TestFailed, 're module constants'
151
Guido van Rossumf5910e41997-12-30 17:32:33 +0000152for flags in [re.I, re.M, re.X, re.S, re.L]:
Guido van Rossumdfa67901997-12-08 17:12:06 +0000153 try:
154 r = re.compile('^pattern$', flags)
155 except:
156 print 'Exception raised on flag', flags
157
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000158from re_tests import *
Guido van Rossum49946571997-07-18 04:26:25 +0000159if verbose:
160 print 'Running re_tests test suite'
Guido van Rossumd807b751997-09-04 14:35:45 +0000161else:
162 # To save time, only run the first and last 10 tests
Guido van Rossumdfa67901997-12-08 17:12:06 +0000163 pass #tests = tests[:10] + tests[-10:]
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000164
165for t in tests:
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +0000166 sys.stdout.flush()
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000167 pattern=s=outcome=repl=expected=None
168 if len(t)==5:
169 pattern, s, outcome, repl, expected = t
170 elif len(t)==3:
171 pattern, s, outcome = t
172 else:
173 raise ValueError, ('Test tuples should have 3 or 5 fields',t)
174
175 try:
176 obj=re.compile(pattern)
177 except re.error:
178 if outcome==SYNTAX_ERROR: pass # Expected a syntax error
179 else:
180 print '=== Syntax error:', t
Guido van Rossum95e80531997-08-13 22:34:14 +0000181 except KeyboardInterrupt: raise KeyboardInterrupt
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000182 except:
183 print '*** Unexpected error ***'
Guido van Rossum1d8b7581997-07-11 21:14:53 +0000184 if verbose:
185 traceback.print_exc(file=sys.stdout)
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000186 else:
187 try:
188 result=obj.search(s)
Guido van Rossumdfa67901997-12-08 17:12:06 +0000189 except (re.error), msg:
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000190 print '=== Unexpected exception', t, repr(msg)
191 if outcome==SYNTAX_ERROR:
192 # This should have been a syntax error; forget it.
193 pass
194 elif outcome==FAIL:
195 if result is None: pass # No match, as expected
196 else: print '=== Succeeded incorrectly', t
197 elif outcome==SUCCEED:
198 if result is not None:
199 # Matched, as expected, so now we compute the
200 # result string and compare it to our expected result.
201 start, end = result.span(0)
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +0000202 vardict={'found': result.group(0),
203 'groups': result.group(),
204 'flags': result.re.flags}
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000205 for i in range(1, 100):
206 try:
207 gi = result.group(i)
Guido van Rossum035aae01997-07-11 20:47:58 +0000208 # Special hack because else the string concat fails:
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +0000209 if gi is None:
210 gi = "None"
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000211 except IndexError:
Guido van Rossum23b8d4c1997-07-15 15:49:52 +0000212 gi = "Error"
Guido van Rossum847ed4a1997-07-15 15:40:57 +0000213 vardict['g%d' % i] = gi
Guido van Rossume8b81311997-07-15 18:47:48 +0000214 for i in result.re.groupindex.keys():
215 try:
216 gi = result.group(i)
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +0000217 if gi is None:
218 gi = "None"
Guido van Rossume8b81311997-07-15 18:47:48 +0000219 except IndexError:
Guido van Rossuma0e4c1b1997-07-17 14:52:48 +0000220 gi = "Error"
221 vardict[i] = gi
Guido van Rossum8e0ce301997-07-11 19:34:44 +0000222 repl=eval(repl, vardict)
223 if repl!=expected:
224 print '=== grouping error', t,
225 print repr(repl)+' should be '+repr(expected)
226 else:
227 print '=== Failed incorrectly', t
Guido van Rossum95e80531997-08-13 22:34:14 +0000228
Guido van Rossumdfa67901997-12-08 17:12:06 +0000229 # Try the match with the search area limited to the extent
230 # of the match and see if it still succeeds. \B will
231 # break (because it won't match at the end or start of a
232 # string), so we'll ignore patterns that feature it.
233
234 if pattern[:2]!='\\B' and pattern[-2:]!='\\B':
235 obj=re.compile(pattern)
236 result=obj.search(s, pos=result.start(0), endpos=result.end(0)+1)
237 if result==None:
238 print '=== Failed on range-limited match', t
239
Guido van Rossum95e80531997-08-13 22:34:14 +0000240 # Try the match with IGNORECASE enabled, and check that it
241 # still succeeds.
242 obj=re.compile(pattern, re.IGNORECASE)
243 result=obj.search(s)
244 if result==None:
245 print '=== Fails on case-insensitive match', t
Guido van Rossumdfa67901997-12-08 17:12:06 +0000246
Guido van Rossumf5910e41997-12-30 17:32:33 +0000247 # Try the match with LOCALE enabled, and check that it
248 # still succeeds.
249 obj=re.compile(pattern, re.LOCALE)
250 result=obj.search(s)
251 if result==None:
252 print '=== Fails on locale-sensitive match', t
Guido van Rossumdfa67901997-12-08 17:12:06 +0000253