Staging
v0.5.1
https://github.com/python/cpython
Raw File
Tip revision: ecbb68f2cce8d9a6dda564f148122f8ad193433f authored by Barry Warsaw on 07 April 2009, 15:17:20 UTC
Retagging.
Tip revision: ecbb68f
test_internals.py
# 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 failUnlessSame(self, a, b):
        self.failUnlessEqual(id(a), id(b))

    def test_ints(self):
        i = 42000123
        self.failUnlessEqual(3, grc(i))
        ci = c_int(i)
        self.failUnlessEqual(3, grc(i))
        self.failUnlessEqual(ci._objects, None)

    def test_c_char_p(self):
        s = "Hello, World"
        self.failUnlessEqual(3, grc(s))
        cs = c_char_p(s)
        self.failUnlessEqual(4, grc(s))
        self.failUnlessSame(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.failUnlessEqual(x._objects, None)
        x.a = a
        x.b = b
        self.failUnlessEqual(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.failUnlessEqual(y._objects, None)

        x1, x2 = X(), X()
        y.x, y.y = x1, x2
        self.failUnlessEqual(y._objects, {"0": {}, "1": {}})
        x1.a, x2.b = 42, 93
        self.failUnlessEqual(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.failUnlessEqual(x._objects, {"0": s1, "1": s2})

        y = Y()
        y.x = x
        self.failUnlessEqual(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.failUnlessEqual(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()
back to top