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