@@ -1369,6 +1369,18 @@ def test( self ) :
13691369
13701370class TestBufferProtocol ( unittest .TestCase ) :
13711371
1372+ def __assertMemoryBufferProperties ( self , pythonBuffer , cortexBuffer , elementFormat , ndim , shape , strides ) :
1373+
1374+ self .assertIs ( pythonBuffer .obj , cortexBuffer )
1375+ self .assertTrue ( pythonBuffer .readonly )
1376+ self .assertEqual ( pythonBuffer .format , elementFormat )
1377+ self .assertEqual ( pythonBuffer .ndim , ndim )
1378+ self .assertEqual ( pythonBuffer .shape , shape )
1379+ self .assertEqual ( pythonBuffer .itemsize , struct .calcsize ( elementFormat ) )
1380+ self .assertEqual ( pythonBuffer .strides , strides )
1381+ self .assertTrue ( pythonBuffer .c_contiguous )
1382+ self .assertTrue ( pythonBuffer .contiguous )
1383+
13721384 def testSimpleTypes ( self ) :
13731385
13741386 for elementType , vectorType , elementFormat in [
@@ -1393,15 +1405,99 @@ def testSimpleTypes( self ) :
13931405
13941406 # `memoryview` returns `int` for C `char` / Python `chr` types. Cast to `chr`
13951407 self .assertEqual ( list ( m ) if elementType != chr else [ chr (i ) for i in m ], list ( v ) )
1396- self .assertIs ( m .obj , b )
1397- self .assertTrue ( m .readonly )
1398- self .assertEqual ( m .format , elementFormat )
1399- self .assertEqual ( m .ndim , 1 )
1400- self .assertEqual ( m .shape , ( len ( v ), ) )
1401- self .assertEqual ( m .itemsize , struct .calcsize ( elementFormat ) )
1402- self .assertEqual ( m .strides , ( m .itemsize , ) )
1403- self .assertTrue ( m .c_contiguous )
1404- self .assertTrue ( m .contiguous )
1408+ self .__assertMemoryBufferProperties ( m , b , elementFormat , 1 , ( len ( v ), ), ( m .itemsize , ) )
1409+
1410+ def testMatrixTypes ( self ) :
1411+
1412+ for elementType , vectorType , matrixSize , elementFormat in [
1413+ ( imath .M44f , IECore .M44fVectorData , 4 , "f" ),
1414+ ( imath .M44d , IECore .M44dVectorData , 4 , "d" ),
1415+ ( imath .M33f , IECore .M33fVectorData , 3 , "f" ),
1416+ ( imath .M33d , IECore .M33dVectorData , 3 , "d" ),
1417+ ] :
1418+ with self .subTest ( elementType = elementType , vectorType = vectorType ) :
1419+ v = vectorType (
1420+ [
1421+ elementType ( * list ( range ( 0 , matrixSize * matrixSize ) ) ),
1422+ elementType ( * list ( range ( 1 , 1 + matrixSize * matrixSize ) ) ),
1423+ elementType ( * list ( range ( 2 , 2 + matrixSize * matrixSize ) ) ),
1424+ ]
1425+ )
1426+
1427+ b = v .asReadOnlyBuffer ()
1428+ m = memoryview ( b )
1429+
1430+ self .assertIsNotNone ( m )
1431+ for i in range ( 0 , len ( v ) ) :
1432+ for j in range ( 0 , matrixSize ) :
1433+ for k in range ( 0 , matrixSize ) :
1434+ self .assertEqual ( m .tolist ()[i ][j ][k ], v [i ][j ][k ] )
1435+
1436+ self .__assertMemoryBufferProperties (
1437+ m ,
1438+ b ,
1439+ elementFormat ,
1440+ 3 ,
1441+ ( len ( v ), matrixSize , matrixSize ),
1442+ ( matrixSize * matrixSize * m .itemsize , matrixSize * m .itemsize , m .itemsize )
1443+ )
1444+
1445+ def testQuat ( self ) :
1446+
1447+ for elementType , vectorType , dimensions , elementFormat in [
1448+ ( imath .Quatf , IECore .QuatfVectorData , 4 , "f" ),
1449+ ( imath .Quatd , IECore .QuatdVectorData , 4 , "d" ),
1450+ ] :
1451+ with self .subTest ( elementType = elementType , vectorType = vectorType ) :
1452+ v = vectorType (
1453+ [
1454+ elementType ( * list ( range ( 0 , dimensions ) ) ),
1455+ elementType ( * list ( range ( 1 , 1 + dimensions ) ) ),
1456+ elementType ( * list ( range ( 2 , 2 + dimensions ) ) ),
1457+ ]
1458+ )
1459+
1460+ b = v .asReadOnlyBuffer ()
1461+ m = memoryview ( b )
1462+
1463+ self .assertIsNotNone ( m )
1464+ for i in range ( 0 , len ( v ) ) :
1465+ mList = m .tolist ()
1466+ self .assertEqual ( elementType ( mList [i ][0 ], mList [i ][1 ], mList [i ][2 ], mList [i ][3 ] ), v [i ] )
1467+
1468+ self .__assertMemoryBufferProperties ( m , b , elementFormat , 2 , ( len ( v ), dimensions ), ( dimensions * m .itemsize , m .itemsize ) )
1469+
1470+ def testTwoDimensionalBuffers ( self ) :
1471+
1472+ for elementType , vectorType , dimensions , elementFormat in [
1473+ ( imath .Color3f , IECore .Color3fVectorData , 3 , "f" ),
1474+ ( imath .Color4f , IECore .Color4fVectorData , 4 , "f" ),
1475+ ( imath .V2f , IECore .V2fVectorData , 2 , "f" ),
1476+ ( imath .V2d , IECore .V2dVectorData , 2 , "d" ),
1477+ ( imath .V2i , IECore .V2iVectorData , 2 , "i" ),
1478+ ( imath .V3f , IECore .V3fVectorData , 3 , "f" ),
1479+ ( imath .V3d , IECore .V3dVectorData , 3 , "d" ),
1480+ ( imath .V3i , IECore .V3iVectorData , 3 , "i" ),
1481+ ] :
1482+ with self .subTest ( elementType = elementType , vectorType = vectorType ) :
1483+ v = vectorType (
1484+ [
1485+ elementType ( * list ( range ( 0 , dimensions ) ) ),
1486+ elementType ( * list ( range ( 1 , 1 + dimensions ) ) ),
1487+ elementType ( * list ( range ( 2 , 2 + dimensions ) ) ),
1488+ ]
1489+ )
1490+
1491+ b = v .asReadOnlyBuffer ()
1492+ m = memoryview ( b )
1493+
1494+ self .assertIsNotNone ( m )
1495+ for i in range ( 0 , len ( v ) ) :
1496+ for j in range ( 0 , dimensions ) :
1497+ self .assertEqual ( m .tolist ()[i ][j ], v [i ][j ] )
1498+
1499+ self .__assertMemoryBufferProperties ( m , b , elementFormat , 2 , ( len ( v ), dimensions ), ( dimensions * m .itemsize , m .itemsize ) )
1500+
14051501
14061502 def testReadOnlyBuffer ( self ) :
14071503
0 commit comments