gh-129813, PEP 782: Add PyBytesWriter C API (#138822)

This commit is contained in:
Victor Stinner 2025-09-12 13:41:59 +02:00 committed by GitHub
parent 3d521a62e7
commit adb414044f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 873 additions and 0 deletions

View file

@ -299,5 +299,80 @@ def test_join(self):
bytes_join(b'', NULL)
class BytesWriterTest(unittest.TestCase):
result_type = bytes
def create_writer(self, alloc=0, string=b''):
return _testcapi.PyBytesWriter(alloc, string, 0)
def test_create(self):
# Test PyBytesWriter_Create()
writer = self.create_writer()
self.assertEqual(writer.get_size(), 0)
self.assertEqual(writer.finish(), self.result_type(b''))
writer = self.create_writer(3, b'abc')
self.assertEqual(writer.get_size(), 3)
self.assertEqual(writer.finish(), self.result_type(b'abc'))
writer = self.create_writer(10, b'abc')
self.assertEqual(writer.get_size(), 10)
self.assertEqual(writer.finish_with_size(3), self.result_type(b'abc'))
def test_write_bytes(self):
# Test PyBytesWriter_WriteBytes()
writer = self.create_writer()
writer.write_bytes(b'Hello World!', -1)
self.assertEqual(writer.finish(), self.result_type(b'Hello World!'))
writer = self.create_writer()
writer.write_bytes(b'Hello ', -1)
writer.write_bytes(b'World! <truncated>', 6)
self.assertEqual(writer.finish(), self.result_type(b'Hello World!'))
def test_resize(self):
# Test PyBytesWriter_Resize()
writer = self.create_writer()
writer.resize(len(b'number=123456'), b'number=123456')
writer.resize(len(b'number=123456'), b'')
self.assertEqual(writer.get_size(), len(b'number=123456'))
self.assertEqual(writer.finish(), self.result_type(b'number=123456'))
writer = self.create_writer()
writer.resize(0, b'')
writer.resize(len(b'number=123456'), b'number=123456')
self.assertEqual(writer.finish(), self.result_type(b'number=123456'))
writer = self.create_writer()
writer.resize(len(b'number='), b'number=')
writer.resize(len(b'number=123456'), b'123456')
self.assertEqual(writer.finish(), self.result_type(b'number=123456'))
writer = self.create_writer()
writer.resize(len(b'number='), b'number=')
writer.resize(len(b'number='), b'')
writer.resize(len(b'number=123456'), b'123456')
self.assertEqual(writer.finish(), self.result_type(b'number=123456'))
writer = self.create_writer()
writer.resize(len(b'number'), b'number')
writer.resize(len(b'number='), b'=')
writer.resize(len(b'number=123'), b'123')
writer.resize(len(b'number=123456'), b'456')
self.assertEqual(writer.finish(), self.result_type(b'number=123456'))
def test_example_abc(self):
self.assertEqual(_testcapi.byteswriter_abc(), b'abc')
def test_example_resize(self):
self.assertEqual(_testcapi.byteswriter_resize(), b'Hello World')
class ByteArrayWriterTest(BytesWriterTest):
result_type = bytearray
def create_writer(self, alloc=0, string=b''):
return _testcapi.PyBytesWriter(alloc, string, 1)
if __name__ == "__main__":
unittest.main()