You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.0 KiB
154 lines
4.0 KiB
from ctypes import *
|
|
import unittest
|
|
|
|
class SimpleTestCase(unittest.TestCase):
|
|
def test_cint(self):
|
|
x = c_int()
|
|
self.assertEqual(x._objects, None)
|
|
x.value = 42
|
|
self.assertEqual(x._objects, None)
|
|
x = c_int(99)
|
|
self.assertEqual(x._objects, None)
|
|
|
|
def test_ccharp(self):
|
|
x = c_char_p()
|
|
self.assertEqual(x._objects, None)
|
|
x.value = b"abc"
|
|
self.assertEqual(x._objects, b"abc")
|
|
x = c_char_p(b"spam")
|
|
self.assertEqual(x._objects, b"spam")
|
|
|
|
class StructureTestCase(unittest.TestCase):
|
|
def test_cint_struct(self):
|
|
class X(Structure):
|
|
_fields_ = [("a", c_int),
|
|
("b", c_int)]
|
|
|
|
x = X()
|
|
self.assertEqual(x._objects, None)
|
|
x.a = 42
|
|
x.b = 99
|
|
self.assertEqual(x._objects, None)
|
|
|
|
def test_ccharp_struct(self):
|
|
class X(Structure):
|
|
_fields_ = [("a", c_char_p),
|
|
("b", c_char_p)]
|
|
x = X()
|
|
self.assertEqual(x._objects, None)
|
|
|
|
x.a = b"spam"
|
|
x.b = b"foo"
|
|
self.assertEqual(x._objects, {"0": b"spam", "1": b"foo"})
|
|
|
|
def test_struct_struct(self):
|
|
class POINT(Structure):
|
|
_fields_ = [("x", c_int), ("y", c_int)]
|
|
class RECT(Structure):
|
|
_fields_ = [("ul", POINT), ("lr", POINT)]
|
|
|
|
r = RECT()
|
|
r.ul.x = 0
|
|
r.ul.y = 1
|
|
r.lr.x = 2
|
|
r.lr.y = 3
|
|
self.assertEqual(r._objects, None)
|
|
|
|
r = RECT()
|
|
pt = POINT(1, 2)
|
|
r.ul = pt
|
|
self.assertEqual(r._objects, {'0': {}})
|
|
r.ul.x = 22
|
|
r.ul.y = 44
|
|
self.assertEqual(r._objects, {'0': {}})
|
|
r.lr = POINT()
|
|
self.assertEqual(r._objects, {'0': {}, '1': {}})
|
|
|
|
class ArrayTestCase(unittest.TestCase):
|
|
def test_cint_array(self):
|
|
INTARR = c_int * 3
|
|
|
|
ia = INTARR()
|
|
self.assertEqual(ia._objects, None)
|
|
ia[0] = 1
|
|
ia[1] = 2
|
|
ia[2] = 3
|
|
self.assertEqual(ia._objects, None)
|
|
|
|
class X(Structure):
|
|
_fields_ = [("x", c_int),
|
|
("a", INTARR)]
|
|
|
|
x = X()
|
|
x.x = 1000
|
|
x.a[0] = 42
|
|
x.a[1] = 96
|
|
self.assertEqual(x._objects, None)
|
|
x.a = ia
|
|
self.assertEqual(x._objects, {'1': {}})
|
|
|
|
class PointerTestCase(unittest.TestCase):
|
|
def test_p_cint(self):
|
|
i = c_int(42)
|
|
x = pointer(i)
|
|
self.assertEqual(x._objects, {'1': i})
|
|
|
|
class DeletePointerTestCase(unittest.TestCase):
|
|
@unittest.skip('test disabled')
|
|
def test_X(self):
|
|
class X(Structure):
|
|
_fields_ = [("p", POINTER(c_char_p))]
|
|
x = X()
|
|
i = c_char_p("abc def")
|
|
from sys import getrefcount as grc
|
|
print("2?", grc(i))
|
|
x.p = pointer(i)
|
|
print("3?", grc(i))
|
|
for i in range(320):
|
|
c_int(99)
|
|
x.p[0]
|
|
print(x.p[0])
|
|
## del x
|
|
## print "2?", grc(i)
|
|
## del i
|
|
import gc
|
|
gc.collect()
|
|
for i in range(320):
|
|
c_int(99)
|
|
x.p[0]
|
|
print(x.p[0])
|
|
print(x.p.contents)
|
|
## print x._objects
|
|
|
|
x.p[0] = "spam spam"
|
|
## print x.p[0]
|
|
print("+" * 42)
|
|
print(x._objects)
|
|
|
|
class PointerToStructure(unittest.TestCase):
|
|
def test(self):
|
|
class POINT(Structure):
|
|
_fields_ = [("x", c_int), ("y", c_int)]
|
|
class RECT(Structure):
|
|
_fields_ = [("a", POINTER(POINT)),
|
|
("b", POINTER(POINT))]
|
|
r = RECT()
|
|
p1 = POINT(1, 2)
|
|
|
|
r.a = pointer(p1)
|
|
r.b = pointer(p1)
|
|
## from pprint import pprint as pp
|
|
## pp(p1._objects)
|
|
## pp(r._objects)
|
|
|
|
r.a[0].x = 42
|
|
r.a[0].y = 99
|
|
|
|
# to avoid leaking when tests are run several times
|
|
# clean up the types left in the cache.
|
|
from ctypes import _pointer_type_cache
|
|
del _pointer_type_cache[POINT]
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|