summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_bytes.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_bytes.py')
-rw-r--r--Lib/test/test_bytes.py81
1 files changed, 59 insertions, 22 deletions
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index afd506f..a3804a9 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -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