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