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