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