Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(114)

Side by Side Diff: Lib/ctypes/test/test_slicing.py

Issue 602: range: lean and mean (Closed) SVN Base: http://svn.python.org/view/*checkout*/python/branches/py3k/
Patch Set: __len__ is back! Created 3 months, 3 weeks ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 import unittest 1 import unittest
2 from ctypes import * 2 from ctypes import *
3 3
4 import _ctypes_test 4 import _ctypes_test
5 5
6 class SlicesTestCase(unittest.TestCase): 6 class SlicesTestCase(unittest.TestCase):
7 def test_getslice_cint(self): 7 def test_getslice_cint(self):
8 a = (c_int * 100)(*range(1100, 1200)) 8 a = (c_int * 100)(*range(1100, 1200))
9 b = list(range(1100, 1200)) 9 b = list(range(1100, 1200))
10 self.failUnlessEqual(a[0:2], b[0:2]) 10 self.failUnlessEqual(a[0:2], b[0:2])
11 self.failUnlessEqual(a[0:2:], b[0:2:]) 11 self.failUnlessEqual(a[0:2:], b[0:2:])
12 self.failUnlessEqual(len(a), len(b)) 12 self.failUnlessEqual(len(a), len(b))
13 self.failUnlessEqual(a[5:7], b[5:7]) 13 self.failUnlessEqual(a[5:7], b[5:7])
14 self.failUnlessEqual(a[5:7:], b[5:7:]) 14 self.failUnlessEqual(a[5:7:], b[5:7:])
15 self.failUnlessEqual(a[-1], b[-1]) 15 self.failUnlessEqual(a[-1], b[-1])
16 self.failUnlessEqual(a[:], b[:]) 16 self.failUnlessEqual(a[:], b[:])
17 self.failUnlessEqual(a[::], b[::]) 17 self.failUnlessEqual(a[::], b[::])
18 self.failUnlessEqual(a[10::-1], b[10::-1]) 18 self.failUnlessEqual(a[10::-1], b[10::-1])
19 self.failUnlessEqual(a[30:20:-1], b[30:20:-1]) 19 self.failUnlessEqual(a[30:20:-1], b[30:20:-1])
20 self.failUnlessEqual(a[:12:6], b[:12:6]) 20 self.failUnlessEqual(a[:12:6], b[:12:6])
21 self.failUnlessEqual(a[2:6:4], b[2:6:4]) 21 self.failUnlessEqual(a[2:6:4], b[2:6:4])
22 22
23 a[0:5] = range(5, 10) 23 a[0:5] = list(range(5, 10))
GvR 2008/05/03 05:04:35 Hm... Why can't you assign a range() to a c_int ar
Benjamin 2008/05/03 17:18:39 On 2008/05/03 05:04:35, gvanrossum wrote: > Hm...
24 self.failUnlessEqual(a[0:5], list(range(5, 10))) 24 self.failUnlessEqual(a[0:5], list(range(5, 10)))
25 self.failUnlessEqual(a[0:5:], list(range(5, 10))) 25 self.failUnlessEqual(a[0:5:], list(range(5, 10)))
26 self.failUnlessEqual(a[4::-1], list(range(9, 4, -1))) 26 self.failUnlessEqual(a[4::-1], list(range(9, 4, -1)))
27 27
28 def test_setslice_cint(self): 28 def test_setslice_cint(self):
29 a = (c_int * 100)(*range(1100, 1200)) 29 a = (c_int * 100)(*range(1100, 1200))
30 b = list(range(1100, 1200)) 30 b = list(range(1100, 1200))
31 31
32 a[32:47] = list(range(32, 47)) 32 a[32:47] = list(range(32, 47))
33 self.failUnlessEqual(a[32:47], list(range(32, 47))) 33 self.failUnlessEqual(a[32:47], list(range(32, 47)))
34 a[32:47] = range(132, 147) 34 a[32:47] = list(range(132, 147))
35 self.failUnlessEqual(a[32:47:], list(range(132, 147))) 35 self.failUnlessEqual(a[32:47:], list(range(132, 147)))
36 a[46:31:-1] = range(232, 247) 36 a[46:31:-1] = list(range(232, 247))
37 self.failUnlessEqual(a[32:47:1], list(range(246, 231, -1))) 37 self.failUnlessEqual(a[32:47:1], list(range(246, 231, -1)))
38 38
39 a[32:47] = range(1132, 1147) 39 a[32:47] = list(range(1132, 1147))
40 self.failUnlessEqual(a[:], b) 40 self.failUnlessEqual(a[:], b)
41 a[32:47:7] = range(3) 41 a[32:47:7] = list(range(3))
42 b[32:47:7] = range(3) 42 b[32:47:7] = list(range(3))
43 self.failUnlessEqual(a[:], b) 43 self.failUnlessEqual(a[:], b)
44 a[33::-3] = range(12) 44 a[33::-3] = list(range(12))
45 b[33::-3] = range(12) 45 b[33::-3] = list(range(12))
46 self.failUnlessEqual(a[:], b) 46 self.failUnlessEqual(a[:], b)
47 47
48 from operator import setitem 48 from operator import setitem
49 49
50 # TypeError: int expected instead of str instance 50 # TypeError: int expected instead of str instance
51 self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde") 51 self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde")
52 # TypeError: int expected instead of str instance 52 # TypeError: int expected instead of str instance
53 self.assertRaises(TypeError, setitem, a, slice(0, 5), 53 self.assertRaises(TypeError, setitem, a, slice(0, 5),
54 ["a", "b", "c", "d", "e"]) 54 ["a", "b", "c", "d", "e"])
55 # TypeError: int expected instead of float instance 55 # TypeError: int expected instead of float instance
56 self.assertRaises(TypeError, setitem, a, slice(0, 5), 56 self.assertRaises(TypeError, setitem, a, slice(0, 5),
57 [1, 2, 3, 4, 3.14]) 57 [1, 2, 3, 4, 3.14])
58 # ValueError: Can only assign sequence of same size 58 # ValueError: Can only assign sequence of same size
59 self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32)) 59 self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32))
60 60
61 def test_char_ptr(self): 61 def test_char_ptr(self):
62 s = b"abcdefghijklmnopqrstuvwxyz" 62 s = b"abcdefghijklmnopqrstuvwxyz"
63 63
64 dll = CDLL(_ctypes_test.__file__) 64 dll = CDLL(_ctypes_test.__file__)
65 dll.my_strdup.restype = POINTER(c_char) 65 dll.my_strdup.restype = POINTER(c_char)
66 dll.my_free.restype = None 66 dll.my_free.restype = None
67 res = dll.my_strdup(s) 67 res = dll.my_strdup(s)
68 self.failUnlessEqual(res[:len(s)], s) 68 self.failUnlessEqual(res[:len(s)], s)
69 self.failUnlessEqual(res[:3], s[:3]) 69 self.failUnlessEqual(res[:3], s[:3])
70 self.failUnlessEqual(res[:len(s):], s) 70 self.failUnlessEqual(res[:len(s):], s)
71 self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1]) 71 self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1])
72 self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7]) 72 self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7])
73 self.failUnlessEqual(res[0:-1:-1], s[0::-1]) 73 self.failUnlessEqual(res[0:-1:-1], s[0::-1])
74 74
75 import operator 75 import operator
76 self.assertRaises(ValueError, operator.getitem, 76 self.assertRaises(ValueError, operator.getitem,
77 res, slice(None, None, None)) 77 res, slice(None, None, None))
78 self.assertRaises(ValueError, operator.getitem, 78 self.assertRaises(ValueError, operator.getitem,
79 res, slice(0, None, None)) 79 res, slice(0, None, None))
80 self.assertRaises(ValueError, operator.getitem, 80 self.assertRaises(ValueError, operator.getitem,
81 res, slice(None, 5, -1)) 81 res, slice(None, 5, -1))
82 self.assertRaises(ValueError, operator.getitem, 82 self.assertRaises(ValueError, operator.getitem,
83 res, slice(-5, None, None)) 83 res, slice(-5, None, None))
84 84
85 self.assertRaises(TypeError, operator.setitem, 85 self.assertRaises(TypeError, operator.setitem,
86 res, slice(0, 5), "abcde") 86 res, slice(0, 5), "abcde")
87 dll.my_free(res) 87 dll.my_free(res)
88 88
89 dll.my_strdup.restype = POINTER(c_byte) 89 dll.my_strdup.restype = POINTER(c_byte)
90 res = dll.my_strdup(s) 90 res = dll.my_strdup(s)
91 self.failUnlessEqual(res[:len(s)], list(range(ord("a"), ord("z")+1))) 91 self.failUnlessEqual(res[:len(s)], list(range(ord("a"), ord("z")+1)))
92 self.failUnlessEqual(res[:len(s):], list(range(ord("a"), ord("z")+1))) 92 self.failUnlessEqual(res[:len(s):], list(range(ord("a"), ord("z")+1)))
93 dll.my_free(res) 93 dll.my_free(res)
94 94
95 def test_char_ptr_with_free(self): 95 def test_char_ptr_with_free(self):
96 dll = CDLL(_ctypes_test.__file__) 96 dll = CDLL(_ctypes_test.__file__)
97 s = b"abcdefghijklmnopqrstuvwxyz" 97 s = b"abcdefghijklmnopqrstuvwxyz"
98 98
99 class allocated_c_char_p(c_char_p): 99 class allocated_c_char_p(c_char_p):
100 pass 100 pass
101 101
102 dll.my_free.restype = None 102 dll.my_free.restype = None
103 def errcheck(result, func, args): 103 def errcheck(result, func, args):
104 retval = result.value 104 retval = result.value
105 dll.my_free(result) 105 dll.my_free(result)
106 return retval 106 return retval
107 107
108 dll.my_strdup.restype = allocated_c_char_p 108 dll.my_strdup.restype = allocated_c_char_p
109 dll.my_strdup.errcheck = errcheck 109 dll.my_strdup.errcheck = errcheck
110 try: 110 try:
111 res = dll.my_strdup(s) 111 res = dll.my_strdup(s)
112 self.failUnlessEqual(res, s.decode()) 112 self.failUnlessEqual(res, s.decode())
113 finally: 113 finally:
114 del dll.my_strdup.errcheck 114 del dll.my_strdup.errcheck
115 115
116 116
117 def test_char_array(self): 117 def test_char_array(self):
118 s = b"abcdefghijklmnopqrstuvwxyz\0" 118 s = b"abcdefghijklmnopqrstuvwxyz\0"
119 119
120 p = (c_char * 27)(*s) 120 p = (c_char * 27)(*s)
121 self.failUnlessEqual(p[:], s) 121 self.failUnlessEqual(p[:], s)
122 self.failUnlessEqual(p[::], s) 122 self.failUnlessEqual(p[::], s)
123 self.failUnlessEqual(p[::-1], s[::-1]) 123 self.failUnlessEqual(p[::-1], s[::-1])
124 self.failUnlessEqual(p[5::-2], s[5::-2]) 124 self.failUnlessEqual(p[5::-2], s[5::-2])
125 self.failUnlessEqual(p[2:5:-3], s[2:5:-3]) 125 self.failUnlessEqual(p[2:5:-3], s[2:5:-3])
126 126
127 127
128 try: 128 try:
129 c_wchar 129 c_wchar
130 except NameError: 130 except NameError:
131 pass 131 pass
132 else: 132 else:
133 def test_wchar_ptr(self): 133 def test_wchar_ptr(self):
134 s = "abcdefghijklmnopqrstuvwxyz\0" 134 s = "abcdefghijklmnopqrstuvwxyz\0"
135 135
136 dll = CDLL(_ctypes_test.__file__) 136 dll = CDLL(_ctypes_test.__file__)
137 dll.my_wcsdup.restype = POINTER(c_wchar) 137 dll.my_wcsdup.restype = POINTER(c_wchar)
138 dll.my_wcsdup.argtypes = POINTER(c_wchar), 138 dll.my_wcsdup.argtypes = POINTER(c_wchar),
139 dll.my_free.restype = None 139 dll.my_free.restype = None
140 res = dll.my_wcsdup(s) 140 res = dll.my_wcsdup(s)
141 self.failUnlessEqual(res[:len(s)], s) 141 self.failUnlessEqual(res[:len(s)], s)
142 self.failUnlessEqual(res[:len(s):], s) 142 self.failUnlessEqual(res[:len(s):], s)
143 self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1]) 143 self.failUnlessEqual(res[len(s)-1:-1:-1], s[::-1])
144 self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7]) 144 self.failUnlessEqual(res[len(s)-1:5:-7], s[:5:-7])
145 145
146 import operator 146 import operator
147 self.assertRaises(TypeError, operator.setitem, 147 self.assertRaises(TypeError, operator.setitem,
148 res, slice(0, 5), "abcde") 148 res, slice(0, 5), "abcde")
149 dll.my_free(res) 149 dll.my_free(res)
150 150
151 if sizeof(c_wchar) == sizeof(c_short): 151 if sizeof(c_wchar) == sizeof(c_short):
152 dll.my_wcsdup.restype = POINTER(c_short) 152 dll.my_wcsdup.restype = POINTER(c_short)
153 elif sizeof(c_wchar) == sizeof(c_int): 153 elif sizeof(c_wchar) == sizeof(c_int):
154 dll.my_wcsdup.restype = POINTER(c_int) 154 dll.my_wcsdup.restype = POINTER(c_int)
155 elif sizeof(c_wchar) == sizeof(c_long): 155 elif sizeof(c_wchar) == sizeof(c_long):
156 dll.my_wcsdup.restype = POINTER(c_long) 156 dll.my_wcsdup.restype = POINTER(c_long)
157 else: 157 else:
158 return 158 return
159 res = dll.my_wcsdup(s) 159 res = dll.my_wcsdup(s)
160 tmpl = list(range(ord("a"), ord("z")+1)) 160 tmpl = list(range(ord("a"), ord("z")+1))
161 self.failUnlessEqual(res[:len(s)-1], tmpl) 161 self.failUnlessEqual(res[:len(s)-1], tmpl)
162 self.failUnlessEqual(res[:len(s)-1:], tmpl) 162 self.failUnlessEqual(res[:len(s)-1:], tmpl)
163 self.failUnlessEqual(res[len(s)-2:-1:-1], tmpl[::-1]) 163 self.failUnlessEqual(res[len(s)-2:-1:-1], tmpl[::-1])
164 self.failUnlessEqual(res[len(s)-2:5:-7], tmpl[:5:-7]) 164 self.failUnlessEqual(res[len(s)-2:5:-7], tmpl[:5:-7])
165 dll.my_free(res) 165 dll.my_free(res)
166 166
167 ################################################################ 167 ################################################################
168 168
169 if __name__ == "__main__": 169 if __name__ == "__main__":
170 unittest.main() 170 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld r292