diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-11-21 15:35:08 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-11-21 15:35:08 (GMT) |
commit | b44fb128ae5d9562f00a944e2d22392235073a69 (patch) | |
tree | a02c44010193373a6766920250f2bfbd1af03f21 /Lib | |
parent | a2f7ee8b26e00124c0587932364b26635af84c45 (diff) | |
download | cpython-b44fb128ae5d9562f00a944e2d22392235073a69.zip cpython-b44fb128ae5d9562f00a944e2d22392235073a69.tar.gz cpython-b44fb128ae5d9562f00a944e2d22392235073a69.tar.bz2 |
Implement rich comparison for _sre.SRE_Pattern
Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created by
re.compile(), become comparable (only x==y and x!=y operators). This change
should fix the issue #18383: don't duplicate warning filters when the warnings
module is reloaded (thing usually only done in unit tests).
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_re.py | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index aac3a2c..4fcd2d4 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -3,12 +3,13 @@ from test.support import verbose, run_unittest, gc_collect, bigmemtest, _2G, \ import io import locale import re -from re import Scanner import sre_compile -import sys import string +import sys import traceback import unittest +import warnings +from re import Scanner from weakref import proxy # Misc tests from Tim Peters' re.doc @@ -1777,6 +1778,48 @@ SUBPATTERN None 0 0 self.assertIn('ASCII', str(re.A)) self.assertIn('DOTALL', str(re.S)) + def test_pattern_compare(self): + pattern1 = re.compile('abc', re.IGNORECASE) + + # equal + re.purge() + pattern2 = re.compile('abc', re.IGNORECASE) + self.assertEqual(hash(pattern2), hash(pattern1)) + self.assertEqual(pattern2, pattern1) + + # not equal: different pattern + re.purge() + pattern3 = re.compile('XYZ', re.IGNORECASE) + # Don't test hash(pattern3) != hash(pattern1) because there is no + # warranty that hash values are different + self.assertNotEqual(pattern3, pattern1) + + # not equal: different flag (flags=0) + re.purge() + pattern4 = re.compile('abc') + self.assertNotEqual(pattern4, pattern1) + + # only == and != comparison operators are supported + with self.assertRaises(TypeError): + pattern1 < pattern2 + + def test_pattern_compare_bytes(self): + pattern1 = re.compile(b'abc') + + # equal: test bytes patterns + re.purge() + pattern2 = re.compile(b'abc') + self.assertEqual(hash(pattern2), hash(pattern1)) + self.assertEqual(pattern2, pattern1) + + # not equal: pattern of a different types (str vs bytes), + # comparison must not raise a BytesWarning + re.purge() + pattern3 = re.compile('abc') + with warnings.catch_warnings(): + warnings.simplefilter('error', BytesWarning) + self.assertNotEqual(pattern3, pattern1) + class PatternReprTests(unittest.TestCase): def check(self, pattern, expected): |