@@ -185,18 +185,32 @@ class T(base):
185185 self .assertRaises (TypeError , setattr , T , "_fields_" , [("x" , typ )])
186186
187187 def test_struct_struct (self ):
188- # Nested structures with different byte order not (yet) supported
189- if sys .byteorder == "little" :
190- base = BigEndianStructure
191- else :
192- base = LittleEndianStructure
193-
194- class T (Structure ):
195- _fields_ = [("a" , c_int ),
196- ("b" , c_int )]
197- class S (base ):
198- pass
199- self .assertRaises (TypeError , setattr , S , "_fields_" , [("s" , T )])
188+ # nested structures with different byteorders
189+
190+ # create nested structures with given byteorders and set memory to data
191+ def set_structures (endianness , nested_endianness , data ):
192+ class NestedStructure (nested_endianness ):
193+ _fields_ = [("x" , c_uint32 ),
194+ ("y" , c_uint32 )]
195+
196+ class TestStructure (endianness ):
197+ _fields_ = [("point" , NestedStructure )]
198+
199+ self .assertEqual (len (data ), sizeof (TestStructure ))
200+ return cast (data , POINTER (TestStructure ))[0 ]
201+
202+ for nested , data in (
203+ (BigEndianStructure , b'\0 \0 \0 \1 \0 \0 \0 \2 ' ),
204+ (LittleEndianStructure , b'\1 \0 \0 \0 \2 \0 \0 \0 ' ),
205+ ):
206+ for parent in (
207+ BigEndianStructure ,
208+ LittleEndianStructure ,
209+ Structure ,
210+ ):
211+ s = set_structures (parent , nested , data )
212+ self .assertEqual (s .point .x , 1 )
213+ self .assertEqual (s .point .y , 2 )
200214
201215 def test_struct_fields_2 (self ):
202216 # standard packing in struct uses no alignment.
0 commit comments