summaryrefslogtreecommitdiff
path: root/lib/python2.7/ctypes/test/test_internals.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/ctypes/test/test_internals.py')
-rw-r--r--lib/python2.7/ctypes/test/test_internals.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/lib/python2.7/ctypes/test/test_internals.py b/lib/python2.7/ctypes/test/test_internals.py
new file mode 100644
index 0000000..2e5b1fe
--- /dev/null
+++ b/lib/python2.7/ctypes/test/test_internals.py
@@ -0,0 +1,103 @@
+# This tests the internal _objects attribute
+import unittest
+from ctypes import *
+from sys import getrefcount as grc
+
+# XXX This test must be reviewed for correctness!!!
+
+"""
+ctypes' types are container types.
+
+They have an internal memory block, which only consists of some bytes,
+but it has to keep references to other objects as well. This is not
+really needed for trivial C types like int or char, but it is important
+for aggregate types like strings or pointers in particular.
+
+What about pointers?
+
+"""
+
+class ObjectsTestCase(unittest.TestCase):
+ def assertSame(self, a, b):
+ self.assertEqual(id(a), id(b))
+
+ def test_ints(self):
+ i = 42000123
+ refcnt = grc(i)
+ ci = c_int(i)
+ self.assertEqual(refcnt, grc(i))
+ self.assertEqual(ci._objects, None)
+
+ def test_c_char_p(self):
+ s = "Hello, World"
+ refcnt = grc(s)
+ cs = c_char_p(s)
+ self.assertEqual(refcnt + 1, grc(s))
+ self.assertSame(cs._objects, s)
+
+ def test_simple_struct(self):
+ class X(Structure):
+ _fields_ = [("a", c_int), ("b", c_int)]
+
+ a = 421234
+ b = 421235
+ x = X()
+ self.assertEqual(x._objects, None)
+ x.a = a
+ x.b = b
+ self.assertEqual(x._objects, None)
+
+ def test_embedded_structs(self):
+ class X(Structure):
+ _fields_ = [("a", c_int), ("b", c_int)]
+
+ class Y(Structure):
+ _fields_ = [("x", X), ("y", X)]
+
+ y = Y()
+ self.assertEqual(y._objects, None)
+
+ x1, x2 = X(), X()
+ y.x, y.y = x1, x2
+ self.assertEqual(y._objects, {"0": {}, "1": {}})
+ x1.a, x2.b = 42, 93
+ self.assertEqual(y._objects, {"0": {}, "1": {}})
+
+ def test_xxx(self):
+ class X(Structure):
+ _fields_ = [("a", c_char_p), ("b", c_char_p)]
+
+ class Y(Structure):
+ _fields_ = [("x", X), ("y", X)]
+
+ s1 = "Hello, World"
+ s2 = "Hallo, Welt"
+
+ x = X()
+ x.a = s1
+ x.b = s2
+ self.assertEqual(x._objects, {"0": s1, "1": s2})
+
+ y = Y()
+ y.x = x
+ self.assertEqual(y._objects, {"0": {"0": s1, "1": s2}})
+## x = y.x
+## del y
+## print x._b_base_._objects
+
+ def test_ptr_struct(self):
+ class X(Structure):
+ _fields_ = [("data", POINTER(c_int))]
+
+ A = c_int*4
+ a = A(11, 22, 33, 44)
+ self.assertEqual(a._objects, None)
+
+ x = X()
+ x.data = a
+##XXX print x._objects
+##XXX print x.data[0]
+##XXX print x.data._objects
+
+if __name__ == '__main__':
+ unittest.main()