2 Tests common to list and UserList.UserList
8 from test
import test_support
, seq_tests
10 class CommonTest(seq_tests
.CommonTest
):
13 # Iterable arg is optional
14 self
.assertEqual(self
.type2test([]), self
.type2test())
16 # Init clears previous values
17 a
= self
.type2test([1, 2, 3])
19 self
.assertEqual(a
, self
.type2test([]))
21 # Init overwrites previous values
22 a
= self
.type2test([1, 2, 3])
24 self
.assertEqual(a
, self
.type2test([4, 5, 6]))
26 # Mutables always return a new object
28 self
.assertNotEqual(id(a
), id(b
))
29 self
.assertEqual(a
, b
)
34 a0
= self
.type2test(l0
)
35 a2
= self
.type2test(l2
)
37 self
.assertEqual(str(a0
), str(l0
))
38 self
.assertEqual(repr(a0
), repr(l0
))
39 self
.assertEqual(`a2`
, `l2`
)
40 self
.assertEqual(str(a2
), "[0, 1, 2]")
41 self
.assertEqual(repr(a2
), "[0, 1, 2]")
45 self
.assertEqual(str(a2
), "[0, 1, 2, [...], 3]")
46 self
.assertEqual(repr(a2
), "[0, 1, 2, [...], 3]")
49 for i
in xrange(sys
.getrecursionlimit() + 100):
51 self
.assertRaises(RuntimeError, repr, l0
)
54 d
= self
.type2test(xrange(200))
56 d
.extend(xrange(200,400))
60 fo
= open(test_support
.TESTFN
, "wb")
63 fo
= open(test_support
.TESTFN
, "rb")
64 self
.assertEqual(fo
.read(), repr(d
))
67 os
.remove(test_support
.TESTFN
)
69 def test_set_subscript(self
):
70 a
= self
.type2test(range(20))
71 self
.assertRaises(ValueError, a
.__setitem
__, slice(0, 10, 0), [1,2,3])
72 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 10), 1)
73 self
.assertRaises(ValueError, a
.__setitem
__, slice(0, 10, 2), [1,2])
74 self
.assertRaises(TypeError, a
.__getitem
__, 'x', 1)
75 a
[slice(2,10,3)] = [1,2,3]
76 self
.assertEqual(a
, self
.type2test([0, 1, 1, 3, 4, 2, 6, 7, 3,
77 9, 10, 11, 12, 13, 14, 15,
80 def test_reversed(self
):
81 a
= self
.type2test(range(20))
83 self
.assertEqual(list(r
), self
.type2test(range(19, -1, -1)))
84 self
.assertRaises(StopIteration, r
.next
)
85 self
.assertEqual(list(reversed(self
.type2test())),
87 # Bug 3689: make sure list-reversed-iterator doesn't have __len__
88 self
.assertRaises(TypeError, len, reversed([1,2,3]))
90 def test_setitem(self
):
91 a
= self
.type2test([0, 1])
94 self
.assertEqual(a
, self
.type2test([0, 100]))
96 self
.assertEqual(a
, self
.type2test([0, 200]))
98 self
.assertEqual(a
, self
.type2test([100, 200]))
99 self
.assertRaises(IndexError, a
.__setitem
__, -3, 200)
100 self
.assertRaises(IndexError, a
.__setitem
__, 2, 200)
102 a
= self
.type2test([])
103 self
.assertRaises(IndexError, a
.__setitem
__, 0, 200)
104 self
.assertRaises(IndexError, a
.__setitem
__, -1, 200)
105 self
.assertRaises(TypeError, a
.__setitem
__)
107 a
= self
.type2test([0,1,2,3,4])
111 self
.assertEqual(a
, self
.type2test([1,2,3,3,4]))
115 self
.assertEqual(a
, self
.type2test([5,6,7,3,4]))
118 self
.assertEqual(a
, self
.type2test([5,6,7,88,99]))
121 self
.assertEqual(a
, self
.type2test([5,6,7,8,9]))
123 def test_delitem(self
):
124 a
= self
.type2test([0, 1])
126 self
.assertEqual(a
, [0])
128 self
.assertEqual(a
, [])
130 a
= self
.type2test([0, 1])
132 self
.assertEqual(a
, [1])
134 self
.assertEqual(a
, [])
136 a
= self
.type2test([0, 1])
137 self
.assertRaises(IndexError, a
.__delitem
__, -3)
138 self
.assertRaises(IndexError, a
.__delitem
__, 2)
140 a
= self
.type2test([])
141 self
.assertRaises(IndexError, a
.__delitem
__, 0)
143 self
.assertRaises(TypeError, a
.__delitem
__)
145 def test_setslice(self
):
147 a
= self
.type2test(l
)
149 for i
in range(-3, 4):
151 self
.assertEqual(a
, l
)
154 self
.assertEqual(a2
, a
)
156 self
.assertEqual(a
, l
)
159 self
.assertEqual(a2
, a
)
160 for j
in range(-3, 4):
162 self
.assertEqual(a
, l
)
165 self
.assertEqual(a2
, a
)
169 self
.assertEqual(aa2
, [-2, -1, 0, 1])
171 self
.assertEqual(aa2
, [])
173 a
= self
.type2test([1, 2, 3, 4, 5])
175 self
.assertEqual(a
, self
.type2test([1, 2, 3, 4, 5, 5]))
176 a
= self
.type2test([1, 2, 3, 4, 5])
178 self
.assertEqual(a
, self
.type2test([1, 1, 2, 3, 4, 5]))
179 a
= self
.type2test([1, 2, 3, 4, 5])
181 self
.assertEqual(a
, self
.type2test([1, 1, 2, 3, 4, 5, 5]))
183 a
= self
.type2test([])
184 a
[:] = tuple(range(10))
185 self
.assertEqual(a
, self
.type2test(range(10)))
187 self
.assertRaises(TypeError, a
.__setslice
__, 0, 1, 5)
188 self
.assertRaises(TypeError, a
.__setitem
__, slice(0, 1, 5))
190 self
.assertRaises(TypeError, a
.__setslice
__)
191 self
.assertRaises(TypeError, a
.__setitem
__)
193 def test_delslice(self
):
194 a
= self
.type2test([0, 1])
197 self
.assertEqual(a
, self
.type2test([]))
199 a
= self
.type2test([0, 1])
202 self
.assertEqual(a
, self
.type2test([]))
204 a
= self
.type2test([0, 1])
206 self
.assertEqual(a
, self
.type2test([1]))
208 a
= self
.type2test([0, 1])
210 self
.assertEqual(a
, self
.type2test([1]))
212 a
= self
.type2test([0, 1])
215 self
.assertEqual(a
, self
.type2test([]))
217 a
= self
.type2test([0, 1])
220 self
.assertEqual(a
, self
.type2test([]))
222 a
= self
.type2test([0, 1])
224 self
.assertEqual(a
, self
.type2test([0]))
226 a
= self
.type2test([0, 1])
228 self
.assertEqual(a
, self
.type2test([0]))
230 a
= self
.type2test([0, 1])
232 self
.assertEqual(a
, self
.type2test([]))
234 def test_append(self
):
235 a
= self
.type2test([])
239 self
.assertEqual(a
, self
.type2test([0, 1, 2]))
241 self
.assertRaises(TypeError, a
.append
)
243 def test_extend(self
):
244 a1
= self
.type2test([0])
245 a2
= self
.type2test((0, 1))
248 self
.assertEqual(a
, a1
+ a2
)
250 a
.extend(self
.type2test([]))
251 self
.assertEqual(a
, a1
+ a2
)
254 self
.assertEqual(a
, self
.type2test([0, 0, 1, 0, 0, 1]))
256 a
= self
.type2test("spam")
258 self
.assertEqual(a
, list("spameggs"))
260 self
.assertRaises(TypeError, a
.extend
, None)
262 self
.assertRaises(TypeError, a
.extend
)
264 def test_insert(self
):
265 a
= self
.type2test([0, 1, 2])
269 self
.assertEqual(a
, [-2, -1, 0, 0, 1, 2])
273 b
.insert(-200, "left")
274 b
.insert(200, "right")
275 self
.assertEqual(b
, self
.type2test(["left",-2,-1,0,0,"foo",1,2,"right"]))
277 self
.assertRaises(TypeError, a
.insert
)
280 a
= self
.type2test([-1, 0, 1])
282 self
.assertEqual(a
, [-1, 0])
284 self
.assertEqual(a
, [0])
285 self
.assertRaises(IndexError, a
.pop
, 5)
287 self
.assertEqual(a
, [])
288 self
.assertRaises(IndexError, a
.pop
)
289 self
.assertRaises(TypeError, a
.pop
, 42, 42)
290 a
= self
.type2test([0, 10, 20, 30, 40])
292 def test_remove(self
):
293 a
= self
.type2test([0, 0, 1])
295 self
.assertEqual(a
, [0, 0])
297 self
.assertEqual(a
, [0])
299 self
.assertEqual(a
, [])
301 self
.assertRaises(ValueError, a
.remove
, 0)
303 self
.assertRaises(TypeError, a
.remove
)
305 class BadExc(Exception):
309 def __eq__(self
, other
):
314 a
= self
.type2test([0, 1, 2, 3])
315 self
.assertRaises(BadExc
, a
.remove
, BadCmp())
318 def __eq__(self
, other
):
321 d
= self
.type2test('abcdefghcij')
323 self
.assertEqual(d
, self
.type2test('abdefghcij'))
325 self
.assertEqual(d
, self
.type2test('abdefghij'))
326 self
.assertRaises(ValueError, d
.remove
, 'c')
327 self
.assertEqual(d
, self
.type2test('abdefghij'))
329 # Handle comparison errors
330 d
= self
.type2test(['a', 'b', BadCmp2(), 'c'])
331 e
= self
.type2test(d
)
332 self
.assertRaises(BadExc
, d
.remove
, 'c')
333 for x
, y
in zip(d
, e
):
334 # verify that original order and values are retained.
337 def test_count(self
):
338 a
= self
.type2test([0, 1, 2])*3
339 self
.assertEqual(a
.count(0), 3)
340 self
.assertEqual(a
.count(1), 3)
341 self
.assertEqual(a
.count(3), 0)
343 self
.assertRaises(TypeError, a
.count
)
345 class BadExc(Exception):
349 def __eq__(self
, other
):
354 self
.assertRaises(BadExc
, a
.count
, BadCmp())
356 def test_index(self
):
357 u
= self
.type2test([0, 1])
358 self
.assertEqual(u
.index(0), 0)
359 self
.assertEqual(u
.index(1), 1)
360 self
.assertRaises(ValueError, u
.index
, 2)
362 u
= self
.type2test([-2, -1, 0, 0, 1, 2])
363 self
.assertEqual(u
.count(0), 2)
364 self
.assertEqual(u
.index(0), 2)
365 self
.assertEqual(u
.index(0, 2), 2)
366 self
.assertEqual(u
.index(-2, -10), 0)
367 self
.assertEqual(u
.index(0, 3), 3)
368 self
.assertEqual(u
.index(0, 3, 4), 3)
369 self
.assertRaises(ValueError, u
.index
, 2, 0, -10)
371 self
.assertRaises(TypeError, u
.index
)
373 class BadExc(Exception):
377 def __eq__(self
, other
):
382 a
= self
.type2test([0, 1, 2, 3])
383 self
.assertRaises(BadExc
, a
.index
, BadCmp())
385 a
= self
.type2test([-2, -1, 0, 0, 1, 2])
386 self
.assertEqual(a
.index(0), 2)
387 self
.assertEqual(a
.index(0, 2), 2)
388 self
.assertEqual(a
.index(0, -4), 2)
389 self
.assertEqual(a
.index(-2, -10), 0)
390 self
.assertEqual(a
.index(0, 3), 3)
391 self
.assertEqual(a
.index(0, -3), 3)
392 self
.assertEqual(a
.index(0, 3, 4), 3)
393 self
.assertEqual(a
.index(0, -3, -2), 3)
394 self
.assertEqual(a
.index(0, -4*sys
.maxint
, 4*sys
.maxint
), 2)
395 self
.assertRaises(ValueError, a
.index
, 0, 4*sys
.maxint
,-4*sys
.maxint
)
396 self
.assertRaises(ValueError, a
.index
, 2, 0, -10)
398 self
.assertRaises(ValueError, a
.index
, 2, 0, 4)
399 self
.assertEqual(a
, self
.type2test([-2, -1, 0, 1, 2]))
401 # Test modifying the list during index's iteration
403 def __init__(self
, victim
):
405 def __eq__(self
, other
):
409 a
[:] = [EvilCmp(a
) for _
in xrange(100)]
410 # This used to seg fault before patch #1005778
411 self
.assertRaises(ValueError, a
.index
, None)
413 def test_reverse(self
):
414 u
= self
.type2test([-2, -1, 0, 1, 2])
417 self
.assertEqual(u
, [2, 1, 0, -1, -2])
419 self
.assertEqual(u
, u2
)
421 self
.assertRaises(TypeError, u
.reverse
, 42)
424 u
= self
.type2test([1, 0])
426 self
.assertEqual(u
, [0, 1])
428 u
= self
.type2test([2,1,0,-1,-2])
430 self
.assertEqual(u
, self
.type2test([-2,-1,0,1,2]))
432 self
.assertRaises(TypeError, u
.sort
, 42, 42)
437 self
.assertEqual(u
, self
.type2test([2,1,0,-1,-2]))
439 # The following dumps core in unpatched Python 1.5:
440 def myComparison(x
,y
):
442 z
= self
.type2test(range(12))
445 self
.assertRaises(TypeError, z
.sort
, 2)
447 def selfmodifyingComparison(x
,y
):
450 self
.assertRaises(ValueError, z
.sort
, selfmodifyingComparison
)
452 self
.assertRaises(TypeError, z
.sort
, lambda x
, y
: 's')
454 self
.assertRaises(TypeError, z
.sort
, 42, 42, 42, 42)
456 def test_slice(self
):
457 u
= self
.type2test("spam")
459 self
.assertEqual(u
, list("ham"))
462 super(CommonTest
, self
).test_iadd()
463 u
= self
.type2test([0, 1])
466 self
.assert_(u
is u2
)
468 u
= self
.type2test("spam")
470 self
.assertEqual(u
, self
.type2test("spameggs"))
472 self
.assertRaises(TypeError, u
.__iadd
__, None)
475 u
= self
.type2test([0, 1])
477 self
.assertEqual(u
, self
.type2test([0, 1, 0, 1, 0, 1]))
479 self
.assertEqual(u
, self
.type2test([]))
480 s
= self
.type2test([])
483 self
.assertEqual(id(s
), oldid
)
485 def test_extendedslicing(self
):
487 a
= self
.type2test([0,1,2,3,4])
491 self
.assertEqual(a
, self
.type2test([1,3]))
492 a
= self
.type2test(range(5))
494 self
.assertEqual(a
, self
.type2test([0,2,4]))
495 a
= self
.type2test(range(5))
497 self
.assertEqual(a
, self
.type2test([0,2,3,4]))
498 a
= self
.type2test(range(10))
500 self
.assertEqual(a
, self
.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9]))
502 a
= self
.type2test(range(10))
504 self
.assertEqual(a
, self
.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9]))
505 a
= self
.type2test(range(10))
507 self
.assertEqual(a
, self
.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
508 a
= self
.type2test(range(4))
510 self
.assertEqual(a
, self
.type2test([3, 2, 1, 0]))
511 a
= self
.type2test(range(10))
514 a
[2:3] = self
.type2test(["two", "elements"])
515 b
[slice(2,3)] = self
.type2test(["two", "elements"])
516 c
[2:3:] = self
.type2test(["two", "elements"])
517 self
.assertEqual(a
, b
)
518 self
.assertEqual(a
, c
)
519 a
= self
.type2test(range(10))
520 a
[::2] = tuple(range(5))
521 self
.assertEqual(a
, self
.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9]))
523 def test_constructor_exception_handling(self
):
527 raise KeyboardInterrupt
528 self
.assertRaises(KeyboardInterrupt, list, F())