/Lib/ctypes/test/test_anon.py

http://unladen-swallow.googlecode.com/ · Python · 60 lines · 46 code · 12 blank · 2 comment · 1 complexity · 5b941e6ca4cde98c1f6dbedefd609872 MD5 · raw file

  1. import unittest
  2. from ctypes import *
  3. class AnonTest(unittest.TestCase):
  4. def test_anon(self):
  5. class ANON(Union):
  6. _fields_ = [("a", c_int),
  7. ("b", c_int)]
  8. class Y(Structure):
  9. _fields_ = [("x", c_int),
  10. ("_", ANON),
  11. ("y", c_int)]
  12. _anonymous_ = ["_"]
  13. self.failUnlessEqual(Y.a.offset, sizeof(c_int))
  14. self.failUnlessEqual(Y.b.offset, sizeof(c_int))
  15. self.failUnlessEqual(ANON.a.offset, 0)
  16. self.failUnlessEqual(ANON.b.offset, 0)
  17. def test_anon_nonseq(self):
  18. # TypeError: _anonymous_ must be a sequence
  19. self.failUnlessRaises(TypeError,
  20. lambda: type(Structure)("Name",
  21. (Structure,),
  22. {"_fields_": [], "_anonymous_": 42}))
  23. def test_anon_nonmember(self):
  24. # AttributeError: type object 'Name' has no attribute 'x'
  25. self.failUnlessRaises(AttributeError,
  26. lambda: type(Structure)("Name",
  27. (Structure,),
  28. {"_fields_": [],
  29. "_anonymous_": ["x"]}))
  30. def test_nested(self):
  31. class ANON_S(Structure):
  32. _fields_ = [("a", c_int)]
  33. class ANON_U(Union):
  34. _fields_ = [("_", ANON_S),
  35. ("b", c_int)]
  36. _anonymous_ = ["_"]
  37. class Y(Structure):
  38. _fields_ = [("x", c_int),
  39. ("_", ANON_U),
  40. ("y", c_int)]
  41. _anonymous_ = ["_"]
  42. self.failUnlessEqual(Y.x.offset, 0)
  43. self.failUnlessEqual(Y.a.offset, sizeof(c_int))
  44. self.failUnlessEqual(Y.b.offset, sizeof(c_int))
  45. self.failUnlessEqual(Y._.offset, sizeof(c_int))
  46. self.failUnlessEqual(Y.y.offset, sizeof(c_int) * 2)
  47. if __name__ == "__main__":
  48. unittest.main()