Home | History | Annotate | Download | only in test
      1 import unittest
      2 from ctypes import *
      3 
      4 class MyInt(c_int):
      5     def __cmp__(self, other):
      6         if type(other) != MyInt:
      7             return -1
      8         return cmp(self.value, other.value)
      9     def __hash__(self): # Silence Py3k warning
     10         return hash(self.value)
     11 
     12 class Test(unittest.TestCase):
     13 
     14     def test_compare(self):
     15         self.assertEqual(MyInt(3), MyInt(3))
     16         self.assertNotEqual(MyInt(42), MyInt(43))
     17 
     18     def test_ignore_retval(self):
     19         # Test if the return value of a callback is ignored
     20         # if restype is None
     21         proto = CFUNCTYPE(None)
     22         def func():
     23             return (1, "abc", None)
     24 
     25         cb = proto(func)
     26         self.assertEqual(None, cb())
     27 
     28 
     29     def test_int_callback(self):
     30         args = []
     31         def func(arg):
     32             args.append(arg)
     33             return arg
     34 
     35         cb = CFUNCTYPE(None, MyInt)(func)
     36 
     37         self.assertEqual(None, cb(42))
     38         self.assertEqual(type(args[-1]), MyInt)
     39 
     40         cb = CFUNCTYPE(c_int, c_int)(func)
     41 
     42         self.assertEqual(42, cb(42))
     43         self.assertEqual(type(args[-1]), int)
     44 
     45     def test_int_struct(self):
     46         class X(Structure):
     47             _fields_ = [("x", MyInt)]
     48 
     49         self.assertEqual(X().x, MyInt())
     50 
     51         s = X()
     52         s.x = MyInt(42)
     53 
     54         self.assertEqual(s.x, MyInt(42))
     55 
     56 if __name__ == "__main__":
     57     unittest.main()
     58