/Lib/ctypes/test/test_cfuncs.py

http://unladen-swallow.googlecode.com/ · Python · 211 lines · 172 code · 35 blank · 4 comment · 6 complexity · cbfbeb49f648cd8a78936ee81710398e MD5 · raw file

  1. # A lot of failures in these tests on Mac OS X.
  2. # Byte order related?
  3. import unittest
  4. from ctypes import *
  5. import _ctypes_test
  6. class CFunctions(unittest.TestCase):
  7. _dll = CDLL(_ctypes_test.__file__)
  8. def S(self):
  9. return c_longlong.in_dll(self._dll, "last_tf_arg_s").value
  10. def U(self):
  11. return c_ulonglong.in_dll(self._dll, "last_tf_arg_u").value
  12. def test_byte(self):
  13. self._dll.tf_b.restype = c_byte
  14. self._dll.tf_b.argtypes = (c_byte,)
  15. self.failUnlessEqual(self._dll.tf_b(-126), -42)
  16. self.failUnlessEqual(self.S(), -126)
  17. def test_byte_plus(self):
  18. self._dll.tf_bb.restype = c_byte
  19. self._dll.tf_bb.argtypes = (c_byte, c_byte)
  20. self.failUnlessEqual(self._dll.tf_bb(0, -126), -42)
  21. self.failUnlessEqual(self.S(), -126)
  22. def test_ubyte(self):
  23. self._dll.tf_B.restype = c_ubyte
  24. self._dll.tf_B.argtypes = (c_ubyte,)
  25. self.failUnlessEqual(self._dll.tf_B(255), 85)
  26. self.failUnlessEqual(self.U(), 255)
  27. def test_ubyte_plus(self):
  28. self._dll.tf_bB.restype = c_ubyte
  29. self._dll.tf_bB.argtypes = (c_byte, c_ubyte)
  30. self.failUnlessEqual(self._dll.tf_bB(0, 255), 85)
  31. self.failUnlessEqual(self.U(), 255)
  32. def test_short(self):
  33. self._dll.tf_h.restype = c_short
  34. self._dll.tf_h.argtypes = (c_short,)
  35. self.failUnlessEqual(self._dll.tf_h(-32766), -10922)
  36. self.failUnlessEqual(self.S(), -32766)
  37. def test_short_plus(self):
  38. self._dll.tf_bh.restype = c_short
  39. self._dll.tf_bh.argtypes = (c_byte, c_short)
  40. self.failUnlessEqual(self._dll.tf_bh(0, -32766), -10922)
  41. self.failUnlessEqual(self.S(), -32766)
  42. def test_ushort(self):
  43. self._dll.tf_H.restype = c_ushort
  44. self._dll.tf_H.argtypes = (c_ushort,)
  45. self.failUnlessEqual(self._dll.tf_H(65535), 21845)
  46. self.failUnlessEqual(self.U(), 65535)
  47. def test_ushort_plus(self):
  48. self._dll.tf_bH.restype = c_ushort
  49. self._dll.tf_bH.argtypes = (c_byte, c_ushort)
  50. self.failUnlessEqual(self._dll.tf_bH(0, 65535), 21845)
  51. self.failUnlessEqual(self.U(), 65535)
  52. def test_int(self):
  53. self._dll.tf_i.restype = c_int
  54. self._dll.tf_i.argtypes = (c_int,)
  55. self.failUnlessEqual(self._dll.tf_i(-2147483646), -715827882)
  56. self.failUnlessEqual(self.S(), -2147483646)
  57. def test_int_plus(self):
  58. self._dll.tf_bi.restype = c_int
  59. self._dll.tf_bi.argtypes = (c_byte, c_int)
  60. self.failUnlessEqual(self._dll.tf_bi(0, -2147483646), -715827882)
  61. self.failUnlessEqual(self.S(), -2147483646)
  62. def test_uint(self):
  63. self._dll.tf_I.restype = c_uint
  64. self._dll.tf_I.argtypes = (c_uint,)
  65. self.failUnlessEqual(self._dll.tf_I(4294967295), 1431655765)
  66. self.failUnlessEqual(self.U(), 4294967295)
  67. def test_uint_plus(self):
  68. self._dll.tf_bI.restype = c_uint
  69. self._dll.tf_bI.argtypes = (c_byte, c_uint)
  70. self.failUnlessEqual(self._dll.tf_bI(0, 4294967295), 1431655765)
  71. self.failUnlessEqual(self.U(), 4294967295)
  72. def test_long(self):
  73. self._dll.tf_l.restype = c_long
  74. self._dll.tf_l.argtypes = (c_long,)
  75. self.failUnlessEqual(self._dll.tf_l(-2147483646), -715827882)
  76. self.failUnlessEqual(self.S(), -2147483646)
  77. def test_long_plus(self):
  78. self._dll.tf_bl.restype = c_long
  79. self._dll.tf_bl.argtypes = (c_byte, c_long)
  80. self.failUnlessEqual(self._dll.tf_bl(0, -2147483646), -715827882)
  81. self.failUnlessEqual(self.S(), -2147483646)
  82. def test_ulong(self):
  83. self._dll.tf_L.restype = c_ulong
  84. self._dll.tf_L.argtypes = (c_ulong,)
  85. self.failUnlessEqual(self._dll.tf_L(4294967295), 1431655765)
  86. self.failUnlessEqual(self.U(), 4294967295)
  87. def test_ulong_plus(self):
  88. self._dll.tf_bL.restype = c_ulong
  89. self._dll.tf_bL.argtypes = (c_char, c_ulong)
  90. self.failUnlessEqual(self._dll.tf_bL(' ', 4294967295), 1431655765)
  91. self.failUnlessEqual(self.U(), 4294967295)
  92. def test_longlong(self):
  93. self._dll.tf_q.restype = c_longlong
  94. self._dll.tf_q.argtypes = (c_longlong, )
  95. self.failUnlessEqual(self._dll.tf_q(-9223372036854775806), -3074457345618258602)
  96. self.failUnlessEqual(self.S(), -9223372036854775806)
  97. def test_longlong_plus(self):
  98. self._dll.tf_bq.restype = c_longlong
  99. self._dll.tf_bq.argtypes = (c_byte, c_longlong)
  100. self.failUnlessEqual(self._dll.tf_bq(0, -9223372036854775806), -3074457345618258602)
  101. self.failUnlessEqual(self.S(), -9223372036854775806)
  102. def test_ulonglong(self):
  103. self._dll.tf_Q.restype = c_ulonglong
  104. self._dll.tf_Q.argtypes = (c_ulonglong, )
  105. self.failUnlessEqual(self._dll.tf_Q(18446744073709551615), 6148914691236517205)
  106. self.failUnlessEqual(self.U(), 18446744073709551615)
  107. def test_ulonglong_plus(self):
  108. self._dll.tf_bQ.restype = c_ulonglong
  109. self._dll.tf_bQ.argtypes = (c_byte, c_ulonglong)
  110. self.failUnlessEqual(self._dll.tf_bQ(0, 18446744073709551615), 6148914691236517205)
  111. self.failUnlessEqual(self.U(), 18446744073709551615)
  112. def test_float(self):
  113. self._dll.tf_f.restype = c_float
  114. self._dll.tf_f.argtypes = (c_float,)
  115. self.failUnlessEqual(self._dll.tf_f(-42.), -14.)
  116. self.failUnlessEqual(self.S(), -42)
  117. def test_float_plus(self):
  118. self._dll.tf_bf.restype = c_float
  119. self._dll.tf_bf.argtypes = (c_byte, c_float)
  120. self.failUnlessEqual(self._dll.tf_bf(0, -42.), -14.)
  121. self.failUnlessEqual(self.S(), -42)
  122. def test_double(self):
  123. self._dll.tf_d.restype = c_double
  124. self._dll.tf_d.argtypes = (c_double,)
  125. self.failUnlessEqual(self._dll.tf_d(42.), 14.)
  126. self.failUnlessEqual(self.S(), 42)
  127. def test_double_plus(self):
  128. self._dll.tf_bd.restype = c_double
  129. self._dll.tf_bd.argtypes = (c_byte, c_double)
  130. self.failUnlessEqual(self._dll.tf_bd(0, 42.), 14.)
  131. self.failUnlessEqual(self.S(), 42)
  132. def test_longdouble(self):
  133. self._dll.tf_D.restype = c_longdouble
  134. self._dll.tf_D.argtypes = (c_longdouble,)
  135. self.failUnlessEqual(self._dll.tf_D(42.), 14.)
  136. self.failUnlessEqual(self.S(), 42)
  137. def test_longdouble_plus(self):
  138. self._dll.tf_bD.restype = c_longdouble
  139. self._dll.tf_bD.argtypes = (c_byte, c_longdouble)
  140. self.failUnlessEqual(self._dll.tf_bD(0, 42.), 14.)
  141. self.failUnlessEqual(self.S(), 42)
  142. def test_callwithresult(self):
  143. def process_result(result):
  144. return result * 2
  145. self._dll.tf_i.restype = process_result
  146. self._dll.tf_i.argtypes = (c_int,)
  147. self.failUnlessEqual(self._dll.tf_i(42), 28)
  148. self.failUnlessEqual(self.S(), 42)
  149. self.failUnlessEqual(self._dll.tf_i(-42), -28)
  150. self.failUnlessEqual(self.S(), -42)
  151. def test_void(self):
  152. self._dll.tv_i.restype = None
  153. self._dll.tv_i.argtypes = (c_int,)
  154. self.failUnlessEqual(self._dll.tv_i(42), None)
  155. self.failUnlessEqual(self.S(), 42)
  156. self.failUnlessEqual(self._dll.tv_i(-42), None)
  157. self.failUnlessEqual(self.S(), -42)
  158. # The following repeates the above tests with stdcall functions (where
  159. # they are available)
  160. try:
  161. WinDLL
  162. except NameError:
  163. pass
  164. else:
  165. class stdcall_dll(WinDLL):
  166. def __getattr__(self, name):
  167. if name[:2] == '__' and name[-2:] == '__':
  168. raise AttributeError(name)
  169. func = self._FuncPtr(("s_" + name, self))
  170. setattr(self, name, func)
  171. return func
  172. class stdcallCFunctions(CFunctions):
  173. _dll = stdcall_dll(_ctypes_test.__file__)
  174. pass
  175. if __name__ == '__main__':
  176. unittest.main()