blob: cbf2e0589a26e2aeb0d1936f40be186af8cc804e [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
8"""
9ctypes' types are container types.
10
11They have an internal memory block, which only consists of some bytes,
12but it has to keep references to other objects as well. This is not
13really needed for trivial C types like int or char, but it is important
14for aggregate types like strings or pointers in particular.
15
16What about pointers?
17
18"""
19
20class ObjectsTestCase(unittest.TestCase):
Benjamin Peterson77108eb2009-07-01 00:43:10 +000021 def assertSame(self, a, b):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000022 self.assertEqual(id(a), id(b))
Thomas Hellerbabddfc2006-03-08 19:56:54 +000023
24 def test_ints(self):
25 i = 42000123
Benjamin Peterson886af962010-03-21 23:13:07 +000026 refcnt = grc(i)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000027 ci = c_int(i)
Benjamin Peterson886af962010-03-21 23:13:07 +000028 self.assertEqual(refcnt, grc(i))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000029 self.assertEqual(ci._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000030
31 def test_c_char_p(self):
Thomas Heller0d8a1fd2007-07-12 19:54:27 +000032 s = b"Hello, World"
Benjamin Peterson886af962010-03-21 23:13:07 +000033 refcnt = grc(s)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000034 cs = c_char_p(s)
Benjamin Peterson886af962010-03-21 23:13:07 +000035 self.assertEqual(refcnt + 1, grc(s))
Benjamin Peterson77108eb2009-07-01 00:43:10 +000036 self.assertSame(cs._objects, s)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000037
38 def test_simple_struct(self):
39 class X(Structure):
40 _fields_ = [("a", c_int), ("b", c_int)]
41
42 a = 421234
43 b = 421235
44 x = X()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000045 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000046 x.a = a
47 x.b = b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000048 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000049
50 def test_embedded_structs(self):
51 class X(Structure):
52 _fields_ = [("a", c_int), ("b", c_int)]
53
54 class Y(Structure):
55 _fields_ = [("x", X), ("y", X)]
56
57 y = Y()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000058 self.assertEqual(y._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000059
60 x1, x2 = X(), X()
61 y.x, y.y = x1, x2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000062 self.assertEqual(y._objects, {"0": {}, "1": {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000063 x1.a, x2.b = 42, 93
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000064 self.assertEqual(y._objects, {"0": {}, "1": {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000065
66 def test_xxx(self):
67 class X(Structure):
68 _fields_ = [("a", c_char_p), ("b", c_char_p)]
69
70 class Y(Structure):
71 _fields_ = [("x", X), ("y", X)]
72
Victor Stinner42746df2010-07-27 23:36:41 +000073 s1 = b"Hello, World"
74 s2 = b"Hallo, Welt"
Thomas Hellerbabddfc2006-03-08 19:56:54 +000075
76 x = X()
77 x.a = s1
78 x.b = s2
Victor Stinner42746df2010-07-27 23:36:41 +000079 self.assertEqual(x._objects, {"0": s1, "1": s2})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000080
81 y = Y()
82 y.x = x
Victor Stinner42746df2010-07-27 23:36:41 +000083 self.assertEqual(y._objects, {"0": {"0": s1, "1": s2}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000084## x = y.x
85## del y
86## print x._b_base_._objects
87
88 def test_ptr_struct(self):
89 class X(Structure):
90 _fields_ = [("data", POINTER(c_int))]
91
92 A = c_int*4
93 a = A(11, 22, 33, 44)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000094 self.assertEqual(a._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000095
96 x = X()
97 x.data = a
98##XXX print x._objects
99##XXX print x.data[0]
100##XXX print x.data._objects
101
102if __name__ == '__main__':
103 unittest.main()