1 | import operator
|
---|
2 | import unittest
|
---|
3 |
|
---|
4 | from test import test_support
|
---|
5 |
|
---|
6 | class Seq1:
|
---|
7 | def __init__(self, lst):
|
---|
8 | self.lst = lst
|
---|
9 | def __len__(self):
|
---|
10 | return len(self.lst)
|
---|
11 | def __getitem__(self, i):
|
---|
12 | return self.lst[i]
|
---|
13 | def __add__(self, other):
|
---|
14 | return self.lst + other.lst
|
---|
15 | def __mul__(self, other):
|
---|
16 | return self.lst * other
|
---|
17 | def __rmul__(self, other):
|
---|
18 | return other * self.lst
|
---|
19 |
|
---|
20 | class Seq2(object):
|
---|
21 | def __init__(self, lst):
|
---|
22 | self.lst = lst
|
---|
23 | def __len__(self):
|
---|
24 | return len(self.lst)
|
---|
25 | def __getitem__(self, i):
|
---|
26 | return self.lst[i]
|
---|
27 | def __add__(self, other):
|
---|
28 | return self.lst + other.lst
|
---|
29 | def __mul__(self, other):
|
---|
30 | return self.lst * other
|
---|
31 | def __rmul__(self, other):
|
---|
32 | return other * self.lst
|
---|
33 |
|
---|
34 |
|
---|
35 | class OperatorTestCase(unittest.TestCase):
|
---|
36 | def test_lt(self):
|
---|
37 | self.assertRaises(TypeError, operator.lt)
|
---|
38 | self.assertRaises(TypeError, operator.lt, 1j, 2j)
|
---|
39 | self.assertFalse(operator.lt(1, 0))
|
---|
40 | self.assertFalse(operator.lt(1, 0.0))
|
---|
41 | self.assertFalse(operator.lt(1, 1))
|
---|
42 | self.assertFalse(operator.lt(1, 1.0))
|
---|
43 | self.assertTrue(operator.lt(1, 2))
|
---|
44 | self.assertTrue(operator.lt(1, 2.0))
|
---|
45 |
|
---|
46 | def test_le(self):
|
---|
47 | self.assertRaises(TypeError, operator.le)
|
---|
48 | self.assertRaises(TypeError, operator.le, 1j, 2j)
|
---|
49 | self.assertFalse(operator.le(1, 0))
|
---|
50 | self.assertFalse(operator.le(1, 0.0))
|
---|
51 | self.assertTrue(operator.le(1, 1))
|
---|
52 | self.assertTrue(operator.le(1, 1.0))
|
---|
53 | self.assertTrue(operator.le(1, 2))
|
---|
54 | self.assertTrue(operator.le(1, 2.0))
|
---|
55 |
|
---|
56 | def test_eq(self):
|
---|
57 | class C(object):
|
---|
58 | def __eq__(self, other):
|
---|
59 | raise SyntaxError
|
---|
60 | __hash__ = None # Silence Py3k warning
|
---|
61 | self.assertRaises(TypeError, operator.eq)
|
---|
62 | self.assertRaises(SyntaxError, operator.eq, C(), C())
|
---|
63 | self.assertFalse(operator.eq(1, 0))
|
---|
64 | self.assertFalse(operator.eq(1, 0.0))
|
---|
65 | self.assertTrue(operator.eq(1, 1))
|
---|
66 | self.assertTrue(operator.eq(1, 1.0))
|
---|
67 | self.assertFalse(operator.eq(1, 2))
|
---|
68 | self.assertFalse(operator.eq(1, 2.0))
|
---|
69 |
|
---|
70 | def test_ne(self):
|
---|
71 | class C(object):
|
---|
72 | def __ne__(self, other):
|
---|
73 | raise SyntaxError
|
---|
74 | self.assertRaises(TypeError, operator.ne)
|
---|
75 | self.assertRaises(SyntaxError, operator.ne, C(), C())
|
---|
76 | self.assertTrue(operator.ne(1, 0))
|
---|
77 | self.assertTrue(operator.ne(1, 0.0))
|
---|
78 | self.assertFalse(operator.ne(1, 1))
|
---|
79 | self.assertFalse(operator.ne(1, 1.0))
|
---|
80 | self.assertTrue(operator.ne(1, 2))
|
---|
81 | self.assertTrue(operator.ne(1, 2.0))
|
---|
82 |
|
---|
83 | def test_ge(self):
|
---|
84 | self.assertRaises(TypeError, operator.ge)
|
---|
85 | self.assertRaises(TypeError, operator.ge, 1j, 2j)
|
---|
86 | self.assertTrue(operator.ge(1, 0))
|
---|
87 | self.assertTrue(operator.ge(1, 0.0))
|
---|
88 | self.assertTrue(operator.ge(1, 1))
|
---|
89 | self.assertTrue(operator.ge(1, 1.0))
|
---|
90 | self.assertFalse(operator.ge(1, 2))
|
---|
91 | self.assertFalse(operator.ge(1, 2.0))
|
---|
92 |
|
---|
93 | def test_gt(self):
|
---|
94 | self.assertRaises(TypeError, operator.gt)
|
---|
95 | self.assertRaises(TypeError, operator.gt, 1j, 2j)
|
---|
96 | self.assertTrue(operator.gt(1, 0))
|
---|
97 | self.assertTrue(operator.gt(1, 0.0))
|
---|
98 | self.assertFalse(operator.gt(1, 1))
|
---|
99 | self.assertFalse(operator.gt(1, 1.0))
|
---|
100 | self.assertFalse(operator.gt(1, 2))
|
---|
101 | self.assertFalse(operator.gt(1, 2.0))
|
---|
102 |
|
---|
103 | def test_abs(self):
|
---|
104 | self.assertRaises(TypeError, operator.abs)
|
---|
105 | self.assertRaises(TypeError, operator.abs, None)
|
---|
106 | self.assertTrue(operator.abs(-1) == 1)
|
---|
107 | self.assertTrue(operator.abs(1) == 1)
|
---|
108 |
|
---|
109 | def test_add(self):
|
---|
110 | self.assertRaises(TypeError, operator.add)
|
---|
111 | self.assertRaises(TypeError, operator.add, None, None)
|
---|
112 | self.assertTrue(operator.add(3, 4) == 7)
|
---|
113 |
|
---|
114 | def test_bitwise_and(self):
|
---|
115 | self.assertRaises(TypeError, operator.and_)
|
---|
116 | self.assertRaises(TypeError, operator.and_, None, None)
|
---|
117 | self.assertTrue(operator.and_(0xf, 0xa) == 0xa)
|
---|
118 |
|
---|
119 | def test_concat(self):
|
---|
120 | self.assertRaises(TypeError, operator.concat)
|
---|
121 | self.assertRaises(TypeError, operator.concat, None, None)
|
---|
122 | self.assertTrue(operator.concat('py', 'thon') == 'python')
|
---|
123 | self.assertTrue(operator.concat([1, 2], [3, 4]) == [1, 2, 3, 4])
|
---|
124 | self.assertTrue(operator.concat(Seq1([5, 6]), Seq1([7])) == [5, 6, 7])
|
---|
125 | self.assertTrue(operator.concat(Seq2([5, 6]), Seq2([7])) == [5, 6, 7])
|
---|
126 | self.assertRaises(TypeError, operator.concat, 13, 29)
|
---|
127 |
|
---|
128 | def test_countOf(self):
|
---|
129 | self.assertRaises(TypeError, operator.countOf)
|
---|
130 | self.assertRaises(TypeError, operator.countOf, None, None)
|
---|
131 | self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 3) == 1)
|
---|
132 | self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 5) == 0)
|
---|
133 |
|
---|
134 | def test_delitem(self):
|
---|
135 | a = [4, 3, 2, 1]
|
---|
136 | self.assertRaises(TypeError, operator.delitem, a)
|
---|
137 | self.assertRaises(TypeError, operator.delitem, a, None)
|
---|
138 | self.assertTrue(operator.delitem(a, 1) is None)
|
---|
139 | self.assertTrue(a == [4, 2, 1])
|
---|
140 |
|
---|
141 | def test_delslice(self):
|
---|
142 | a = range(10)
|
---|
143 | self.assertRaises(TypeError, operator.delslice, a)
|
---|
144 | self.assertRaises(TypeError, operator.delslice, a, None, None)
|
---|
145 | self.assertTrue(operator.delslice(a, 2, 8) is None)
|
---|
146 | self.assertTrue(a == [0, 1, 8, 9])
|
---|
147 | operator.delslice(a, 0, test_support.MAX_Py_ssize_t)
|
---|
148 | self.assertTrue(a == [])
|
---|
149 |
|
---|
150 | def test_div(self):
|
---|
151 | self.assertRaises(TypeError, operator.div, 5)
|
---|
152 | self.assertRaises(TypeError, operator.div, None, None)
|
---|
153 | self.assertTrue(operator.floordiv(5, 2) == 2)
|
---|
154 |
|
---|
155 | def test_floordiv(self):
|
---|
156 | self.assertRaises(TypeError, operator.floordiv, 5)
|
---|
157 | self.assertRaises(TypeError, operator.floordiv, None, None)
|
---|
158 | self.assertTrue(operator.floordiv(5, 2) == 2)
|
---|
159 |
|
---|
160 | def test_truediv(self):
|
---|
161 | self.assertRaises(TypeError, operator.truediv, 5)
|
---|
162 | self.assertRaises(TypeError, operator.truediv, None, None)
|
---|
163 | self.assertTrue(operator.truediv(5, 2) == 2.5)
|
---|
164 |
|
---|
165 | def test_getitem(self):
|
---|
166 | a = range(10)
|
---|
167 | self.assertRaises(TypeError, operator.getitem)
|
---|
168 | self.assertRaises(TypeError, operator.getitem, a, None)
|
---|
169 | self.assertTrue(operator.getitem(a, 2) == 2)
|
---|
170 |
|
---|
171 | def test_getslice(self):
|
---|
172 | a = range(10)
|
---|
173 | self.assertRaises(TypeError, operator.getslice)
|
---|
174 | self.assertRaises(TypeError, operator.getslice, a, None, None)
|
---|
175 | self.assertTrue(operator.getslice(a, 4, 6) == [4, 5])
|
---|
176 | b = operator.getslice(a, 0, test_support.MAX_Py_ssize_t)
|
---|
177 | self.assertTrue(b == a)
|
---|
178 |
|
---|
179 | def test_indexOf(self):
|
---|
180 | self.assertRaises(TypeError, operator.indexOf)
|
---|
181 | self.assertRaises(TypeError, operator.indexOf, None, None)
|
---|
182 | self.assertTrue(operator.indexOf([4, 3, 2, 1], 3) == 1)
|
---|
183 | self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
|
---|
184 |
|
---|
185 | def test_invert(self):
|
---|
186 | self.assertRaises(TypeError, operator.invert)
|
---|
187 | self.assertRaises(TypeError, operator.invert, None)
|
---|
188 | self.assertTrue(operator.inv(4) == -5)
|
---|
189 |
|
---|
190 | def test_isCallable(self):
|
---|
191 | self.assertRaises(TypeError, operator.isCallable)
|
---|
192 | class C:
|
---|
193 | pass
|
---|
194 | def check(self, o, v):
|
---|
195 | with test_support.check_py3k_warnings():
|
---|
196 | self.assertEqual(operator.isCallable(o), v)
|
---|
197 | self.assertEqual(callable(o), v)
|
---|
198 | check(self, 4, 0)
|
---|
199 | check(self, operator.isCallable, 1)
|
---|
200 | check(self, C, 1)
|
---|
201 | check(self, C(), 0)
|
---|
202 |
|
---|
203 | def test_isMappingType(self):
|
---|
204 | self.assertRaises(TypeError, operator.isMappingType)
|
---|
205 | self.assertFalse(operator.isMappingType(1))
|
---|
206 | self.assertFalse(operator.isMappingType(operator.isMappingType))
|
---|
207 | self.assertTrue(operator.isMappingType(operator.__dict__))
|
---|
208 | self.assertTrue(operator.isMappingType({}))
|
---|
209 |
|
---|
210 | def test_isNumberType(self):
|
---|
211 | self.assertRaises(TypeError, operator.isNumberType)
|
---|
212 | self.assertTrue(operator.isNumberType(8))
|
---|
213 | self.assertTrue(operator.isNumberType(8j))
|
---|
214 | self.assertTrue(operator.isNumberType(8L))
|
---|
215 | self.assertTrue(operator.isNumberType(8.3))
|
---|
216 | self.assertFalse(operator.isNumberType(dir()))
|
---|
217 |
|
---|
218 | def test_isSequenceType(self):
|
---|
219 | self.assertRaises(TypeError, operator.isSequenceType)
|
---|
220 | self.assertTrue(operator.isSequenceType(dir()))
|
---|
221 | self.assertTrue(operator.isSequenceType(()))
|
---|
222 | self.assertTrue(operator.isSequenceType(xrange(10)))
|
---|
223 | self.assertTrue(operator.isSequenceType('yeahbuddy'))
|
---|
224 | self.assertFalse(operator.isSequenceType(3))
|
---|
225 | class Dict(dict): pass
|
---|
226 | self.assertFalse(operator.isSequenceType(Dict()))
|
---|
227 |
|
---|
228 | def test_lshift(self):
|
---|
229 | self.assertRaises(TypeError, operator.lshift)
|
---|
230 | self.assertRaises(TypeError, operator.lshift, None, 42)
|
---|
231 | self.assertTrue(operator.lshift(5, 1) == 10)
|
---|
232 | self.assertTrue(operator.lshift(5, 0) == 5)
|
---|
233 | self.assertRaises(ValueError, operator.lshift, 2, -1)
|
---|
234 |
|
---|
235 | def test_mod(self):
|
---|
236 | self.assertRaises(TypeError, operator.mod)
|
---|
237 | self.assertRaises(TypeError, operator.mod, None, 42)
|
---|
238 | self.assertTrue(operator.mod(5, 2) == 1)
|
---|
239 |
|
---|
240 | def test_mul(self):
|
---|
241 | self.assertRaises(TypeError, operator.mul)
|
---|
242 | self.assertRaises(TypeError, operator.mul, None, None)
|
---|
243 | self.assertTrue(operator.mul(5, 2) == 10)
|
---|
244 |
|
---|
245 | def test_neg(self):
|
---|
246 | self.assertRaises(TypeError, operator.neg)
|
---|
247 | self.assertRaises(TypeError, operator.neg, None)
|
---|
248 | self.assertTrue(operator.neg(5) == -5)
|
---|
249 | self.assertTrue(operator.neg(-5) == 5)
|
---|
250 | self.assertTrue(operator.neg(0) == 0)
|
---|
251 | self.assertTrue(operator.neg(-0) == 0)
|
---|
252 |
|
---|
253 | def test_bitwise_or(self):
|
---|
254 | self.assertRaises(TypeError, operator.or_)
|
---|
255 | self.assertRaises(TypeError, operator.or_, None, None)
|
---|
256 | self.assertTrue(operator.or_(0xa, 0x5) == 0xf)
|
---|
257 |
|
---|
258 | def test_pos(self):
|
---|
259 | self.assertRaises(TypeError, operator.pos)
|
---|
260 | self.assertRaises(TypeError, operator.pos, None)
|
---|
261 | self.assertTrue(operator.pos(5) == 5)
|
---|
262 | self.assertTrue(operator.pos(-5) == -5)
|
---|
263 | self.assertTrue(operator.pos(0) == 0)
|
---|
264 | self.assertTrue(operator.pos(-0) == 0)
|
---|
265 |
|
---|
266 | def test_pow(self):
|
---|
267 | self.assertRaises(TypeError, operator.pow)
|
---|
268 | self.assertRaises(TypeError, operator.pow, None, None)
|
---|
269 | self.assertTrue(operator.pow(3,5) == 3**5)
|
---|
270 | self.assertTrue(operator.__pow__(3,5) == 3**5)
|
---|
271 | self.assertRaises(TypeError, operator.pow, 1)
|
---|
272 | self.assertRaises(TypeError, operator.pow, 1, 2, 3)
|
---|
273 |
|
---|
274 | def test_repeat(self):
|
---|
275 | a = range(3)
|
---|
276 | self.assertRaises(TypeError, operator.repeat)
|
---|
277 | self.assertRaises(TypeError, operator.repeat, a, None)
|
---|
278 | self.assertTrue(operator.repeat(a, 2) == a+a)
|
---|
279 | self.assertTrue(operator.repeat(a, 1) == a)
|
---|
280 | self.assertTrue(operator.repeat(a, 0) == [])
|
---|
281 | a = (1, 2, 3)
|
---|
282 | self.assertTrue(operator.repeat(a, 2) == a+a)
|
---|
283 | self.assertTrue(operator.repeat(a, 1) == a)
|
---|
284 | self.assertTrue(operator.repeat(a, 0) == ())
|
---|
285 | a = '123'
|
---|
286 | self.assertTrue(operator.repeat(a, 2) == a+a)
|
---|
287 | self.assertTrue(operator.repeat(a, 1) == a)
|
---|
288 | self.assertTrue(operator.repeat(a, 0) == '')
|
---|
289 | a = Seq1([4, 5, 6])
|
---|
290 | self.assertTrue(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6])
|
---|
291 | self.assertTrue(operator.repeat(a, 1) == [4, 5, 6])
|
---|
292 | self.assertTrue(operator.repeat(a, 0) == [])
|
---|
293 | a = Seq2([4, 5, 6])
|
---|
294 | self.assertTrue(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6])
|
---|
295 | self.assertTrue(operator.repeat(a, 1) == [4, 5, 6])
|
---|
296 | self.assertTrue(operator.repeat(a, 0) == [])
|
---|
297 | self.assertRaises(TypeError, operator.repeat, 6, 7)
|
---|
298 |
|
---|
299 | def test_rshift(self):
|
---|
300 | self.assertRaises(TypeError, operator.rshift)
|
---|
301 | self.assertRaises(TypeError, operator.rshift, None, 42)
|
---|
302 | self.assertTrue(operator.rshift(5, 1) == 2)
|
---|
303 | self.assertTrue(operator.rshift(5, 0) == 5)
|
---|
304 | self.assertRaises(ValueError, operator.rshift, 2, -1)
|
---|
305 |
|
---|
306 | def test_contains(self):
|
---|
307 | self.assertRaises(TypeError, operator.contains)
|
---|
308 | self.assertRaises(TypeError, operator.contains, None, None)
|
---|
309 | self.assertTrue(operator.contains(range(4), 2))
|
---|
310 | self.assertFalse(operator.contains(range(4), 5))
|
---|
311 | with test_support.check_py3k_warnings():
|
---|
312 | self.assertTrue(operator.sequenceIncludes(range(4), 2))
|
---|
313 | self.assertFalse(operator.sequenceIncludes(range(4), 5))
|
---|
314 |
|
---|
315 | def test_setitem(self):
|
---|
316 | a = range(3)
|
---|
317 | self.assertRaises(TypeError, operator.setitem, a)
|
---|
318 | self.assertRaises(TypeError, operator.setitem, a, None, None)
|
---|
319 | self.assertTrue(operator.setitem(a, 0, 2) is None)
|
---|
320 | self.assertTrue(a == [2, 1, 2])
|
---|
321 | self.assertRaises(IndexError, operator.setitem, a, 4, 2)
|
---|
322 |
|
---|
323 | def test_setslice(self):
|
---|
324 | a = range(4)
|
---|
325 | self.assertRaises(TypeError, operator.setslice, a)
|
---|
326 | self.assertRaises(TypeError, operator.setslice, a, None, None, None)
|
---|
327 | self.assertTrue(operator.setslice(a, 1, 3, [2, 1]) is None)
|
---|
328 | self.assertTrue(a == [0, 2, 1, 3])
|
---|
329 | operator.setslice(a, 0, test_support.MAX_Py_ssize_t, [])
|
---|
330 | self.assertTrue(a == [])
|
---|
331 |
|
---|
332 | def test_sub(self):
|
---|
333 | self.assertRaises(TypeError, operator.sub)
|
---|
334 | self.assertRaises(TypeError, operator.sub, None, None)
|
---|
335 | self.assertTrue(operator.sub(5, 2) == 3)
|
---|
336 |
|
---|
337 | def test_truth(self):
|
---|
338 | class C(object):
|
---|
339 | def __nonzero__(self):
|
---|
340 | raise SyntaxError
|
---|
341 | self.assertRaises(TypeError, operator.truth)
|
---|
342 | self.assertRaises(SyntaxError, operator.truth, C())
|
---|
343 | self.assertTrue(operator.truth(5))
|
---|
344 | self.assertTrue(operator.truth([0]))
|
---|
345 | self.assertFalse(operator.truth(0))
|
---|
346 | self.assertFalse(operator.truth([]))
|
---|
347 |
|
---|
348 | def test_bitwise_xor(self):
|
---|
349 | self.assertRaises(TypeError, operator.xor)
|
---|
350 | self.assertRaises(TypeError, operator.xor, None, None)
|
---|
351 | self.assertTrue(operator.xor(0xb, 0xc) == 0x7)
|
---|
352 |
|
---|
353 | def test_is(self):
|
---|
354 | a = b = 'xyzpdq'
|
---|
355 | c = a[:3] + b[3:]
|
---|
356 | self.assertRaises(TypeError, operator.is_)
|
---|
357 | self.assertTrue(operator.is_(a, b))
|
---|
358 | self.assertFalse(operator.is_(a,c))
|
---|
359 |
|
---|
360 | def test_is_not(self):
|
---|
361 | a = b = 'xyzpdq'
|
---|
362 | c = a[:3] + b[3:]
|
---|
363 | self.assertRaises(TypeError, operator.is_not)
|
---|
364 | self.assertFalse(operator.is_not(a, b))
|
---|
365 | self.assertTrue(operator.is_not(a,c))
|
---|
366 |
|
---|
367 | def test_attrgetter(self):
|
---|
368 | class A:
|
---|
369 | pass
|
---|
370 | a = A()
|
---|
371 | a.name = 'arthur'
|
---|
372 | f = operator.attrgetter('name')
|
---|
373 | self.assertEqual(f(a), 'arthur')
|
---|
374 | f = operator.attrgetter('rank')
|
---|
375 | self.assertRaises(AttributeError, f, a)
|
---|
376 | f = operator.attrgetter(2)
|
---|
377 | self.assertRaises(TypeError, f, a)
|
---|
378 | self.assertRaises(TypeError, operator.attrgetter)
|
---|
379 |
|
---|
380 | # multiple gets
|
---|
381 | record = A()
|
---|
382 | record.x = 'X'
|
---|
383 | record.y = 'Y'
|
---|
384 | record.z = 'Z'
|
---|
385 | self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
|
---|
386 | self.assertRaises(TypeError, operator.attrgetter('x', (), 'y'), record)
|
---|
387 |
|
---|
388 | class C(object):
|
---|
389 | def __getattr__(self, name):
|
---|
390 | raise SyntaxError
|
---|
391 | self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
|
---|
392 |
|
---|
393 | # recursive gets
|
---|
394 | a = A()
|
---|
395 | a.name = 'arthur'
|
---|
396 | a.child = A()
|
---|
397 | a.child.name = 'thomas'
|
---|
398 | f = operator.attrgetter('child.name')
|
---|
399 | self.assertEqual(f(a), 'thomas')
|
---|
400 | self.assertRaises(AttributeError, f, a.child)
|
---|
401 | f = operator.attrgetter('name', 'child.name')
|
---|
402 | self.assertEqual(f(a), ('arthur', 'thomas'))
|
---|
403 | f = operator.attrgetter('name', 'child.name', 'child.child.name')
|
---|
404 | self.assertRaises(AttributeError, f, a)
|
---|
405 |
|
---|
406 | a.child.child = A()
|
---|
407 | a.child.child.name = 'johnson'
|
---|
408 | f = operator.attrgetter('child.child.name')
|
---|
409 | self.assertEqual(f(a), 'johnson')
|
---|
410 | f = operator.attrgetter('name', 'child.name', 'child.child.name')
|
---|
411 | self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
|
---|
412 |
|
---|
413 | def test_itemgetter(self):
|
---|
414 | a = 'ABCDE'
|
---|
415 | f = operator.itemgetter(2)
|
---|
416 | self.assertEqual(f(a), 'C')
|
---|
417 | f = operator.itemgetter(10)
|
---|
418 | self.assertRaises(IndexError, f, a)
|
---|
419 |
|
---|
420 | class C(object):
|
---|
421 | def __getitem__(self, name):
|
---|
422 | raise SyntaxError
|
---|
423 | self.assertRaises(SyntaxError, operator.itemgetter(42), C())
|
---|
424 |
|
---|
425 | f = operator.itemgetter('name')
|
---|
426 | self.assertRaises(TypeError, f, a)
|
---|
427 | self.assertRaises(TypeError, operator.itemgetter)
|
---|
428 |
|
---|
429 | d = dict(key='val')
|
---|
430 | f = operator.itemgetter('key')
|
---|
431 | self.assertEqual(f(d), 'val')
|
---|
432 | f = operator.itemgetter('nonkey')
|
---|
433 | self.assertRaises(KeyError, f, d)
|
---|
434 |
|
---|
435 | # example used in the docs
|
---|
436 | inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
|
---|
437 | getcount = operator.itemgetter(1)
|
---|
438 | self.assertEqual(map(getcount, inventory), [3, 2, 5, 1])
|
---|
439 | self.assertEqual(sorted(inventory, key=getcount),
|
---|
440 | [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
|
---|
441 |
|
---|
442 | # multiple gets
|
---|
443 | data = map(str, range(20))
|
---|
444 | self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
|
---|
445 | self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
|
---|
446 |
|
---|
447 | def test_methodcaller(self):
|
---|
448 | self.assertRaises(TypeError, operator.methodcaller)
|
---|
449 | class A:
|
---|
450 | def foo(self, *args, **kwds):
|
---|
451 | return args[0] + args[1]
|
---|
452 | def bar(self, f=42):
|
---|
453 | return f
|
---|
454 | a = A()
|
---|
455 | f = operator.methodcaller('foo')
|
---|
456 | self.assertRaises(IndexError, f, a)
|
---|
457 | f = operator.methodcaller('foo', 1, 2)
|
---|
458 | self.assertEqual(f(a), 3)
|
---|
459 | f = operator.methodcaller('bar')
|
---|
460 | self.assertEqual(f(a), 42)
|
---|
461 | self.assertRaises(TypeError, f, a, a)
|
---|
462 | f = operator.methodcaller('bar', f=5)
|
---|
463 | self.assertEqual(f(a), 5)
|
---|
464 |
|
---|
465 | def test_inplace(self):
|
---|
466 | class C(object):
|
---|
467 | def __iadd__ (self, other): return "iadd"
|
---|
468 | def __iand__ (self, other): return "iand"
|
---|
469 | def __idiv__ (self, other): return "idiv"
|
---|
470 | def __ifloordiv__(self, other): return "ifloordiv"
|
---|
471 | def __ilshift__ (self, other): return "ilshift"
|
---|
472 | def __imod__ (self, other): return "imod"
|
---|
473 | def __imul__ (self, other): return "imul"
|
---|
474 | def __ior__ (self, other): return "ior"
|
---|
475 | def __ipow__ (self, other): return "ipow"
|
---|
476 | def __irshift__ (self, other): return "irshift"
|
---|
477 | def __isub__ (self, other): return "isub"
|
---|
478 | def __itruediv__ (self, other): return "itruediv"
|
---|
479 | def __ixor__ (self, other): return "ixor"
|
---|
480 | def __getitem__(self, other): return 5 # so that C is a sequence
|
---|
481 | c = C()
|
---|
482 | self.assertEqual(operator.iadd (c, 5), "iadd")
|
---|
483 | self.assertEqual(operator.iand (c, 5), "iand")
|
---|
484 | self.assertEqual(operator.idiv (c, 5), "idiv")
|
---|
485 | self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
|
---|
486 | self.assertEqual(operator.ilshift (c, 5), "ilshift")
|
---|
487 | self.assertEqual(operator.imod (c, 5), "imod")
|
---|
488 | self.assertEqual(operator.imul (c, 5), "imul")
|
---|
489 | self.assertEqual(operator.ior (c, 5), "ior")
|
---|
490 | self.assertEqual(operator.ipow (c, 5), "ipow")
|
---|
491 | self.assertEqual(operator.irshift (c, 5), "irshift")
|
---|
492 | self.assertEqual(operator.isub (c, 5), "isub")
|
---|
493 | self.assertEqual(operator.itruediv (c, 5), "itruediv")
|
---|
494 | self.assertEqual(operator.ixor (c, 5), "ixor")
|
---|
495 | self.assertEqual(operator.iconcat (c, c), "iadd")
|
---|
496 | self.assertEqual(operator.irepeat (c, 5), "imul")
|
---|
497 | self.assertEqual(operator.__iadd__ (c, 5), "iadd")
|
---|
498 | self.assertEqual(operator.__iand__ (c, 5), "iand")
|
---|
499 | self.assertEqual(operator.__idiv__ (c, 5), "idiv")
|
---|
500 | self.assertEqual(operator.__ifloordiv__(c, 5), "ifloordiv")
|
---|
501 | self.assertEqual(operator.__ilshift__ (c, 5), "ilshift")
|
---|
502 | self.assertEqual(operator.__imod__ (c, 5), "imod")
|
---|
503 | self.assertEqual(operator.__imul__ (c, 5), "imul")
|
---|
504 | self.assertEqual(operator.__ior__ (c, 5), "ior")
|
---|
505 | self.assertEqual(operator.__ipow__ (c, 5), "ipow")
|
---|
506 | self.assertEqual(operator.__irshift__ (c, 5), "irshift")
|
---|
507 | self.assertEqual(operator.__isub__ (c, 5), "isub")
|
---|
508 | self.assertEqual(operator.__itruediv__ (c, 5), "itruediv")
|
---|
509 | self.assertEqual(operator.__ixor__ (c, 5), "ixor")
|
---|
510 | self.assertEqual(operator.__iconcat__ (c, c), "iadd")
|
---|
511 | self.assertEqual(operator.__irepeat__ (c, 5), "imul")
|
---|
512 |
|
---|
513 | def test_main(verbose=None):
|
---|
514 | import sys
|
---|
515 | test_classes = (
|
---|
516 | OperatorTestCase,
|
---|
517 | )
|
---|
518 |
|
---|
519 | test_support.run_unittest(*test_classes)
|
---|
520 |
|
---|
521 | # verify reference counting
|
---|
522 | if verbose and hasattr(sys, "gettotalrefcount"):
|
---|
523 | import gc
|
---|
524 | counts = [None] * 5
|
---|
525 | for i in xrange(len(counts)):
|
---|
526 | test_support.run_unittest(*test_classes)
|
---|
527 | gc.collect()
|
---|
528 | counts[i] = sys.gettotalrefcount()
|
---|
529 | print counts
|
---|
530 |
|
---|
531 | if __name__ == "__main__":
|
---|
532 | test_main(verbose=True)
|
---|