14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# A lot of failures in these tests on Mac OS X. 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Byte order related? 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ctypes import * 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport _ctypes_test 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CFunctions(unittest.TestCase): 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _dll = CDLL(_ctypes_test.__file__) 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def S(self): 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return c_longlong.in_dll(self._dll, "last_tf_arg_s").value 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def U(self): 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return c_ulonglong.in_dll(self._dll, "last_tf_arg_u").value 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_byte(self): 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_b.restype = c_byte 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_b.argtypes = (c_byte,) 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_b(-126), -42) 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -126) 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_byte_plus(self): 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bb.restype = c_byte 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bb.argtypes = (c_byte, c_byte) 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bb(0, -126), -42) 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -126) 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ubyte(self): 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_B.restype = c_ubyte 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_B.argtypes = (c_ubyte,) 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_B(255), 85) 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 255) 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ubyte_plus(self): 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bB.restype = c_ubyte 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bB.argtypes = (c_byte, c_ubyte) 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bB(0, 255), 85) 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 255) 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_short(self): 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_h.restype = c_short 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_h.argtypes = (c_short,) 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_h(-32766), -10922) 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -32766) 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_short_plus(self): 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bh.restype = c_short 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bh.argtypes = (c_byte, c_short) 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bh(0, -32766), -10922) 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -32766) 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ushort(self): 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_H.restype = c_ushort 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_H.argtypes = (c_ushort,) 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_H(65535), 21845) 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 65535) 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ushort_plus(self): 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bH.restype = c_ushort 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bH.argtypes = (c_byte, c_ushort) 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bH(0, 65535), 21845) 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 65535) 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_int(self): 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_i.restype = c_int 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_i.argtypes = (c_int,) 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_i(-2147483646), -715827882) 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -2147483646) 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_int_plus(self): 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bi.restype = c_int 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bi.argtypes = (c_byte, c_int) 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bi(0, -2147483646), -715827882) 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -2147483646) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_uint(self): 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_I.restype = c_uint 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_I.argtypes = (c_uint,) 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_I(4294967295), 1431655765) 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 4294967295) 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_uint_plus(self): 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bI.restype = c_uint 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bI.argtypes = (c_byte, c_uint) 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bI(0, 4294967295), 1431655765) 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 4294967295) 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_long(self): 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_l.restype = c_long 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_l.argtypes = (c_long,) 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_l(-2147483646), -715827882) 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -2147483646) 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_long_plus(self): 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bl.restype = c_long 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bl.argtypes = (c_byte, c_long) 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bl(0, -2147483646), -715827882) 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -2147483646) 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ulong(self): 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_L.restype = c_ulong 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_L.argtypes = (c_ulong,) 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_L(4294967295), 1431655765) 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 4294967295) 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ulong_plus(self): 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bL.restype = c_ulong 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bL.argtypes = (c_char, c_ulong) 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bL(' ', 4294967295), 1431655765) 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 4294967295) 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_longlong(self): 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_q.restype = c_longlong 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_q.argtypes = (c_longlong, ) 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_q(-9223372036854775806), -3074457345618258602) 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -9223372036854775806) 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_longlong_plus(self): 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bq.restype = c_longlong 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bq.argtypes = (c_byte, c_longlong) 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bq(0, -9223372036854775806), -3074457345618258602) 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -9223372036854775806) 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ulonglong(self): 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_Q.restype = c_ulonglong 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_Q.argtypes = (c_ulonglong, ) 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_Q(18446744073709551615), 6148914691236517205) 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 18446744073709551615) 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_ulonglong_plus(self): 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bQ.restype = c_ulonglong 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bQ.argtypes = (c_byte, c_ulonglong) 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bQ(0, 18446744073709551615), 6148914691236517205) 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.U(), 18446744073709551615) 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_float(self): 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_f.restype = c_float 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_f.argtypes = (c_float,) 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_f(-42.), -14.) 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -42) 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_float_plus(self): 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bf.restype = c_float 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bf.argtypes = (c_byte, c_float) 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bf(0, -42.), -14.) 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -42) 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_double(self): 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_d.restype = c_double 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_d.argtypes = (c_double,) 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_d(42.), 14.) 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_double_plus(self): 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bd.restype = c_double 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bd.argtypes = (c_byte, c_double) 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bd(0, 42.), 14.) 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_longdouble(self): 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_D.restype = c_longdouble 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_D.argtypes = (c_longdouble,) 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_D(42.), 14.) 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_longdouble_plus(self): 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bD.restype = c_longdouble 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_bD.argtypes = (c_byte, c_longdouble) 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_bD(0, 42.), 14.) 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_callwithresult(self): 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def process_result(result): 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return result * 2 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_i.restype = process_result 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tf_i.argtypes = (c_int,) 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_i(42), 28) 1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tf_i(-42), -28) 1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -42) 1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_void(self): 1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tv_i.restype = None 1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._dll.tv_i.argtypes = (c_int,) 1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tv_i(42), None) 1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), 42) 1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self._dll.tv_i(-42), None) 1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.S(), -42) 1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# The following repeates the above tests with stdcall functions (where 1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# they are available) 1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry: 1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao WinDLL 1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept NameError: 1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse: 1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao class stdcall_dll(WinDLL): 1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __getattr__(self, name): 2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if name[:2] == '__' and name[-2:] == '__': 2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise AttributeError(name) 2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao func = self._FuncPtr(("s_" + name, self)) 2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao setattr(self, name, func) 2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return func 2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao class stdcallCFunctions(CFunctions): 2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _dll = stdcall_dll(_ctypes_test.__file__) 2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__': 2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unittest.main() 212