mirror of
https://github.com/python/cpython.git
synced 2025-08-12 04:49:01 +00:00
[3.12] gh-104231: Add more tests for str(), repr(), ascii(), and bytes() (GH-112551) (GH-112555)
(cherry picked from commit 2223899adc
)
This commit is contained in:
parent
88d9142639
commit
ae1ea41cf3
2 changed files with 121 additions and 50 deletions
|
@ -46,6 +46,10 @@ class Indexable:
|
|||
|
||||
class BaseBytesTest:
|
||||
|
||||
def assertTypedEqual(self, actual, expected):
|
||||
self.assertIs(type(actual), type(expected))
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_basics(self):
|
||||
b = self.type2test()
|
||||
self.assertEqual(type(b), self.type2test)
|
||||
|
@ -1023,36 +1027,63 @@ class BytesTest(BaseBytesTest, unittest.TestCase):
|
|||
self.assertRaises(TypeError, f.readinto, b"")
|
||||
|
||||
def test_custom(self):
|
||||
class A:
|
||||
def __bytes__(self):
|
||||
return b'abc'
|
||||
self.assertEqual(bytes(A()), b'abc')
|
||||
class A: pass
|
||||
self.assertRaises(TypeError, bytes, A())
|
||||
class A:
|
||||
def __bytes__(self):
|
||||
return None
|
||||
self.assertRaises(TypeError, bytes, A())
|
||||
class A:
|
||||
self.assertEqual(bytes(BytesSubclass(b'abc')), b'abc')
|
||||
self.assertEqual(BytesSubclass(OtherBytesSubclass(b'abc')),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertEqual(bytes(WithBytes(b'abc')), b'abc')
|
||||
self.assertEqual(BytesSubclass(WithBytes(b'abc')), BytesSubclass(b'abc'))
|
||||
|
||||
class NoBytes: pass
|
||||
self.assertRaises(TypeError, bytes, NoBytes())
|
||||
self.assertRaises(TypeError, bytes, WithBytes('abc'))
|
||||
self.assertRaises(TypeError, bytes, WithBytes(None))
|
||||
class IndexWithBytes:
|
||||
def __bytes__(self):
|
||||
return b'a'
|
||||
def __index__(self):
|
||||
return 42
|
||||
self.assertEqual(bytes(A()), b'a')
|
||||
self.assertEqual(bytes(IndexWithBytes()), b'a')
|
||||
# Issue #25766
|
||||
class A(str):
|
||||
class StrWithBytes(str):
|
||||
def __new__(cls, value):
|
||||
self = str.__new__(cls, '\u20ac')
|
||||
self.value = value
|
||||
return self
|
||||
def __bytes__(self):
|
||||
return b'abc'
|
||||
self.assertEqual(bytes(A('\u20ac')), b'abc')
|
||||
self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
|
||||
return self.value
|
||||
self.assertEqual(bytes(StrWithBytes(b'abc')), b'abc')
|
||||
self.assertEqual(bytes(StrWithBytes(b'abc'), 'iso8859-15'), b'\xa4')
|
||||
self.assertEqual(bytes(StrWithBytes(BytesSubclass(b'abc'))), b'abc')
|
||||
self.assertEqual(BytesSubclass(StrWithBytes(b'abc')), BytesSubclass(b'abc'))
|
||||
self.assertEqual(BytesSubclass(StrWithBytes(b'abc'), 'iso8859-15'),
|
||||
BytesSubclass(b'\xa4'))
|
||||
self.assertEqual(BytesSubclass(StrWithBytes(BytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertEqual(BytesSubclass(StrWithBytes(OtherBytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
# Issue #24731
|
||||
class A:
|
||||
self.assertTypedEqual(bytes(WithBytes(BytesSubclass(b'abc'))), BytesSubclass(b'abc'))
|
||||
self.assertTypedEqual(BytesSubclass(WithBytes(BytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertTypedEqual(BytesSubclass(WithBytes(OtherBytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
|
||||
class BytesWithBytes(bytes):
|
||||
def __new__(cls, value):
|
||||
self = bytes.__new__(cls, b'\xa4')
|
||||
self.value = value
|
||||
return self
|
||||
def __bytes__(self):
|
||||
return OtherBytesSubclass(b'abc')
|
||||
self.assertEqual(bytes(A()), b'abc')
|
||||
self.assertIs(type(bytes(A())), OtherBytesSubclass)
|
||||
self.assertEqual(BytesSubclass(A()), b'abc')
|
||||
self.assertIs(type(BytesSubclass(A())), BytesSubclass)
|
||||
return self.value
|
||||
self.assertTypedEqual(bytes(BytesWithBytes(b'abc')), b'abc')
|
||||
self.assertTypedEqual(BytesSubclass(BytesWithBytes(b'abc')),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertTypedEqual(bytes(BytesWithBytes(BytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertTypedEqual(BytesSubclass(BytesWithBytes(BytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
self.assertTypedEqual(BytesSubclass(BytesWithBytes(OtherBytesSubclass(b'abc'))),
|
||||
BytesSubclass(b'abc'))
|
||||
|
||||
# Test PyBytes_FromFormat()
|
||||
def test_from_format(self):
|
||||
|
@ -2069,6 +2100,12 @@ class BytesSubclass(bytes):
|
|||
class OtherBytesSubclass(bytes):
|
||||
pass
|
||||
|
||||
class WithBytes:
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
def __bytes__(self):
|
||||
return self.value
|
||||
|
||||
class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
|
||||
basetype = bytearray
|
||||
type2test = ByteArraySubclass
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue