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