blob: e12aa4177567db67684a62da0f38ac3312d151d5 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettinger2012f172003-02-07 05:32:58 +00004import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00005import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00006import random
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00007
8def onearg(x):
9 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000010 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
12def errfunc(*args):
13 'Test function that raises an error'
14 raise ValueError
15
16def gen3():
17 'Non-restartable source sequence'
18 for i in (0, 1, 2):
19 yield i
20
21def isEven(x):
22 'Test predicate'
23 return x%2==0
24
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000025def isOdd(x):
26 'Test predicate'
27 return x%2==1
28
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000029class StopNow:
30 'Class emulating an empty iterable.'
31 def __iter__(self):
32 return self
33 def next(self):
34 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000035
Raymond Hettinger02420702003-06-29 20:36:23 +000036def take(n, seq):
37 'Convenience function for partially consuming a long of infinite iterable'
38 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000039
Raymond Hettinger96ef8112003-02-01 00:10:11 +000040class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000041 def test_chain(self):
42 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000043 self.assertEqual(list(chain('abc')), list('abc'))
44 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000045 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000047
Raymond Hettinger96ef8112003-02-01 00:10:11 +000048 def test_count(self):
49 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
50 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000051 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000052 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000053 self.assertRaises(TypeError, count, 'a')
54 c = count(sys.maxint-2) # verify that rollover doesn't crash
55 c.next(); c.next(); c.next(); c.next(); c.next()
Raymond Hettinger96ef8112003-02-01 00:10:11 +000056
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000057 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000058 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000059 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000060 self.assertRaises(TypeError, cycle)
61 self.assertRaises(TypeError, cycle, 5)
62 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000063
Raymond Hettinger96ef8112003-02-01 00:10:11 +000064 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +000065 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000066 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +000067 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000068 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000069 self.assertRaises(TypeError, ifilter, lambda x:x)
70 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000071 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000072 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +000073
74 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +000075 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
76 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +000077 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +000078 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000079 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
80 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +000081 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000082 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000083
84 def test_izip(self):
85 ans = [(x,y) for x, y in izip('abc',count())]
86 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000087 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
88 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +000089 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000090 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +000091 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000092 self.assertRaises(TypeError, izip, 3)
93 self.assertRaises(TypeError, izip, range(3), 3)
94 # Check tuple re-use (implementation detail)
95 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
96 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000097 self.assertEqual([pair for pair in izip('abc', 'def')],
98 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000099 ids = map(id, izip('abc', 'def'))
100 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000101 ids = map(id, list(izip('abc', 'def')))
102 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000103
104 def test_repeat(self):
105 self.assertEqual(zip(xrange(3),repeat('a')),
106 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000107 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000108 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000109 self.assertEqual(list(repeat('a', 0)), [])
110 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000111 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000112 self.assertRaises(TypeError, repeat, None, 3, 4)
113 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000114
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000115 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000116 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
117 [0**1, 1**2, 2**3])
118 self.assertEqual(list(imap(None, 'abc', range(5))),
119 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000120 self.assertEqual(list(imap(None, 'abc', count())),
121 [('a',0),('b',1),('c',2)])
122 self.assertEqual(take(2,imap(None, 'abc', count())),
123 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000124 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000125 self.assertRaises(TypeError, imap)
126 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000127 self.assertRaises(TypeError, imap(10, range(5)).next)
128 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
129 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000130
131 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000132 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
133 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000134 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
135 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000136 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000137 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000138 self.assertRaises(TypeError, starmap)
139 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
140 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
141 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
142 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000143
144 def test_islice(self):
145 for args in [ # islice(args) should agree with range(args)
146 (10, 20, 3),
147 (10, 3, 20),
148 (10, 20),
149 (10, 3),
150 (20,)
151 ]:
152 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
153
154 for args, tgtargs in [ # Stop when seqn is exhausted
155 ((10, 110, 3), ((10, 100, 3))),
156 ((10, 110), ((10, 100))),
157 ((110,), (100,))
158 ]:
159 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
160
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000161 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000162 self.assertEqual(list(islice(xrange(10), None)), range(10))
163 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
164 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
165
166 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000167 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000168 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
169 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
170 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
171 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
172 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000173 self.assertRaises(ValueError, islice, xrange(10), 'a')
174 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
175 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
176 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
177 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000178 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000179
180 def test_takewhile(self):
181 data = [1, 3, 5, 20, 2, 4, 6, 8]
182 underten = lambda x: x<10
183 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000184 self.assertEqual(list(takewhile(underten, [])), [])
185 self.assertRaises(TypeError, takewhile)
186 self.assertRaises(TypeError, takewhile, operator.pow)
187 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
188 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
189 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000190
191 def test_dropwhile(self):
192 data = [1, 3, 5, 20, 2, 4, 6, 8]
193 underten = lambda x: x<10
194 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000195 self.assertEqual(list(dropwhile(underten, [])), [])
196 self.assertRaises(TypeError, dropwhile)
197 self.assertRaises(TypeError, dropwhile, operator.pow)
198 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
199 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
200 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000201
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000202 def test_tee(self):
203 n = 100
204 def irange(n):
205 for i in xrange(n):
206 yield i
207
208 a, b = tee([]) # test empty iterator
209 self.assertEqual(list(a), [])
210 self.assertEqual(list(b), [])
211
212 a, b = tee(irange(n)) # test 100% interleaved
213 self.assertEqual(zip(a,b), zip(range(n),range(n)))
214
215 a, b = tee(irange(n)) # test 0% interleaved
216 self.assertEqual(list(a), range(n))
217 self.assertEqual(list(b), range(n))
218
219 a, b = tee(irange(n)) # test dealloc of leading iterator
220 self.assertEqual(a.next(), 0)
221 self.assertEqual(a.next(), 1)
222 del a
223 self.assertEqual(list(b), range(n))
224
225 a, b = tee(irange(n)) # test dealloc of trailing iterator
226 self.assertEqual(a.next(), 0)
227 self.assertEqual(a.next(), 1)
228 del b
229 self.assertEqual(list(a), range(2, n))
230
231 for j in xrange(5): # test randomly interleaved
232 order = [0]*n + [1]*n
233 random.shuffle(order)
234 lists = ([], [])
235 its = tee(irange(n))
236 for i in order:
237 value = its[i].next()
238 lists[i].append(value)
239 self.assertEqual(lists[0], range(n))
240 self.assertEqual(lists[1], range(n))
241
242 self.assertRaises(TypeError, tee)
243 self.assertRaises(TypeError, tee, 3)
244 self.assertRaises(TypeError, tee, [1,2], 'x')
245
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000246 try:
247 class A(tee): pass
248 except TypeError:
249 pass
250 else:
251 self.fail("tee constructor should not be subclassable")
252
253 # tee_iterator should not be instantiable
254 a, b = tee(xrange(10))
255 self.assertRaises(TypeError, type(a))
256 self.assert_(a is iter(a)) # tee_iterator should support __iter__
257
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000258 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000259 self.assertRaises(StopIteration, izip().next)
260
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000261 for f in (chain, cycle, izip):
262 self.assertRaises(StopIteration, f([]).next)
263 self.assertRaises(StopIteration, f(StopNow()).next)
264
265 self.assertRaises(StopIteration, islice([], None).next)
266 self.assertRaises(StopIteration, islice(StopNow(), None).next)
267
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000268 p, q = tee([])
269 self.assertRaises(StopIteration, p.next)
270 self.assertRaises(StopIteration, q.next)
271 p, q = tee(StopNow())
272 self.assertRaises(StopIteration, p.next)
273 self.assertRaises(StopIteration, q.next)
274
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000275 self.assertRaises(StopIteration, repeat(None, 0).next)
276
277 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
278 self.assertRaises(StopIteration, f(lambda x:x, []).next)
279 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
280
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000281class TestGC(unittest.TestCase):
282
283 def makecycle(self, iterator, container):
284 container.append(iterator)
285 iterator.next()
286 del container, iterator
287
288 def test_chain(self):
289 a = []
290 self.makecycle(chain(a), a)
291
292 def test_cycle(self):
293 a = []
294 self.makecycle(cycle([a]*2), a)
295
296 def test_ifilter(self):
297 a = []
298 self.makecycle(ifilter(lambda x:True, [a]*2), a)
299
300 def test_ifilterfalse(self):
301 a = []
302 self.makecycle(ifilterfalse(lambda x:False, a), a)
303
304 def test_izip(self):
305 a = []
306 self.makecycle(izip([a]*2, [a]*3), a)
307
308 def test_imap(self):
309 a = []
310 self.makecycle(imap(lambda x:x, [a]*2), a)
311
312 def test_islice(self):
313 a = []
314 self.makecycle(islice([a]*2, None), a)
315
316 def test_starmap(self):
317 a = []
318 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
319
320 def test_tee(self):
321 a = []
322 p, q = t = tee([a]*2)
323 a += [a, p, q, t]
324 p.next()
325 del a, p, q, t
326
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000327def R(seqn):
328 'Regular generator'
329 for i in seqn:
330 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000331
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000332class G:
333 'Sequence using __getitem__'
334 def __init__(self, seqn):
335 self.seqn = seqn
336 def __getitem__(self, i):
337 return self.seqn[i]
338
339class I:
340 'Sequence using iterator protocol'
341 def __init__(self, seqn):
342 self.seqn = seqn
343 self.i = 0
344 def __iter__(self):
345 return self
346 def next(self):
347 if self.i >= len(self.seqn): raise StopIteration
348 v = self.seqn[self.i]
349 self.i += 1
350 return v
351
352class Ig:
353 'Sequence using iterator protocol defined with a generator'
354 def __init__(self, seqn):
355 self.seqn = seqn
356 self.i = 0
357 def __iter__(self):
358 for val in self.seqn:
359 yield val
360
361class X:
362 'Missing __getitem__ and __iter__'
363 def __init__(self, seqn):
364 self.seqn = seqn
365 self.i = 0
366 def next(self):
367 if self.i >= len(self.seqn): raise StopIteration
368 v = self.seqn[self.i]
369 self.i += 1
370 return v
371
372class N:
373 'Iterator missing next()'
374 def __init__(self, seqn):
375 self.seqn = seqn
376 self.i = 0
377 def __iter__(self):
378 return self
379
380class E:
381 'Test propagation of exceptions'
382 def __init__(self, seqn):
383 self.seqn = seqn
384 self.i = 0
385 def __iter__(self):
386 return self
387 def next(self):
388 3/0
389
390class S:
391 'Test immediate stop'
392 def __init__(self, seqn):
393 pass
394 def __iter__(self):
395 return self
396 def next(self):
397 raise StopIteration
398
399def L(seqn):
400 'Test multiple tiers of iterators'
401 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
402
403
404class TestVariousIteratorArgs(unittest.TestCase):
405
406 def test_chain(self):
407 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
408 for g in (G, I, Ig, S, L, R):
409 self.assertEqual(list(chain(g(s))), list(g(s)))
410 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
411 self.assertRaises(TypeError, chain, X(s))
412 self.assertRaises(TypeError, list, chain(N(s)))
413 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
414
415 def test_cycle(self):
416 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
417 for g in (G, I, Ig, S, L, R):
418 tgtlen = len(s) * 3
419 expected = list(g(s))*3
420 actual = list(islice(cycle(g(s)), tgtlen))
421 self.assertEqual(actual, expected)
422 self.assertRaises(TypeError, cycle, X(s))
423 self.assertRaises(TypeError, list, cycle(N(s)))
424 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
425
426 def test_ifilter(self):
427 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
428 for g in (G, I, Ig, S, L, R):
429 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
430 self.assertRaises(TypeError, ifilter, isEven, X(s))
431 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
432 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
433
434 def test_ifilterfalse(self):
435 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
436 for g in (G, I, Ig, S, L, R):
437 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
438 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
439 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
440 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
441
442 def test_izip(self):
443 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
444 for g in (G, I, Ig, S, L, R):
445 self.assertEqual(list(izip(g(s))), zip(g(s)))
446 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
447 self.assertRaises(TypeError, izip, X(s))
448 self.assertRaises(TypeError, list, izip(N(s)))
449 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
450
451 def test_imap(self):
452 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
453 for g in (G, I, Ig, S, L, R):
454 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
455 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
456 self.assertRaises(TypeError, imap, onearg, X(s))
457 self.assertRaises(TypeError, list, imap(onearg, N(s)))
458 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
459
460 def test_islice(self):
461 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
462 for g in (G, I, Ig, S, L, R):
463 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
464 self.assertRaises(TypeError, islice, X(s), 10)
465 self.assertRaises(TypeError, list, islice(N(s), 10))
466 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
467
468 def test_starmap(self):
469 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
470 for g in (G, I, Ig, S, L, R):
471 ss = zip(s, s)
472 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
473 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
474 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
475 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
476
477 def test_takewhile(self):
478 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
479 for g in (G, I, Ig, S, L, R):
480 tgt = []
481 for elem in g(s):
482 if not isEven(elem): break
483 tgt.append(elem)
484 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
485 self.assertRaises(TypeError, takewhile, isEven, X(s))
486 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
487 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
488
489 def test_dropwhile(self):
490 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
491 for g in (G, I, Ig, S, L, R):
492 tgt = []
493 for elem in g(s):
494 if not tgt and isOdd(elem): continue
495 tgt.append(elem)
496 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
497 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
498 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
499 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
500
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000501 def test_tee(self):
502 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
503 for g in (G, I, Ig, S, L, R):
504 it1, it2 = tee(g(s))
505 self.assertEqual(list(it1), list(g(s)))
506 self.assertEqual(list(it2), list(g(s)))
507 self.assertRaises(TypeError, tee, X(s))
508 self.assertRaises(TypeError, list, tee(N(s))[0])
509 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
510
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000511class RegressionTests(unittest.TestCase):
512
513 def test_sf_793826(self):
514 # Fix Armin Rigo's successful efforts to wreak havoc
515
516 def mutatingtuple(tuple1, f, tuple2):
517 # this builds a tuple t which is a copy of tuple1,
518 # then calls f(t), then mutates t to be equal to tuple2
519 # (needs len(tuple1) == len(tuple2)).
520 def g(value, first=[1]):
521 if first:
522 del first[:]
523 f(z.next())
524 return value
525 items = list(tuple2)
526 items[1:1] = list(tuple1)
527 gen = imap(g, items)
528 z = izip(*[gen]*len(tuple1))
529 z.next()
530
531 def f(t):
532 global T
533 T = t
534 first[:] = list(T)
535
536 first = []
537 mutatingtuple((1,2,3), f, (4,5,6))
538 second = list(T)
539 self.assertEqual(first, second)
540
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000541
542libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000543
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000544
545>>> amounts = [120.15, 764.05, 823.14]
546>>> for checknum, amount in izip(count(1200), amounts):
547... print 'Check %d is for $%.2f' % (checknum, amount)
548...
549Check 1200 is for $120.15
550Check 1201 is for $764.05
551Check 1202 is for $823.14
552
553>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000554>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
555... print cube
556...
5571
5588
55927
560
561>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000562>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000563... print name.title()
564...
565Alex
566Laura
567Martin
568Walter
569Samuele
570
Raymond Hettingera098b332003-09-08 23:58:40 +0000571>>> def take(n, seq):
572... return list(islice(seq, n))
573
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000574>>> def enumerate(iterable):
575... return izip(count(), iterable)
576
577>>> def tabulate(function):
578... "Return function(0), function(1), ..."
579... return imap(function, count())
580
581>>> def iteritems(mapping):
582... return izip(mapping.iterkeys(), mapping.itervalues())
583
584>>> def nth(iterable, n):
585... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000586... return list(islice(iterable, n, n+1))
587
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000588>>> def all(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000589... "Returns True if pred(x) is True for every element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000590... return False not in imap(pred, seq)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000591
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000592>>> def any(seq, pred=bool):
Raymond Hettinger02420702003-06-29 20:36:23 +0000593... "Returns True if pred(x) is True for at least one element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000594... return True in imap(pred, seq)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000595
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000596>>> def no(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000597... "Returns True if pred(x) is False for every element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000598... return True not in imap(pred, seq)
599
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000600>>> def quantify(seq, pred=bool):
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000601... "Count how many times the predicate is True in the sequence"
602... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000603
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000604>>> def padnone(seq):
605... "Returns the sequence elements and then returns None indefinitely"
606... return chain(seq, repeat(None))
607
608>>> def ncycles(seq, n):
609... "Returns the sequence elements n times"
610... return chain(*repeat(seq, n))
611
612>>> def dotproduct(vec1, vec2):
613... return sum(imap(operator.mul, vec1, vec2))
614
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000615>>> def flatten(listOfLists):
616... return list(chain(*listOfLists))
617
618>>> def repeatfunc(func, times=None, *args):
619... "Repeat calls to func with specified arguments."
620... " Example: repeatfunc(random.random)"
621... if times is None:
622... return starmap(func, repeat(args))
623... else:
624... return starmap(func, repeat(args, times))
625
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000626>>> def window(seq, n=2):
627... "Returns a sliding window (of width n) over data from the iterable"
628... " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
629... it = iter(seq)
630... result = tuple(islice(it, n))
631... if len(result) == n:
632... yield result
633... for elem in it:
634... result = result[1:] + (elem,)
635... yield result
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000636
637This is not part of the examples but it tests to make sure the definitions
638perform as purported.
639
Raymond Hettingera098b332003-09-08 23:58:40 +0000640>>> take(10, count())
641[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
642
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000643>>> list(enumerate('abc'))
644[(0, 'a'), (1, 'b'), (2, 'c')]
645
646>>> list(islice(tabulate(lambda x: 2*x), 4))
647[0, 2, 4, 6]
648
649>>> nth('abcde', 3)
650['d']
651
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000652>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000653True
654
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000655>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000656False
657
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000658>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000659True
660
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000661>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000662False
663
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000664>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000665True
666
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000667>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000668False
669
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000670>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000067150
672
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000673>>> a = [[1, 2, 3], [4, 5, 6]]
674>>> flatten(a)
675[1, 2, 3, 4, 5, 6]
676
677>>> list(repeatfunc(pow, 5, 2, 3))
678[8, 8, 8, 8, 8]
679
680>>> import random
681>>> take(5, imap(int, repeatfunc(random.random)))
682[0, 0, 0, 0, 0]
683
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000684>>> list(window('abc'))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000685[('a', 'b'), ('b', 'c')]
686
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000687>>> list(window('abc',5))
688[]
689
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000690>>> list(islice(padnone('abc'), 0, 6))
691['a', 'b', 'c', None, None, None]
692
693>>> list(ncycles('abc', 3))
694['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
695
696>>> dotproduct([1,2,3], [4,5,6])
69732
698
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000699"""
700
701__test__ = {'libreftest' : libreftest}
702
703def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000704 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
705 RegressionTests)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000706 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000707
708 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000709 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000710 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000711 counts = [None] * 5
712 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000713 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000714 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000715 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000716 print counts
717
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000718 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000719 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000720
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000721if __name__ == "__main__":
722 test_main(verbose=True)