import unittest from test.support import import_helper _testlimitedcapi = import_helper.import_module('_testlimitedcapi') from _testcapi import PY_SSIZE_T_MIN, PY_SSIZE_T_MAX NULL = None class ByteArraySubclass(bytearray): pass class BytesLike: def __init__(self, value): self.value = value def __bytes__(self): return self.value class CAPITest(unittest.TestCase): def test_check(self): # Test PyByteArray_Check() check = _testlimitedcapi.bytearray_check self.assertTrue(check(bytearray(b'abc'))) self.assertFalse(check(b'abc')) self.assertTrue(check(ByteArraySubclass(b'abc'))) self.assertFalse(check(BytesLike(b'abc'))) self.assertFalse(check(3)) self.assertFalse(check([])) self.assertFalse(check(object())) # CRASHES check(NULL) def test_checkexact(self): # Test PyByteArray_CheckExact() check = _testlimitedcapi.bytearray_checkexact self.assertTrue(check(bytearray(b'abc'))) self.assertFalse(check(b'abc')) self.assertFalse(check(ByteArraySubclass(b'abc'))) self.assertFalse(check(BytesLike(b'abc'))) self.assertFalse(check(3)) self.assertFalse(check([])) self.assertFalse(check(object())) # CRASHES check(NULL) def test_fromstringandsize(self): # Test PyByteArray_FromStringAndSize() fromstringandsize = _testlimitedcapi.bytearray_fromstringandsize self.assertEqual(fromstringandsize(b'abc'), bytearray(b'abc')) self.assertEqual(fromstringandsize(b'abc', 2), bytearray(b'ab')) self.assertEqual(fromstringandsize(b'abc\0def'), bytearray(b'abc\0def')) self.assertEqual(fromstringandsize(b'', 0), bytearray()) self.assertEqual(fromstringandsize(NULL, 0), bytearray()) self.assertEqual(len(fromstringandsize(NULL, 3)), 3) self.assertRaises(MemoryError, fromstringandsize, NULL, PY_SSIZE_T_MAX) self.assertRaises(SystemError, fromstringandsize, b'abc', -1) self.assertRaises(SystemError, fromstringandsize, b'abc', PY_SSIZE_T_MIN) self.assertRaises(SystemError, fromstringandsize, NULL, -1) self.assertRaises(SystemError, fromstringandsize, NULL, PY_SSIZE_T_MIN) def test_fromobject(self): # Test PyByteArray_FromObject() fromobject = _testlimitedcapi.bytearray_fromobject self.assertEqual(fromobject(b'abc'), bytearray(b'abc')) self.assertEqual(fromobject(bytearray(b'abc')), bytearray(b'abc')) self.assertEqual(fromobject(ByteArraySubclass(b'abc')), bytearray(b'abc')) self.assertEqual(fromobject([97, 98, 99]), bytearray(b'abc')) self.assertEqual(fromobject(3), bytearray(b'\0\0\0')) self.assertRaises(TypeError, fromobject, BytesLike(b'abc')) self.assertRaises(TypeError, fromobject, 'abc') self.assertRaises(TypeError, fromobject, object()) # CRASHES fromobject(NULL) def test_size(self): # Test PyByteArray_Size() size = _testlimitedcapi.bytearray_size self.assertEqual(size(bytearray(b'abc')), 3) self.assertEqual(size(ByteArraySubclass(b'abc')), 3) # CRASHES size(b'abc') # CRASHES size(object()) # CRASHES size(NULL) def test_asstring(self): """Test PyByteArray_AsString()""" asstring = _testlimitedcapi.bytearray_asstring self.assertEqual(asstring(bytearray(b'abc'), 4), b'abc\0') self.assertEqual(asstring(ByteArraySubclass(b'abc'), 4), b'abc\0') self.assertEqual(asstring(bytearray(b'abc\0def'), 8), b'abc\0def\0') # CRASHES asstring(b'abc', 0) # CRASHES asstring(object()', 0) # CRASHES asstring(NULL, 0) def test_concat(self): """Test PyByteArray_Concat()""" concat = _testlimitedcapi.bytearray_concat ba = bytearray(b'abc') self.assertEqual(concat(ba, b'def'), bytearray(b'abcdef')) self.assertEqual(ba, b'abc') self.assertEqual(concat(b'abc', b'def'), bytearray(b'abcdef')) self.assertEqual(concat(b'a\0b', b'c\0d'), bytearray(b'a\0bc\0d')) self.assertEqual(concat(bytearray(b'abc'), b'def'), bytearray(b'abcdef')) self.assertEqual(concat(b'abc', bytearray(b'def')), bytearray(b'abcdef')) self.assertEqual(concat(bytearray(b'abc'), b''), bytearray(b'abc')) self.assertEqual(concat(b'', bytearray(b'def')), bytearray(b'def')) self.assertEqual(concat(memoryview(b'xabcy')[1:4], b'def'), bytearray(b'abcdef')) self.assertEqual(concat(b'abc', memoryview(b'xdefy')[1:4]), bytearray(b'abcdef')) self.assertRaises(TypeError, concat, memoryview(b'axbycz')[::2], b'def') self.assertRaises(TypeError, concat, b'abc', memoryview(b'dxeyfz')[::2]) self.assertRaises(TypeError, concat, b'abc', 'def') self.assertRaises(TypeError, concat, 'abc', b'def') self.assertRaises(TypeError, concat, 'abc', 'def') self.assertRaises(TypeError, concat, [], b'def') self.assertRaises(TypeError, concat, b'abc', []) self.assertRaises(TypeError, concat, [], []) # CRASHES concat(NULL, bytearray(b'def')) # CRASHES concat(bytearray(b'abc'), NULL) # CRASHES concat(NULL, object()) # CRASHES concat(object(), NULL) def test_resize(self): """Test PyByteArray_Resize()""" resize = _testlimitedcapi.bytearray_resize ba = bytearray(b'abcdef') self.assertEqual(resize(ba, 3), 0) self.assertEqual(ba, bytearray(b'abc')) self.assertEqual(resize(ba, 10), 0) self.assertEqual(len(ba), 10) self.assertEqual(ba[:3], bytearray(b'abc')) self.assertEqual(resize(ba, 2**20), 0) self.assertEqual(len(ba), 2**20) self.assertEqual(ba[:3], bytearray(b'abc')) self.assertEqual(resize(ba, 0), 0) self.assertEqual(ba, bytearray()) ba = ByteArraySubclass(b'abcdef') self.assertEqual(resize(ba, 3), 0) self.assertEqual(ba, bytearray(b'abc')) self.assertRaises(MemoryError, resize, bytearray(), PY_SSIZE_T_MAX) self.assertRaises(MemoryError, resize, bytearray(1000), PY_SSIZE_T_MAX) # CRASHES resize(bytearray(b'abc'), -1) # CRASHES resize(b'abc', 0) # CRASHES resize(object(), 0) # CRASHES resize(NULL, 0) if __name__ == "__main__": unittest.main()