Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | """ |
2 | Tests common to list and UserList.UserList | |
3 | """ | |
4 | ||
5 | import sys | |
6 | import os | |
7 | ||
8 | import unittest | |
9 | from test import test_support, seq_tests | |
10 | ||
11 | class CommonTest(seq_tests.CommonTest): | |
12 | ||
13 | def test_init(self): | |
14 | # Iterable arg is optional | |
15 | self.assertEqual(self.type2test([]), self.type2test()) | |
16 | ||
17 | # Init clears previous values | |
18 | a = self.type2test([1, 2, 3]) | |
19 | a.__init__() | |
20 | self.assertEqual(a, self.type2test([])) | |
21 | ||
22 | # Init overwrites previous values | |
23 | a = self.type2test([1, 2, 3]) | |
24 | a.__init__([4, 5, 6]) | |
25 | self.assertEqual(a, self.type2test([4, 5, 6])) | |
26 | ||
27 | # Mutables always return a new object | |
28 | b = self.type2test(a) | |
29 | self.assertNotEqual(id(a), id(b)) | |
30 | self.assertEqual(a, b) | |
31 | ||
32 | def test_repr(self): | |
33 | l0 = [] | |
34 | l2 = [0, 1, 2] | |
35 | a0 = self.type2test(l0) | |
36 | a2 = self.type2test(l2) | |
37 | ||
38 | self.assertEqual(str(a0), str(l0)) | |
39 | self.assertEqual(repr(a0), repr(l0)) | |
40 | self.assertEqual(`a2`, `l2`) | |
41 | self.assertEqual(str(a2), "[0, 1, 2]") | |
42 | self.assertEqual(repr(a2), "[0, 1, 2]") | |
43 | ||
44 | a2.append(a2) | |
45 | a2.append(3) | |
46 | self.assertEqual(str(a2), "[0, 1, 2, [...], 3]") | |
47 | self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]") | |
48 | ||
49 | def test_print(self): | |
50 | d = self.type2test(xrange(200)) | |
51 | d.append(d) | |
52 | d.extend(xrange(200,400)) | |
53 | d.append(d) | |
54 | d.append(400) | |
55 | try: | |
56 | fo = open(test_support.TESTFN, "wb") | |
57 | print >> fo, d, | |
58 | fo.close() | |
59 | fo = open(test_support.TESTFN, "rb") | |
60 | self.assertEqual(fo.read(), repr(d)) | |
61 | finally: | |
62 | fo.close() | |
63 | os.remove(test_support.TESTFN) | |
64 | ||
65 | def test_set_subscript(self): | |
66 | a = self.type2test(range(20)) | |
67 | self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 0), [1,2,3]) | |
68 | self.assertRaises(TypeError, a.__setitem__, slice(0, 10), 1) | |
69 | self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 2), [1,2]) | |
70 | self.assertRaises(TypeError, a.__getitem__, 'x', 1) | |
71 | a[slice(2,10,3)] = [1,2,3] | |
72 | self.assertEqual(a, self.type2test([0, 1, 1, 3, 4, 2, 6, 7, 3, | |
73 | 9, 10, 11, 12, 13, 14, 15, | |
74 | 16, 17, 18, 19])) | |
75 | ||
76 | def test_reversed(self): | |
77 | a = self.type2test(range(20)) | |
78 | r = reversed(a) | |
79 | self.assertEqual(list(r), self.type2test(range(19, -1, -1))) | |
80 | self.assertRaises(StopIteration, r.next) | |
81 | self.assertEqual(list(reversed(self.type2test())), | |
82 | self.type2test()) | |
83 | ||
84 | def test_setitem(self): | |
85 | a = self.type2test([0, 1]) | |
86 | a[0] = 0 | |
87 | a[1] = 100 | |
88 | self.assertEqual(a, self.type2test([0, 100])) | |
89 | a[-1] = 200 | |
90 | self.assertEqual(a, self.type2test([0, 200])) | |
91 | a[-2] = 100 | |
92 | self.assertEqual(a, self.type2test([100, 200])) | |
93 | self.assertRaises(IndexError, a.__setitem__, -3, 200) | |
94 | self.assertRaises(IndexError, a.__setitem__, 2, 200) | |
95 | ||
96 | a = self.type2test([]) | |
97 | self.assertRaises(IndexError, a.__setitem__, 0, 200) | |
98 | self.assertRaises(IndexError, a.__setitem__, -1, 200) | |
99 | self.assertRaises(TypeError, a.__setitem__) | |
100 | ||
101 | a = self.type2test([0,1,2,3,4]) | |
102 | a[0L] = 1 | |
103 | a[1L] = 2 | |
104 | a[2L] = 3 | |
105 | self.assertEqual(a, self.type2test([1,2,3,3,4])) | |
106 | a[0] = 5 | |
107 | a[1] = 6 | |
108 | a[2] = 7 | |
109 | self.assertEqual(a, self.type2test([5,6,7,3,4])) | |
110 | a[-2L] = 88 | |
111 | a[-1L] = 99 | |
112 | self.assertEqual(a, self.type2test([5,6,7,88,99])) | |
113 | a[-2] = 8 | |
114 | a[-1] = 9 | |
115 | self.assertEqual(a, self.type2test([5,6,7,8,9])) | |
116 | ||
117 | def test_delitem(self): | |
118 | a = self.type2test([0, 1]) | |
119 | del a[1] | |
120 | self.assertEqual(a, [0]) | |
121 | del a[0] | |
122 | self.assertEqual(a, []) | |
123 | ||
124 | a = self.type2test([0, 1]) | |
125 | del a[-2] | |
126 | self.assertEqual(a, [1]) | |
127 | del a[-1] | |
128 | self.assertEqual(a, []) | |
129 | ||
130 | a = self.type2test([0, 1]) | |
131 | self.assertRaises(IndexError, a.__delitem__, -3) | |
132 | self.assertRaises(IndexError, a.__delitem__, 2) | |
133 | ||
134 | a = self.type2test([]) | |
135 | self.assertRaises(IndexError, a.__delitem__, 0) | |
136 | ||
137 | self.assertRaises(TypeError, a.__delitem__) | |
138 | ||
139 | def test_setslice(self): | |
140 | l = [0, 1] | |
141 | a = self.type2test(l) | |
142 | ||
143 | for i in range(-3, 4): | |
144 | a[:i] = l[:i] | |
145 | self.assertEqual(a, l) | |
146 | a2 = a[:] | |
147 | a2[:i] = a[:i] | |
148 | self.assertEqual(a2, a) | |
149 | a[i:] = l[i:] | |
150 | self.assertEqual(a, l) | |
151 | a2 = a[:] | |
152 | a2[i:] = a[i:] | |
153 | self.assertEqual(a2, a) | |
154 | for j in range(-3, 4): | |
155 | a[i:j] = l[i:j] | |
156 | self.assertEqual(a, l) | |
157 | a2 = a[:] | |
158 | a2[i:j] = a[i:j] | |
159 | self.assertEqual(a2, a) | |
160 | ||
161 | aa2 = a2[:] | |
162 | aa2[:0] = [-2, -1] | |
163 | self.assertEqual(aa2, [-2, -1, 0, 1]) | |
164 | aa2[0:] = [] | |
165 | self.assertEqual(aa2, []) | |
166 | ||
167 | a = self.type2test([1, 2, 3, 4, 5]) | |
168 | a[:-1] = a | |
169 | self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 5])) | |
170 | a = self.type2test([1, 2, 3, 4, 5]) | |
171 | a[1:] = a | |
172 | self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5])) | |
173 | a = self.type2test([1, 2, 3, 4, 5]) | |
174 | a[1:-1] = a | |
175 | self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5, 5])) | |
176 | ||
177 | a = self.type2test([]) | |
178 | a[:] = tuple(range(10)) | |
179 | self.assertEqual(a, self.type2test(range(10))) | |
180 | ||
181 | self.assertRaises(TypeError, a.__setslice__, 0, 1, 5) | |
182 | ||
183 | self.assertRaises(TypeError, a.__setslice__) | |
184 | ||
185 | def test_delslice(self): | |
186 | a = self.type2test([0, 1]) | |
187 | del a[1:2] | |
188 | del a[0:1] | |
189 | self.assertEqual(a, self.type2test([])) | |
190 | ||
191 | a = self.type2test([0, 1]) | |
192 | del a[1L:2L] | |
193 | del a[0L:1L] | |
194 | self.assertEqual(a, self.type2test([])) | |
195 | ||
196 | a = self.type2test([0, 1]) | |
197 | del a[-2:-1] | |
198 | self.assertEqual(a, self.type2test([1])) | |
199 | ||
200 | a = self.type2test([0, 1]) | |
201 | del a[-2L:-1L] | |
202 | self.assertEqual(a, self.type2test([1])) | |
203 | ||
204 | a = self.type2test([0, 1]) | |
205 | del a[1:] | |
206 | del a[:1] | |
207 | self.assertEqual(a, self.type2test([])) | |
208 | ||
209 | a = self.type2test([0, 1]) | |
210 | del a[1L:] | |
211 | del a[:1L] | |
212 | self.assertEqual(a, self.type2test([])) | |
213 | ||
214 | a = self.type2test([0, 1]) | |
215 | del a[-1:] | |
216 | self.assertEqual(a, self.type2test([0])) | |
217 | ||
218 | a = self.type2test([0, 1]) | |
219 | del a[-1L:] | |
220 | self.assertEqual(a, self.type2test([0])) | |
221 | ||
222 | a = self.type2test([0, 1]) | |
223 | del a[:] | |
224 | self.assertEqual(a, self.type2test([])) | |
225 | ||
226 | def test_append(self): | |
227 | a = self.type2test([]) | |
228 | a.append(0) | |
229 | a.append(1) | |
230 | a.append(2) | |
231 | self.assertEqual(a, self.type2test([0, 1, 2])) | |
232 | ||
233 | self.assertRaises(TypeError, a.append) | |
234 | ||
235 | def test_extend(self): | |
236 | a1 = self.type2test([0]) | |
237 | a2 = self.type2test((0, 1)) | |
238 | a = a1[:] | |
239 | a.extend(a2) | |
240 | self.assertEqual(a, a1 + a2) | |
241 | ||
242 | a.extend(self.type2test([])) | |
243 | self.assertEqual(a, a1 + a2) | |
244 | ||
245 | a.extend(a) | |
246 | self.assertEqual(a, self.type2test([0, 0, 1, 0, 0, 1])) | |
247 | ||
248 | a = self.type2test("spam") | |
249 | a.extend("eggs") | |
250 | self.assertEqual(a, list("spameggs")) | |
251 | ||
252 | self.assertRaises(TypeError, a.extend, None) | |
253 | ||
254 | self.assertRaises(TypeError, a.extend) | |
255 | ||
256 | def test_insert(self): | |
257 | a = self.type2test([0, 1, 2]) | |
258 | a.insert(0, -2) | |
259 | a.insert(1, -1) | |
260 | a.insert(2, 0) | |
261 | self.assertEqual(a, [-2, -1, 0, 0, 1, 2]) | |
262 | ||
263 | b = a[:] | |
264 | b.insert(-2, "foo") | |
265 | b.insert(-200, "left") | |
266 | b.insert(200, "right") | |
267 | self.assertEqual(b, self.type2test(["left",-2,-1,0,0,"foo",1,2,"right"])) | |
268 | ||
269 | self.assertRaises(TypeError, a.insert) | |
270 | ||
271 | def test_pop(self): | |
272 | from decimal import Decimal | |
273 | a = self.type2test([-1, 0, 1]) | |
274 | a.pop() | |
275 | self.assertEqual(a, [-1, 0]) | |
276 | a.pop(0) | |
277 | self.assertEqual(a, [0]) | |
278 | self.assertRaises(IndexError, a.pop, 5) | |
279 | a.pop(0) | |
280 | self.assertEqual(a, []) | |
281 | self.assertRaises(IndexError, a.pop) | |
282 | self.assertRaises(TypeError, a.pop, 42, 42) | |
283 | a = self.type2test([0, 10, 20, 30, 40]) | |
284 | self.assertEqual(a.pop(Decimal(2)), 20) | |
285 | self.assertRaises(IndexError, a.pop, Decimal(25)) | |
286 | ||
287 | def test_remove(self): | |
288 | a = self.type2test([0, 0, 1]) | |
289 | a.remove(1) | |
290 | self.assertEqual(a, [0, 0]) | |
291 | a.remove(0) | |
292 | self.assertEqual(a, [0]) | |
293 | a.remove(0) | |
294 | self.assertEqual(a, []) | |
295 | ||
296 | self.assertRaises(ValueError, a.remove, 0) | |
297 | ||
298 | self.assertRaises(TypeError, a.remove) | |
299 | ||
300 | class BadExc(Exception): | |
301 | pass | |
302 | ||
303 | class BadCmp: | |
304 | def __eq__(self, other): | |
305 | if other == 2: | |
306 | raise BadExc() | |
307 | return False | |
308 | ||
309 | a = self.type2test([0, 1, 2, 3]) | |
310 | self.assertRaises(BadExc, a.remove, BadCmp()) | |
311 | ||
312 | def test_count(self): | |
313 | a = self.type2test([0, 1, 2])*3 | |
314 | self.assertEqual(a.count(0), 3) | |
315 | self.assertEqual(a.count(1), 3) | |
316 | self.assertEqual(a.count(3), 0) | |
317 | ||
318 | self.assertRaises(TypeError, a.count) | |
319 | ||
320 | class BadExc(Exception): | |
321 | pass | |
322 | ||
323 | class BadCmp: | |
324 | def __eq__(self, other): | |
325 | if other == 2: | |
326 | raise BadExc() | |
327 | return False | |
328 | ||
329 | self.assertRaises(BadExc, a.count, BadCmp()) | |
330 | ||
331 | def test_index(self): | |
332 | u = self.type2test([0, 1]) | |
333 | self.assertEqual(u.index(0), 0) | |
334 | self.assertEqual(u.index(1), 1) | |
335 | self.assertRaises(ValueError, u.index, 2) | |
336 | ||
337 | u = self.type2test([-2, -1, 0, 0, 1, 2]) | |
338 | self.assertEqual(u.count(0), 2) | |
339 | self.assertEqual(u.index(0), 2) | |
340 | self.assertEqual(u.index(0, 2), 2) | |
341 | self.assertEqual(u.index(-2, -10), 0) | |
342 | self.assertEqual(u.index(0, 3), 3) | |
343 | self.assertEqual(u.index(0, 3, 4), 3) | |
344 | self.assertRaises(ValueError, u.index, 2, 0, -10) | |
345 | ||
346 | self.assertRaises(TypeError, u.index) | |
347 | ||
348 | class BadExc(Exception): | |
349 | pass | |
350 | ||
351 | class BadCmp: | |
352 | def __eq__(self, other): | |
353 | if other == 2: | |
354 | raise BadExc() | |
355 | return False | |
356 | ||
357 | a = self.type2test([0, 1, 2, 3]) | |
358 | self.assertRaises(BadExc, a.index, BadCmp()) | |
359 | ||
360 | a = self.type2test([-2, -1, 0, 0, 1, 2]) | |
361 | self.assertEqual(a.index(0), 2) | |
362 | self.assertEqual(a.index(0, 2), 2) | |
363 | self.assertEqual(a.index(0, -4), 2) | |
364 | self.assertEqual(a.index(-2, -10), 0) | |
365 | self.assertEqual(a.index(0, 3), 3) | |
366 | self.assertEqual(a.index(0, -3), 3) | |
367 | self.assertEqual(a.index(0, 3, 4), 3) | |
368 | self.assertEqual(a.index(0, -3, -2), 3) | |
369 | self.assertEqual(a.index(0, -4*sys.maxint, 4*sys.maxint), 2) | |
370 | self.assertRaises(ValueError, a.index, 0, 4*sys.maxint,-4*sys.maxint) | |
371 | self.assertRaises(ValueError, a.index, 2, 0, -10) | |
372 | a.remove(0) | |
373 | self.assertRaises(ValueError, a.index, 2, 0, 4) | |
374 | self.assertEqual(a, self.type2test([-2, -1, 0, 1, 2])) | |
375 | ||
376 | # Test modifying the list during index's iteration | |
377 | class EvilCmp: | |
378 | def __init__(self, victim): | |
379 | self.victim = victim | |
380 | def __eq__(self, other): | |
381 | del self.victim[:] | |
382 | return False | |
383 | a = self.type2test() | |
384 | a[:] = [EvilCmp(a) for _ in xrange(100)] | |
385 | # This used to seg fault before patch #1005778 | |
386 | self.assertRaises(ValueError, a.index, None) | |
387 | ||
388 | def test_reverse(self): | |
389 | u = self.type2test([-2, -1, 0, 1, 2]) | |
390 | u2 = u[:] | |
391 | u.reverse() | |
392 | self.assertEqual(u, [2, 1, 0, -1, -2]) | |
393 | u.reverse() | |
394 | self.assertEqual(u, u2) | |
395 | ||
396 | self.assertRaises(TypeError, u.reverse, 42) | |
397 | ||
398 | def test_sort(self): | |
399 | u = self.type2test([1, 0]) | |
400 | u.sort() | |
401 | self.assertEqual(u, [0, 1]) | |
402 | ||
403 | u = self.type2test([2,1,0,-1,-2]) | |
404 | u.sort() | |
405 | self.assertEqual(u, self.type2test([-2,-1,0,1,2])) | |
406 | ||
407 | self.assertRaises(TypeError, u.sort, 42, 42) | |
408 | ||
409 | def revcmp(a, b): | |
410 | return cmp(b, a) | |
411 | u.sort(revcmp) | |
412 | self.assertEqual(u, self.type2test([2,1,0,-1,-2])) | |
413 | ||
414 | # The following dumps core in unpatched Python 1.5: | |
415 | def myComparison(x,y): | |
416 | return cmp(x%3, y%7) | |
417 | z = self.type2test(range(12)) | |
418 | z.sort(myComparison) | |
419 | ||
420 | self.assertRaises(TypeError, z.sort, 2) | |
421 | ||
422 | def selfmodifyingComparison(x,y): | |
423 | z.append(1) | |
424 | return cmp(x, y) | |
425 | self.assertRaises(ValueError, z.sort, selfmodifyingComparison) | |
426 | ||
427 | self.assertRaises(TypeError, z.sort, lambda x, y: 's') | |
428 | ||
429 | self.assertRaises(TypeError, z.sort, 42, 42, 42, 42) | |
430 | ||
431 | def test_slice(self): | |
432 | u = self.type2test("spam") | |
433 | u[:2] = "h" | |
434 | self.assertEqual(u, list("ham")) | |
435 | ||
436 | def test_iadd(self): | |
437 | super(CommonTest, self).test_iadd() | |
438 | u = self.type2test([0, 1]) | |
439 | u2 = u | |
440 | u += [2, 3] | |
441 | self.assert_(u is u2) | |
442 | ||
443 | u = self.type2test("spam") | |
444 | u += "eggs" | |
445 | self.assertEqual(u, self.type2test("spameggs")) | |
446 | ||
447 | self.assertRaises(TypeError, u.__iadd__, None) | |
448 | ||
449 | def test_imul(self): | |
450 | u = self.type2test([0, 1]) | |
451 | u *= 3 | |
452 | self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1])) | |
453 | u *= 0 | |
454 | self.assertEqual(u, self.type2test([])) | |
455 | s = self.type2test([]) | |
456 | oldid = id(s) | |
457 | s *= 10 | |
458 | self.assertEqual(id(s), oldid) | |
459 | ||
460 | def test_extendedslicing(self): | |
461 | # subscript | |
462 | a = self.type2test([0,1,2,3,4]) | |
463 | ||
464 | # deletion | |
465 | del a[::2] | |
466 | self.assertEqual(a, self.type2test([1,3])) | |
467 | a = self.type2test(range(5)) | |
468 | del a[1::2] | |
469 | self.assertEqual(a, self.type2test([0,2,4])) | |
470 | a = self.type2test(range(5)) | |
471 | del a[1::-2] | |
472 | self.assertEqual(a, self.type2test([0,2,3,4])) | |
473 | a = self.type2test(range(10)) | |
474 | del a[::1000] | |
475 | self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9])) | |
476 | # assignment | |
477 | a = self.type2test(range(10)) | |
478 | a[::2] = [-1]*5 | |
479 | self.assertEqual(a, self.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9])) | |
480 | a = self.type2test(range(10)) | |
481 | a[::-4] = [10]*3 | |
482 | self.assertEqual(a, self.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10])) | |
483 | a = self.type2test(range(4)) | |
484 | a[::-1] = a | |
485 | self.assertEqual(a, self.type2test([3, 2, 1, 0])) | |
486 | a = self.type2test(range(10)) | |
487 | b = a[:] | |
488 | c = a[:] | |
489 | a[2:3] = self.type2test(["two", "elements"]) | |
490 | b[slice(2,3)] = self.type2test(["two", "elements"]) | |
491 | c[2:3:] = self.type2test(["two", "elements"]) | |
492 | self.assertEqual(a, b) | |
493 | self.assertEqual(a, c) | |
494 | a = self.type2test(range(10)) | |
495 | a[::2] = tuple(range(5)) | |
496 | self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) | |
497 | ||
498 | def test_constructor_exception_handling(self): | |
499 | # Bug #1242657 | |
500 | class F(object): | |
501 | def __iter__(self): | |
502 | yield 23 | |
503 | def __len__(self): | |
504 | raise KeyboardInterrupt | |
505 | self.assertRaises(KeyboardInterrupt, list, F()) |