summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-11-21 15:35:08 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-11-21 15:35:08 (GMT)
commitb44fb128ae5d9562f00a944e2d22392235073a69 (patch)
treea02c44010193373a6766920250f2bfbd1af03f21 /Lib
parenta2f7ee8b26e00124c0587932364b26635af84c45 (diff)
downloadcpython-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.py47
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):