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