4 from test
import test_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, e
.next
)
81 def test_iteratorseqn(self
):
82 self
.assertEqual(list(self
.enum(I(self
.seq
))), self
.res
)
84 self
.assertRaises(StopIteration, e
.next
)
86 def test_iteratorgenerator(self
):
87 self
.assertEqual(list(self
.enum(Ig(self
.seq
))), self
.res
)
89 self
.assertRaises(StopIteration, e
.next
)
91 def test_noniterable(self
):
92 self
.assertRaises(TypeError, self
.enum
, X(self
.seq
))
94 def test_illformediterable(self
):
95 self
.assertRaises(TypeError, list, 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
= 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(), xrange(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_class_class(self
):
146 def __reversed__(self
):
148 self
.assertEqual(list(reversed(A())), [2, 1])
150 def test_xrange_optimization(self
):
152 self
.assertEqual(type(reversed(x
)), type(iter(x
)))
155 # This is an implementation detail, not an interface requirement
156 from test
.test_iterlen
import len
157 for s
in ('hello', tuple('hello'), list('hello'), xrange(5)):
158 self
.assertEqual(len(reversed(s
)), len(s
))
161 self
.assertEqual(len(r
), 0)
162 class SeqWithWeirdLen
:
168 raise ZeroDivisionError
169 def __getitem__(self
, index
):
171 r
= reversed(SeqWithWeirdLen())
172 self
.assertRaises(ZeroDivisionError, len, r
)
179 def __getitem__(self
, index
):
186 self
.assertRaises(TypeError, reversed)
187 self
.assertRaises(TypeError, reversed, [], 'extra')
189 def test_bug1229429(self
):
190 # this bug was never in reversed, it was in
191 # PyObject_CallMethod, and reversed_new calls that sometimes.
192 if not hasattr(sys
, "getrefcount"):
196 r
= f
.__reversed
__ = object()
197 rc
= sys
.getrefcount(r
)
204 self
.fail("non-callable __reversed__ didn't raise!")
205 self
.assertEqual(rc
, sys
.getrefcount(r
))
208 class TestStart(EnumerateTestCase
):
210 enum
= lambda i
: enumerate(i
, start
=11)
211 seq
, res
= 'abc', [(1, 'a'), (2, 'b'), (3, 'c')]
214 class TestLongStart(EnumerateTestCase
):
216 enum
= lambda i
: enumerate(i
, start
=sys
.maxint
+1)
217 seq
, res
= 'abc', [(sys
.maxint
+1,'a'), (sys
.maxint
+2,'b'),
221 def test_main(verbose
=None):
222 testclasses
= (EnumerateTestCase
, SubclassTestCase
, TestEmpty
, TestBig
,
224 test_support
.run_unittest(*testclasses
)
226 # verify reference counting
228 if verbose
and hasattr(sys
, "gettotalrefcount"):
230 for i
in xrange(len(counts
)):
231 test_support
.run_unittest(*testclasses
)
232 counts
[i
] = sys
.gettotalrefcount()
235 if __name__
== "__main__":
236 test_main(verbose
=True)