Kaydet (Commit) ccb7ca72 authored tarafından Max Bernstein's avatar Max Bernstein Kaydeden (comit) Dino Viehland

bpo-36929: Modify io/re tests to allow for missing mod name (#13392)

* bpo-36929: Modify io/re tests to allow for missing mod name

For a vanishingly small number of internal types, CPython sets the
tp_name slot to mod_name.type_name, either in the PyTypeObject or the
PyType_Spec. There are a few minor places where this surfaces:

* Custom repr functions for those types (some of which ignore the
  tp_name in favor of using a string literal, such as _io.TextIOWrapper)
* Pickling error messages

The test suite only tests the former. This commit modifies the test
suite to allow Python implementations to omit the module prefix.

https://bugs.python.org/issue36929
üst ad098b67
...@@ -1119,12 +1119,12 @@ class CommonBufferedTests: ...@@ -1119,12 +1119,12 @@ class CommonBufferedTests:
def test_repr(self): def test_repr(self):
raw = self.MockRawIO() raw = self.MockRawIO()
b = self.tp(raw) b = self.tp(raw)
clsname = "%s.%s" % (self.tp.__module__, self.tp.__qualname__) clsname = r"(%s\.)?%s" % (self.tp.__module__, self.tp.__qualname__)
self.assertEqual(repr(b), "<%s>" % clsname) self.assertRegex(repr(b), "<%s>" % clsname)
raw.name = "dummy" raw.name = "dummy"
self.assertEqual(repr(b), "<%s name='dummy'>" % clsname) self.assertRegex(repr(b), "<%s name='dummy'>" % clsname)
raw.name = b"dummy" raw.name = b"dummy"
self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) self.assertRegex(repr(b), "<%s name=b'dummy'>" % clsname)
def test_recursive_repr(self): def test_recursive_repr(self):
# Issue #25455 # Issue #25455
...@@ -2598,17 +2598,17 @@ class TextIOWrapperTest(unittest.TestCase): ...@@ -2598,17 +2598,17 @@ class TextIOWrapperTest(unittest.TestCase):
b = self.BufferedReader(raw) b = self.BufferedReader(raw)
t = self.TextIOWrapper(b, encoding="utf-8") t = self.TextIOWrapper(b, encoding="utf-8")
modname = self.TextIOWrapper.__module__ modname = self.TextIOWrapper.__module__
self.assertEqual(repr(t), self.assertRegex(repr(t),
"<%s.TextIOWrapper encoding='utf-8'>" % modname) r"<(%s\.)?TextIOWrapper encoding='utf-8'>" % modname)
raw.name = "dummy" raw.name = "dummy"
self.assertEqual(repr(t), self.assertRegex(repr(t),
"<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname) r"<(%s\.)?TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
t.mode = "r" t.mode = "r"
self.assertEqual(repr(t), self.assertRegex(repr(t),
"<%s.TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname) r"<(%s\.)?TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname)
raw.name = b"dummy" raw.name = b"dummy"
self.assertEqual(repr(t), self.assertRegex(repr(t),
"<%s.TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname) r"<(%s\.)?TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname)
t.buffer.detach() t.buffer.detach()
repr(t) # Should not raise an exception repr(t) # Should not raise an exception
...@@ -4174,11 +4174,11 @@ class CMiscIOTest(MiscIOTest): ...@@ -4174,11 +4174,11 @@ class CMiscIOTest(MiscIOTest):
err = res.err.decode() err = res.err.decode()
if res.rc != 0: if res.rc != 0:
# Failure: should be a fatal error # Failure: should be a fatal error
self.assertIn("Fatal Python error: could not acquire lock " pattern = (r"Fatal Python error: could not acquire lock "
"for <_io.BufferedWriter name='<{stream_name}>'> " r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> "
"at interpreter shutdown, possibly due to " r"at interpreter shutdown, possibly due to "
"daemon threads".format_map(locals()), r"daemon threads".format_map(locals()))
err) self.assertRegex(err, pattern)
else: else:
self.assertFalse(err.strip('.!')) self.assertFalse(err.strip('.!'))
......
...@@ -1761,24 +1761,28 @@ class ReTests(unittest.TestCase): ...@@ -1761,24 +1761,28 @@ class ReTests(unittest.TestCase):
def test_match_repr(self): def test_match_repr(self):
for string in '[abracadabra]', S('[abracadabra]'): for string in '[abracadabra]', S('[abracadabra]'):
m = re.search(r'(.+)(.*?)\1', string) m = re.search(r'(.+)(.*?)\1', string)
self.assertEqual(repr(m), "<%s.%s object; " pattern = r"<(%s\.)?%s object; span=\(1, 12\), match='abracadabra'>" % (
"span=(1, 12), match='abracadabra'>" % type(m).__module__, type(m).__qualname__
(type(m).__module__, type(m).__qualname__)) )
self.assertRegex(repr(m), pattern)
for string in (b'[abracadabra]', B(b'[abracadabra]'), for string in (b'[abracadabra]', B(b'[abracadabra]'),
bytearray(b'[abracadabra]'), bytearray(b'[abracadabra]'),
memoryview(b'[abracadabra]')): memoryview(b'[abracadabra]')):
m = re.search(br'(.+)(.*?)\1', string) m = re.search(br'(.+)(.*?)\1', string)
self.assertEqual(repr(m), "<%s.%s object; " pattern = r"<(%s\.)?%s object; span=\(1, 12\), match=b'abracadabra'>" % (
"span=(1, 12), match=b'abracadabra'>" % type(m).__module__, type(m).__qualname__
(type(m).__module__, type(m).__qualname__)) )
self.assertRegex(repr(m), pattern)
first, second = list(re.finditer("(aa)|(bb)", "aa bb")) first, second = list(re.finditer("(aa)|(bb)", "aa bb"))
self.assertEqual(repr(first), "<%s.%s object; " pattern = r"<(%s\.)?%s object; span=\(0, 2\), match='aa'>" % (
"span=(0, 2), match='aa'>" % type(second).__module__, type(second).__qualname__
(type(second).__module__, type(first).__qualname__)) )
self.assertEqual(repr(second), "<%s.%s object; " self.assertRegex(repr(first), pattern)
"span=(3, 5), match='bb'>" % pattern = r"<(%s\.)?%s object; span=\(3, 5\), match='bb'>" % (
(type(second).__module__, type(second).__qualname__)) type(second).__module__, type(second).__qualname__
)
self.assertRegex(repr(second), pattern)
def test_zerowidth(self): def test_zerowidth(self):
# Issues 852532, 1647489, 3262, 25054. # Issues 852532, 1647489, 3262, 25054.
......
...@@ -143,6 +143,7 @@ Michel Van den Bergh ...@@ -143,6 +143,7 @@ Michel Van den Bergh
Julian Berman Julian Berman
Brice Berna Brice Berna
Olivier Bernard Olivier Bernard
Maxwell Bernstein
Eric Beser Eric Beser
Steven Bethard Steven Bethard
Stephen Bevan Stephen Bevan
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment