|
5 | 5 | create_string_buffer, string_at,
|
6 | 6 | create_unicode_buffer, wstring_at,
|
7 | 7 | memmove, memset,
|
8 |
| - c_char_p, c_byte, c_ubyte, c_wchar) |
| 8 | + memoryview_at, c_void_p, |
| 9 | + c_char_p, c_byte, c_ubyte, c_wchar, |
| 10 | + addressof, byref) |
9 | 11 |
|
10 | 12 |
|
11 | 13 | class MemFunctionsTest(unittest.TestCase):
|
@@ -77,6 +79,62 @@ def test_wstring_at(self):
|
77 | 79 | self.assertEqual(wstring_at(a, 16), "Hello, World\0\0\0\0")
|
78 | 80 | self.assertEqual(wstring_at(a, 0), "")
|
79 | 81 |
|
| 82 | + def test_memoryview_at(self): |
| 83 | + b = (c_byte * 10)() |
| 84 | + |
| 85 | + size = len(b) |
| 86 | + for foreign_ptr in ( |
| 87 | + b, |
| 88 | + cast(b, c_void_p), |
| 89 | + byref(b), |
| 90 | + addressof(b), |
| 91 | + ): |
| 92 | + with self.subTest(foreign_ptr=type(foreign_ptr).__name__): |
| 93 | + b[:] = b"initialval" |
| 94 | + v = memoryview_at(foreign_ptr, size) |
| 95 | + self.assertIsInstance(v, memoryview) |
| 96 | + self.assertEqual(bytes(v), b"initialval") |
| 97 | + |
| 98 | + # test that writes to source buffer get reflected in memoryview |
| 99 | + b[:] = b"0123456789" |
| 100 | + self.assertEqual(bytes(v), b"0123456789") |
| 101 | + |
| 102 | + # test that writes to memoryview get reflected in source buffer |
| 103 | + v[:] = b"9876543210" |
| 104 | + self.assertEqual(bytes(b), b"9876543210") |
| 105 | + |
| 106 | + with self.assertRaises(ValueError): |
| 107 | + memoryview_at(foreign_ptr, -1) |
| 108 | + |
| 109 | + with self.assertRaises(ValueError): |
| 110 | + memoryview_at(foreign_ptr, sys.maxsize + 1) |
| 111 | + |
| 112 | + v0 = memoryview_at(foreign_ptr, 0) |
| 113 | + self.assertEqual(bytes(v0), b'') |
| 114 | + |
| 115 | + def test_memoryview_at_readonly(self): |
| 116 | + b = (c_byte * 10)() |
| 117 | + |
| 118 | + size = len(b) |
| 119 | + for foreign_ptr in ( |
| 120 | + b, |
| 121 | + cast(b, c_void_p), |
| 122 | + byref(b), |
| 123 | + addressof(b), |
| 124 | + ): |
| 125 | + with self.subTest(foreign_ptr=type(foreign_ptr).__name__): |
| 126 | + b[:] = b"initialval" |
| 127 | + v = memoryview_at(foreign_ptr, size, readonly=True) |
| 128 | + self.assertIsInstance(v, memoryview) |
| 129 | + self.assertEqual(bytes(v), b"initialval") |
| 130 | + |
| 131 | + # test that writes to source buffer get reflected in memoryview |
| 132 | + b[:] = b"0123456789" |
| 133 | + self.assertEqual(bytes(v), b"0123456789") |
| 134 | + |
| 135 | + # test that writes to the memoryview are blocked |
| 136 | + with self.assertRaises(TypeError): |
| 137 | + v[:] = b"9876543210" |
80 | 138 |
|
81 | 139 | if __name__ == "__main__":
|
82 | 140 | unittest.main()
|
0 commit comments