updated SRE test suite (fixes PEP223 problem, shows syntax errors)

This commit is contained in:
Fredrik Lundh 2000-09-03 10:43:16 +00:00
parent acee48628d
commit 03dd010b4f
1 changed files with 78 additions and 76 deletions

View File

@ -47,9 +47,9 @@ def test(expression, result, exception=None):
print 'Running tests on character literals' print 'Running tests on character literals'
for i in [0, 8, 16, 32, 64, 127, 128, 255]: for i in [0, 8, 16, 32, 64, 127, 128, 255]:
test(r"""sre.match("\%03o" % i, chr(i)) != None""", 1) test(r"""sre.match(r"\%03o" % i, chr(i)) != None""", 1)
test(r"""sre.match("\%03o0" % i, chr(i)+"0") != None""", 1) test(r"""sre.match(r"\%03o0" % i, chr(i)+"0") != None""", 1)
test(r"""sre.match("\%03o8" % i, chr(i)+"8") != None""", 1) test(r"""sre.match(r"\%03o8" % i, chr(i)+"8") != None""", 1)
test(r"""sre.match(r"\x%02x" % i, chr(i)) != None""", 1) test(r"""sre.match(r"\x%02x" % i, chr(i)) != None""", 1)
test(r"""sre.match(r"\x%02x0" % i, chr(i)+"0") != None""", 1) test(r"""sre.match(r"\x%02x0" % i, chr(i)+"0") != None""", 1)
test(r"""sre.match(r"\x%02xz" % i, chr(i)+"z") != None""", 1) test(r"""sre.match(r"\x%02xz" % i, chr(i)+"z") != None""", 1)
@ -61,27 +61,27 @@ def test(expression, result, exception=None):
if verbose: if verbose:
print 'Running tests on sre.search and sre.match' print 'Running tests on sre.search and sre.match'
test(r"""sre.search('x*', 'axx').span(0)""", (0, 0)) test(r"""sre.search(r'x*', 'axx').span(0)""", (0, 0))
test(r"""sre.search('x*', 'axx').span()""", (0, 0)) test(r"""sre.search(r'x*', 'axx').span()""", (0, 0))
test(r"""sre.search('x+', 'axx').span(0)""", (1, 3)) test(r"""sre.search(r'x+', 'axx').span(0)""", (1, 3))
test(r"""sre.search('x+', 'axx').span()""", (1, 3)) test(r"""sre.search(r'x+', 'axx').span()""", (1, 3))
test(r"""sre.search('x', 'aaa')""", None) test(r"""sre.search(r'x', 'aaa')""", None)
test(r"""sre.match('a*', 'xxx').span(0)""", (0, 0)) test(r"""sre.match(r'a*', 'xxx').span(0)""", (0, 0))
test(r"""sre.match('a*', 'xxx').span()""", (0, 0)) test(r"""sre.match(r'a*', 'xxx').span()""", (0, 0))
test(r"""sre.match('x*', 'xxxa').span(0)""", (0, 3)) test(r"""sre.match(r'x*', 'xxxa').span(0)""", (0, 3))
test(r"""sre.match('x*', 'xxxa').span()""", (0, 3)) test(r"""sre.match(r'x*', 'xxxa').span()""", (0, 3))
test(r"""sre.match('a+', 'xxx')""", None) test(r"""sre.match(r'a+', 'xxx')""", None)
# bug 113254 # bug 113254
test(r"""sre.match('(a)|(b)', 'b').start(1)""", -1) test(r"""sre.match(r'(a)|(b)', 'b').start(1)""", -1)
test(r"""sre.match('(a)|(b)', 'b').end(1)""", -1) test(r"""sre.match(r'(a)|(b)', 'b').end(1)""", -1)
test(r"""sre.match('(a)|(b)', 'b').span(1)""", (-1, -1)) test(r"""sre.match(r'(a)|(b)', 'b').span(1)""", (-1, -1))
if verbose: if verbose:
print 'Running tests on sre.sub' print 'Running tests on sre.sub'
test(r"""sre.sub("(?i)b+", "x", "bbbb BBBB")""", 'x x') test(r"""sre.sub(r"(?i)b+", "x", "bbbb BBBB")""", 'x x')
def bump_num(matchobj): def bump_num(matchobj):
int_value = int(matchobj.group(0)) int_value = int(matchobj.group(0))
@ -90,97 +90,97 @@ def bump_num(matchobj):
test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y')""", '9.3 -3 24x100y') test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y')""", '9.3 -3 24x100y')
test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y', 3)""", '9.3 -3 23x99y') test(r"""sre.sub(r'\d+', bump_num, '08.2 -2 23x99y', 3)""", '9.3 -3 23x99y')
test(r"""sre.sub('.', lambda m: r"\n", 'x')""", '\\n') test(r"""sre.sub(r'.', lambda m: r"\n", 'x')""", '\\n')
test(r"""sre.sub('.', r"\n", 'x')""", '\n') test(r"""sre.sub(r'.', r"\n", 'x')""", '\n')
s = r"\1\1" s = r"\1\1"
test(r"""sre.sub('(.)', s, 'x')""", 'xx') test(r"""sre.sub(r'(.)', s, 'x')""", 'xx')
test(r"""sre.sub('(.)', sre.escape(s), 'x')""", s) test(r"""sre.sub(r'(.)', sre.escape(s), 'x')""", s)
test(r"""sre.sub('(.)', lambda m: s, 'x')""", s) test(r"""sre.sub(r'(.)', lambda m: s, 'x')""", s)
test(r"""sre.sub('(?P<a>x)', '\g<a>\g<a>', 'xx')""", 'xxxx') test(r"""sre.sub(r'(?P<a>x)', '\g<a>\g<a>', 'xx')""", 'xxxx')
test(r"""sre.sub('(?P<a>x)', '\g<a>\g<1>', 'xx')""", 'xxxx') test(r"""sre.sub(r'(?P<a>x)', '\g<a>\g<1>', 'xx')""", 'xxxx')
test(r"""sre.sub('(?P<unk>x)', '\g<unk>\g<unk>', 'xx')""", 'xxxx') test(r"""sre.sub(r'(?P<unk>x)', '\g<unk>\g<unk>', 'xx')""", 'xxxx')
test(r"""sre.sub('(?P<unk>x)', '\g<1>\g<1>', 'xx')""", 'xxxx') test(r"""sre.sub(r'(?P<unk>x)', '\g<1>\g<1>', 'xx')""", 'xxxx')
test(r"""sre.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\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D') test(r"""sre.sub(r'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\b\\B\\Z\a\\A\\w\\W\\s\\S\\d\\D')
test(r"""sre.sub('a', '\t\n\v\r\f\a', 'a')""", '\t\n\v\r\f\a') test(r"""sre.sub(r'a', '\t\n\v\r\f\a', 'a')""", '\t\n\v\r\f\a')
test(r"""sre.sub('a', '\t\n\v\r\f\a', 'a')""", (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7))) test(r"""sre.sub(r'a', '\t\n\v\r\f\a', 'a')""", (chr(9)+chr(10)+chr(11)+chr(13)+chr(12)+chr(7)))
test(r"""sre.sub('^\s*', 'X', 'test')""", 'Xtest') test(r"""sre.sub(r'^\s*', 'X', 'test')""", 'Xtest')
# qualified sub # qualified sub
test(r"""sre.sub('a', 'b', 'aaaaa')""", 'bbbbb') test(r"""sre.sub(r'a', 'b', 'aaaaa')""", 'bbbbb')
test(r"""sre.sub('a', 'b', 'aaaaa', 1)""", 'baaaa') test(r"""sre.sub(r'a', 'b', 'aaaaa', 1)""", 'baaaa')
if verbose: if verbose:
print 'Running tests on symbolic references' print 'Running tests on symbolic references'
test(r"""sre.sub('(?P<a>x)', '\g<a', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)', '\g<a', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)', '\g<', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)', '\g<', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)', '\g', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)', '\g', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)', '\g<a a>', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)', '\g<a a>', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)', '\g<1a1>', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)', '\g<1a1>', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)', '\g<ab>', 'xx')""", None, IndexError) test(r"""sre.sub(r'(?P<a>x)', '\g<ab>', 'xx')""", None, IndexError)
test(r"""sre.sub('(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)|(?P<b>y)', '\g<b>', 'xx')""", None, sre.error)
test(r"""sre.sub('(?P<a>x)|(?P<b>y)', '\\2', 'xx')""", None, sre.error) test(r"""sre.sub(r'(?P<a>x)|(?P<b>y)', '\\2', 'xx')""", None, sre.error)
if verbose: if verbose:
print 'Running tests on sre.subn' print 'Running tests on sre.subn'
test(r"""sre.subn("(?i)b+", "x", "bbbb BBBB")""", ('x x', 2)) test(r"""sre.subn(r"(?i)b+", "x", "bbbb BBBB")""", ('x x', 2))
test(r"""sre.subn("b+", "x", "bbbb BBBB")""", ('x BBBB', 1)) test(r"""sre.subn(r"b+", "x", "bbbb BBBB")""", ('x BBBB', 1))
test(r"""sre.subn("b+", "x", "xyz")""", ('xyz', 0)) test(r"""sre.subn(r"b+", "x", "xyz")""", ('xyz', 0))
test(r"""sre.subn("b*", "x", "xyz")""", ('xxxyxzx', 4)) test(r"""sre.subn(r"b*", "x", "xyz")""", ('xxxyxzx', 4))
test(r"""sre.subn("b*", "x", "xyz", 2)""", ('xxxyz', 2)) test(r"""sre.subn(r"b*", "x", "xyz", 2)""", ('xxxyz', 2))
if verbose: if verbose:
print 'Running tests on sre.split' print 'Running tests on sre.split'
test(r"""sre.split(":", ":a:b::c")""", ['', 'a', 'b', '', 'c']) test(r"""sre.split(r":", ":a:b::c")""", ['', 'a', 'b', '', 'c'])
test(r"""sre.split(":*", ":a:b::c")""", ['', 'a', 'b', 'c']) test(r"""sre.split(r":*", ":a:b::c")""", ['', 'a', 'b', 'c'])
test(r"""sre.split("(:*)", ":a:b::c")""", ['', ':', 'a', ':', 'b', '::', 'c']) test(r"""sre.split(r"(:*)", ":a:b::c")""", ['', ':', 'a', ':', 'b', '::', 'c'])
test(r"""sre.split("(?::*)", ":a:b::c")""", ['', 'a', 'b', 'c']) test(r"""sre.split(r"(?::*)", ":a:b::c")""", ['', 'a', 'b', 'c'])
test(r"""sre.split("(:)*", ":a:b::c")""", ['', ':', 'a', ':', 'b', ':', 'c']) test(r"""sre.split(r"(:)*", ":a:b::c")""", ['', ':', 'a', ':', 'b', ':', 'c'])
test(r"""sre.split("([b:]+)", ":a:b::c")""", ['', ':', 'a', ':b::', 'c']) test(r"""sre.split(r"([b:]+)", ":a:b::c")""", ['', ':', 'a', ':b::', 'c'])
test(r"""sre.split("(b)|(:+)", ":a:b::c")""", test(r"""sre.split(r"(b)|(:+)", ":a:b::c")""",
['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c']) ['', None, ':', 'a', None, ':', '', 'b', None, '', None, '::', 'c'])
test(r"""sre.split("(?:b)|(?::+)", ":a:b::c")""", ['', 'a', '', '', 'c']) test(r"""sre.split(r"(?:b)|(?::+)", ":a:b::c")""", ['', 'a', '', '', 'c'])
test(r"""sre.split(":", ":a:b::c", 2)""", ['', 'a', 'b::c']) test(r"""sre.split(r":", ":a:b::c", 2)""", ['', 'a', 'b::c'])
test(r"""sre.split(':', 'a:b:c:d', 2)""", ['a', 'b', 'c:d']) test(r"""sre.split(r':', 'a:b:c:d', 2)""", ['a', 'b', 'c:d'])
test(r"""sre.split("(:)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c']) test(r"""sre.split(r"(:)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c'])
test(r"""sre.split("(:*)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c']) test(r"""sre.split(r"(:*)", ":a:b::c", 2)""", ['', ':', 'a', ':', 'b::c'])
if verbose: if verbose:
print "Running tests on sre.findall" print "Running tests on sre.findall"
test(r"""sre.findall(":+", "abc")""", []) test(r"""sre.findall(r":+", "abc")""", [])
test(r"""sre.findall(":+", "a:b::c:::d")""", [":", "::", ":::"]) test(r"""sre.findall(r":+", "a:b::c:::d")""", [":", "::", ":::"])
test(r"""sre.findall("(:+)", "a:b::c:::d")""", [":", "::", ":::"]) test(r"""sre.findall(r"(:+)", "a:b::c:::d")""", [":", "::", ":::"])
test(r"""sre.findall("(:)(:*)", "a:b::c:::d")""", test(r"""sre.findall(r"(:)(:*)", "a:b::c:::d")""",
[(":", ""), (":", ":"), (":", "::")]) [(":", ""), (":", ":"), (":", "::")])
test(r"""sre.findall("(a)|(b)", "abc")""", [("a", ""), ("", "b")]) test(r"""sre.findall(r"(a)|(b)", "abc")""", [("a", ""), ("", "b")])
if verbose: if verbose:
print "Running tests on sre.match" print "Running tests on sre.match"
test(r"""sre.match('a', 'a').groups()""", ()) test(r"""sre.match(r'a', 'a').groups()""", ())
test(r"""sre.match('(a)', 'a').groups()""", ('a',)) test(r"""sre.match(r'(a)', 'a').groups()""", ('a',))
test(r"""sre.match('(a)', 'a').group(0)""", 'a') test(r"""sre.match(r'(a)', 'a').group(0)""", 'a')
test(r"""sre.match('(a)', 'a').group(1)""", 'a') test(r"""sre.match(r'(a)', 'a').group(1)""", 'a')
test(r"""sre.match('(a)', 'a').group(1, 1)""", ('a', 'a')) test(r"""sre.match(r'(a)', 'a').group(1, 1)""", ('a', 'a'))
pat = sre.compile('((a)|(b))(c)?') pat = sre.compile(r'((a)|(b))(c)?')
test(r"""pat.match('a').groups()""", ('a', 'a', None, None)) test(r"""pat.match('a').groups()""", ('a', 'a', None, None))
test(r"""pat.match('b').groups()""", ('b', None, 'b', None)) test(r"""pat.match('b').groups()""", ('b', None, 'b', None))
test(r"""pat.match('ac').groups()""", ('a', 'a', None, 'c')) test(r"""pat.match('ac').groups()""", ('a', 'a', None, 'c'))
test(r"""pat.match('bc').groups()""", ('b', None, 'b', 'c')) test(r"""pat.match('bc').groups()""", ('b', None, 'b', 'c'))
test(r"""pat.match('bc').groups("")""", ('b', "", 'b', 'c')) test(r"""pat.match('bc').groups("")""", ('b', "", 'b', 'c'))
pat = sre.compile('(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?') pat = sre.compile(r'(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?')
test(r"""pat.match('a').group(1, 2, 3)""", ('a', None, None)) test(r"""pat.match('a').group(1, 2, 3)""", ('a', None, None))
test(r"""pat.match('b').group('a1', 'b2', 'c3')""", (None, 'b', None)) test(r"""pat.match('b').group('a1', 'b2', 'c3')""", (None, 'b', None))
test(r"""pat.match('ac').group(1, 'b2', 3)""", ('a', None, 'c')) test(r"""pat.match('ac').group(1, 'b2', 3)""", ('a', None, 'c'))
@ -203,7 +203,7 @@ def bump_num(matchobj):
try: try:
import pickle import pickle
pat = sre.compile('a(?:b|(c|e){1,2}?|d)+?(.)') pat = sre.compile(r'a(?:b|(c|e){1,2}?|d)+?(.)')
s = pickle.dumps(pat) s = pickle.dumps(pat)
pat = pickle.loads(s) pat = pickle.loads(s)
except: except:
@ -211,7 +211,7 @@ def bump_num(matchobj):
try: try:
import cPickle import cPickle
pat = sre.compile('a(?:b|(c|e){1,2}?|d)+?(.)') pat = sre.compile(r'a(?:b|(c|e){1,2}?|d)+?(.)')
s = cPickle.dumps(pat) s = cPickle.dumps(pat)
pat = cPickle.loads(s) pat = cPickle.loads(s)
except: except:
@ -237,9 +237,12 @@ def bump_num(matchobj):
# Try nasty case that overflows the straightforward recursive # Try nasty case that overflows the straightforward recursive
# implementation of repeated groups. # implementation of repeated groups.
test(r"""sre.match('(x)*', 50000*'x').span()""", (0, 50000), RuntimeError) test(r"""sre.match(r'(x)*', 50000*'x').span()""",
test(r"""sre.match('(x)*y', 50000*'x'+'y').span()""", (0, 50001), RuntimeError) (0, 50000), RuntimeError)
test(r"""sre.match('(x)*?y', 50000*'x'+'y').span()""", (0, 50001), RuntimeError) test(r"""sre.match(r'(x)*y', 50000*'x'+'y').span()""",
(0, 50001), RuntimeError)
test(r"""sre.match(r'(x)*?y', 50000*'x'+'y').span()""",
(0, 50001), RuntimeError)
from re_tests import * from re_tests import *
@ -277,8 +280,7 @@ def bump_num(matchobj):
except (sre.error), msg: except (sre.error), msg:
print '=== Unexpected exception', t, repr(msg) print '=== Unexpected exception', t, repr(msg)
if outcome==SYNTAX_ERROR: if outcome==SYNTAX_ERROR:
# This should have been a syntax error; forget it. print '=== Compiled incorrectly', t
pass
elif outcome==FAIL: elif outcome==FAIL:
if result is None: pass # No match, as expected if result is None: pass # No match, as expected
else: print '=== Succeeded incorrectly', t else: print '=== Succeeded incorrectly', t