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