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