blob: 0d893f2205deba355484af420f4a799782d7dc38 [file] [log] [blame]
Walter Dörwald1dde95d2003-12-08 11:38:45 +00001"""
2Tests common to list and UserList.UserList
3"""
4
5import sys
Raymond Hettingerbcab2b22004-09-29 08:03:17 +00006import os
Walter Dörwald1dde95d2003-12-08 11:38:45 +00007
8import unittest
9from test import test_support, seq_tests
10
11class CommonTest(seq_tests.CommonTest):
12
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000013 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
Walter Dörwald1dde95d2003-12-08 11:38:45 +000032 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))
Brett Cannon0b70cca2006-08-25 02:59:59 +000040 self.assertEqual(repr(a2), repr(l2))
Walter Dörwald1dde95d2003-12-08 11:38:45 +000041 self.assertEqual(str(a2), "[0, 1, 2]")
42 self.assertEqual(repr(a2), "[0, 1, 2]")
43
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000044 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):
Guido van Rossum805365e2007-05-07 22:24:25 +000050 d = self.type2test(range(200))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000051 d.append(d)
Guido van Rossum805365e2007-05-07 22:24:25 +000052 d.extend(range(200,400))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000053 d.append(d)
54 d.append(400)
55 try:
Walter Dörwald6c037ba2007-05-24 18:05:27 +000056 fo = open(test_support.TESTFN, "w")
Guido van Rossum374812c2007-02-09 22:11:20 +000057 fo.write(str(d))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000058 fo.close()
Walter Dörwald6c037ba2007-05-24 18:05:27 +000059 fo = open(test_support.TESTFN, "r")
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000060 self.assertEqual(fo.read(), repr(d))
61 finally:
62 fo.close()
63 os.remove(test_support.TESTFN)
64
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000065 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)))
Georg Brandla18af4e2007-04-21 15:47:16 +000080 self.assertRaises(StopIteration, next, r)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000081 self.assertEqual(list(reversed(self.type2test())),
82 self.type2test())
83
Walter Dörwald1dde95d2003-12-08 11:38:45 +000084 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)
Walter Dörwald1dde95d2003-12-08 11:38:45 +000099 self.assertRaises(TypeError, a.__setitem__)
100
101 a = self.type2test([0,1,2,3,4])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000102 a[0] = 1
103 a[1] = 2
104 a[2] = 3
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000105 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]))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000110 a[-2] = 88
111 a[-1] = 99
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000112 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])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000192 del a[1:2]
193 del a[0:1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000194 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])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000201 del a[-2:-1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000202 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])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000210 del a[1:]
211 del a[:1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000212 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])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000219 del a[-1:]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000220 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 a = self.type2test([-1, 0, 1])
273 a.pop()
274 self.assertEqual(a, [-1, 0])
275 a.pop(0)
276 self.assertEqual(a, [0])
277 self.assertRaises(IndexError, a.pop, 5)
278 a.pop(0)
279 self.assertEqual(a, [])
280 self.assertRaises(IndexError, a.pop)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000281 self.assertRaises(TypeError, a.pop, 42, 42)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000282 a = self.type2test([0, 10, 20, 30, 40])
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000283
284 def test_remove(self):
285 a = self.type2test([0, 0, 1])
286 a.remove(1)
287 self.assertEqual(a, [0, 0])
288 a.remove(0)
289 self.assertEqual(a, [0])
290 a.remove(0)
291 self.assertEqual(a, [])
292
293 self.assertRaises(ValueError, a.remove, 0)
Tim Peters13018922004-01-18 21:03:23 +0000294
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000295 self.assertRaises(TypeError, a.remove)
296
297 class BadExc(Exception):
298 pass
299
300 class BadCmp:
301 def __eq__(self, other):
302 if other == 2:
303 raise BadExc()
304 return False
305
306 a = self.type2test([0, 1, 2, 3])
307 self.assertRaises(BadExc, a.remove, BadCmp())
308
Walter Dörwald7355e812005-03-21 21:31:47 +0000309 class BadCmp2:
310 def __eq__(self, other):
311 raise BadExc()
312
313 d = self.type2test('abcdefghcij')
314 d.remove('c')
315 self.assertEqual(d, self.type2test('abdefghcij'))
316 d.remove('c')
317 self.assertEqual(d, self.type2test('abdefghij'))
318 self.assertRaises(ValueError, d.remove, 'c')
319 self.assertEqual(d, self.type2test('abdefghij'))
320
321 # Handle comparison errors
322 d = self.type2test(['a', 'b', BadCmp2(), 'c'])
323 e = self.type2test(d)
324 self.assertRaises(BadExc, d.remove, 'c')
325 for x, y in zip(d, e):
326 # verify that original order and values are retained.
327 self.assert_(x is y)
328
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000329 def test_count(self):
330 a = self.type2test([0, 1, 2])*3
331 self.assertEqual(a.count(0), 3)
332 self.assertEqual(a.count(1), 3)
333 self.assertEqual(a.count(3), 0)
334
335 self.assertRaises(TypeError, a.count)
Tim Peters13018922004-01-18 21:03:23 +0000336
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000337 class BadExc(Exception):
338 pass
339
340 class BadCmp:
341 def __eq__(self, other):
342 if other == 2:
343 raise BadExc()
344 return False
345
346 self.assertRaises(BadExc, a.count, BadCmp())
347
348 def test_index(self):
349 u = self.type2test([0, 1])
350 self.assertEqual(u.index(0), 0)
351 self.assertEqual(u.index(1), 1)
352 self.assertRaises(ValueError, u.index, 2)
353
354 u = self.type2test([-2, -1, 0, 0, 1, 2])
355 self.assertEqual(u.count(0), 2)
356 self.assertEqual(u.index(0), 2)
357 self.assertEqual(u.index(0, 2), 2)
358 self.assertEqual(u.index(-2, -10), 0)
359 self.assertEqual(u.index(0, 3), 3)
360 self.assertEqual(u.index(0, 3, 4), 3)
361 self.assertRaises(ValueError, u.index, 2, 0, -10)
362
363 self.assertRaises(TypeError, u.index)
364
365 class BadExc(Exception):
366 pass
367
368 class BadCmp:
369 def __eq__(self, other):
370 if other == 2:
371 raise BadExc()
372 return False
373
374 a = self.type2test([0, 1, 2, 3])
375 self.assertRaises(BadExc, a.index, BadCmp())
376
377 a = self.type2test([-2, -1, 0, 0, 1, 2])
378 self.assertEqual(a.index(0), 2)
379 self.assertEqual(a.index(0, 2), 2)
380 self.assertEqual(a.index(0, -4), 2)
381 self.assertEqual(a.index(-2, -10), 0)
382 self.assertEqual(a.index(0, 3), 3)
383 self.assertEqual(a.index(0, -3), 3)
384 self.assertEqual(a.index(0, 3, 4), 3)
385 self.assertEqual(a.index(0, -3, -2), 3)
386 self.assertEqual(a.index(0, -4*sys.maxint, 4*sys.maxint), 2)
387 self.assertRaises(ValueError, a.index, 0, 4*sys.maxint,-4*sys.maxint)
388 self.assertRaises(ValueError, a.index, 2, 0, -10)
389 a.remove(0)
390 self.assertRaises(ValueError, a.index, 2, 0, 4)
391 self.assertEqual(a, self.type2test([-2, -1, 0, 1, 2]))
392
Neal Norwitzf0769532004-08-13 03:18:29 +0000393 # Test modifying the list during index's iteration
394 class EvilCmp:
395 def __init__(self, victim):
396 self.victim = victim
397 def __eq__(self, other):
398 del self.victim[:]
399 return False
400 a = self.type2test()
Guido van Rossum805365e2007-05-07 22:24:25 +0000401 a[:] = [EvilCmp(a) for _ in range(100)]
Neal Norwitzf0769532004-08-13 03:18:29 +0000402 # This used to seg fault before patch #1005778
403 self.assertRaises(ValueError, a.index, None)
404
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000405 def test_reverse(self):
406 u = self.type2test([-2, -1, 0, 1, 2])
407 u2 = u[:]
408 u.reverse()
409 self.assertEqual(u, [2, 1, 0, -1, -2])
410 u.reverse()
411 self.assertEqual(u, u2)
Tim Peters13018922004-01-18 21:03:23 +0000412
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000413 self.assertRaises(TypeError, u.reverse, 42)
414
415 def test_sort(self):
416 u = self.type2test([1, 0])
417 u.sort()
418 self.assertEqual(u, [0, 1])
Tim Peters13018922004-01-18 21:03:23 +0000419
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000420 u = self.type2test([2,1,0,-1,-2])
421 u.sort()
422 self.assertEqual(u, self.type2test([-2,-1,0,1,2]))
Tim Peters13018922004-01-18 21:03:23 +0000423
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000424 self.assertRaises(TypeError, u.sort, 42, 42)
425
426 def revcmp(a, b):
427 return cmp(b, a)
428 u.sort(revcmp)
429 self.assertEqual(u, self.type2test([2,1,0,-1,-2]))
430
431 # The following dumps core in unpatched Python 1.5:
432 def myComparison(x,y):
433 return cmp(x%3, y%7)
434 z = self.type2test(range(12))
435 z.sort(myComparison)
Tim Peters13018922004-01-18 21:03:23 +0000436
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000437 self.assertRaises(TypeError, z.sort, 2)
Tim Peters13018922004-01-18 21:03:23 +0000438
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000439 def selfmodifyingComparison(x,y):
440 z.append(1)
441 return cmp(x, y)
442 self.assertRaises(ValueError, z.sort, selfmodifyingComparison)
Tim Peters13018922004-01-18 21:03:23 +0000443
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000444 self.assertRaises(TypeError, z.sort, lambda x, y: 's')
445
446 self.assertRaises(TypeError, z.sort, 42, 42, 42, 42)
447
448 def test_slice(self):
449 u = self.type2test("spam")
450 u[:2] = "h"
451 self.assertEqual(u, list("ham"))
452
453 def test_iadd(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000454 super().test_iadd()
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000455 u = self.type2test([0, 1])
456 u2 = u
457 u += [2, 3]
458 self.assert_(u is u2)
459
460 u = self.type2test("spam")
461 u += "eggs"
462 self.assertEqual(u, self.type2test("spameggs"))
463
464 self.assertRaises(TypeError, u.__iadd__, None)
465
466 def test_imul(self):
467 u = self.type2test([0, 1])
468 u *= 3
469 self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1]))
470 u *= 0
471 self.assertEqual(u, self.type2test([]))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000472 s = self.type2test([])
473 oldid = id(s)
474 s *= 10
475 self.assertEqual(id(s), oldid)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000476
477 def test_extendedslicing(self):
478 # subscript
479 a = self.type2test([0,1,2,3,4])
480
481 # deletion
482 del a[::2]
483 self.assertEqual(a, self.type2test([1,3]))
484 a = self.type2test(range(5))
485 del a[1::2]
486 self.assertEqual(a, self.type2test([0,2,4]))
487 a = self.type2test(range(5))
488 del a[1::-2]
489 self.assertEqual(a, self.type2test([0,2,3,4]))
490 a = self.type2test(range(10))
491 del a[::1000]
492 self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9]))
493 # assignment
494 a = self.type2test(range(10))
495 a[::2] = [-1]*5
496 self.assertEqual(a, self.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9]))
497 a = self.type2test(range(10))
498 a[::-4] = [10]*3
499 self.assertEqual(a, self.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
500 a = self.type2test(range(4))
501 a[::-1] = a
502 self.assertEqual(a, self.type2test([3, 2, 1, 0]))
503 a = self.type2test(range(10))
504 b = a[:]
505 c = a[:]
506 a[2:3] = self.type2test(["two", "elements"])
507 b[slice(2,3)] = self.type2test(["two", "elements"])
508 c[2:3:] = self.type2test(["two", "elements"])
509 self.assertEqual(a, b)
510 self.assertEqual(a, c)
511 a = self.type2test(range(10))
512 a[::2] = tuple(range(5))
513 self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9]))
Raymond Hettingera710b332005-08-21 11:03:59 +0000514
515 def test_constructor_exception_handling(self):
516 # Bug #1242657
517 class F(object):
518 def __iter__(self):
519 yield 23
520 def __len__(self):
521 raise KeyboardInterrupt
522 self.assertRaises(KeyboardInterrupt, list, F())