blob: 271e3f57f817430dcd94726051a6a945a119c4de [file] [log] [blame]
Thomas Hellerbabddfc2006-03-08 19:56:54 +00001# This tests the internal _objects attribute
2import unittest
3from ctypes import *
4from sys import getrefcount as grc
5
6# XXX This test must be reviewed for correctness!!!
7
Victor Stinner765531d2013-03-26 01:11:54 +01008# ctypes' types are container types.
9#
10# They have an internal memory block, which only consists of some bytes,
11# but it has to keep references to other objects as well. This is not
12# really needed for trivial C types like int or char, but it is important
13# for aggregate types like strings or pointers in particular.
14#
15# What about pointers?
Thomas Hellerbabddfc2006-03-08 19:56:54 +000016
17class ObjectsTestCase(unittest.TestCase):
Benjamin Peterson77108eb2009-07-01 00:43:10 +000018 def assertSame(self, a, b):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000019 self.assertEqual(id(a), id(b))
Thomas Hellerbabddfc2006-03-08 19:56:54 +000020
21 def test_ints(self):
22 i = 42000123
Benjamin Peterson886af962010-03-21 23:13:07 +000023 refcnt = grc(i)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000024 ci = c_int(i)
Benjamin Peterson886af962010-03-21 23:13:07 +000025 self.assertEqual(refcnt, grc(i))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000026 self.assertEqual(ci._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000027
28 def test_c_char_p(self):
Thomas Heller0d8a1fd2007-07-12 19:54:27 +000029 s = b"Hello, World"
Benjamin Peterson886af962010-03-21 23:13:07 +000030 refcnt = grc(s)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000031 cs = c_char_p(s)
Benjamin Peterson886af962010-03-21 23:13:07 +000032 self.assertEqual(refcnt + 1, grc(s))
Benjamin Peterson77108eb2009-07-01 00:43:10 +000033 self.assertSame(cs._objects, s)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000034
35 def test_simple_struct(self):
36 class X(Structure):
37 _fields_ = [("a", c_int), ("b", c_int)]
38
39 a = 421234
40 b = 421235
41 x = X()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000042 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000043 x.a = a
44 x.b = b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000045 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000046
47 def test_embedded_structs(self):
48 class X(Structure):
49 _fields_ = [("a", c_int), ("b", c_int)]
50
51 class Y(Structure):
52 _fields_ = [("x", X), ("y", X)]
53
54 y = Y()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000055 self.assertEqual(y._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000056
57 x1, x2 = X(), X()
58 y.x, y.y = x1, x2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000059 self.assertEqual(y._objects, {"0": {}, "1": {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000060 x1.a, x2.b = 42, 93
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000061 self.assertEqual(y._objects, {"0": {}, "1": {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000062
63 def test_xxx(self):
64 class X(Structure):
65 _fields_ = [("a", c_char_p), ("b", c_char_p)]
66
67 class Y(Structure):
68 _fields_ = [("x", X), ("y", X)]
69
Victor Stinner42746df2010-07-27 23:36:41 +000070 s1 = b"Hello, World"
71 s2 = b"Hallo, Welt"
Thomas Hellerbabddfc2006-03-08 19:56:54 +000072
73 x = X()
74 x.a = s1
75 x.b = s2
Victor Stinner42746df2010-07-27 23:36:41 +000076 self.assertEqual(x._objects, {"0": s1, "1": s2})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000077
78 y = Y()
79 y.x = x
Victor Stinner42746df2010-07-27 23:36:41 +000080 self.assertEqual(y._objects, {"0": {"0": s1, "1": s2}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000081## x = y.x
82## del y
83## print x._b_base_._objects
84
85 def test_ptr_struct(self):
86 class X(Structure):
87 _fields_ = [("data", POINTER(c_int))]
88
89 A = c_int*4
90 a = A(11, 22, 33, 44)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000091 self.assertEqual(a._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000092
93 x = X()
94 x.data = a
95##XXX print x._objects
96##XXX print x.data[0]
97##XXX print x.data._objects
98
99if __name__ == '__main__':
100 unittest.main()