14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ctypes import *
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MyInt(c_int):
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __cmp__(self, other):
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if type(other) != MyInt:
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return -1
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return cmp(self.value, other.value)
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __hash__(self): # Silence Py3k warning
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return hash(self.value)
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Test(unittest.TestCase):
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_compare(self):
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(MyInt(3), MyInt(3))
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(MyInt(42), MyInt(43))
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ignore_retval(self):
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test if the return value of a callback is ignored
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if restype is None
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        proto = CFUNCTYPE(None)
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def func():
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (1, "abc", None)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cb = proto(func)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, cb())
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_int_callback(self):
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = []
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def func(arg):
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args.append(arg)
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return arg
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cb = CFUNCTYPE(None, MyInt)(func)
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(None, cb(42))
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(args[-1]), MyInt)
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cb = CFUNCTYPE(c_int, c_int)(func)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(42, cb(42))
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(args[-1]), int)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_int_struct(self):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class X(Structure):
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _fields_ = [("x", MyInt)]
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(X().x, MyInt())
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = X()
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.x = MyInt(42)
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.x, MyInt(42))
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    unittest.main()
58