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