blob: 14b54c77352a319d0d7707298ad4b22fcd323ef8 [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))
40 self.assertEqual(`a2`, `l2`)
41 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):
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
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)))
80 self.assertRaises(StopIteration, r.next)
81 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])
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):
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000272 from decimal import Decimal
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000273 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)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000282 self.assertRaises(TypeError, a.pop, 42, 42)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000283 a = self.type2test([0, 10, 20, 30, 40])
284 self.assertEqual(a.pop(Decimal(2)), 20)
285 self.assertRaises(IndexError, a.pop, Decimal(25))
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000286
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)
Tim Peters13018922004-01-18 21:03:23 +0000297
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000298 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
Walter Dörwald7355e812005-03-21 21:31:47 +0000312 class BadCmp2:
313 def __eq__(self, other):
314 raise BadExc()
315
316 d = self.type2test('abcdefghcij')
317 d.remove('c')
318 self.assertEqual(d, self.type2test('abdefghcij'))
319 d.remove('c')
320 self.assertEqual(d, self.type2test('abdefghij'))
321 self.assertRaises(ValueError, d.remove, 'c')
322 self.assertEqual(d, self.type2test('abdefghij'))
323
324 # Handle comparison errors
325 d = self.type2test(['a', 'b', BadCmp2(), 'c'])
326 e = self.type2test(d)
327 self.assertRaises(BadExc, d.remove, 'c')
328 for x, y in zip(d, e):
329 # verify that original order and values are retained.
330 self.assert_(x is y)
331
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000332 def test_count(self):
333 a = self.type2test([0, 1, 2])*3
334 self.assertEqual(a.count(0), 3)
335 self.assertEqual(a.count(1), 3)
336 self.assertEqual(a.count(3), 0)
337
338 self.assertRaises(TypeError, a.count)
Tim Peters13018922004-01-18 21:03:23 +0000339
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000340 class BadExc(Exception):
341 pass
342
343 class BadCmp:
344 def __eq__(self, other):
345 if other == 2:
346 raise BadExc()
347 return False
348
349 self.assertRaises(BadExc, a.count, BadCmp())
350
351 def test_index(self):
352 u = self.type2test([0, 1])
353 self.assertEqual(u.index(0), 0)
354 self.assertEqual(u.index(1), 1)
355 self.assertRaises(ValueError, u.index, 2)
356
357 u = self.type2test([-2, -1, 0, 0, 1, 2])
358 self.assertEqual(u.count(0), 2)
359 self.assertEqual(u.index(0), 2)
360 self.assertEqual(u.index(0, 2), 2)
361 self.assertEqual(u.index(-2, -10), 0)
362 self.assertEqual(u.index(0, 3), 3)
363 self.assertEqual(u.index(0, 3, 4), 3)
364 self.assertRaises(ValueError, u.index, 2, 0, -10)
365
366 self.assertRaises(TypeError, u.index)
367
368 class BadExc(Exception):
369 pass
370
371 class BadCmp:
372 def __eq__(self, other):
373 if other == 2:
374 raise BadExc()
375 return False
376
377 a = self.type2test([0, 1, 2, 3])
378 self.assertRaises(BadExc, a.index, BadCmp())
379
380 a = self.type2test([-2, -1, 0, 0, 1, 2])
381 self.assertEqual(a.index(0), 2)
382 self.assertEqual(a.index(0, 2), 2)
383 self.assertEqual(a.index(0, -4), 2)
384 self.assertEqual(a.index(-2, -10), 0)
385 self.assertEqual(a.index(0, 3), 3)
386 self.assertEqual(a.index(0, -3), 3)
387 self.assertEqual(a.index(0, 3, 4), 3)
388 self.assertEqual(a.index(0, -3, -2), 3)
389 self.assertEqual(a.index(0, -4*sys.maxint, 4*sys.maxint), 2)
390 self.assertRaises(ValueError, a.index, 0, 4*sys.maxint,-4*sys.maxint)
391 self.assertRaises(ValueError, a.index, 2, 0, -10)
392 a.remove(0)
393 self.assertRaises(ValueError, a.index, 2, 0, 4)
394 self.assertEqual(a, self.type2test([-2, -1, 0, 1, 2]))
395
Neal Norwitzf0769532004-08-13 03:18:29 +0000396 # Test modifying the list during index's iteration
397 class EvilCmp:
398 def __init__(self, victim):
399 self.victim = victim
400 def __eq__(self, other):
401 del self.victim[:]
402 return False
403 a = self.type2test()
404 a[:] = [EvilCmp(a) for _ in xrange(100)]
405 # This used to seg fault before patch #1005778
406 self.assertRaises(ValueError, a.index, None)
407
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000408 def test_reverse(self):
409 u = self.type2test([-2, -1, 0, 1, 2])
410 u2 = u[:]
411 u.reverse()
412 self.assertEqual(u, [2, 1, 0, -1, -2])
413 u.reverse()
414 self.assertEqual(u, u2)
Tim Peters13018922004-01-18 21:03:23 +0000415
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000416 self.assertRaises(TypeError, u.reverse, 42)
417
418 def test_sort(self):
419 u = self.type2test([1, 0])
420 u.sort()
421 self.assertEqual(u, [0, 1])
Tim Peters13018922004-01-18 21:03:23 +0000422
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000423 u = self.type2test([2,1,0,-1,-2])
424 u.sort()
425 self.assertEqual(u, self.type2test([-2,-1,0,1,2]))
Tim Peters13018922004-01-18 21:03:23 +0000426
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000427 self.assertRaises(TypeError, u.sort, 42, 42)
428
429 def revcmp(a, b):
430 return cmp(b, a)
431 u.sort(revcmp)
432 self.assertEqual(u, self.type2test([2,1,0,-1,-2]))
433
434 # The following dumps core in unpatched Python 1.5:
435 def myComparison(x,y):
436 return cmp(x%3, y%7)
437 z = self.type2test(range(12))
438 z.sort(myComparison)
Tim Peters13018922004-01-18 21:03:23 +0000439
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000440 self.assertRaises(TypeError, z.sort, 2)
Tim Peters13018922004-01-18 21:03:23 +0000441
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000442 def selfmodifyingComparison(x,y):
443 z.append(1)
444 return cmp(x, y)
445 self.assertRaises(ValueError, z.sort, selfmodifyingComparison)
Tim Peters13018922004-01-18 21:03:23 +0000446
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000447 self.assertRaises(TypeError, z.sort, lambda x, y: 's')
448
449 self.assertRaises(TypeError, z.sort, 42, 42, 42, 42)
450
451 def test_slice(self):
452 u = self.type2test("spam")
453 u[:2] = "h"
454 self.assertEqual(u, list("ham"))
455
456 def test_iadd(self):
457 super(CommonTest, self).test_iadd()
458 u = self.type2test([0, 1])
459 u2 = u
460 u += [2, 3]
461 self.assert_(u is u2)
462
463 u = self.type2test("spam")
464 u += "eggs"
465 self.assertEqual(u, self.type2test("spameggs"))
466
467 self.assertRaises(TypeError, u.__iadd__, None)
468
469 def test_imul(self):
470 u = self.type2test([0, 1])
471 u *= 3
472 self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1]))
473 u *= 0
474 self.assertEqual(u, self.type2test([]))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000475 s = self.type2test([])
476 oldid = id(s)
477 s *= 10
478 self.assertEqual(id(s), oldid)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000479
480 def test_extendedslicing(self):
481 # subscript
482 a = self.type2test([0,1,2,3,4])
483
484 # deletion
485 del a[::2]
486 self.assertEqual(a, self.type2test([1,3]))
487 a = self.type2test(range(5))
488 del a[1::2]
489 self.assertEqual(a, self.type2test([0,2,4]))
490 a = self.type2test(range(5))
491 del a[1::-2]
492 self.assertEqual(a, self.type2test([0,2,3,4]))
493 a = self.type2test(range(10))
494 del a[::1000]
495 self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9]))
496 # assignment
497 a = self.type2test(range(10))
498 a[::2] = [-1]*5
499 self.assertEqual(a, self.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9]))
500 a = self.type2test(range(10))
501 a[::-4] = [10]*3
502 self.assertEqual(a, self.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
503 a = self.type2test(range(4))
504 a[::-1] = a
505 self.assertEqual(a, self.type2test([3, 2, 1, 0]))
506 a = self.type2test(range(10))
507 b = a[:]
508 c = a[:]
509 a[2:3] = self.type2test(["two", "elements"])
510 b[slice(2,3)] = self.type2test(["two", "elements"])
511 c[2:3:] = self.type2test(["two", "elements"])
512 self.assertEqual(a, b)
513 self.assertEqual(a, c)
514 a = self.type2test(range(10))
515 a[::2] = tuple(range(5))
516 self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9]))
Raymond Hettingera710b332005-08-21 11:03:59 +0000517
518 def test_constructor_exception_handling(self):
519 # Bug #1242657
520 class F(object):
521 def __iter__(self):
522 yield 23
523 def __len__(self):
524 raise KeyboardInterrupt
525 self.assertRaises(KeyboardInterrupt, list, F())