Home | History | Annotate | Download | only in test
      1 from ctypes import *
      2 import unittest
      3 import sys
      4 
      5 class Test(unittest.TestCase):
      6 
      7     def test_array2pointer(self):
      8         array = (c_int * 3)(42, 17, 2)
      9 
     10         # casting an array to a pointer works.
     11         ptr = cast(array, POINTER(c_int))
     12         self.assertEqual([ptr[i] for i in range(3)], [42, 17, 2])
     13 
     14         if 2*sizeof(c_short) == sizeof(c_int):
     15             ptr = cast(array, POINTER(c_short))
     16             if sys.byteorder == "little":
     17                 self.assertEqual([ptr[i] for i in range(6)],
     18                                      [42, 0, 17, 0, 2, 0])
     19             else:
     20                 self.assertEqual([ptr[i] for i in range(6)],
     21                                      [0, 42, 0, 17, 0, 2])
     22 
     23     def test_address2pointer(self):
     24         array = (c_int * 3)(42, 17, 2)
     25 
     26         address = addressof(array)
     27         ptr = cast(c_void_p(address), POINTER(c_int))
     28         self.assertEqual([ptr[i] for i in range(3)], [42, 17, 2])
     29 
     30         ptr = cast(address, POINTER(c_int))
     31         self.assertEqual([ptr[i] for i in range(3)], [42, 17, 2])
     32 
     33     def test_p2a_objects(self):
     34         array = (c_char_p * 5)()
     35         self.assertEqual(array._objects, None)
     36         array[0] = "foo bar"
     37         self.assertEqual(array._objects, {'0': "foo bar"})
     38 
     39         p = cast(array, POINTER(c_char_p))
     40         # array and p share a common _objects attribute
     41         self.assertTrue(p._objects is array._objects)
     42         self.assertEqual(array._objects, {'0': "foo bar", id(array): array})
     43         p[0] = "spam spam"
     44         self.assertEqual(p._objects, {'0': "spam spam", id(array): array})
     45         self.assertTrue(array._objects is p._objects)
     46         p[1] = "foo bar"
     47         self.assertEqual(p._objects, {'1': 'foo bar', '0': "spam spam", id(array): array})
     48         self.assertTrue(array._objects is p._objects)
     49 
     50     def test_other(self):
     51         p = cast((c_int * 4)(1, 2, 3, 4), POINTER(c_int))
     52         self.assertEqual(p[:4], [1,2, 3, 4])
     53         self.assertEqual(p[:4:], [1, 2, 3, 4])
     54         self.assertEqual(p[3:-1:-1], [4, 3, 2, 1])
     55         self.assertEqual(p[:4:3], [1, 4])
     56         c_int()
     57         self.assertEqual(p[:4], [1, 2, 3, 4])
     58         self.assertEqual(p[:4:], [1, 2, 3, 4])
     59         self.assertEqual(p[3:-1:-1], [4, 3, 2, 1])
     60         self.assertEqual(p[:4:3], [1, 4])
     61         p[2] = 96
     62         self.assertEqual(p[:4], [1, 2, 96, 4])
     63         self.assertEqual(p[:4:], [1, 2, 96, 4])
     64         self.assertEqual(p[3:-1:-1], [4, 96, 2, 1])
     65         self.assertEqual(p[:4:3], [1, 4])
     66         c_int()
     67         self.assertEqual(p[:4], [1, 2, 96, 4])
     68         self.assertEqual(p[:4:], [1, 2, 96, 4])
     69         self.assertEqual(p[3:-1:-1], [4, 96, 2, 1])
     70         self.assertEqual(p[:4:3], [1, 4])
     71 
     72     def test_char_p(self):
     73         # This didn't work: bad argument to internal function
     74         s = c_char_p("hiho")
     75         self.assertEqual(cast(cast(s, c_void_p), c_char_p).value,
     76                              "hiho")
     77 
     78     try:
     79         c_wchar_p
     80     except NameError:
     81         pass
     82     else:
     83         def test_wchar_p(self):
     84             s = c_wchar_p("hiho")
     85             self.assertEqual(cast(cast(s, c_void_p), c_wchar_p).value,
     86                                  "hiho")
     87 
     88 if __name__ == "__main__":
     89     unittest.main()
     90