/Lib/ctypes/test/test_varsize_struct.py

http://unladen-swallow.googlecode.com/ · Python · 50 lines · 37 code · 8 blank · 5 comment · 1 complexity · bb322516d3bcde9a4ef228684bc8e256 MD5 · raw file

  1. from ctypes import *
  2. import unittest
  3. class VarSizeTest(unittest.TestCase):
  4. def test_resize(self):
  5. class X(Structure):
  6. _fields_ = [("item", c_int),
  7. ("array", c_int * 1)]
  8. self.failUnlessEqual(sizeof(X), sizeof(c_int) * 2)
  9. x = X()
  10. x.item = 42
  11. x.array[0] = 100
  12. self.failUnlessEqual(sizeof(x), sizeof(c_int) * 2)
  13. # make room for one additional item
  14. new_size = sizeof(X) + sizeof(c_int) * 1
  15. resize(x, new_size)
  16. self.failUnlessEqual(sizeof(x), new_size)
  17. self.failUnlessEqual((x.item, x.array[0]), (42, 100))
  18. # make room for 10 additional items
  19. new_size = sizeof(X) + sizeof(c_int) * 9
  20. resize(x, new_size)
  21. self.failUnlessEqual(sizeof(x), new_size)
  22. self.failUnlessEqual((x.item, x.array[0]), (42, 100))
  23. # make room for one additional item
  24. new_size = sizeof(X) + sizeof(c_int) * 1
  25. resize(x, new_size)
  26. self.failUnlessEqual(sizeof(x), new_size)
  27. self.failUnlessEqual((x.item, x.array[0]), (42, 100))
  28. def test_array_invalid_length(self):
  29. # cannot create arrays with non-positive size
  30. self.failUnlessRaises(ValueError, lambda: c_int * -1)
  31. self.failUnlessRaises(ValueError, lambda: c_int * -3)
  32. def test_zerosized_array(self):
  33. array = (c_int * 0)()
  34. # accessing elements of zero-sized arrays raise IndexError
  35. self.failUnlessRaises(IndexError, array.__setitem__, 0, None)
  36. self.failUnlessRaises(IndexError, array.__getitem__, 0)
  37. self.failUnlessRaises(IndexError, array.__setitem__, 1, None)
  38. self.failUnlessRaises(IndexError, array.__getitem__, 1)
  39. self.failUnlessRaises(IndexError, array.__setitem__, -1, None)
  40. self.failUnlessRaises(IndexError, array.__getitem__, -1)
  41. if __name__ == "__main__":
  42. unittest.main()