list_tests.py revision a18af4e7a2091d11478754eb66ae387a85535763
1"""
2Tests common to list and UserList.UserList
3"""
4
5import sys
6import os
7
8import unittest
9from test import test_support, seq_tests
10
11class 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(repr(a2), repr(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            fo.write(str(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, next, r)
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[0] = 1
103        a[1] = 2
104        a[2] = 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[-2] = 88
111        a[-1] = 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[1:2]
193        del a[0:1]
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[-2:-1]
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[1:]
211        del a[:1]
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[-1:]
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        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)
281        self.assertRaises(TypeError, a.pop, 42, 42)
282        a = self.type2test([0, 10, 20, 30, 40])
283
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)
294
295        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
309        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
329    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)
336
337        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
393        # 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()
401        a[:] = [EvilCmp(a) for _ in xrange(100)]
402        # This used to seg fault before patch #1005778
403        self.assertRaises(ValueError, a.index, None)
404
405    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)
412
413        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])
419
420        u = self.type2test([2,1,0,-1,-2])
421        u.sort()
422        self.assertEqual(u, self.type2test([-2,-1,0,1,2]))
423
424        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)
436
437        self.assertRaises(TypeError, z.sort, 2)
438
439        def selfmodifyingComparison(x,y):
440            z.append(1)
441            return cmp(x, y)
442        self.assertRaises(ValueError, z.sort, selfmodifyingComparison)
443
444        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):
454        super(CommonTest, self).test_iadd()
455        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([]))
472        s = self.type2test([])
473        oldid = id(s)
474        s *= 10
475        self.assertEqual(id(s), oldid)
476
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]))
514
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())
523