/Lib/ctypes/test/test_arrays.py

http://unladen-swallow.googlecode.com/ · Python · 134 lines · 86 code · 30 blank · 18 comment · 13 complexity · 40052286c1a7171667b6d0a49ec694ba MD5 · raw file

  1. import unittest
  2. from ctypes import *
  3. formats = "bBhHiIlLqQfd"
  4. formats = c_byte, c_ubyte, c_short, c_ushort, c_int, c_uint, \
  5. c_long, c_ulonglong, c_float, c_double, c_longdouble
  6. class ArrayTestCase(unittest.TestCase):
  7. def test_simple(self):
  8. # create classes holding simple numeric types, and check
  9. # various properties.
  10. init = range(15, 25)
  11. for fmt in formats:
  12. alen = len(init)
  13. int_array = ARRAY(fmt, alen)
  14. ia = int_array(*init)
  15. # length of instance ok?
  16. self.failUnlessEqual(len(ia), alen)
  17. # slot values ok?
  18. values = [ia[i] for i in range(len(init))]
  19. self.failUnlessEqual(values, init)
  20. # change the items
  21. from operator import setitem
  22. new_values = range(42, 42+alen)
  23. [setitem(ia, n, new_values[n]) for n in range(alen)]
  24. values = [ia[i] for i in range(len(init))]
  25. self.failUnlessEqual(values, new_values)
  26. # are the items initialized to 0?
  27. ia = int_array()
  28. values = [ia[i] for i in range(len(init))]
  29. self.failUnlessEqual(values, [0] * len(init))
  30. # Too many in itializers should be caught
  31. self.assertRaises(IndexError, int_array, *range(alen*2))
  32. CharArray = ARRAY(c_char, 3)
  33. ca = CharArray("a", "b", "c")
  34. # Should this work? It doesn't:
  35. # CharArray("abc")
  36. self.assertRaises(TypeError, CharArray, "abc")
  37. self.failUnlessEqual(ca[0], "a")
  38. self.failUnlessEqual(ca[1], "b")
  39. self.failUnlessEqual(ca[2], "c")
  40. self.failUnlessEqual(ca[-3], "a")
  41. self.failUnlessEqual(ca[-2], "b")
  42. self.failUnlessEqual(ca[-1], "c")
  43. self.failUnlessEqual(len(ca), 3)
  44. # slicing is now supported, but not extended slicing (3-argument)!
  45. from operator import getslice, delitem
  46. self.assertRaises(TypeError, getslice, ca, 0, 1, -1)
  47. # cannot delete items
  48. self.assertRaises(TypeError, delitem, ca, 0)
  49. def test_numeric_arrays(self):
  50. alen = 5
  51. numarray = ARRAY(c_int, alen)
  52. na = numarray()
  53. values = [na[i] for i in range(alen)]
  54. self.failUnlessEqual(values, [0] * alen)
  55. na = numarray(*[c_int()] * alen)
  56. values = [na[i] for i in range(alen)]
  57. self.failUnlessEqual(values, [0]*alen)
  58. na = numarray(1, 2, 3, 4, 5)
  59. values = [i for i in na]
  60. self.failUnlessEqual(values, [1, 2, 3, 4, 5])
  61. na = numarray(*map(c_int, (1, 2, 3, 4, 5)))
  62. values = [i for i in na]
  63. self.failUnlessEqual(values, [1, 2, 3, 4, 5])
  64. def test_classcache(self):
  65. self.failUnless(not ARRAY(c_int, 3) is ARRAY(c_int, 4))
  66. self.failUnless(ARRAY(c_int, 3) is ARRAY(c_int, 3))
  67. def test_from_address(self):
  68. # Failed with 0.9.8, reported by JUrner
  69. p = create_string_buffer("foo")
  70. sz = (c_char * 3).from_address(addressof(p))
  71. self.failUnlessEqual(sz[:], "foo")
  72. self.failUnlessEqual(sz[::], "foo")
  73. self.failUnlessEqual(sz[::-1], "oof")
  74. self.failUnlessEqual(sz[::3], "f")
  75. self.failUnlessEqual(sz[1:4:2], "o")
  76. self.failUnlessEqual(sz.value, "foo")
  77. try:
  78. create_unicode_buffer
  79. except NameError:
  80. pass
  81. else:
  82. def test_from_addressW(self):
  83. p = create_unicode_buffer("foo")
  84. sz = (c_wchar * 3).from_address(addressof(p))
  85. self.failUnlessEqual(sz[:], "foo")
  86. self.failUnlessEqual(sz[::], "foo")
  87. self.failUnlessEqual(sz[::-1], "oof")
  88. self.failUnlessEqual(sz[::3], "f")
  89. self.failUnlessEqual(sz[1:4:2], "o")
  90. self.failUnlessEqual(sz.value, "foo")
  91. def test_cache(self):
  92. # Array types are cached internally in the _ctypes extension,
  93. # in a WeakValueDictionary. Make sure the array type is
  94. # removed from the cache when the itemtype goes away. This
  95. # test will not fail, but will show a leak in the testsuite.
  96. # Create a new type:
  97. class my_int(c_int):
  98. pass
  99. # Create a new array type based on it:
  100. t1 = my_int * 1
  101. t2 = my_int * 1
  102. self.failUnless(t1 is t2)
  103. if __name__ == '__main__':
  104. unittest.main()