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.
56 lines
1.3 KiB
56 lines
1.3 KiB
5 years ago
|
import unittest
|
||
|
from ctypes import *
|
||
|
|
||
|
class MyInt(c_int):
|
||
|
def __eq__(self, other):
|
||
|
if type(other) != MyInt:
|
||
|
return NotImplementedError
|
||
|
return self.value == other.value
|
||
|
|
||
|
class Test(unittest.TestCase):
|
||
|
|
||
|
def test_compare(self):
|
||
|
self.assertEqual(MyInt(3), MyInt(3))
|
||
|
self.assertNotEqual(MyInt(42), MyInt(43))
|
||
|
|
||
|
def test_ignore_retval(self):
|
||
|
# Test if the return value of a callback is ignored
|
||
|
# if restype is None
|
||
|
proto = CFUNCTYPE(None)
|
||
|
def func():
|
||
|
return (1, "abc", None)
|
||
|
|
||
|
cb = proto(func)
|
||
|
self.assertEqual(None, cb())
|
||
|
|
||
|
|
||
|
def test_int_callback(self):
|
||
|
args = []
|
||
|
def func(arg):
|
||
|
args.append(arg)
|
||
|
return arg
|
||
|
|
||
|
cb = CFUNCTYPE(None, MyInt)(func)
|
||
|
|
||
|
self.assertEqual(None, cb(42))
|
||
|
self.assertEqual(type(args[-1]), MyInt)
|
||
|
|
||
|
cb = CFUNCTYPE(c_int, c_int)(func)
|
||
|
|
||
|
self.assertEqual(42, cb(42))
|
||
|
self.assertEqual(type(args[-1]), int)
|
||
|
|
||
|
def test_int_struct(self):
|
||
|
class X(Structure):
|
||
|
_fields_ = [("x", MyInt)]
|
||
|
|
||
|
self.assertEqual(X().x, MyInt())
|
||
|
|
||
|
s = X()
|
||
|
s.x = MyInt(42)
|
||
|
|
||
|
self.assertEqual(s.x, MyInt(42))
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
unittest.main()
|