/Lib/ctypes/test/test_slicing.py

http://unladen-swallow.googlecode.com/ · Python · 178 lines · 146 code · 27 blank · 5 comment · 10 complexity · 418ea0284f4646cee053e7ba0bdf1c59 MD5 · raw file

  1. import unittest
  2. from ctypes import *
  3. import _ctypes_test
  4. class SlicesTestCase(unittest.TestCase):
  5. def test_getslice_cint(self):
  6. a = (c_int * 100)(*xrange(1100, 1200))
  7. b = range(1100, 1200)
  8. self.failUnlessEqual(a[0:2], b[0:2])
  9. self.failUnlessEqual(a[0:2:], b[0:2:])
  10. self.failUnlessEqual(len(a), len(b))
  11. self.failUnlessEqual(a[5:7], b[5:7])
  12. self.failUnlessEqual(a[5:7:], b[5:7:])
  13. self.failUnlessEqual(a[-1], b[-1])
  14. self.failUnlessEqual(a[:], b[:])
  15. self.failUnlessEqual(a[::], b[::])
  16. self.failUnlessEqual(a[10::-1], b[10::-1])
  17. self.failUnlessEqual(a[30:20:-1], b[30:20:-1])
  18. self.failUnlessEqual(a[:12:6], b[:12:6])
  19. self.failUnlessEqual(a[2:6:4], b[2:6:4])
  20. a[0:5] = range(5, 10)
  21. self.failUnlessEqual(a[0:5], range(5, 10))
  22. self.failUnlessEqual(a[0:5:], range(5, 10))
  23. self.failUnlessEqual(a[4::-1], range(9, 4, -1))
  24. def test_setslice_cint(self):
  25. a = (c_int * 100)(*xrange(1100, 1200))
  26. b = range(1100, 1200)
  27. a[32:47] = range(32, 47)
  28. self.failUnlessEqual(a[32:47], range(32, 47))
  29. a[32:47] = range(132, 147)
  30. self.failUnlessEqual(a[32:47:], range(132, 147))
  31. a[46:31:-1] = range(232, 247)
  32. self.failUnlessEqual(a[32:47:1], range(246, 231, -1))
  33. a[32:47] = range(1132, 1147)
  34. self.failUnlessEqual(a[:], b)
  35. a[32:47:7] = range(3)
  36. b[32:47:7] = range(3)
  37. self.failUnlessEqual(a[:], b)
  38. a[33::-3] = range(12)
  39. b[33::-3] = range(12)
  40. self.failUnlessEqual(a[:], b)
  41. from operator import setslice, setitem
  42. # TypeError: int expected instead of str instance
  43. self.assertRaises(TypeError, setslice, a, 0, 5, "abcde")
  44. self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde")
  45. # TypeError: int expected instead of str instance
  46. self.assertRaises(TypeError, setslice, a, 0, 5, ["a", "b", "c", "d", "e"])
  47. self.assertRaises(TypeError, setitem, a, slice(0, 5),
  48. ["a", "b", "c", "d", "e"])
  49. # TypeError: int expected instead of float instance
  50. self.assertRaises(TypeError, setslice, a, 0, 5, [1, 2, 3, 4, 3.14])
  51. self.assertRaises(TypeError, setitem, a, slice(0, 5),
  52. [1, 2, 3, 4, 3.14])
  53. # ValueError: Can only assign sequence of same size
  54. self.assertRaises(ValueError, setslice, a, 0, 5, range(32))
  55. self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32))
  56. def test_char_ptr(self):
  57. s = "abcdefghijklmnopqrstuvwxyz"
  58. dll = CDLL(_ctypes_test.__file__)
  59. dll.my_strdup.restype = POINTER(c_char)
  60. dll.my_free.restype = None
  61. res = dll.my_strdup(s)
  62. self.failUnlessEqual(res[:len(s)], s)
  63. self.failUnlessEqual(res[:3], s[:3])
  64. self.failUnlessEqual(res[:len(s):], s)
  65. self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1])
  66. self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7])
  67. self.failUnlessEqual(res[0:-1:-1], s[0::-1])
  68. import operator
  69. self.assertRaises(ValueError, operator.getitem,
  70. res, slice(None, None, None))
  71. self.assertRaises(ValueError, operator.getitem,
  72. res, slice(0, None, None))
  73. self.assertRaises(ValueError, operator.getitem,
  74. res, slice(None, 5, -1))
  75. self.assertRaises(ValueError, operator.getitem,
  76. res, slice(-5, None, None))
  77. self.assertRaises(TypeError, operator.setslice,
  78. res, 0, 5, u"abcde")
  79. self.assertRaises(TypeError, operator.setitem,
  80. res, slice(0, 5), u"abcde")
  81. dll.my_free(res)
  82. dll.my_strdup.restype = POINTER(c_byte)
  83. res = dll.my_strdup(s)
  84. self.failUnlessEqual(res[:len(s)], range(ord("a"), ord("z")+1))
  85. self.failUnlessEqual(res[:len(s):], range(ord("a"), ord("z")+1))
  86. dll.my_free(res)
  87. def test_char_ptr_with_free(self):
  88. dll = CDLL(_ctypes_test.__file__)
  89. s = "abcdefghijklmnopqrstuvwxyz"
  90. class allocated_c_char_p(c_char_p):
  91. pass
  92. dll.my_free.restype = None
  93. def errcheck(result, func, args):
  94. retval = result.value
  95. dll.my_free(result)
  96. return retval
  97. dll.my_strdup.restype = allocated_c_char_p
  98. dll.my_strdup.errcheck = errcheck
  99. try:
  100. res = dll.my_strdup(s)
  101. self.failUnlessEqual(res, s)
  102. finally:
  103. del dll.my_strdup.errcheck
  104. def test_char_array(self):
  105. s = "abcdefghijklmnopqrstuvwxyz\0"
  106. p = (c_char * 27)(*s)
  107. self.failUnlessEqual(p[:], s)
  108. self.failUnlessEqual(p[::], s)
  109. self.failUnlessEqual(p[::-1], s[::-1])
  110. self.failUnlessEqual(p[5::-2], s[5::-2])
  111. self.failUnlessEqual(p[2:5:-3], s[2:5:-3])
  112. try:
  113. c_wchar
  114. except NameError:
  115. pass
  116. else:
  117. def test_wchar_ptr(self):
  118. s = u"abcdefghijklmnopqrstuvwxyz\0"
  119. dll = CDLL(_ctypes_test.__file__)
  120. dll.my_wcsdup.restype = POINTER(c_wchar)
  121. dll.my_wcsdup.argtypes = POINTER(c_wchar),
  122. dll.my_free.restype = None
  123. res = dll.my_wcsdup(s)
  124. self.failUnlessEqual(res[:len(s)], s)
  125. self.failUnlessEqual(res[:len(s):], s)
  126. self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1])
  127. self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7])
  128. import operator
  129. self.assertRaises(TypeError, operator.setslice,
  130. res, 0, 5, u"abcde")
  131. self.assertRaises(TypeError, operator.setitem,
  132. res, slice(0, 5), u"abcde")
  133. dll.my_free(res)
  134. if sizeof(c_wchar) == sizeof(c_short):
  135. dll.my_wcsdup.restype = POINTER(c_short)
  136. elif sizeof(c_wchar) == sizeof(c_int):
  137. dll.my_wcsdup.restype = POINTER(c_int)
  138. elif sizeof(c_wchar) == sizeof(c_long):
  139. dll.my_wcsdup.restype = POINTER(c_long)
  140. else:
  141. return
  142. res = dll.my_wcsdup(s)
  143. tmpl = range(ord("a"), ord("z")+1)
  144. self.failUnlessEqual(res[:len(s)-1], tmpl)
  145. self.failUnlessEqual(res[:len(s)-1:], tmpl)
  146. self.failUnlessEqual(res[len(s)-2:-1:-1], tmpl[::-1])
  147. self.failUnlessEqual(res[len(s)-2:5:-7], tmpl[:5:-7])
  148. dll.my_free(res)
  149. ################################################################
  150. if __name__ == "__main__":
  151. unittest.main()