1
1
from ctypes import (
2
- c_char , c_uint32 , c_ubyte , c_byte , alignment , sizeof ,
2
+ c_char , c_uint32 , c_uint16 , c_ubyte , c_byte , alignment , sizeof ,
3
3
BigEndianStructure , LittleEndianStructure ,
4
4
BigEndianUnion , LittleEndianUnion ,
5
5
)
@@ -17,7 +17,7 @@ def test_aligned_string(self):
17
17
class Aligned (base ):
18
18
_align_ = 16
19
19
_fields_ = [
20
- ('value' , c_char * 16 ),
20
+ ('value' , c_char * 12 )
21
21
]
22
22
23
23
class Main (base ):
@@ -37,21 +37,20 @@ class Main(base):
37
37
38
38
def test_aligned_structures (self ):
39
39
for base , data in (
40
- (LittleEndianStructure , bytearray (b"\1 \0 \0 \0 \1 \0 \1 \0 \7 \0 \0 \0 " )),
41
- (BigEndianStructure , bytearray (b"\1 \0 \0 \0 \1 \0 \1 \ 0\0 \0 \0 \7 " )),
40
+ (LittleEndianStructure , bytearray (b"\1 \0 \0 \0 \1 \0 \0 \0 \7 \0 \0 \0 " )),
41
+ (BigEndianStructure , bytearray (b"\1 \0 \0 \0 \1 \0 \0 \0 \7 \ 0\0 \0 " )),
42
42
):
43
43
class SomeBools (base ):
44
44
_align_ = 4
45
45
_fields_ = [
46
46
("bool1" , c_ubyte ),
47
47
("bool2" , c_ubyte ),
48
- ("bool3" , c_ubyte ),
49
48
]
50
49
class Main (base ):
51
50
_fields_ = [
52
51
("x" , c_ubyte ),
53
52
("y" , SomeBools ),
54
- ("z" , c_uint32 ),
53
+ ("z" , c_ubyte ),
55
54
]
56
55
57
56
main = Main .from_buffer (data )
@@ -63,7 +62,6 @@ class Main(base):
63
62
self .assertEqual (Main .y .size , 4 )
64
63
self .assertEqual (main .y .bool1 , True )
65
64
self .assertEqual (main .y .bool2 , False )
66
- self .assertEqual (main .y .bool3 , True )
67
65
self .assertEqual (Main .z .offset , 8 )
68
66
self .assertEqual (main .z , 7 )
69
67
@@ -189,28 +187,38 @@ class Main(sbase):
189
187
self .assertEqual (main .union .b .y , 4 )
190
188
191
189
def test_smaller_aligned_subclassed_union (self ):
192
- for ubase , e in (
193
- (LittleEndianUnion , "<" ),
194
- (BigEndianUnion , ">" ),
190
+ for sbase , ubase , e in (
191
+ (LittleEndianStructure , LittleEndianUnion , "<" ),
192
+ (BigEndianStructure , BigEndianUnion , ">" ),
195
193
):
196
- data = bytearray (struct .pack (f"{ e } I " , 0xD60102D6 ))
194
+ data = bytearray (struct .pack (f"{ e } H2xI " , 1 , 0xD60102D7 ))
197
195
class SubUnion (ubase ):
198
196
_align_ = 2
199
197
_fields_ = [
200
198
("unsigned" , c_ubyte ),
201
199
("signed" , c_byte ),
202
200
]
203
201
204
- class Main (SubUnion ):
202
+ class MainUnion (SubUnion ):
205
203
_fields_ = [
206
204
("num" , c_uint32 )
207
205
]
208
206
207
+ class Main (sbase ):
208
+ _fields_ = [
209
+ ("first" , c_uint16 ),
210
+ ("union" , MainUnion ),
211
+ ]
212
+
209
213
main = Main .from_buffer (data )
214
+ self .assertEqual (main .union .num , 0xD60102D7 )
215
+ self .assertEqual (main .union .unsigned , data [4 ])
216
+ self .assertEqual (main .union .signed , data [4 ] - 256 )
210
217
self .assertEqual (alignment (main ), 4 )
211
- self .assertEqual (main .num , 0xD60102D6 )
212
- self .assertEqual (main .unsigned , 0xD6 )
213
- self .assertEqual (main .signed , - 42 )
218
+ self .assertEqual (alignment (main .union ), 4 )
219
+ self .assertEqual (Main .union .offset , 4 )
220
+ self .assertEqual (Main .union .size , 4 )
221
+ self .assertEqual (Main .first .size , 2 )
214
222
215
223
def test_larger_aligned_subclassed_union (self ):
216
224
for ubase , e in (
@@ -232,6 +240,7 @@ class Main(SubUnion):
232
240
233
241
main = Main .from_buffer (data )
234
242
self .assertEqual (alignment (main ), 8 )
243
+ self .assertEqual (sizeof (main ), 8 )
235
244
self .assertEqual (main .num , 0xD60102D6 )
236
245
self .assertEqual (main .unsigned , 0xD6 )
237
246
self .assertEqual (main .signed , - 42 )
0 commit comments