Home | History | Annotate | Download | only in test
      1 """
      2 Tests common to tuple, list and UserList.UserList
      3 """
      4 
      5 import unittest
      6 import sys
      7 import pickle
      8 from test import support
      9 
     10 # Various iterables
     11 # This is used for checking the constructor (here and in test_deque.py)
     12 def iterfunc(seqn):
     13     'Regular generator'
     14     for i in seqn:
     15         yield i
     16 
     17 class Sequence:
     18     'Sequence using __getitem__'
     19     def __init__(self, seqn):
     20         self.seqn = seqn
     21     def __getitem__(self, i):
     22         return self.seqn[i]
     23 
     24 class IterFunc:
     25     'Sequence using iterator protocol'
     26     def __init__(self, seqn):
     27         self.seqn = seqn
     28         self.i = 0
     29     def __iter__(self):
     30         return self
     31     def __next__(self):
     32         if self.i >= len(self.seqn): raise StopIteration
     33         v = self.seqn[self.i]
     34         self.i += 1
     35         return v
     36 
     37 class IterGen:
     38     'Sequence using iterator protocol defined with a generator'
     39     def __init__(self, seqn):
     40         self.seqn = seqn
     41         self.i = 0
     42     def __iter__(self):
     43         for val in self.seqn:
     44             yield val
     45 
     46 class IterNextOnly:
     47     'Missing __getitem__ and __iter__'
     48     def __init__(self, seqn):
     49         self.seqn = seqn
     50         self.i = 0
     51     def __next__(self):
     52         if self.i >= len(self.seqn): raise StopIteration
     53         v = self.seqn[self.i]
     54         self.i += 1
     55         return v
     56 
     57 class IterNoNext:
     58     'Iterator missing __next__()'
     59     def __init__(self, seqn):
     60         self.seqn = seqn
     61         self.i = 0
     62     def __iter__(self):
     63         return self
     64 
     65 class IterGenExc:
     66     'Test propagation of exceptions'
     67     def __init__(self, seqn):
     68         self.seqn = seqn
     69         self.i = 0
     70     def __iter__(self):
     71         return self
     72     def __next__(self):
     73         3 // 0
     74 
     75 class IterFuncStop:
     76     'Test immediate stop'
     77     def __init__(self, seqn):
     78         pass
     79     def __iter__(self):
     80         return self
     81     def __next__(self):
     82         raise StopIteration
     83 
     84 from itertools import chain
     85 def itermulti(seqn):
     86     'Test multiple tiers of iterators'
     87     return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn)))))
     88 
     89 class LyingTuple(tuple):
     90     def __iter__(self):
     91         yield 1
     92 
     93 class LyingList(list):
     94     def __iter__(self):
     95         yield 1
     96 
     97 class CommonTest(unittest.TestCase):
     98     # The type to be tested
     99     type2test = None
    100 
    101     def test_constructors(self):
    102         l0 = []
    103         l1 = [0]
    104         l2 = [0, 1]
    105 
    106         u = self.type2test()
    107         u0 = self.type2test(l0)
    108         u1 = self.type2test(l1)
    109         u2 = self.type2test(l2)
    110 
    111         uu = self.type2test(u)
    112         uu0 = self.type2test(u0)
    113         uu1 = self.type2test(u1)
    114         uu2 = self.type2test(u2)
    115 
    116         v = self.type2test(tuple(u))
    117         class OtherSeq:
    118             def __init__(self, initseq):
    119                 self.__data = initseq
    120             def __len__(self):
    121                 return len(self.__data)
    122             def __getitem__(self, i):
    123                 return self.__data[i]
    124         s = OtherSeq(u0)
    125         v0 = self.type2test(s)
    126         self.assertEqual(len(v0), len(s))
    127 
    128         s = "this is also a sequence"
    129         vv = self.type2test(s)
    130         self.assertEqual(len(vv), len(s))
    131 
    132         # Create from various iteratables
    133         for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
    134             for g in (Sequence, IterFunc, IterGen,
    135                       itermulti, iterfunc):
    136                 self.assertEqual(self.type2test(g(s)), self.type2test(s))
    137             self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test())
    138             self.assertEqual(self.type2test(c for c in "123"), self.type2test("123"))
    139             self.assertRaises(TypeError, self.type2test, IterNextOnly(s))
    140             self.assertRaises(TypeError, self.type2test, IterNoNext(s))
    141             self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s))
    142 
    143         # Issue #23757
    144         self.assertEqual(self.type2test(LyingTuple((2,))), self.type2test((1,)))
    145         self.assertEqual(self.type2test(LyingList([2])), self.type2test([1]))
    146 
    147     def test_truth(self):
    148         self.assertFalse(self.type2test())
    149         self.assertTrue(self.type2test([42]))
    150 
    151     def test_getitem(self):
    152         u = self.type2test([0, 1, 2, 3, 4])
    153         for i in range(len(u)):
    154             self.assertEqual(u[i], i)
    155             self.assertEqual(u[int(i)], i)
    156         for i in range(-len(u), -1):
    157             self.assertEqual(u[i], len(u)+i)
    158             self.assertEqual(u[int(i)], len(u)+i)
    159         self.assertRaises(IndexError, u.__getitem__, -len(u)-1)
    160         self.assertRaises(IndexError, u.__getitem__, len(u))
    161         self.assertRaises(ValueError, u.__getitem__, slice(0,10,0))
    162 
    163         u = self.type2test()
    164         self.assertRaises(IndexError, u.__getitem__, 0)
    165         self.assertRaises(IndexError, u.__getitem__, -1)
    166 
    167         self.assertRaises(TypeError, u.__getitem__)
    168 
    169         a = self.type2test([10, 11])
    170         self.assertEqual(a[0], 10)
    171         self.assertEqual(a[1], 11)
    172         self.assertEqual(a[-2], 10)
    173         self.assertEqual(a[-1], 11)
    174         self.assertRaises(IndexError, a.__getitem__, -3)
    175         self.assertRaises(IndexError, a.__getitem__, 3)
    176 
    177     def test_getslice(self):
    178         l = [0, 1, 2, 3, 4]
    179         u = self.type2test(l)
    180 
    181         self.assertEqual(u[0:0], self.type2test())
    182         self.assertEqual(u[1:2], self.type2test([1]))
    183         self.assertEqual(u[-2:-1], self.type2test([3]))
    184         self.assertEqual(u[-1000:1000], u)
    185         self.assertEqual(u[1000:-1000], self.type2test([]))
    186         self.assertEqual(u[:], u)
    187         self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4]))
    188         self.assertEqual(u[None:3], self.type2test([0, 1, 2]))
    189 
    190         # Extended slices
    191         self.assertEqual(u[::], u)
    192         self.assertEqual(u[::2], self.type2test([0, 2, 4]))
    193         self.assertEqual(u[1::2], self.type2test([1, 3]))
    194         self.assertEqual(u[::-1], self.type2test([4, 3, 2, 1, 0]))
    195         self.assertEqual(u[::-2], self.type2test([4, 2, 0]))
    196         self.assertEqual(u[3::-2], self.type2test([3, 1]))
    197         self.assertEqual(u[3:3:-2], self.type2test([]))
    198         self.assertEqual(u[3:2:-2], self.type2test([3]))
    199         self.assertEqual(u[3:1:-2], self.type2test([3]))
    200         self.assertEqual(u[3:0:-2], self.type2test([3, 1]))
    201         self.assertEqual(u[::-100], self.type2test([4]))
    202         self.assertEqual(u[100:-100:], self.type2test([]))
    203         self.assertEqual(u[-100:100:], u)
    204         self.assertEqual(u[100:-100:-1], u[::-1])
    205         self.assertEqual(u[-100:100:-1], self.type2test([]))
    206         self.assertEqual(u[-100:100:2], self.type2test([0, 2, 4]))
    207 
    208         # Test extreme cases with long ints
    209         a = self.type2test([0,1,2,3,4])
    210         self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2]))
    211         self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4]))
    212 
    213     def test_contains(self):
    214         u = self.type2test([0, 1, 2])
    215         for i in u:
    216             self.assertIn(i, u)
    217         for i in min(u)-1, max(u)+1:
    218             self.assertNotIn(i, u)
    219 
    220         self.assertRaises(TypeError, u.__contains__)
    221 
    222     def test_contains_fake(self):
    223         class AllEq:
    224             # Sequences must use rich comparison against each item
    225             # (unless "is" is true, or an earlier item answered)
    226             # So instances of AllEq must be found in all non-empty sequences.
    227             def __eq__(self, other):
    228                 return True
    229             __hash__ = None # Can't meet hash invariant requirements
    230         self.assertNotIn(AllEq(), self.type2test([]))
    231         self.assertIn(AllEq(), self.type2test([1]))
    232 
    233     def test_contains_order(self):
    234         # Sequences must test in-order.  If a rich comparison has side
    235         # effects, these will be visible to tests against later members.
    236         # In this test, the "side effect" is a short-circuiting raise.
    237         class DoNotTestEq(Exception):
    238             pass
    239         class StopCompares:
    240             def __eq__(self, other):
    241                 raise DoNotTestEq
    242 
    243         checkfirst = self.type2test([1, StopCompares()])
    244         self.assertIn(1, checkfirst)
    245         checklast = self.type2test([StopCompares(), 1])
    246         self.assertRaises(DoNotTestEq, checklast.__contains__, 1)
    247 
    248     def test_len(self):
    249         self.assertEqual(len(self.type2test()), 0)
    250         self.assertEqual(len(self.type2test([])), 0)
    251         self.assertEqual(len(self.type2test([0])), 1)
    252         self.assertEqual(len(self.type2test([0, 1, 2])), 3)
    253 
    254     def test_minmax(self):
    255         u = self.type2test([0, 1, 2])
    256         self.assertEqual(min(u), 0)
    257         self.assertEqual(max(u), 2)
    258 
    259     def test_addmul(self):
    260         u1 = self.type2test([0])
    261         u2 = self.type2test([0, 1])
    262         self.assertEqual(u1, u1 + self.type2test())
    263         self.assertEqual(u1, self.type2test() + u1)
    264         self.assertEqual(u1 + self.type2test([1]), u2)
    265         self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0]))
    266         self.assertEqual(self.type2test(), u2*0)
    267         self.assertEqual(self.type2test(), 0*u2)
    268         self.assertEqual(self.type2test(), u2*0)
    269         self.assertEqual(self.type2test(), 0*u2)
    270         self.assertEqual(u2, u2*1)
    271         self.assertEqual(u2, 1*u2)
    272         self.assertEqual(u2, u2*1)
    273         self.assertEqual(u2, 1*u2)
    274         self.assertEqual(u2+u2, u2*2)
    275         self.assertEqual(u2+u2, 2*u2)
    276         self.assertEqual(u2+u2, u2*2)
    277         self.assertEqual(u2+u2, 2*u2)
    278         self.assertEqual(u2+u2+u2, u2*3)
    279         self.assertEqual(u2+u2+u2, 3*u2)
    280 
    281         class subclass(self.type2test):
    282             pass
    283         u3 = subclass([0, 1])
    284         self.assertEqual(u3, u3*1)
    285         self.assertIsNot(u3, u3*1)
    286 
    287     def test_iadd(self):
    288         u = self.type2test([0, 1])
    289         u += self.type2test()
    290         self.assertEqual(u, self.type2test([0, 1]))
    291         u += self.type2test([2, 3])
    292         self.assertEqual(u, self.type2test([0, 1, 2, 3]))
    293         u += self.type2test([4, 5])
    294         self.assertEqual(u, self.type2test([0, 1, 2, 3, 4, 5]))
    295 
    296         u = self.type2test("spam")
    297         u += self.type2test("eggs")
    298         self.assertEqual(u, self.type2test("spameggs"))
    299 
    300     def test_imul(self):
    301         u = self.type2test([0, 1])
    302         u *= 3
    303         self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1]))
    304 
    305     def test_getitemoverwriteiter(self):
    306         # Verify that __getitem__ overrides are not recognized by __iter__
    307         class T(self.type2test):
    308             def __getitem__(self, key):
    309                 return str(key) + '!!!'
    310         self.assertEqual(next(iter(T((1,2)))), 1)
    311 
    312     def test_repeat(self):
    313         for m in range(4):
    314             s = tuple(range(m))
    315             for n in range(-3, 5):
    316                 self.assertEqual(self.type2test(s*n), self.type2test(s)*n)
    317             self.assertEqual(self.type2test(s)*(-4), self.type2test([]))
    318             self.assertEqual(id(s), id(s*1))
    319 
    320     def test_bigrepeat(self):
    321         if sys.maxsize <= 2147483647:
    322             x = self.type2test([0])
    323             x *= 2**16
    324             self.assertRaises(MemoryError, x.__mul__, 2**16)
    325             if hasattr(x, '__imul__'):
    326                 self.assertRaises(MemoryError, x.__imul__, 2**16)
    327 
    328     def test_subscript(self):
    329         a = self.type2test([10, 11])
    330         self.assertEqual(a.__getitem__(0), 10)
    331         self.assertEqual(a.__getitem__(1), 11)
    332         self.assertEqual(a.__getitem__(-2), 10)
    333         self.assertEqual(a.__getitem__(-1), 11)
    334         self.assertRaises(IndexError, a.__getitem__, -3)
    335         self.assertRaises(IndexError, a.__getitem__, 3)
    336         self.assertEqual(a.__getitem__(slice(0,1)), self.type2test([10]))
    337         self.assertEqual(a.__getitem__(slice(1,2)), self.type2test([11]))
    338         self.assertEqual(a.__getitem__(slice(0,2)), self.type2test([10, 11]))
    339         self.assertEqual(a.__getitem__(slice(0,3)), self.type2test([10, 11]))
    340         self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([]))
    341         self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0))
    342         self.assertRaises(TypeError, a.__getitem__, 'x')
    343 
    344     def test_count(self):
    345         a = self.type2test([0, 1, 2])*3
    346         self.assertEqual(a.count(0), 3)
    347         self.assertEqual(a.count(1), 3)
    348         self.assertEqual(a.count(3), 0)
    349 
    350         self.assertRaises(TypeError, a.count)
    351 
    352         class BadExc(Exception):
    353             pass
    354 
    355         class BadCmp:
    356             def __eq__(self, other):
    357                 if other == 2:
    358                     raise BadExc()
    359                 return False
    360 
    361         self.assertRaises(BadExc, a.count, BadCmp())
    362 
    363     def test_index(self):
    364         u = self.type2test([0, 1])
    365         self.assertEqual(u.index(0), 0)
    366         self.assertEqual(u.index(1), 1)
    367         self.assertRaises(ValueError, u.index, 2)
    368 
    369         u = self.type2test([-2, -1, 0, 0, 1, 2])
    370         self.assertEqual(u.count(0), 2)
    371         self.assertEqual(u.index(0), 2)
    372         self.assertEqual(u.index(0, 2), 2)
    373         self.assertEqual(u.index(-2, -10), 0)
    374         self.assertEqual(u.index(0, 3), 3)
    375         self.assertEqual(u.index(0, 3, 4), 3)
    376         self.assertRaises(ValueError, u.index, 2, 0, -10)
    377 
    378         self.assertRaises(TypeError, u.index)
    379 
    380         class BadExc(Exception):
    381             pass
    382 
    383         class BadCmp:
    384             def __eq__(self, other):
    385                 if other == 2:
    386                     raise BadExc()
    387                 return False
    388 
    389         a = self.type2test([0, 1, 2, 3])
    390         self.assertRaises(BadExc, a.index, BadCmp())
    391 
    392         a = self.type2test([-2, -1, 0, 0, 1, 2])
    393         self.assertEqual(a.index(0), 2)
    394         self.assertEqual(a.index(0, 2), 2)
    395         self.assertEqual(a.index(0, -4), 2)
    396         self.assertEqual(a.index(-2, -10), 0)
    397         self.assertEqual(a.index(0, 3), 3)
    398         self.assertEqual(a.index(0, -3), 3)
    399         self.assertEqual(a.index(0, 3, 4), 3)
    400         self.assertEqual(a.index(0, -3, -2), 3)
    401         self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2)
    402         self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize)
    403         self.assertRaises(ValueError, a.index, 2, 0, -10)
    404 
    405     def test_pickle(self):
    406         lst = self.type2test([4, 5, 6, 7])
    407         for proto in range(pickle.HIGHEST_PROTOCOL + 1):
    408             lst2 = pickle.loads(pickle.dumps(lst, proto))
    409             self.assertEqual(lst2, lst)
    410             self.assertNotEqual(id(lst2), id(lst))
    411 
    412     def test_free_after_iterating(self):
    413         support.check_free_after_iterating(self, iter, self.type2test)
    414         support.check_free_after_iterating(self, reversed, self.type2test)
    415