4
from test import support
7
'Sequence using __getitem__'
8
def __init__(self, seqn):
10
def __getitem__(self, i):
14
'Sequence using iterator protocol'
15
def __init__(self, seqn):
21
if self.i >= len(self.seqn): raise StopIteration
27
'Sequence using iterator protocol defined with a generator'
28
def __init__(self, seqn):
36
'Missing __getitem__ and __iter__'
37
def __init__(self, seqn):
41
if self.i >= len(self.seqn): raise StopIteration
47
'Test propagation of exceptions'
48
def __init__(self, seqn):
57
'Iterator missing __next__()'
58
def __init__(self, seqn):
64
class EnumerateTestCase(unittest.TestCase):
67
seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')]
69
def test_basicfunction(self):
70
self.assertEqual(type(self.enum(self.seq)), self.enum)
71
e = self.enum(self.seq)
72
self.assertEqual(iter(e), e)
73
self.assertEqual(list(self.enum(self.seq)), self.res)
76
def test_getitemseqn(self):
77
self.assertEqual(list(self.enum(G(self.seq))), self.res)
79
self.assertRaises(StopIteration, next, e)
81
def test_iteratorseqn(self):
82
self.assertEqual(list(self.enum(I(self.seq))), self.res)
84
self.assertRaises(StopIteration, next, e)
86
def test_iteratorgenerator(self):
87
self.assertEqual(list(self.enum(Ig(self.seq))), self.res)
89
self.assertRaises(StopIteration, next, e)
91
def test_noniterable(self):
92
self.assertRaises(TypeError, self.enum, X(self.seq))
94
def test_illformediterable(self):
95
self.assertRaises(TypeError, self.enum, N(self.seq))
97
def test_exception_propagation(self):
98
self.assertRaises(ZeroDivisionError, list, self.enum(E(self.seq)))
100
def test_argumentcheck(self):
101
self.assertRaises(TypeError, self.enum) # no arguments
102
self.assertRaises(TypeError, self.enum, 1) # wrong type (not iterable)
103
self.assertRaises(TypeError, self.enum, 'abc', 'a') # wrong type
104
self.assertRaises(TypeError, self.enum, 'abc', 2, 3) # too many arguments
106
def test_tuple_reuse(self):
107
# Tests an implementation detail where tuple is reused
108
# whenever nothing else holds a reference to it
109
self.assertEqual(len(set(map(id, list(enumerate(self.seq))))), len(self.seq))
110
self.assertEqual(len(set(map(id, enumerate(self.seq)))), min(1,len(self.seq)))
112
class MyEnum(enumerate):
115
class SubclassTestCase(EnumerateTestCase):
119
class TestEmpty(EnumerateTestCase):
123
class TestBig(EnumerateTestCase):
125
seq = range(10,20000,2)
126
res = list(zip(range(20000), seq))
128
class TestReversed(unittest.TestCase):
130
def test_simple(self):
132
def __getitem__(self, i):
138
for data in 'abc', range(5), tuple(enumerate('abc')), A(), range(1,17,5):
139
self.assertEqual(list(data)[::-1], list(reversed(data)))
140
self.assertRaises(TypeError, reversed, {})
141
# don't allow keyword arguments
142
self.assertRaises(TypeError, reversed, [], a=1)
144
def test_range_optimization(self):
146
self.assertEqual(type(reversed(x)), type(iter(x)))
149
# This is an implementation detail, not an interface requirement
150
from test.test_iterlen import len
151
for s in ('hello', tuple('hello'), list('hello'), range(5)):
152
self.assertEqual(len(reversed(s)), len(s))
155
self.assertEqual(len(r), 0)
156
class SeqWithWeirdLen:
162
raise ZeroDivisionError
163
def __getitem__(self, index):
165
r = reversed(SeqWithWeirdLen())
166
self.assertRaises(ZeroDivisionError, len, r)
173
def __getitem__(self, index):
180
self.assertRaises(TypeError, reversed)
181
self.assertRaises(TypeError, reversed, [], 'extra')
183
def test_bug1229429(self):
184
# this bug was never in reversed, it was in
185
# PyObject_CallMethod, and reversed_new calls that sometimes.
186
if not hasattr(sys, "getrefcount"):
190
r = f.__reversed__ = object()
191
rc = sys.getrefcount(r)
198
self.fail("non-callable __reversed__ didn't raise!")
199
self.assertEqual(rc, sys.getrefcount(r))
202
class TestStart(EnumerateTestCase):
204
enum = lambda i: enumerate(i, start=11)
205
seq, res = 'abc', [(1, 'a'), (2, 'b'), (3, 'c')]
208
class TestLongStart(EnumerateTestCase):
210
enum = lambda i: enumerate(i, start=sys.maxsize+1)
211
seq, res = 'abc', [(sys.maxsize+1,'a'), (sys.maxsize+2,'b'),
215
def test_main(verbose=None):
216
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
218
support.run_unittest(*testclasses)
220
# verify reference counting
222
if verbose and hasattr(sys, "gettotalrefcount"):
224
for i in range(len(counts)):
225
support.run_unittest(*testclasses)
226
counts[i] = sys.gettotalrefcount()
229
if __name__ == "__main__":
230
test_main(verbose=True)