#2650: Refactor the tests for re.escape.

This commit is contained in:
Ezio Melotti 2011-03-25 14:08:44 +02:00
parent 5cf7878fda
commit d2114ebd97

View file

@ -1,7 +1,10 @@
from test.support import verbose, run_unittest from test.support import verbose, run_unittest
import re import re
from re import Scanner from re import Scanner
import sys, os, traceback import os
import sys
import string
import traceback
from weakref import proxy from weakref import proxy
# Misc tests from Tim Peters' re.doc # Misc tests from Tim Peters' re.doc
@ -411,31 +414,46 @@ class ReTests(unittest.TestCase):
self.assertEqual(re.search("\s(b)", " b").group(1), "b") self.assertEqual(re.search("\s(b)", " b").group(1), "b")
self.assertEqual(re.search("a\s", "a ").group(0), "a ") self.assertEqual(re.search("a\s", "a ").group(0), "a ")
def test_re_escape(self): def assertMatch(self, pattern, text, match=None, span=None,
p="" matcher=re.match):
self.assertEqual(re.escape(p), p) if match is None and span is None:
for i in range(0, 256): # the pattern matches the whole text
p = p + chr(i) match = text
self.assertEqual(re.match(re.escape(chr(i)), chr(i)) is not None, span = (0, len(text))
True) elif match is None or span is None:
self.assertEqual(re.match(re.escape(chr(i)), chr(i)).span(), (0,1)) raise ValueError('If match is not None, span should be specified '
'(and vice versa).')
m = matcher(pattern, text)
self.assertTrue(m)
self.assertEqual(m.group(), match)
self.assertEqual(m.span(), span)
pat=re.compile(re.escape(p)) def test_re_escape(self):
self.assertEqual(pat.match(p) is not None, True) alnum_chars = string.ascii_letters + string.digits
self.assertEqual(pat.match(p).span(), (0,256)) p = ''.join(chr(i) for i in range(256))
for c in p:
if c in alnum_chars:
self.assertEqual(re.escape(c), c)
elif c == '\x00':
self.assertEqual(re.escape(c), '\\000')
else:
self.assertEqual(re.escape(c), '\\' + c)
self.assertMatch(re.escape(c), c)
self.assertMatch(re.escape(p), p)
def test_re_escape_byte(self): def test_re_escape_byte(self):
p=b"" alnum_chars = (string.ascii_letters + string.digits).encode('ascii')
self.assertEqual(re.escape(p), p) p = bytes(range(256))
for i in range(0, 256): for i in p:
b = bytes([i]) b = bytes([i])
p += b if b in alnum_chars:
self.assertEqual(re.match(re.escape(b), b) is not None, True) self.assertEqual(re.escape(b), b)
self.assertEqual(re.match(re.escape(b), b).span(), (0,1)) elif i == 0:
self.assertEqual(re.escape(b), b'\\000')
pat=re.compile(re.escape(p)) else:
self.assertEqual(pat.match(p) is not None, True) self.assertEqual(re.escape(b), b'\\' + b)
self.assertEqual(pat.match(p).span(), (0,256)) self.assertMatch(re.escape(b), b)
self.assertMatch(re.escape(p), p)
def pickle_test(self, pickle): def pickle_test(self, pickle):
oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)') oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')