github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/pybind11/tests/test_buffers.py (about) 1 import ctypes 2 import io 3 import struct 4 5 import pytest 6 7 import env 8 from pybind11_tests import ConstructorStats 9 from pybind11_tests import buffers as m 10 11 np = pytest.importorskip("numpy") 12 13 14 def test_from_python(): 15 with pytest.raises(RuntimeError) as excinfo: 16 m.Matrix(np.array([1, 2, 3])) # trying to assign a 1D array 17 assert str(excinfo.value) == "Incompatible buffer format!" 18 19 m3 = np.array([[1, 2, 3], [4, 5, 6]]).astype(np.float32) 20 m4 = m.Matrix(m3) 21 22 for i in range(m4.rows()): 23 for j in range(m4.cols()): 24 assert m3[i, j] == m4[i, j] 25 26 cstats = ConstructorStats.get(m.Matrix) 27 assert cstats.alive() == 1 28 del m3, m4 29 assert cstats.alive() == 0 30 assert cstats.values() == ["2x3 matrix"] 31 assert cstats.copy_constructions == 0 32 # assert cstats.move_constructions >= 0 # Don't invoke any 33 assert cstats.copy_assignments == 0 34 assert cstats.move_assignments == 0 35 36 37 # https://foss.heptapod.net/pypy/pypy/-/issues/2444 38 # TODO: fix on recent PyPy 39 @pytest.mark.xfail( 40 env.PYPY, reason="PyPy 7.3.7 doesn't clear this anymore", strict=False 41 ) 42 def test_to_python(): 43 mat = m.Matrix(5, 4) 44 assert memoryview(mat).shape == (5, 4) 45 46 assert mat[2, 3] == 0 47 mat[2, 3] = 4.0 48 mat[3, 2] = 7.0 49 assert mat[2, 3] == 4 50 assert mat[3, 2] == 7 51 assert struct.unpack_from("f", mat, (3 * 4 + 2) * 4) == (7,) 52 assert struct.unpack_from("f", mat, (2 * 4 + 3) * 4) == (4,) 53 54 mat2 = np.array(mat, copy=False) 55 assert mat2.shape == (5, 4) 56 assert abs(mat2).sum() == 11 57 assert mat2[2, 3] == 4 and mat2[3, 2] == 7 58 mat2[2, 3] = 5 59 assert mat2[2, 3] == 5 60 61 cstats = ConstructorStats.get(m.Matrix) 62 assert cstats.alive() == 1 63 del mat 64 pytest.gc_collect() 65 assert cstats.alive() == 1 66 del mat2 # holds a mat reference 67 pytest.gc_collect() 68 assert cstats.alive() == 0 69 assert cstats.values() == ["5x4 matrix"] 70 assert cstats.copy_constructions == 0 71 # assert cstats.move_constructions >= 0 # Don't invoke any 72 assert cstats.copy_assignments == 0 73 assert cstats.move_assignments == 0 74 75 76 def test_inherited_protocol(): 77 """SquareMatrix is derived from Matrix and inherits the buffer protocol""" 78 79 matrix = m.SquareMatrix(5) 80 assert memoryview(matrix).shape == (5, 5) 81 assert np.asarray(matrix).shape == (5, 5) 82 83 84 def test_pointer_to_member_fn(): 85 for cls in [m.Buffer, m.ConstBuffer, m.DerivedBuffer]: 86 buf = cls() 87 buf.value = 0x12345678 88 value = struct.unpack("i", bytearray(buf))[0] 89 assert value == 0x12345678 90 91 92 def test_readonly_buffer(): 93 buf = m.BufferReadOnly(0x64) 94 view = memoryview(buf) 95 assert view[0] == 0x64 96 assert view.readonly 97 with pytest.raises(TypeError): 98 view[0] = 0 99 100 101 def test_selective_readonly_buffer(): 102 buf = m.BufferReadOnlySelect() 103 104 memoryview(buf)[0] = 0x64 105 assert buf.value == 0x64 106 107 io.BytesIO(b"A").readinto(buf) 108 assert buf.value == ord(b"A") 109 110 buf.readonly = True 111 with pytest.raises(TypeError): 112 memoryview(buf)[0] = 0 113 with pytest.raises(TypeError): 114 io.BytesIO(b"1").readinto(buf) 115 116 117 def test_ctypes_array_1d(): 118 char1d = (ctypes.c_char * 10)() 119 int1d = (ctypes.c_int * 15)() 120 long1d = (ctypes.c_long * 7)() 121 122 for carray in (char1d, int1d, long1d): 123 info = m.get_buffer_info(carray) 124 assert info.itemsize == ctypes.sizeof(carray._type_) 125 assert info.size == len(carray) 126 assert info.ndim == 1 127 assert info.shape == [info.size] 128 assert info.strides == [info.itemsize] 129 assert not info.readonly 130 131 132 def test_ctypes_array_2d(): 133 char2d = ((ctypes.c_char * 10) * 4)() 134 int2d = ((ctypes.c_int * 15) * 3)() 135 long2d = ((ctypes.c_long * 7) * 2)() 136 137 for carray in (char2d, int2d, long2d): 138 info = m.get_buffer_info(carray) 139 assert info.itemsize == ctypes.sizeof(carray[0]._type_) 140 assert info.size == len(carray) * len(carray[0]) 141 assert info.ndim == 2 142 assert info.shape == [len(carray), len(carray[0])] 143 assert info.strides == [info.itemsize * len(carray[0]), info.itemsize] 144 assert not info.readonly 145 146 147 def test_ctypes_from_buffer(): 148 test_pystr = b"0123456789" 149 for pyarray in (test_pystr, bytearray(test_pystr)): 150 pyinfo = m.get_buffer_info(pyarray) 151 152 if pyinfo.readonly: 153 cbytes = (ctypes.c_char * len(pyarray)).from_buffer_copy(pyarray) 154 cinfo = m.get_buffer_info(cbytes) 155 else: 156 cbytes = (ctypes.c_char * len(pyarray)).from_buffer(pyarray) 157 cinfo = m.get_buffer_info(cbytes) 158 159 assert cinfo.size == pyinfo.size 160 assert cinfo.ndim == pyinfo.ndim 161 assert cinfo.shape == pyinfo.shape 162 assert cinfo.strides == pyinfo.strides 163 assert not cinfo.readonly