blob: 63ca17b6e4f1dc7138e40e747de3cf93ab95b612 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Guido van Rossum360e4b82007-05-14 22:51:27 +00009maxsize = test_support.MAX_Py_ssize_t
10minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
Guido van Rossum801f0d72006-08-24 19:48:10 +000012def lzip(*args):
13 return list(zip(*args))
14
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015def onearg(x):
16 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000017 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000018
19def errfunc(*args):
20 'Test function that raises an error'
21 raise ValueError
22
23def gen3():
24 'Non-restartable source sequence'
25 for i in (0, 1, 2):
26 yield i
27
28def isEven(x):
29 'Test predicate'
30 return x%2==0
31
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000032def isOdd(x):
33 'Test predicate'
34 return x%2==1
35
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000036class StopNow:
37 'Class emulating an empty iterable.'
38 def __iter__(self):
39 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000040 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000041 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000042
Raymond Hettinger02420702003-06-29 20:36:23 +000043def take(n, seq):
44 'Convenience function for partially consuming a long of infinite iterable'
45 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000046
Raymond Hettinger96ef8112003-02-01 00:10:11 +000047class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000048 def test_chain(self):
49 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000050 self.assertEqual(list(chain('abc')), list('abc'))
51 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000052 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000053 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000054
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +000056 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
57 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
58 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +000059 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
60 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000061 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000062 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +000063 self.assertEqual(list(islice(count(maxsize-5), 10)),
64 list(range(maxsize-5, maxsize+5)))
65 self.assertEqual(list(islice(count(-maxsize-5), 10)),
66 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000067 c = count(3)
68 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +000069 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000070 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000071 c = count(-9)
72 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +000073 next(c)
74 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +000075 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +000076 # Test repr (ignoring the L in longs)
77 r1 = repr(count(i)).replace('L', '')
78 r2 = 'count(%r)'.__mod__(i).replace('L', '')
79 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000080
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000081 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000082 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000083 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000084 self.assertRaises(TypeError, cycle)
85 self.assertRaises(TypeError, cycle, 5)
86 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000087
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000088 def test_groupby(self):
89 # Check whether it accepts arguments correctly
90 self.assertEqual([], list(groupby([])))
91 self.assertEqual([], list(groupby([], key=id)))
92 self.assertRaises(TypeError, list, groupby('abc', []))
93 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000094 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000095
96 # Check normal input
97 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
98 (2,15,22), (3,16,23), (3,17,23)]
99 dup = []
100 for k, g in groupby(s, lambda r:r[0]):
101 for elem in g:
102 self.assertEqual(k, elem[0])
103 dup.append(elem)
104 self.assertEqual(s, dup)
105
106 # Check nested case
107 dup = []
108 for k, g in groupby(s, lambda r:r[0]):
109 for ik, ig in groupby(g, lambda r:r[2]):
110 for elem in ig:
111 self.assertEqual(k, elem[0])
112 self.assertEqual(ik, elem[2])
113 dup.append(elem)
114 self.assertEqual(s, dup)
115
116 # Check case where inner iterator is not used
117 keys = [k for k, g in groupby(s, lambda r:r[0])]
118 expectedkeys = set([r[0] for r in s])
119 self.assertEqual(set(keys), expectedkeys)
120 self.assertEqual(len(keys), len(expectedkeys))
121
122 # Exercise pipes and filters style
123 s = 'abracadabra'
124 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000125 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
127 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000128 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000129 self.assertEqual(r, ['a', 'b', 'r'])
130 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000131 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000132 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
133 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000134 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000135 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
136
Georg Brandla18af4e2007-04-21 15:47:16 +0000137 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000138 class ExpectedError(Exception):
139 pass
140 def delayed_raise(n=0):
141 for i in range(n):
142 yield 'yo'
143 raise ExpectedError
144 def gulp(iterable, keyp=None, func=list):
145 return [func(g) for k, g in groupby(iterable, keyp)]
146
Georg Brandla18af4e2007-04-21 15:47:16 +0000147 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000148 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000149 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000150 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
151
152 # __cmp__ failure
153 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000155 raise ExpectedError
156 s = [DummyCmp(), DummyCmp(), None]
157
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000158 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000159 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000160 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000161 self.assertRaises(ExpectedError, gulp, s)
162
163 # keyfunc failure
164 def keyfunc(obj):
165 if keyfunc.skip > 0:
166 keyfunc.skip -= 1
167 return obj
168 else:
169 raise ExpectedError
170
171 # keyfunc failure on outer object
172 keyfunc.skip = 0
173 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
174 keyfunc.skip = 1
175 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
176
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000177 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000179 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Christian Heimes836baa52008-02-26 08:18:30 +0000180 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000181 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000182 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000183 self.assertRaises(TypeError, ifilter, lambda x:x)
184 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000185 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000186 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000187
188 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000189 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
190 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Christian Heimes836baa52008-02-26 08:18:30 +0000191 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000192 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000193 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
195 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000196 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000197 self.assertRaises(TypeError, next, ifilterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000198
199 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000200 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000201 ans = [(x,y) for x, y in izip('abc',count())]
202 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000203 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
204 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
205 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
206 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
207 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000208 self.assertRaises(TypeError, izip, 3)
209 self.assertRaises(TypeError, izip, range(3), 3)
210 # Check tuple re-use (implementation detail)
211 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000212 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000213 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000214 lzip('abc', 'def'))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000215 ids = list(map(id, izip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000216 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000217 ids = list(map(id, list(izip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000218 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000219
Thomas Wouterscf297e42007-02-23 15:07:44 +0000220 def test_iziplongest(self):
221 for args in [
222 ['abc', range(6)],
223 [range(6), 'abc'],
224 [range(1000), range(2000,2100), range(3000,3050)],
225 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
226 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
227 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000228 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
229 for i in range(max(map(len, args)))]
Thomas Wouterscf297e42007-02-23 15:07:44 +0000230 self.assertEqual(list(izip_longest(*args)), target)
231 self.assertEqual(list(izip_longest(*args, **{})), target)
232 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
233 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234
Thomas Wouterscf297e42007-02-23 15:07:44 +0000235 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
236
237 self.assertEqual(list(izip_longest()), list(zip()))
238 self.assertEqual(list(izip_longest([])), list(zip([])))
239 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000241 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000242 list(izip(list('abc')+[None], 'defg'))) # empty keyword dict
Thomas Wouterscf297e42007-02-23 15:07:44 +0000243 self.assertRaises(TypeError, izip_longest, 3)
244 self.assertRaises(TypeError, izip_longest, range(3), 3)
245
246 for stmt in [
247 "izip_longest('abc', fv=1)",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000248 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000249 ]:
250 try:
251 eval(stmt, globals(), locals())
252 except TypeError:
253 pass
254 else:
255 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000256
Thomas Wouterscf297e42007-02-23 15:07:44 +0000257 # Check tuple re-use (implementation detail)
258 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
259 list(zip('abc', 'def')))
260 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
261 list(zip('abc', 'def')))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000262 ids = list(map(id, izip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000263 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000264 ids = list(map(id, list(izip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000265 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
266
Christian Heimesc3f30c42008-02-22 16:37:40 +0000267 def test_product(self):
268 for args, result in [
269 ([], []), # zero iterables ??? is this correct
270 (['ab'], [('a',), ('b',)]), # one iterable
271 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
272 ([range(0), range(2), range(3)], []), # first iterable with zero length
273 ([range(2), range(0), range(3)], []), # middle iterable with zero length
274 ([range(2), range(3), range(0)], []), # last iterable with zero length
275 ]:
276 self.assertEqual(list(product(*args)), result)
277 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
278 self.assertRaises(TypeError, product, range(6), None)
279 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
280 set('abcdefg'), range(11), tuple(range(13))]
281 for i in range(100):
282 args = [random.choice(argtypes) for j in range(random.randrange(5))]
283 n = reduce(operator.mul, map(len, args), 1) if args else 0
284 self.assertEqual(len(list(product(*args))), n)
285 args = map(iter, args)
286 self.assertEqual(len(list(product(*args))), n)
287
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000288 # Test implementation detail: tuple re-use
289 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
290 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000291
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000292 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000293 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000294 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000295 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000296 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000297 self.assertEqual(list(repeat('a', 0)), [])
298 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000299 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000300 self.assertRaises(TypeError, repeat, None, 3, 4)
301 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000302 r = repeat(1+0j)
303 self.assertEqual(repr(r), 'repeat((1+0j))')
304 r = repeat(1+0j, 5)
305 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
306 list(r)
307 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000308
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000309 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000310 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
311 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000312 def tupleize(*args):
313 return args
314 self.assertEqual(list(imap(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000316 self.assertEqual(list(imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000317 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000318 self.assertEqual(take(2,imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000319 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000320 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000321 self.assertRaises(TypeError, imap)
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000322 self.assertRaises(TypeError, list, imap(None, range(3), range(3)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000323 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000324 self.assertRaises(TypeError, next, imap(10, range(5)))
325 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
326 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000327
328 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000329 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
330 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000331 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
332 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000333 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000334 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
335 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000336 self.assertRaises(TypeError, starmap)
337 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000338 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
339 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
340 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000341
342 def test_islice(self):
343 for args in [ # islice(args) should agree with range(args)
344 (10, 20, 3),
345 (10, 3, 20),
346 (10, 20),
347 (10, 3),
348 (20,)
349 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000350 self.assertEqual(list(islice(range(100), *args)),
351 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000352
353 for args, tgtargs in [ # Stop when seqn is exhausted
354 ((10, 110, 3), ((10, 100, 3))),
355 ((10, 110), ((10, 100))),
356 ((110,), (100,))
357 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000358 self.assertEqual(list(islice(range(100), *args)),
359 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000360
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000361 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000362 self.assertEqual(list(islice(range(10), None)), list(range(10)))
363 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
364 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
365 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
366 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000367
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000368 # Test number of items consumed SF #1171417
369 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000370 self.assertEqual(list(islice(it, 3)), list(range(3)))
371 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000372
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000373 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000374 self.assertRaises(TypeError, islice, range(10))
375 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
376 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
377 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
378 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
379 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
380 self.assertRaises(ValueError, islice, range(10), 'a')
381 self.assertRaises(ValueError, islice, range(10), 'a', 1)
382 self.assertRaises(ValueError, islice, range(10), 1, 'a')
383 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
384 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000385 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000386
387 def test_takewhile(self):
388 data = [1, 3, 5, 20, 2, 4, 6, 8]
389 underten = lambda x: x<10
390 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000391 self.assertEqual(list(takewhile(underten, [])), [])
392 self.assertRaises(TypeError, takewhile)
393 self.assertRaises(TypeError, takewhile, operator.pow)
394 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000395 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
396 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000397 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
398 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000399 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000400
401 def test_dropwhile(self):
402 data = [1, 3, 5, 20, 2, 4, 6, 8]
403 underten = lambda x: x<10
404 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000405 self.assertEqual(list(dropwhile(underten, [])), [])
406 self.assertRaises(TypeError, dropwhile)
407 self.assertRaises(TypeError, dropwhile, operator.pow)
408 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000409 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
410 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000411
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000412 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000413 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000414 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000415 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416 yield i
417
418 a, b = tee([]) # test empty iterator
419 self.assertEqual(list(a), [])
420 self.assertEqual(list(b), [])
421
422 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000423 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000424
425 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000426 self.assertEqual(list(a), list(range(n)))
427 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000428
429 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000430 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000431 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000432 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000433 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000434
435 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000436 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000437 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000438 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000439 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000440
Guido van Rossum805365e2007-05-07 22:24:25 +0000441 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000442 order = [0]*n + [1]*n
443 random.shuffle(order)
444 lists = ([], [])
445 its = tee(irange(n))
446 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000447 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000448 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000449 self.assertEqual(lists[0], list(range(n)))
450 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000451
Raymond Hettingerad983e72003-11-12 14:32:26 +0000452 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000453 self.assertRaises(TypeError, tee)
454 self.assertRaises(TypeError, tee, 3)
455 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000456 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000457
Raymond Hettingerad983e72003-11-12 14:32:26 +0000458 # tee object should be instantiable
459 a, b = tee('abc')
460 c = type(a)('def')
461 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000462
Raymond Hettingerad983e72003-11-12 14:32:26 +0000463 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000464 a, b, c = tee(range(2000), 3)
465 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000466 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000467 self.assertEqual(list(b), list(range(2000)))
468 self.assertEqual([next(c), next(c)], list(range(2)))
469 self.assertEqual(list(a), list(range(100,2000)))
470 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000471
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000472 # test values of n
473 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000474 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000475 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000476 result = tee('abc', n)
477 self.assertEqual(type(result), tuple)
478 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000479 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000480
Raymond Hettingerad983e72003-11-12 14:32:26 +0000481 # tee pass-through to copyable iterator
482 a, b = tee('abc')
483 c, d = tee(a)
484 self.assert_(a is c)
485
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000486 # test tee_new
487 t1, t2 = tee('abc')
488 tnew = type(t1)
489 self.assertRaises(TypeError, tnew)
490 self.assertRaises(TypeError, tnew, 10)
491 t3 = tnew(t1)
492 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000493
Raymond Hettingera9f60922004-10-17 16:40:14 +0000494 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000495 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000496 p = proxy(a)
497 self.assertEqual(getattr(p, '__class__'), type(b))
498 del a
499 self.assertRaises(ReferenceError, getattr, p, '__class__')
500
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000501 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000502 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000503
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000504 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000505 self.assertRaises(StopIteration, next, f([]))
506 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000507
Georg Brandla18af4e2007-04-21 15:47:16 +0000508 self.assertRaises(StopIteration, next, islice([], None))
509 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000510
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000511 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000512 self.assertRaises(StopIteration, next, p)
513 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000514 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000515 self.assertRaises(StopIteration, next, p)
516 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000517
Georg Brandla18af4e2007-04-21 15:47:16 +0000518 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000519
520 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000521 self.assertRaises(StopIteration, next, f(lambda x:x, []))
522 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000523
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000524class TestGC(unittest.TestCase):
525
526 def makecycle(self, iterator, container):
527 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000528 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000529 del container, iterator
530
531 def test_chain(self):
532 a = []
533 self.makecycle(chain(a), a)
534
535 def test_cycle(self):
536 a = []
537 self.makecycle(cycle([a]*2), a)
538
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000539 def test_dropwhile(self):
540 a = []
541 self.makecycle(dropwhile(bool, [0, a, a]), a)
542
543 def test_groupby(self):
544 a = []
545 self.makecycle(groupby([a]*2, lambda x:x), a)
546
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000547 def test_ifilter(self):
548 a = []
549 self.makecycle(ifilter(lambda x:True, [a]*2), a)
550
551 def test_ifilterfalse(self):
552 a = []
553 self.makecycle(ifilterfalse(lambda x:False, a), a)
554
555 def test_izip(self):
556 a = []
557 self.makecycle(izip([a]*2, [a]*3), a)
558
559 def test_imap(self):
560 a = []
561 self.makecycle(imap(lambda x:x, [a]*2), a)
562
563 def test_islice(self):
564 a = []
565 self.makecycle(islice([a]*2, None), a)
566
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000567 def test_repeat(self):
568 a = []
569 self.makecycle(repeat(a), a)
570
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000571 def test_starmap(self):
572 a = []
573 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
574
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000575 def test_takewhile(self):
576 a = []
577 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
578
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000579def R(seqn):
580 'Regular generator'
581 for i in seqn:
582 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000583
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000584class G:
585 'Sequence using __getitem__'
586 def __init__(self, seqn):
587 self.seqn = seqn
588 def __getitem__(self, i):
589 return self.seqn[i]
590
591class I:
592 'Sequence using iterator protocol'
593 def __init__(self, seqn):
594 self.seqn = seqn
595 self.i = 0
596 def __iter__(self):
597 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000598 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000599 if self.i >= len(self.seqn): raise StopIteration
600 v = self.seqn[self.i]
601 self.i += 1
602 return v
603
604class Ig:
605 'Sequence using iterator protocol defined with a generator'
606 def __init__(self, seqn):
607 self.seqn = seqn
608 self.i = 0
609 def __iter__(self):
610 for val in self.seqn:
611 yield val
612
613class X:
614 'Missing __getitem__ and __iter__'
615 def __init__(self, seqn):
616 self.seqn = seqn
617 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000618 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000619 if self.i >= len(self.seqn): raise StopIteration
620 v = self.seqn[self.i]
621 self.i += 1
622 return v
623
624class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000625 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000626 def __init__(self, seqn):
627 self.seqn = seqn
628 self.i = 0
629 def __iter__(self):
630 return self
631
632class E:
633 'Test propagation of exceptions'
634 def __init__(self, seqn):
635 self.seqn = seqn
636 self.i = 0
637 def __iter__(self):
638 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000639 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000640 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000641
642class S:
643 'Test immediate stop'
644 def __init__(self, seqn):
645 pass
646 def __iter__(self):
647 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000648 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000649 raise StopIteration
650
651def L(seqn):
652 'Test multiple tiers of iterators'
653 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
654
655
656class TestVariousIteratorArgs(unittest.TestCase):
657
658 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000659 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000660 for g in (G, I, Ig, S, L, R):
661 self.assertEqual(list(chain(g(s))), list(g(s)))
662 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
663 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000664 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000665 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
666
Christian Heimesc3f30c42008-02-22 16:37:40 +0000667 def test_product(self):
668 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
669 self.assertRaises(TypeError, product, X(s))
670 self.assertRaises(TypeError, product, N(s))
671 self.assertRaises(ZeroDivisionError, product, E(s))
672
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000673 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000674 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000675 for g in (G, I, Ig, S, L, R):
676 tgtlen = len(s) * 3
677 expected = list(g(s))*3
678 actual = list(islice(cycle(g(s)), tgtlen))
679 self.assertEqual(actual, expected)
680 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000681 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000682 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
683
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000684 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000685 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000686 for g in (G, I, Ig, S, L, R):
687 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
688 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000689 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000690 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
691
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000692 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000693 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000694 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000695 self.assertEqual(list(ifilter(isEven, g(s))),
696 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000697 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000698 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000699 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
700
701 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000702 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000703 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000704 self.assertEqual(list(ifilterfalse(isEven, g(s))),
705 [x for x in g(s) if isOdd(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000706 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000707 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000708 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
709
710 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000711 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000712 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000713 self.assertEqual(list(izip(g(s))), lzip(g(s)))
714 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000715 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000716 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000717 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
718
Thomas Wouterscf297e42007-02-23 15:07:44 +0000719 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000720 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000721 for g in (G, I, Ig, S, L, R):
722 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
723 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
724 self.assertRaises(TypeError, izip_longest, X(s))
725 self.assertRaises(TypeError, izip_longest, N(s))
726 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
727
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000728 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000729 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000730 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000731 self.assertEqual(list(imap(onearg, g(s))),
732 [onearg(x) for x in g(s)])
733 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
734 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000735 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000736 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000737 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
738
739 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000740 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000741 for g in (G, I, Ig, S, L, R):
742 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
743 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000744 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000745 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
746
747 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000748 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000749 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000750 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000751 self.assertEqual(list(starmap(operator.pow, g(ss))),
752 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000753 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000754 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000755 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
756
757 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000758 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000759 for g in (G, I, Ig, S, L, R):
760 tgt = []
761 for elem in g(s):
762 if not isEven(elem): break
763 tgt.append(elem)
764 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
765 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000766 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000767 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
768
769 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000770 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000771 for g in (G, I, Ig, S, L, R):
772 tgt = []
773 for elem in g(s):
774 if not tgt and isOdd(elem): continue
775 tgt.append(elem)
776 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
777 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000778 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000779 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
780
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000781 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000782 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000783 for g in (G, I, Ig, S, L, R):
784 it1, it2 = tee(g(s))
785 self.assertEqual(list(it1), list(g(s)))
786 self.assertEqual(list(it2), list(g(s)))
787 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000788 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000789 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
790
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000791class LengthTransparency(unittest.TestCase):
792
793 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000794 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000795 self.assertEqual(len(repeat(None, 50)), 50)
796 self.assertRaises(TypeError, len, repeat(None))
797
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000798class RegressionTests(unittest.TestCase):
799
800 def test_sf_793826(self):
801 # Fix Armin Rigo's successful efforts to wreak havoc
802
803 def mutatingtuple(tuple1, f, tuple2):
804 # this builds a tuple t which is a copy of tuple1,
805 # then calls f(t), then mutates t to be equal to tuple2
806 # (needs len(tuple1) == len(tuple2)).
807 def g(value, first=[1]):
808 if first:
809 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000810 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000811 return value
812 items = list(tuple2)
813 items[1:1] = list(tuple1)
814 gen = imap(g, items)
815 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000816 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000817
818 def f(t):
819 global T
820 T = t
821 first[:] = list(T)
822
823 first = []
824 mutatingtuple((1,2,3), f, (4,5,6))
825 second = list(T)
826 self.assertEqual(first, second)
827
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000828
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000829 def test_sf_950057(self):
830 # Make sure that chain() and cycle() catch exceptions immediately
831 # rather than when shifting between input sources
832
833 def gen1():
834 hist.append(0)
835 yield 1
836 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000837 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000838 hist.append(2)
839
840 def gen2(x):
841 hist.append(3)
842 yield 2
843 hist.append(4)
844 if x:
845 raise StopIteration
846
847 hist = []
848 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
849 self.assertEqual(hist, [0,1])
850
851 hist = []
852 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
853 self.assertEqual(hist, [0,1])
854
855 hist = []
856 self.assertRaises(AssertionError, list, cycle(gen1()))
857 self.assertEqual(hist, [0,1])
858
Thomas Woutersb2137042007-02-01 18:02:27 +0000859class SubclassWithKwargsTest(unittest.TestCase):
860 def test_keywords_in_subclass(self):
861 # count is not subclassable...
862 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
863 starmap, islice, takewhile, dropwhile, cycle):
864 class Subclass(cls):
865 def __init__(self, newarg=None, *args):
866 cls.__init__(self, *args)
867 try:
868 Subclass(newarg=1)
869 except TypeError as err:
870 # we expect type errors because of wrong argument count
871 self.failIf("does not take keyword arguments" in err.args[0])
872
873
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000874libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000875
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000876
877>>> amounts = [120.15, 764.05, 823.14]
878>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000879... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000880...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000881Check 1200 is for $120.15
882Check 1201 is for $764.05
883Check 1202 is for $823.14
884
885>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000886>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000887... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000888...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00008891
8908
89127
892
893>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000894>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000895... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000896...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000897Alex
898Laura
899Martin
900Walter
901Samuele
902
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000903>>> from operator import itemgetter
904>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000905>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000906>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000907... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000908...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00009091 ['a', 'c', 'e']
9102 ['b', 'd', 'f']
9113 ['g']
912
Raymond Hettinger734fb572004-01-20 20:04:40 +0000913# Find runs of consecutive numbers using groupby. The key to the solution
914# is differencing with a range so that consecutive numbers all appear in
915# same group.
916>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000917>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000918... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000919...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000920[1]
921[4, 5, 6]
922[10]
923[15, 16, 17, 18]
924[22]
925[25, 26, 27, 28]
926
Raymond Hettingera098b332003-09-08 23:58:40 +0000927>>> def take(n, seq):
928... return list(islice(seq, n))
929
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000930>>> def enumerate(iterable):
931... return izip(count(), iterable)
932
933>>> def tabulate(function):
934... "Return function(0), function(1), ..."
935... return imap(function, count())
936
937>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000938... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000939
940>>> def nth(iterable, n):
941... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000942... return list(islice(iterable, n, n+1))
943
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000944>>> def all(seq, pred=None):
945... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000946... for elem in ifilterfalse(pred, seq):
947... return False
948... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000949
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000950>>> def any(seq, pred=None):
951... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000952... for elem in ifilter(pred, seq):
953... return True
954... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000955
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000956>>> def no(seq, pred=None):
957... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000958... for elem in ifilter(pred, seq):
959... return False
960... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000961
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000962>>> def quantify(seq, pred=None):
963... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000964... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000965
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000966>>> def padnone(seq):
967... "Returns the sequence elements and then returns None indefinitely"
968... return chain(seq, repeat(None))
969
970>>> def ncycles(seq, n):
971... "Returns the sequence elements n times"
972... return chain(*repeat(seq, n))
973
974>>> def dotproduct(vec1, vec2):
975... return sum(imap(operator.mul, vec1, vec2))
976
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000977>>> def flatten(listOfLists):
978... return list(chain(*listOfLists))
979
980>>> def repeatfunc(func, times=None, *args):
981... "Repeat calls to func with specified arguments."
982... " Example: repeatfunc(random.random)"
983... if times is None:
984... return starmap(func, repeat(args))
985... else:
986... return starmap(func, repeat(args, times))
987
Raymond Hettingerd591f662003-10-26 15:34:50 +0000988>>> def pairwise(iterable):
989... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
990... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000991... try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000992... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000993... except StopIteration:
994... pass
995... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000996
997This is not part of the examples but it tests to make sure the definitions
998perform as purported.
999
Raymond Hettingera098b332003-09-08 23:58:40 +00001000>>> take(10, count())
1001[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1002
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001003>>> list(enumerate('abc'))
1004[(0, 'a'), (1, 'b'), (2, 'c')]
1005
1006>>> list(islice(tabulate(lambda x: 2*x), 4))
1007[0, 2, 4, 6]
1008
1009>>> nth('abcde', 3)
1010['d']
1011
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001012>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001013True
1014
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001015>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001016False
1017
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001018>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001019True
1020
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001021>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001022False
1023
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001024>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001025True
1026
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001027>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001028False
1029
Guido van Rossum805365e2007-05-07 22:24:25 +00001030>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000103150
1032
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001033>>> a = [[1, 2, 3], [4, 5, 6]]
1034>>> flatten(a)
1035[1, 2, 3, 4, 5, 6]
1036
1037>>> list(repeatfunc(pow, 5, 2, 3))
1038[8, 8, 8, 8, 8]
1039
1040>>> import random
1041>>> take(5, imap(int, repeatfunc(random.random)))
1042[0, 0, 0, 0, 0]
1043
Raymond Hettingerd591f662003-10-26 15:34:50 +00001044>>> list(pairwise('abcd'))
1045[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001046
Raymond Hettingerd591f662003-10-26 15:34:50 +00001047>>> list(pairwise([]))
1048[]
1049
1050>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001051[]
1052
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001053>>> list(islice(padnone('abc'), 0, 6))
1054['a', 'b', 'c', None, None, None]
1055
1056>>> list(ncycles('abc', 3))
1057['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1058
1059>>> dotproduct([1,2,3], [4,5,6])
106032
1061
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001062"""
1063
1064__test__ = {'libreftest' : libreftest}
1065
1066def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001067 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001068 RegressionTests, LengthTransparency,
1069 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001070 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001071
1072 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001073 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001074 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001075 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001076 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001077 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001078 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001079 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001080 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001081
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001082 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001083 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001084
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001085if __name__ == "__main__":
1086 test_main(verbose=True)