summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-07-09 09:48:36 (GMT)
committerGitHub <noreply@github.com>2023-07-09 09:48:36 (GMT)
commit8cb6f9761e3c1cff3210697e3670b57591bf2e7a (patch)
treee15f46e4f85142326f6bb5757e5cb71e835a0e00 /Lib
parentdcc028d92428bd57358a5028ada2a53fc79fc365 (diff)
downloadcpython-8cb6f9761e3c1cff3210697e3670b57591bf2e7a.zip
cpython-8cb6f9761e3c1cff3210697e3670b57591bf2e7a.tar.gz
cpython-8cb6f9761e3c1cff3210697e3670b57591bf2e7a.tar.bz2
Move implementation specific RE tests to separate class (GH-106563)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_re.py135
1 files changed, 69 insertions, 66 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index b1699b0..a6f5af1 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -1046,33 +1046,6 @@ class ReTests(unittest.TestCase):
def test_category(self):
self.assertEqual(re.match(r"(\s)", " ").group(1), " ")
- @cpython_only
- def test_case_helpers(self):
- import _sre
- for i in range(128):
- c = chr(i)
- lo = ord(c.lower())
- self.assertEqual(_sre.ascii_tolower(i), lo)
- self.assertEqual(_sre.unicode_tolower(i), lo)
- iscased = c in string.ascii_letters
- self.assertEqual(_sre.ascii_iscased(i), iscased)
- self.assertEqual(_sre.unicode_iscased(i), iscased)
-
- for i in list(range(128, 0x1000)) + [0x10400, 0x10428]:
- c = chr(i)
- self.assertEqual(_sre.ascii_tolower(i), i)
- if i != 0x0130:
- self.assertEqual(_sre.unicode_tolower(i), ord(c.lower()))
- iscased = c != c.lower() or c != c.upper()
- self.assertFalse(_sre.ascii_iscased(i))
- self.assertEqual(_sre.unicode_iscased(i),
- c != c.lower() or c != c.upper())
-
- self.assertEqual(_sre.ascii_tolower(0x0130), 0x0130)
- self.assertEqual(_sre.unicode_tolower(0x0130), ord('i'))
- self.assertFalse(_sre.ascii_iscased(0x0130))
- self.assertTrue(_sre.unicode_iscased(0x0130))
-
def test_not_literal(self):
self.assertEqual(re.search(r"\s([^a])", " b").group(1), "b")
self.assertEqual(re.search(r"\s([^a]*)", " bb").group(1), "bb")
@@ -1770,20 +1743,6 @@ class ReTests(unittest.TestCase):
pat = re.compile(b'..')
self.assertEqual(pat.sub(lambda m: b'bytes', b'a5'), b'bytes')
- def test_dealloc(self):
- # issue 3299: check for segfault in debug build
- import _sre
- # the overflow limit is different on wide and narrow builds and it
- # depends on the definition of SRE_CODE (see sre.h).
- # 2**128 should be big enough to overflow on both. For smaller values
- # a RuntimeError is raised instead of OverflowError.
- long_overflow = 2**128
- self.assertRaises(TypeError, re.finditer, "a", {})
- with self.assertRaises(OverflowError):
- _sre.compile("abc", 0, [long_overflow], 0, {}, ())
- with self.assertRaises(TypeError):
- _sre.compile({}, 0, [], 0, [], [])
-
def test_search_dot_unicode(self):
self.assertTrue(re.search("123.*-", '123abc-'))
self.assertTrue(re.search("123.*-", '123\xe9-'))
@@ -1841,21 +1800,6 @@ class ReTests(unittest.TestCase):
self.assertRaises(OverflowError, re.compile, r".{%d,}?" % 2**128)
self.assertRaises(OverflowError, re.compile, r".{%d,%d}" % (2**129, 2**128))
- @cpython_only
- def test_repeat_minmax_overflow_maxrepeat(self):
- try:
- from _sre import MAXREPEAT
- except ImportError:
- self.skipTest('requires _sre.MAXREPEAT constant')
- string = "x" * 100000
- self.assertIsNone(re.match(r".{%d}" % (MAXREPEAT - 1), string))
- self.assertEqual(re.match(r".{,%d}" % (MAXREPEAT - 1), string).span(),
- (0, 100000))
- self.assertIsNone(re.match(r".{%d,}?" % (MAXREPEAT - 1), string))
- self.assertRaises(OverflowError, re.compile, r".{%d}" % MAXREPEAT)
- self.assertRaises(OverflowError, re.compile, r".{,%d}" % MAXREPEAT)
- self.assertRaises(OverflowError, re.compile, r".{%d,}?" % MAXREPEAT)
-
def test_backref_group_name_in_exception(self):
# Issue 17341: Poor error message when compiling invalid regex
self.checkPatternError('(?P=<foo>)',
@@ -2418,16 +2362,6 @@ class ReTests(unittest.TestCase):
p.terminate()
p.join()
- def test_sre_template_invalid_group_index(self):
- # see gh-106524
- import _sre
- with self.assertRaises(TypeError) as cm:
- _sre.template("", ["", -1, ""])
- self.assertIn("invalid template", str(cm.exception))
- with self.assertRaises(TypeError) as cm:
- _sre.template("", ["", (), ""])
- self.assertIn("an integer is required", str(cm.exception))
-
def get_debug_out(pat):
with captured_stdout() as out:
@@ -2676,6 +2610,75 @@ class ImplementationTest(unittest.TestCase):
self.assertTrue(hasattr(mod, attr))
del sys.modules[name]
+ @cpython_only
+ def test_case_helpers(self):
+ import _sre
+ for i in range(128):
+ c = chr(i)
+ lo = ord(c.lower())
+ self.assertEqual(_sre.ascii_tolower(i), lo)
+ self.assertEqual(_sre.unicode_tolower(i), lo)
+ iscased = c in string.ascii_letters
+ self.assertEqual(_sre.ascii_iscased(i), iscased)
+ self.assertEqual(_sre.unicode_iscased(i), iscased)
+
+ for i in list(range(128, 0x1000)) + [0x10400, 0x10428]:
+ c = chr(i)
+ self.assertEqual(_sre.ascii_tolower(i), i)
+ if i != 0x0130:
+ self.assertEqual(_sre.unicode_tolower(i), ord(c.lower()))
+ iscased = c != c.lower() or c != c.upper()
+ self.assertFalse(_sre.ascii_iscased(i))
+ self.assertEqual(_sre.unicode_iscased(i),
+ c != c.lower() or c != c.upper())
+
+ self.assertEqual(_sre.ascii_tolower(0x0130), 0x0130)
+ self.assertEqual(_sre.unicode_tolower(0x0130), ord('i'))
+ self.assertFalse(_sre.ascii_iscased(0x0130))
+ self.assertTrue(_sre.unicode_iscased(0x0130))
+
+ @cpython_only
+ def test_dealloc(self):
+ # issue 3299: check for segfault in debug build
+ import _sre
+ # the overflow limit is different on wide and narrow builds and it
+ # depends on the definition of SRE_CODE (see sre.h).
+ # 2**128 should be big enough to overflow on both. For smaller values
+ # a RuntimeError is raised instead of OverflowError.
+ long_overflow = 2**128
+ self.assertRaises(TypeError, re.finditer, "a", {})
+ with self.assertRaises(OverflowError):
+ _sre.compile("abc", 0, [long_overflow], 0, {}, ())
+ with self.assertRaises(TypeError):
+ _sre.compile({}, 0, [], 0, [], [])
+
+ @cpython_only
+ def test_repeat_minmax_overflow_maxrepeat(self):
+ try:
+ from _sre import MAXREPEAT
+ except ImportError:
+ self.skipTest('requires _sre.MAXREPEAT constant')
+ string = "x" * 100000
+ self.assertIsNone(re.match(r".{%d}" % (MAXREPEAT - 1), string))
+ self.assertEqual(re.match(r".{,%d}" % (MAXREPEAT - 1), string).span(),
+ (0, 100000))
+ self.assertIsNone(re.match(r".{%d,}?" % (MAXREPEAT - 1), string))
+ self.assertRaises(OverflowError, re.compile, r".{%d}" % MAXREPEAT)
+ self.assertRaises(OverflowError, re.compile, r".{,%d}" % MAXREPEAT)
+ self.assertRaises(OverflowError, re.compile, r".{%d,}?" % MAXREPEAT)
+
+ @cpython_only
+ def test_sre_template_invalid_group_index(self):
+ # see gh-106524
+ import _sre
+ with self.assertRaises(TypeError) as cm:
+ _sre.template("", ["", -1, ""])
+ self.assertIn("invalid template", str(cm.exception))
+ with self.assertRaises(TypeError) as cm:
+ _sre.template("", ["", (), ""])
+ self.assertIn("an integer is required", str(cm.exception))
+
+
class ExternalTests(unittest.TestCase):
def test_re_benchmarks(self):