/Lib/ctypes/test/test_cast.py

http://unladen-swallow.googlecode.com/ · Python · 89 lines · 73 code · 13 blank · 3 comment · 12 complexity · 2bdfd440cc5aa6d97ebe02756fa3029d MD5 · raw file

  1. from ctypes import *
  2. import unittest
  3. import sys
  4. class Test(unittest.TestCase):
  5. def test_array2pointer(self):
  6. array = (c_int * 3)(42, 17, 2)
  7. # casting an array to a pointer works.
  8. ptr = cast(array, POINTER(c_int))
  9. self.failUnlessEqual([ptr[i] for i in range(3)], [42, 17, 2])
  10. if 2*sizeof(c_short) == sizeof(c_int):
  11. ptr = cast(array, POINTER(c_short))
  12. if sys.byteorder == "little":
  13. self.failUnlessEqual([ptr[i] for i in range(6)],
  14. [42, 0, 17, 0, 2, 0])
  15. else:
  16. self.failUnlessEqual([ptr[i] for i in range(6)],
  17. [0, 42, 0, 17, 0, 2])
  18. def test_address2pointer(self):
  19. array = (c_int * 3)(42, 17, 2)
  20. address = addressof(array)
  21. ptr = cast(c_void_p(address), POINTER(c_int))
  22. self.failUnlessEqual([ptr[i] for i in range(3)], [42, 17, 2])
  23. ptr = cast(address, POINTER(c_int))
  24. self.failUnlessEqual([ptr[i] for i in range(3)], [42, 17, 2])
  25. def test_p2a_objects(self):
  26. array = (c_char_p * 5)()
  27. self.failUnlessEqual(array._objects, None)
  28. array[0] = "foo bar"
  29. self.failUnlessEqual(array._objects, {'0': "foo bar"})
  30. p = cast(array, POINTER(c_char_p))
  31. # array and p share a common _objects attribute
  32. self.failUnless(p._objects is array._objects)
  33. self.failUnlessEqual(array._objects, {'0': "foo bar", id(array): array})
  34. p[0] = "spam spam"
  35. self.failUnlessEqual(p._objects, {'0': "spam spam", id(array): array})
  36. self.failUnless(array._objects is p._objects)
  37. p[1] = "foo bar"
  38. self.failUnlessEqual(p._objects, {'1': 'foo bar', '0': "spam spam", id(array): array})
  39. self.failUnless(array._objects is p._objects)
  40. def test_other(self):
  41. p = cast((c_int * 4)(1, 2, 3, 4), POINTER(c_int))
  42. self.failUnlessEqual(p[:4], [1,2, 3, 4])
  43. self.failUnlessEqual(p[:4:], [1, 2, 3, 4])
  44. self.failUnlessEqual(p[3:-1:-1], [4, 3, 2, 1])
  45. self.failUnlessEqual(p[:4:3], [1, 4])
  46. c_int()
  47. self.failUnlessEqual(p[:4], [1, 2, 3, 4])
  48. self.failUnlessEqual(p[:4:], [1, 2, 3, 4])
  49. self.failUnlessEqual(p[3:-1:-1], [4, 3, 2, 1])
  50. self.failUnlessEqual(p[:4:3], [1, 4])
  51. p[2] = 96
  52. self.failUnlessEqual(p[:4], [1, 2, 96, 4])
  53. self.failUnlessEqual(p[:4:], [1, 2, 96, 4])
  54. self.failUnlessEqual(p[3:-1:-1], [4, 96, 2, 1])
  55. self.failUnlessEqual(p[:4:3], [1, 4])
  56. c_int()
  57. self.failUnlessEqual(p[:4], [1, 2, 96, 4])
  58. self.failUnlessEqual(p[:4:], [1, 2, 96, 4])
  59. self.failUnlessEqual(p[3:-1:-1], [4, 96, 2, 1])
  60. self.failUnlessEqual(p[:4:3], [1, 4])
  61. def test_char_p(self):
  62. # This didn't work: bad argument to internal function
  63. s = c_char_p("hiho")
  64. self.failUnlessEqual(cast(cast(s, c_void_p), c_char_p).value,
  65. "hiho")
  66. try:
  67. c_wchar_p
  68. except NameError:
  69. pass
  70. else:
  71. def test_wchar_p(self):
  72. s = c_wchar_p("hiho")
  73. self.failUnlessEqual(cast(cast(s, c_void_p), c_wchar_p).value,
  74. "hiho")
  75. if __name__ == "__main__":
  76. unittest.main()