Move setting of ioready 'wait' earlier in call chain, to
[python/dscho.git] / Lib / test / test_enumerate.py
blob1fa94799b79acc234010c710b3c122dda167c39a
1 import unittest
3 from test import test_support
5 seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')]
7 class G:
8 'Sequence using __getitem__'
9 def __init__(self, seqn):
10 self.seqn = seqn
11 def __getitem__(self, i):
12 return self.seqn[i]
14 class I:
15 'Sequence using iterator protocol'
16 def __init__(self, seqn):
17 self.seqn = seqn
18 self.i = 0
19 def __iter__(self):
20 return self
21 def next(self):
22 if self.i >= len(self.seqn): raise StopIteration
23 v = self.seqn[self.i]
24 self.i += 1
25 return v
27 class Ig:
28 'Sequence using iterator protocol defined with a generator'
29 def __init__(self, seqn):
30 self.seqn = seqn
31 self.i = 0
32 def __iter__(self):
33 for val in self.seqn:
34 yield val
36 class X:
37 'Missing __getitem__ and __iter__'
38 def __init__(self, seqn):
39 self.seqn = seqn
40 self.i = 0
41 def next(self):
42 if self.i >= len(self.seqn): raise StopIteration
43 v = self.seqn[self.i]
44 self.i += 1
45 return v
47 class E:
48 'Test propagation of exceptions'
49 def __init__(self, seqn):
50 self.seqn = seqn
51 self.i = 0
52 def __iter__(self):
53 return self
54 def next(self):
55 3/0
57 class N:
58 'Iterator missing next()'
59 def __init__(self, seqn):
60 self.seqn = seqn
61 self.i = 0
62 def __iter__(self):
63 return self
65 class EnumerateTestCase(unittest.TestCase):
67 enum = enumerate
69 def test_basicfunction(self):
70 self.assertEqual(type(self.enum(seq)), self.enum)
71 e = self.enum(seq)
72 self.assertEqual(iter(e), e)
73 self.assertEqual(list(self.enum(seq)), res)
74 self.enum.__doc__
76 def test_getitemseqn(self):
77 self.assertEqual(list(self.enum(G(seq))), res)
78 e = self.enum(G(''))
79 self.assertRaises(StopIteration, e.next)
81 def test_iteratorseqn(self):
82 self.assertEqual(list(self.enum(I(seq))), res)
83 e = self.enum(I(''))
84 self.assertRaises(StopIteration, e.next)
86 def test_iteratorgenerator(self):
87 self.assertEqual(list(self.enum(Ig(seq))), res)
88 e = self.enum(Ig(''))
89 self.assertRaises(StopIteration, e.next)
91 def test_noniterable(self):
92 self.assertRaises(TypeError, self.enum, X(seq))
94 def test_illformediterable(self):
95 self.assertRaises(TypeError, list, self.enum(N(seq)))
97 def test_exception_propagation(self):
98 self.assertRaises(ZeroDivisionError, list, self.enum(E(seq)))
100 class MyEnum(enumerate):
101 pass
103 class SubclassTestCase(EnumerateTestCase):
105 enum = MyEnum
107 def suite():
108 suite = unittest.TestSuite()
109 suite.addTest(unittest.makeSuite(EnumerateTestCase))
110 suite.addTest(unittest.makeSuite(SubclassTestCase))
111 return suite
113 def test_main():
114 test_support.run_suite(suite())
116 if __name__ == "__main__":
117 test_main()