10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom ctypes import *
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MyInt(c_int):
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __cmp__(self, other):
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if type(other) != MyInt:
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return -1
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return cmp(self.value, other.value)
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __hash__(self): # Silence Py3k warning
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return hash(self.value)
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass Test(unittest.TestCase):
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_compare(self):
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(MyInt(3), MyInt(3))
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(MyInt(42), MyInt(43))
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ignore_retval(self):
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test if the return value of a callback is ignored
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # if restype is None
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        proto = CFUNCTYPE(None)
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def func():
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return (1, "abc", None)
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cb = proto(func)
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, cb())
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_int_callback(self):
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        args = []
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def func(arg):
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            args.append(arg)
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return arg
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cb = CFUNCTYPE(None, MyInt)(func)
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(None, cb(42))
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(args[-1]), MyInt)
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cb = CFUNCTYPE(c_int, c_int)(func)
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(42, cb(42))
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(args[-1]), int)
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_int_struct(self):
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(Structure):
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _fields_ = [("x", MyInt)]
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(X().x, MyInt())
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = X()
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s.x = MyInt(42)
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.x, MyInt(42))
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    unittest.main()
58