blob: 8ab4cea6f00ea3369a52fe1301743589f2ef48e8 [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
6
7def onearg(x):
8 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00009 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def errfunc(*args):
12 'Test function that raises an error'
13 raise ValueError
14
15def gen3():
16 'Non-restartable source sequence'
17 for i in (0, 1, 2):
18 yield i
19
20def isEven(x):
21 'Test predicate'
22 return x%2==0
23
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000024def isOdd(x):
25 'Test predicate'
26 return x%2==1
27
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000028class StopNow:
29 'Class emulating an empty iterable.'
30 def __iter__(self):
31 return self
32 def next(self):
33 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000034
Raymond Hettinger02420702003-06-29 20:36:23 +000035def take(n, seq):
36 'Convenience function for partially consuming a long of infinite iterable'
37 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000038
Raymond Hettinger96ef8112003-02-01 00:10:11 +000039class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000040 def test_chain(self):
41 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000042 self.assertEqual(list(chain('abc')), list('abc'))
43 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000044 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000045 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000046
Raymond Hettinger96ef8112003-02-01 00:10:11 +000047 def test_count(self):
48 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
49 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000050 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000052 self.assertRaises(TypeError, count, 'a')
53 c = count(sys.maxint-2) # verify that rollover doesn't crash
54 c.next(); c.next(); c.next(); c.next(); c.next()
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000056 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000057 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000058 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000059 self.assertRaises(TypeError, cycle)
60 self.assertRaises(TypeError, cycle, 5)
61 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000062
Raymond Hettinger96ef8112003-02-01 00:10:11 +000063 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +000064 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000065 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +000066 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000067 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000068 self.assertRaises(TypeError, ifilter, lambda x:x)
69 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000070 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000071 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +000072
73 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +000074 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
75 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +000076 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +000077 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000078 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
79 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +000080 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000081 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000082
83 def test_izip(self):
84 ans = [(x,y) for x, y in izip('abc',count())]
85 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000086 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
87 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +000088 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000089 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +000090 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000091 self.assertRaises(TypeError, izip, 3)
92 self.assertRaises(TypeError, izip, range(3), 3)
93 # Check tuple re-use (implementation detail)
94 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
95 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000096 self.assertEqual([pair for pair in izip('abc', 'def')],
97 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000098 ids = map(id, izip('abc', 'def'))
99 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000100 ids = map(id, list(izip('abc', 'def')))
101 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000102
103 def test_repeat(self):
104 self.assertEqual(zip(xrange(3),repeat('a')),
105 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000106 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000107 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000108 self.assertEqual(list(repeat('a', 0)), [])
109 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000110 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000111 self.assertRaises(TypeError, repeat, None, 3, 4)
112 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000113
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000114 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000115 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
116 [0**1, 1**2, 2**3])
117 self.assertEqual(list(imap(None, 'abc', range(5))),
118 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000119 self.assertEqual(list(imap(None, 'abc', count())),
120 [('a',0),('b',1),('c',2)])
121 self.assertEqual(take(2,imap(None, 'abc', count())),
122 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000123 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000124 self.assertRaises(TypeError, imap)
125 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000126 self.assertRaises(TypeError, imap(10, range(5)).next)
127 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
128 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000129
130 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000131 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
132 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000133 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
134 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000135 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000136 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000137 self.assertRaises(TypeError, starmap)
138 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
139 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
140 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
141 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000142
143 def test_islice(self):
144 for args in [ # islice(args) should agree with range(args)
145 (10, 20, 3),
146 (10, 3, 20),
147 (10, 20),
148 (10, 3),
149 (20,)
150 ]:
151 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
152
153 for args, tgtargs in [ # Stop when seqn is exhausted
154 ((10, 110, 3), ((10, 100, 3))),
155 ((10, 110), ((10, 100))),
156 ((110,), (100,))
157 ]:
158 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
159
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000160 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000161 self.assertEqual(list(islice(xrange(10), None)), range(10))
162 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
163 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
164
165 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000166 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000167 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
168 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
169 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
170 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
171 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000172 self.assertRaises(ValueError, islice, xrange(10), 'a')
173 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
174 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
175 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
176 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000177 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178
179 def test_takewhile(self):
180 data = [1, 3, 5, 20, 2, 4, 6, 8]
181 underten = lambda x: x<10
182 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000183 self.assertEqual(list(takewhile(underten, [])), [])
184 self.assertRaises(TypeError, takewhile)
185 self.assertRaises(TypeError, takewhile, operator.pow)
186 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
187 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
188 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000189
190 def test_dropwhile(self):
191 data = [1, 3, 5, 20, 2, 4, 6, 8]
192 underten = lambda x: x<10
193 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertEqual(list(dropwhile(underten, [])), [])
195 self.assertRaises(TypeError, dropwhile)
196 self.assertRaises(TypeError, dropwhile, operator.pow)
197 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
198 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
199 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000200
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000201 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000202 self.assertRaises(StopIteration, izip().next)
203
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000204 for f in (chain, cycle, izip):
205 self.assertRaises(StopIteration, f([]).next)
206 self.assertRaises(StopIteration, f(StopNow()).next)
207
208 self.assertRaises(StopIteration, islice([], None).next)
209 self.assertRaises(StopIteration, islice(StopNow(), None).next)
210
211 self.assertRaises(StopIteration, repeat(None, 0).next)
212
213 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
214 self.assertRaises(StopIteration, f(lambda x:x, []).next)
215 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
216
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000217def R(seqn):
218 'Regular generator'
219 for i in seqn:
220 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000221
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000222class G:
223 'Sequence using __getitem__'
224 def __init__(self, seqn):
225 self.seqn = seqn
226 def __getitem__(self, i):
227 return self.seqn[i]
228
229class I:
230 'Sequence using iterator protocol'
231 def __init__(self, seqn):
232 self.seqn = seqn
233 self.i = 0
234 def __iter__(self):
235 return self
236 def next(self):
237 if self.i >= len(self.seqn): raise StopIteration
238 v = self.seqn[self.i]
239 self.i += 1
240 return v
241
242class Ig:
243 'Sequence using iterator protocol defined with a generator'
244 def __init__(self, seqn):
245 self.seqn = seqn
246 self.i = 0
247 def __iter__(self):
248 for val in self.seqn:
249 yield val
250
251class X:
252 'Missing __getitem__ and __iter__'
253 def __init__(self, seqn):
254 self.seqn = seqn
255 self.i = 0
256 def next(self):
257 if self.i >= len(self.seqn): raise StopIteration
258 v = self.seqn[self.i]
259 self.i += 1
260 return v
261
262class N:
263 'Iterator missing next()'
264 def __init__(self, seqn):
265 self.seqn = seqn
266 self.i = 0
267 def __iter__(self):
268 return self
269
270class E:
271 'Test propagation of exceptions'
272 def __init__(self, seqn):
273 self.seqn = seqn
274 self.i = 0
275 def __iter__(self):
276 return self
277 def next(self):
278 3/0
279
280class S:
281 'Test immediate stop'
282 def __init__(self, seqn):
283 pass
284 def __iter__(self):
285 return self
286 def next(self):
287 raise StopIteration
288
289def L(seqn):
290 'Test multiple tiers of iterators'
291 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
292
Raymond Hettinger02420702003-06-29 20:36:23 +0000293class TestGC(unittest.TestCase):
294
295 def makecycle(self, iterator, container):
296 container.append(iterator)
297 iterator.next()
298 del container, iterator
299
300 def test_chain(self):
301 a = []
302 self.makecycle(chain(a), a)
303
304 def test_cycle(self):
305 a = []
306 self.makecycle(cycle([a]*2), a)
307
308 def test_ifilter(self):
309 a = []
310 self.makecycle(ifilter(lambda x:True, [a]*2), a)
311
312 def test_ifilterfalse(self):
313 a = []
314 self.makecycle(ifilterfalse(lambda x:False, a), a)
315
316 def test_izip(self):
317 a = []
318 self.makecycle(izip([a]*2, [a]*3), a)
319
320 def test_imap(self):
321 a = []
322 self.makecycle(imap(lambda x:x, [a]*2), a)
323
324 def test_islice(self):
325 a = []
326 self.makecycle(islice([a]*2, None), a)
327
328 def test_starmap(self):
329 a = []
330 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
331
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000332
333class TestVariousIteratorArgs(unittest.TestCase):
334
335 def test_chain(self):
336 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
337 for g in (G, I, Ig, S, L, R):
338 self.assertEqual(list(chain(g(s))), list(g(s)))
339 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
340 self.assertRaises(TypeError, chain, X(s))
341 self.assertRaises(TypeError, list, chain(N(s)))
342 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
343
344 def test_cycle(self):
345 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
346 for g in (G, I, Ig, S, L, R):
347 tgtlen = len(s) * 3
348 expected = list(g(s))*3
349 actual = list(islice(cycle(g(s)), tgtlen))
350 self.assertEqual(actual, expected)
351 self.assertRaises(TypeError, cycle, X(s))
352 self.assertRaises(TypeError, list, cycle(N(s)))
353 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
354
355 def test_ifilter(self):
356 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
357 for g in (G, I, Ig, S, L, R):
358 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
359 self.assertRaises(TypeError, ifilter, isEven, X(s))
360 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
361 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
362
363 def test_ifilterfalse(self):
364 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
365 for g in (G, I, Ig, S, L, R):
366 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
367 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
368 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
369 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
370
371 def test_izip(self):
372 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
373 for g in (G, I, Ig, S, L, R):
374 self.assertEqual(list(izip(g(s))), zip(g(s)))
375 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
376 self.assertRaises(TypeError, izip, X(s))
377 self.assertRaises(TypeError, list, izip(N(s)))
378 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
379
380 def test_imap(self):
381 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
382 for g in (G, I, Ig, S, L, R):
383 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
384 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
385 self.assertRaises(TypeError, imap, onearg, X(s))
386 self.assertRaises(TypeError, list, imap(onearg, N(s)))
387 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
388
389 def test_islice(self):
390 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
391 for g in (G, I, Ig, S, L, R):
392 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
393 self.assertRaises(TypeError, islice, X(s), 10)
394 self.assertRaises(TypeError, list, islice(N(s), 10))
395 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
396
397 def test_starmap(self):
398 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
399 for g in (G, I, Ig, S, L, R):
400 ss = zip(s, s)
401 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
402 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
403 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
404 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
405
406 def test_takewhile(self):
407 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
408 for g in (G, I, Ig, S, L, R):
409 tgt = []
410 for elem in g(s):
411 if not isEven(elem): break
412 tgt.append(elem)
413 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
414 self.assertRaises(TypeError, takewhile, isEven, X(s))
415 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
416 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
417
418 def test_dropwhile(self):
419 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
420 for g in (G, I, Ig, S, L, R):
421 tgt = []
422 for elem in g(s):
423 if not tgt and isOdd(elem): continue
424 tgt.append(elem)
425 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
426 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
427 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
428 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
429
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000430class RegressionTests(unittest.TestCase):
431
432 def test_sf_793826(self):
433 # Fix Armin Rigo's successful efforts to wreak havoc
434
435 def mutatingtuple(tuple1, f, tuple2):
436 # this builds a tuple t which is a copy of tuple1,
437 # then calls f(t), then mutates t to be equal to tuple2
438 # (needs len(tuple1) == len(tuple2)).
439 def g(value, first=[1]):
440 if first:
441 del first[:]
442 f(z.next())
443 return value
444 items = list(tuple2)
445 items[1:1] = list(tuple1)
446 gen = imap(g, items)
447 z = izip(*[gen]*len(tuple1))
448 z.next()
449
450 def f(t):
451 global T
452 T = t
453 first[:] = list(T)
454
455 first = []
456 mutatingtuple((1,2,3), f, (4,5,6))
457 second = list(T)
458 self.assertEqual(first, second)
459
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000460
461libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000462
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000463
464>>> amounts = [120.15, 764.05, 823.14]
465>>> for checknum, amount in izip(count(1200), amounts):
466... print 'Check %d is for $%.2f' % (checknum, amount)
467...
468Check 1200 is for $120.15
469Check 1201 is for $764.05
470Check 1202 is for $823.14
471
472>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000473>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
474... print cube
475...
4761
4778
47827
479
480>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000481>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000482... print name.title()
483...
484Alex
485Laura
486Martin
487Walter
488Samuele
489
Raymond Hettingera098b332003-09-08 23:58:40 +0000490>>> def take(n, seq):
491... return list(islice(seq, n))
492
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000493>>> def enumerate(iterable):
494... return izip(count(), iterable)
495
496>>> def tabulate(function):
497... "Return function(0), function(1), ..."
498... return imap(function, count())
499
500>>> def iteritems(mapping):
501... return izip(mapping.iterkeys(), mapping.itervalues())
502
503>>> def nth(iterable, n):
504... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000505... return list(islice(iterable, n, n+1))
506
507>>> def all(pred, seq):
508... "Returns True if pred(x) is True for every element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000509... return False not in imap(pred, seq)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000510
511>>> def some(pred, seq):
Raymond Hettinger02420702003-06-29 20:36:23 +0000512... "Returns True if pred(x) is True for at least one element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000513... return True in imap(pred, seq)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000514
515>>> def no(pred, seq):
516... "Returns True if pred(x) is False for every element in the iterable"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000517... return True not in imap(pred, seq)
518
519>>> def quantify(pred, seq):
520... "Count how many times the predicate is True in the sequence"
521... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000522
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000523>>> def padnone(seq):
524... "Returns the sequence elements and then returns None indefinitely"
525... return chain(seq, repeat(None))
526
527>>> def ncycles(seq, n):
528... "Returns the sequence elements n times"
529... return chain(*repeat(seq, n))
530
531>>> def dotproduct(vec1, vec2):
532... return sum(imap(operator.mul, vec1, vec2))
533
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000534>>> def window(seq, n=2):
535... "Returns a sliding window (of width n) over data from the iterable"
536... " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
537... it = iter(seq)
538... result = tuple(islice(it, n))
539... if len(result) == n:
540... yield result
541... for elem in it:
542... result = result[1:] + (elem,)
543... yield result
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000544
Raymond Hettingera098b332003-09-08 23:58:40 +0000545>>> def tee(iterable):
546... "Return two independent iterators from a single iterable"
547... def gen(next, data={}, cnt=[0]):
548... dpop = data.pop
549... for i in count():
550... if i == cnt[0]:
551... item = data[i] = next()
552... cnt[0] += 1
553... else:
554... item = dpop(i)
555... yield item
556... next = iter(iterable).next
557... return (gen(next), gen(next))
Raymond Hettinger3567a872003-06-28 05:44:36 +0000558
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000559This is not part of the examples but it tests to make sure the definitions
560perform as purported.
561
Raymond Hettingera098b332003-09-08 23:58:40 +0000562>>> take(10, count())
563[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
564
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000565>>> list(enumerate('abc'))
566[(0, 'a'), (1, 'b'), (2, 'c')]
567
568>>> list(islice(tabulate(lambda x: 2*x), 4))
569[0, 2, 4, 6]
570
571>>> nth('abcde', 3)
572['d']
573
574>>> all(lambda x: x%2==0, [2, 4, 6, 8])
575True
576
577>>> all(lambda x: x%2==0, [2, 3, 6, 8])
578False
579
580>>> some(lambda x: x%2==0, [2, 4, 6, 8])
581True
582
583>>> some(lambda x: x%2==0, [1, 3, 5, 9])
584False
585
586>>> no(lambda x: x%2==0, [1, 3, 5, 9])
587True
588
589>>> no(lambda x: x%2==0, [1, 2, 5, 9])
590False
591
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000592>>> quantify(lambda x: x%2==0, xrange(99))
59350
594
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000595>>> list(window('abc'))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000596[('a', 'b'), ('b', 'c')]
597
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000598>>> list(window('abc',5))
599[]
600
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000601>>> list(islice(padnone('abc'), 0, 6))
602['a', 'b', 'c', None, None, None]
603
604>>> list(ncycles('abc', 3))
605['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
606
607>>> dotproduct([1,2,3], [4,5,6])
60832
609
Raymond Hettingera098b332003-09-08 23:58:40 +0000610>>> def irange(start, stop):
611... for i in range(start, stop):
612... yield i
613
614>>> x, y = tee(irange(2,10))
615>>> list(x), list(y)
616([2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 4, 5, 6, 7, 8, 9])
617
618>>> x, y = tee(irange(2,10))
619>>> zip(x, y)
620[(2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
Raymond Hettinger3567a872003-06-28 05:44:36 +0000621
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000622"""
623
624__test__ = {'libreftest' : libreftest}
625
626def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000627 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
628 RegressionTests)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000629 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000630
631 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000632 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000633 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000634 counts = [None] * 5
635 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000636 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000637 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000638 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000639 print counts
640
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000641 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000642 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000643
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000644if __name__ == "__main__":
645 test_main(verbose=True)