10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom ctypes import * 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport ctypes 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport _ctypes_test 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass BITS(Structure): 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("A", c_int, 1), 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("B", c_int, 2), 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("C", c_int, 3), 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("D", c_int, 4), 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("E", c_int, 5), 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("F", c_int, 6), 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("G", c_int, 7), 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("H", c_int, 8), 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("I", c_int, 9), 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("M", c_short, 1), 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("N", c_short, 2), 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("O", c_short, 3), 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("P", c_short, 4), 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("Q", c_short, 5), 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("R", c_short, 6), 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("S", c_short, 7)] 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofunc = CDLL(_ctypes_test.__file__).unpack_bitfields 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofunc.argtypes = POINTER(BITS), c_char 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao##for n in "ABCDEFGHIMNOPQRS": 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao## print n, hex(getattr(BITS, n).size), getattr(BITS, n).offset 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass C_Test(unittest.TestCase): 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_ints(self): 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in range(512): 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for name in "ABCDEFGHI": 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b = BITS() 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao setattr(b, name, i) 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_shorts(self): 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in range(256): 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for name in "MNOPQRS": 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b = BITS() 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao setattr(b, name, i) 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gaosigned_int_types = (c_byte, c_short, c_int, c_long, c_longlong) 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gaounsigned_int_types = (c_ubyte, c_ushort, c_uint, c_ulong, c_ulonglong) 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoint_types = unsigned_int_types + signed_int_types 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass BitFieldTest(unittest.TestCase): 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_longlong(self): 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_longlong, 1), 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_longlong, 62), 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_longlong, 1)] 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_longlong)) 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a, x.b, x.c = -1, 7, -1 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((x.a, x.b, x.c), (-1, 7, -1)) 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_ulonglong(self): 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_ulonglong, 1), 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_ulonglong, 62), 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_ulonglong, 1)] 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_longlong)) 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((x.a, x.b, x.c), (0, 0, 0)) 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a, x.b, x.c = 7, 7, 7 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((x.a, x.b, x.c), (1, 7, 1)) 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_signed(self): 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for c_typ in signed_int_types: 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("dummy", c_typ), 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("a", c_typ, 3), 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_typ, 3), 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_typ, 1)] 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_typ)*2) 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, 0, 0, 0)) 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = -1 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, -1, 0, 0)) 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a, x.b = 0, -1 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, 0, -1, 0)) 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_unsigned(self): 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for c_typ in unsigned_int_types: 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_typ, 3), 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_typ, 3), 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_typ, 1)] 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_typ)) 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, 0, 0, 0)) 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = -1 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, 7, 0, 0)) 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a, x.b = 0, -1 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((c_typ, x.a, x.b, x.c), (c_typ, 0, 7, 0)) 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def fail_fields(self, *fields): 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.get_except(type(Structure), "X", (), 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao {"_fields_": fields}) 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_nonint_types(self): 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # bit fields are not allowed on non-integer types. 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_char_p, 1)) 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type c_char_p')) 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_void_p, 1)) 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type c_void_p')) 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if c_int != c_long: 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", POINTER(c_int), 1)) 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type LP_c_int')) 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_char, 1)) 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type c_char')) 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c_wchar 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except NameError: 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_wchar, 1)) 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type c_wchar')) 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Dummy(Structure): 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [] 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", Dummy, 1)) 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (TypeError, 'bit fields not allowed for type Dummy')) 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_single_bitfield_size(self): 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for c_typ in int_types: 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_typ, -1)) 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (ValueError, 'number of bits invalid for bit field')) 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_typ, 0)) 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (ValueError, 'number of bits invalid for bit field')) 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_typ, 1)] 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_typ)) 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_typ, sizeof(c_typ)*8)] 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_typ)) 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao result = self.fail_fields(("a", c_typ, sizeof(c_typ)*8 + 1)) 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(result, (ValueError, 'number of bits invalid for bit field')) 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_multi_bitfields_size(self): 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_short, 1), 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_short, 14), 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_short, 1)] 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_short)) 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_short, 1), 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("a1", c_short), 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_short, 14), 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_short, 1)] 1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_short)*3) 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.a.offset, 0) 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.a1.offset, sizeof(c_short)) 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.b.offset, sizeof(c_short)*2) 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.c.offset, sizeof(c_short)*2) 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_short, 3), 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_short, 14), 1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_short, 14)] 1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_short)*3) 1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.a.offset, sizeof(c_short)*0) 1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.b.offset, sizeof(c_short)*1) 1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(X.c.offset, sizeof(c_short)*2) 1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def get_except(self, func, *args, **kw): 1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func(*args, **kw) 1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except Exception, detail: 1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return detail.__class__, str(detail) 1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_mixed_1(self): 1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_byte, 4), 2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_int, 4)] 2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if os.name in ("nt", "ce"): 2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_int)*2) 2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_int)) 2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_mixed_2(self): 2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_byte, 4), 2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_int, 32)] 2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_int)*2) 2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_mixed_3(self): 2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_byte, 4), 2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_ubyte, 4)] 2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_byte)) 2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_mixed_4(self): 2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_short, 4), 2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_short, 4), 2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("c", c_int, 24), 2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("d", c_short, 4), 2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("e", c_short, 4), 2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("f", c_int, 24)] 2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # MSVC does NOT combine c_short and c_int into one field, GCC 2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # does (unless GCC is run with '-mms-bitfields' which 2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # produces code compatible with MSVC). 2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if os.name in ("nt", "ce"): 2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_int) * 4) 2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(sizeof(X), sizeof(c_int) * 2) 2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_anon_bitfields(self): 2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # anonymous bit-fields gave a strange error message 2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_byte, 4), 2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ("b", c_ubyte, 4)] 2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Y(Structure): 2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _anonymous_ = ["_"] 2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("_", X)] 2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @unittest.skipUnless(hasattr(ctypes, "c_uint32"), "c_int32 is required") 2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_uint32(self): 2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_uint32, 32)] 2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = 10 2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(x.a, 10) 2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = 0xFDCBA987 2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(x.a, 0xFDCBA987) 2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao @unittest.skipUnless(hasattr(ctypes, "c_uint64"), "c_int64 is required") 2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_uint64(self): 2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class X(Structure): 2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao _fields_ = [("a", c_uint64, 64)] 2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = X() 2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = 10 2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(x.a, 10) 2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.a = 0xFEDCBA9876543211 2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(x.a, 0xFEDCBA9876543211) 2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__": 2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unittest.main() 265