14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ctypes import * 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport _ctypes_test 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SlicesTestCase(unittest.TestCase): 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_getslice_cint(self): 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a = (c_int * 100)(*xrange(1100, 1200)) 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = range(1100, 1200) 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[0:2], b[0:2]) 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[0:2:], b[0:2:]) 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(len(a), len(b)) 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[5:7], b[5:7]) 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[5:7:], b[5:7:]) 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[-1], b[-1]) 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[:], b[:]) 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[::], b[::]) 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[10::-1], b[10::-1]) 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[30:20:-1], b[30:20:-1]) 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[:12:6], b[:12:6]) 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[2:6:4], b[2:6:4]) 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[0:5] = range(5, 10) 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[0:5], range(5, 10)) 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[0:5:], range(5, 10)) 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[4::-1], range(9, 4, -1)) 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_setslice_cint(self): 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a = (c_int * 100)(*xrange(1100, 1200)) 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = range(1100, 1200) 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[32:47] = range(32, 47) 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[32:47], range(32, 47)) 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[32:47] = range(132, 147) 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[32:47:], range(132, 147)) 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[46:31:-1] = range(232, 247) 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[32:47:1], range(246, 231, -1)) 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[32:47] = range(1132, 1147) 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[:], b) 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[32:47:7] = range(3) 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b[32:47:7] = range(3) 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[:], b) 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a[33::-3] = range(12) 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b[33::-3] = range(12) 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(a[:], b) 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from operator import setslice, setitem 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # TypeError: int expected instead of str instance 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setslice, a, 0, 5, "abcde") 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde") 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # TypeError: int expected instead of str instance 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setslice, a, 0, 5, ["a", "b", "c", "d", "e"]) 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setitem, a, slice(0, 5), 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ["a", "b", "c", "d", "e"]) 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # TypeError: int expected instead of float instance 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setslice, a, 0, 5, [1, 2, 3, 4, 3.14]) 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, setitem, a, slice(0, 5), 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao [1, 2, 3, 4, 3.14]) 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # ValueError: Can only assign sequence of same size 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, setslice, a, 0, 5, range(32)) 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32)) 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_char_ptr(self): 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s = "abcdefghijklmnopqrstuvwxyz" 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll = CDLL(_ctypes_test.__file__) 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_strdup.restype = POINTER(c_char) 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free.restype = None 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = dll.my_strdup(s) 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s)], s) 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:3], s[:3]) 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s):], s) 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-1:-1:-1], s[::-1]) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-1:5:-7], s[:5:-7]) 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[0:-1:-1], s[0::-1]) 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import operator 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, operator.getitem, 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(None, None, None)) 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, operator.getitem, 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(0, None, None)) 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, operator.getitem, 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(None, 5, -1)) 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(ValueError, operator.getitem, 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(-5, None, None)) 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, operator.setslice, 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, 0, 5, u"abcde") 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, operator.setitem, 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(0, 5), u"abcde") 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free(res) 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_strdup.restype = POINTER(c_byte) 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = dll.my_strdup(s) 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s)], range(ord("a"), ord("z")+1)) 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s):], range(ord("a"), ord("z")+1)) 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free(res) 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_char_ptr_with_free(self): 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll = CDLL(_ctypes_test.__file__) 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s = "abcdefghijklmnopqrstuvwxyz" 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao class allocated_c_char_p(c_char_p): 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free.restype = None 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def errcheck(result, func, args): 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao retval = result.value 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free(result) 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return retval 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_strdup.restype = allocated_c_char_p 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_strdup.errcheck = errcheck 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = dll.my_strdup(s) 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res, s) 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del dll.my_strdup.errcheck 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_char_array(self): 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s = "abcdefghijklmnopqrstuvwxyz\0" 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao p = (c_char * 27)(*s) 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(p[:], s) 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(p[::], s) 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(p[::-1], s[::-1]) 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(p[5::-2], s[5::-2]) 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(p[2:5:-3], s[2:5:-3]) 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao c_wchar 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except NameError: 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_wchar_ptr(self): 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s = u"abcdefghijklmnopqrstuvwxyz\0" 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll = CDLL(_ctypes_test.__file__) 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_wcsdup.restype = POINTER(c_wchar) 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_wcsdup.argtypes = POINTER(c_wchar), 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free.restype = None 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = dll.my_wcsdup(s) 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s)], s) 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s):], s) 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-1:-1:-1], s[::-1]) 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-1:5:-7], s[:5:-7]) 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import operator 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, operator.setslice, 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, 0, 5, u"abcde") 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(TypeError, operator.setitem, 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res, slice(0, 5), u"abcde") 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free(res) 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if sizeof(c_wchar) == sizeof(c_short): 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_wcsdup.restype = POINTER(c_short) 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif sizeof(c_wchar) == sizeof(c_int): 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_wcsdup.restype = POINTER(c_int) 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif sizeof(c_wchar) == sizeof(c_long): 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_wcsdup.restype = POINTER(c_long) 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = dll.my_wcsdup(s) 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao tmpl = range(ord("a"), ord("z")+1) 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s)-1], tmpl) 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[:len(s)-1:], tmpl) 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-2:-1:-1], tmpl[::-1]) 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(res[len(s)-2:5:-7], tmpl[:5:-7]) 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dll.my_free(res) 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao################################################################ 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__": 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unittest.main() 179