blob: db8adfb4cac06e71660d775e485ec222b80cd9ac [file] [log] [blame]
Thomas Hellerbabddfc2006-03-08 19:56:54 +00001from ctypes import *
2import unittest
3
4class SimpleTestCase(unittest.TestCase):
5 def test_cint(self):
6 x = c_int()
Ezio Melottib3aedd42010-11-20 19:04:17 +00007 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +00008 x.value = 42
Ezio Melottib3aedd42010-11-20 19:04:17 +00009 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000010 x = c_int(99)
Ezio Melottib3aedd42010-11-20 19:04:17 +000011 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000012
13 def test_ccharp(self):
14 x = c_char_p()
Ezio Melottib3aedd42010-11-20 19:04:17 +000015 self.assertEqual(x._objects, None)
Victor Stinner42746df2010-07-27 23:36:41 +000016 x.value = b"abc"
Ezio Melottib3aedd42010-11-20 19:04:17 +000017 self.assertEqual(x._objects, b"abc")
Victor Stinner42746df2010-07-27 23:36:41 +000018 x = c_char_p(b"spam")
Ezio Melottib3aedd42010-11-20 19:04:17 +000019 self.assertEqual(x._objects, b"spam")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000020
21class StructureTestCase(unittest.TestCase):
22 def test_cint_struct(self):
23 class X(Structure):
24 _fields_ = [("a", c_int),
25 ("b", c_int)]
26
27 x = X()
Ezio Melottib3aedd42010-11-20 19:04:17 +000028 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000029 x.a = 42
30 x.b = 99
Ezio Melottib3aedd42010-11-20 19:04:17 +000031 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000032
33 def test_ccharp_struct(self):
34 class X(Structure):
35 _fields_ = [("a", c_char_p),
36 ("b", c_char_p)]
37 x = X()
Ezio Melottib3aedd42010-11-20 19:04:17 +000038 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000039
Victor Stinner42746df2010-07-27 23:36:41 +000040 x.a = b"spam"
41 x.b = b"foo"
Ezio Melottib3aedd42010-11-20 19:04:17 +000042 self.assertEqual(x._objects, {"0": b"spam", "1": b"foo"})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000043
44 def test_struct_struct(self):
45 class POINT(Structure):
46 _fields_ = [("x", c_int), ("y", c_int)]
47 class RECT(Structure):
48 _fields_ = [("ul", POINT), ("lr", POINT)]
49
50 r = RECT()
51 r.ul.x = 0
52 r.ul.y = 1
53 r.lr.x = 2
54 r.lr.y = 3
Ezio Melottib3aedd42010-11-20 19:04:17 +000055 self.assertEqual(r._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000056
57 r = RECT()
58 pt = POINT(1, 2)
59 r.ul = pt
Ezio Melottib3aedd42010-11-20 19:04:17 +000060 self.assertEqual(r._objects, {'0': {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000061 r.ul.x = 22
62 r.ul.y = 44
Ezio Melottib3aedd42010-11-20 19:04:17 +000063 self.assertEqual(r._objects, {'0': {}})
Thomas Wouters0e3f5912006-08-11 14:57:12 +000064 r.lr = POINT()
Ezio Melottib3aedd42010-11-20 19:04:17 +000065 self.assertEqual(r._objects, {'0': {}, '1': {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000066
67class ArrayTestCase(unittest.TestCase):
68 def test_cint_array(self):
69 INTARR = c_int * 3
70
71 ia = INTARR()
Ezio Melottib3aedd42010-11-20 19:04:17 +000072 self.assertEqual(ia._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000073 ia[0] = 1
74 ia[1] = 2
75 ia[2] = 3
Ezio Melottib3aedd42010-11-20 19:04:17 +000076 self.assertEqual(ia._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000077
78 class X(Structure):
79 _fields_ = [("x", c_int),
80 ("a", INTARR)]
81
82 x = X()
83 x.x = 1000
84 x.a[0] = 42
85 x.a[1] = 96
Ezio Melottib3aedd42010-11-20 19:04:17 +000086 self.assertEqual(x._objects, None)
Thomas Hellerbabddfc2006-03-08 19:56:54 +000087 x.a = ia
Ezio Melottib3aedd42010-11-20 19:04:17 +000088 self.assertEqual(x._objects, {'1': {}})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000089
90class PointerTestCase(unittest.TestCase):
Thomas Wouters0e3f5912006-08-11 14:57:12 +000091 def test_p_cint(self):
92 i = c_int(42)
93 x = pointer(i)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000094 self.assertEqual(x._objects, {'1': i})
Thomas Hellerbabddfc2006-03-08 19:56:54 +000095
96class DeletePointerTestCase(unittest.TestCase):
97 def X_test(self):
98 class X(Structure):
99 _fields_ = [("p", POINTER(c_char_p))]
100 x = X()
101 i = c_char_p("abc def")
102 from sys import getrefcount as grc
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000103 print("2?", grc(i))
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000104 x.p = pointer(i)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000105 print("3?", grc(i))
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000106 for i in range(320):
107 c_int(99)
108 x.p[0]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000109 print(x.p[0])
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000110## del x
111## print "2?", grc(i)
112## del i
113 import gc
114 gc.collect()
115 for i in range(320):
116 c_int(99)
117 x.p[0]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000118 print(x.p[0])
119 print(x.p.contents)
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000120## print x._objects
121
122 x.p[0] = "spam spam"
123## print x.p[0]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000124 print("+" * 42)
125 print(x._objects)
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000126
127class PointerToStructure(unittest.TestCase):
128 def test(self):
129 class POINT(Structure):
130 _fields_ = [("x", c_int), ("y", c_int)]
131 class RECT(Structure):
132 _fields_ = [("a", POINTER(POINT)),
133 ("b", POINTER(POINT))]
134 r = RECT()
135 p1 = POINT(1, 2)
Tim Peterse8d09e52006-03-09 01:15:05 +0000136
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000137 r.a = pointer(p1)
138 r.b = pointer(p1)
139## from pprint import pprint as pp
140## pp(p1._objects)
141## pp(r._objects)
142
143 r.a[0].x = 42
144 r.a[0].y = 99
145
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000146 # to avoid leaking when tests are run several times
147 # clean up the types left in the cache.
148 from ctypes import _pointer_type_cache
149 del _pointer_type_cache[POINT]
150
Thomas Hellerbabddfc2006-03-08 19:56:54 +0000151if __name__ == "__main__":
152 unittest.main()