blob: affad7f3b8c755d4cea510d23ffcdc5824197dde [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from 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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00009maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000010minsize = -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
Christian Heimes78644762008-03-04 23:39:23 +000047def prod(iterable):
48 return reduce(operator.mul, iterable, 1)
49
Christian Heimes380f7f22008-02-28 11:19:05 +000050def fact(n):
51 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000052 return prod(range(1, n+1))
53
Raymond Hettinger96ef8112003-02-01 00:10:11 +000054class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000055 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +000056
57 def chain2(*iterables):
58 'Pure python version in the docs'
59 for it in iterables:
60 for element in it:
61 yield element
62
63 for c in (chain, chain2):
64 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
65 self.assertEqual(list(c('abc')), list('abc'))
66 self.assertEqual(list(c('')), [])
67 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
68 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +000069
70 def test_chain_from_iterable(self):
71 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
72 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
73 self.assertEqual(list(chain.from_iterable([''])), [])
74 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
75 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000076
Christian Heimes380f7f22008-02-28 11:19:05 +000077 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000078 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +000079 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +000080 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +000081 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000082 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Christian Heimes380f7f22008-02-28 11:19:05 +000083 self.assertEqual(list(combinations(range(4), 3)),
84 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +000085
86 def combinations1(iterable, r):
87 'Pure python version shown in the docs'
88 pool = tuple(iterable)
89 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000090 if r > n:
91 return
Christian Heimes78644762008-03-04 23:39:23 +000092 indices = list(range(r))
93 yield tuple(pool[i] for i in indices)
94 while 1:
95 for i in reversed(range(r)):
96 if indices[i] != i + n - r:
97 break
98 else:
99 return
100 indices[i] += 1
101 for j in range(i+1, r):
102 indices[j] = indices[j-1] + 1
103 yield tuple(pool[i] for i in indices)
104
105 def combinations2(iterable, r):
106 'Pure python version shown in the docs'
107 pool = tuple(iterable)
108 n = len(pool)
109 for indices in permutations(range(n), r):
110 if sorted(indices) == list(indices):
111 yield tuple(pool[i] for i in indices)
112
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000113 def combinations3(iterable, r):
114 'Pure python version from cwr()'
115 pool = tuple(iterable)
116 n = len(pool)
117 for indices in combinations_with_replacement(range(n), r):
118 if len(set(indices)) == r:
119 yield tuple(pool[i] for i in indices)
120
Christian Heimes78644762008-03-04 23:39:23 +0000121 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000122 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000123 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000124 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000125 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs
Christian Heimes380f7f22008-02-28 11:19:05 +0000126 self.assertEqual(len(result), len(set(result))) # no repeats
127 self.assertEqual(result, sorted(result)) # lexicographic order
128 for c in result:
129 self.assertEqual(len(c), r) # r-length combinations
130 self.assertEqual(len(set(c)), r) # no duplicate elements
131 self.assertEqual(list(c), sorted(c)) # keep original ordering
132 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000133 self.assertEqual(list(c),
134 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000135 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000136 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000137 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000138
139 # Test implementation detail: tuple re-use
140 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
141 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
142
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000143 def test_combinations_with_replacement(self):
144 cwr = combinations_with_replacement
145 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
146 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
147 self.assertRaises(TypeError, cwr, None) # pool is not iterable
148 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
149 self.assertEqual(list(cwr('ABC', 2)),
150 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
151
152 def cwr1(iterable, r):
153 'Pure python version shown in the docs'
154 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
155 pool = tuple(iterable)
156 n = len(pool)
157 if not n and r:
158 return
159 indices = [0] * r
160 yield tuple(pool[i] for i in indices)
161 while 1:
162 for i in reversed(range(r)):
163 if indices[i] != n - 1:
164 break
165 else:
166 return
167 indices[i:] = [indices[i] + 1] * (r - i)
168 yield tuple(pool[i] for i in indices)
169
170 def cwr2(iterable, r):
171 'Pure python version shown in the docs'
172 pool = tuple(iterable)
173 n = len(pool)
174 for indices in product(range(n), repeat=r):
175 if sorted(indices) == list(indices):
176 yield tuple(pool[i] for i in indices)
177
178 def numcombs(n, r):
179 if not n:
180 return 0 if r else 1
181 return fact(n+r-1) / fact(r)/ fact(n-1)
182
183 for n in range(7):
184 values = [5*x-12 for x in range(n)]
185 for r in range(n+2):
186 result = list(cwr(values, r))
187
188 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
189 self.assertEqual(len(result), len(set(result))) # no repeats
190 self.assertEqual(result, sorted(result)) # lexicographic order
191
192 regular_combs = list(combinations(values, r)) # compare to combs without replacement
193 if n == 0 or r <= 1:
194 self.assertEquals(result, regular_combs) # cases that should be identical
195 else:
196 self.assert_(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
197
198 for c in result:
199 self.assertEqual(len(c), r) # r-length combinations
200 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
201 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
202 self.assertEqual(list(c), sorted(c)) # keep original ordering
203 self.assert_(all(e in values for e in c)) # elements taken from input iterable
204 self.assertEqual(noruns,
205 [e for e in values if e in c]) # comb is a subsequence of the input iterable
206 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
207 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
208
209 # Test implementation detail: tuple re-use
210 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
211 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
212
Christian Heimes78644762008-03-04 23:39:23 +0000213 def test_permutations(self):
214 self.assertRaises(TypeError, permutations) # too few arguments
215 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000216 self.assertRaises(TypeError, permutations, None) # pool is not iterable
217 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000218 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000219 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000220 self.assertEqual(list(permutations(range(3), 2)),
221 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
222
223 def permutations1(iterable, r=None):
224 'Pure python version shown in the docs'
225 pool = tuple(iterable)
226 n = len(pool)
227 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000228 if r > n:
229 return
Christian Heimes78644762008-03-04 23:39:23 +0000230 indices = list(range(n))
231 cycles = list(range(n-r+1, n+1))[::-1]
232 yield tuple(pool[i] for i in indices[:r])
233 while n:
234 for i in reversed(range(r)):
235 cycles[i] -= 1
236 if cycles[i] == 0:
237 indices[i:] = indices[i+1:] + indices[i:i+1]
238 cycles[i] = n - i
239 else:
240 j = cycles[i]
241 indices[i], indices[-j] = indices[-j], indices[i]
242 yield tuple(pool[i] for i in indices[:r])
243 break
244 else:
245 return
246
247 def permutations2(iterable, r=None):
248 'Pure python version shown in the docs'
249 pool = tuple(iterable)
250 n = len(pool)
251 r = n if r is None else r
252 for indices in product(range(n), repeat=r):
253 if len(set(indices)) == r:
254 yield tuple(pool[i] for i in indices)
255
256 for n in range(7):
257 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000258 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000259 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000260 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms
Christian Heimes78644762008-03-04 23:39:23 +0000261 self.assertEqual(len(result), len(set(result))) # no repeats
262 self.assertEqual(result, sorted(result)) # lexicographic order
263 for p in result:
264 self.assertEqual(len(p), r) # r-length permutations
265 self.assertEqual(len(set(p)), r) # no duplicate elements
266 self.assert_(all(e in values for e in p)) # elements taken from input iterable
267 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000268 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000269 if r == n:
270 self.assertEqual(result, list(permutations(values, None))) # test r as None
271 self.assertEqual(result, list(permutations(values))) # test default r
272
273 # Test implementation detail: tuple re-use
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000274 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000275 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000276
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000277 def test_combinatorics(self):
278 # Test relationships between product(), permutations(),
279 # combinations() and combinations_with_replacement().
280
281 s = 'ABCDE'
282 for r in range(8):
283 prod = list(product(s, repeat=r))
284 cwr = list(combinations_with_replacement(s, r))
285 perm = list(permutations(s, r))
286 comb = list(combinations(s, r))
287
288 self.assertEquals(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
289 self.assertEquals(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
290 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
291 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
292 self.assertEqual(set(comb), set(cwr) & set(perm)) # comb: both a cwr and a perm
293
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000294 def test_compress(self):
295 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
296 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
297 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
298 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
299 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
300 n = 10000
301 data = chain.from_iterable(repeat(range(6), n))
302 selectors = chain.from_iterable(repeat((0, 1)))
303 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
304 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
305 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
306 self.assertRaises(TypeError, compress, range(6)) # too few args
307 self.assertRaises(TypeError, compress, range(6), None) # too many args
308
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000309 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000310 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
311 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
312 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000313 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
314 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000316 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000317 self.assertEqual(list(islice(count(maxsize-5), 10)),
318 list(range(maxsize-5, maxsize+5)))
319 self.assertEqual(list(islice(count(-maxsize-5), 10)),
320 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000321 c = count(3)
322 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000323 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000324 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000325 c = count(-9)
326 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000327 next(c)
328 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000329 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 +0000330 # Test repr (ignoring the L in longs)
331 r1 = repr(count(i)).replace('L', '')
332 r2 = 'count(%r)'.__mod__(i).replace('L', '')
333 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000334
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000335 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000336 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000337 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000338 self.assertRaises(TypeError, cycle)
339 self.assertRaises(TypeError, cycle, 5)
340 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000341
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000342 def test_groupby(self):
343 # Check whether it accepts arguments correctly
344 self.assertEqual([], list(groupby([])))
345 self.assertEqual([], list(groupby([], key=id)))
346 self.assertRaises(TypeError, list, groupby('abc', []))
347 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000348 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000349
350 # Check normal input
351 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
352 (2,15,22), (3,16,23), (3,17,23)]
353 dup = []
354 for k, g in groupby(s, lambda r:r[0]):
355 for elem in g:
356 self.assertEqual(k, elem[0])
357 dup.append(elem)
358 self.assertEqual(s, dup)
359
360 # Check nested case
361 dup = []
362 for k, g in groupby(s, lambda r:r[0]):
363 for ik, ig in groupby(g, lambda r:r[2]):
364 for elem in ig:
365 self.assertEqual(k, elem[0])
366 self.assertEqual(ik, elem[2])
367 dup.append(elem)
368 self.assertEqual(s, dup)
369
370 # Check case where inner iterator is not used
371 keys = [k for k, g in groupby(s, lambda r:r[0])]
372 expectedkeys = set([r[0] for r in s])
373 self.assertEqual(set(keys), expectedkeys)
374 self.assertEqual(len(keys), len(expectedkeys))
375
376 # Exercise pipes and filters style
377 s = 'abracadabra'
378 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000379 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000380 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
381 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000382 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000383 self.assertEqual(r, ['a', 'b', 'r'])
384 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000385 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000386 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
387 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000388 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000389 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
390
Georg Brandla18af4e2007-04-21 15:47:16 +0000391 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000392 class ExpectedError(Exception):
393 pass
394 def delayed_raise(n=0):
395 for i in range(n):
396 yield 'yo'
397 raise ExpectedError
398 def gulp(iterable, keyp=None, func=list):
399 return [func(g) for k, g in groupby(iterable, keyp)]
400
Georg Brandla18af4e2007-04-21 15:47:16 +0000401 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000402 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000403 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000404 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
405
406 # __cmp__ failure
407 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000408 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000409 raise ExpectedError
410 s = [DummyCmp(), DummyCmp(), None]
411
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000412 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000413 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000414 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000415 self.assertRaises(ExpectedError, gulp, s)
416
417 # keyfunc failure
418 def keyfunc(obj):
419 if keyfunc.skip > 0:
420 keyfunc.skip -= 1
421 return obj
422 else:
423 raise ExpectedError
424
425 # keyfunc failure on outer object
426 keyfunc.skip = 0
427 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
428 keyfunc.skip = 1
429 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
430
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000431 def test_filter(self):
432 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
433 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
434 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
435 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
436 self.assertRaises(TypeError, filter)
437 self.assertRaises(TypeError, filter, lambda x:x)
438 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
439 self.assertRaises(TypeError, filter, isEven, 3)
440 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000441
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000442 def test_filterfalse(self):
443 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
444 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
445 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
446 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
447 self.assertRaises(TypeError, filterfalse)
448 self.assertRaises(TypeError, filterfalse, lambda x:x)
449 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
450 self.assertRaises(TypeError, filterfalse, isEven, 3)
451 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000452
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000453 def test_zip(self):
454 # XXX This is rather silly now that builtin zip() calls zip()...
455 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000456 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000457 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
458 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
459 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
460 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
461 self.assertEqual(list(zip()), lzip())
462 self.assertRaises(TypeError, zip, 3)
463 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000464 # Check tuple re-use (implementation detail)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000465 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000466 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000467 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000468 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000469 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000470 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000471 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000472 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000473
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000474 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000475 for args in [
476 ['abc', range(6)],
477 [range(6), 'abc'],
478 [range(1000), range(2000,2100), range(3000,3050)],
479 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
480 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
481 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000482 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
483 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000484 self.assertEqual(list(zip_longest(*args)), target)
485 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000486 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000487 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000488
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000489 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000490
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000491 self.assertEqual(list(zip_longest()), list(zip()))
492 self.assertEqual(list(zip_longest([])), list(zip([])))
493 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000494
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000495 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000496 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000497 self.assertRaises(TypeError, zip_longest, 3)
498 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000499
500 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000501 "zip_longest('abc', fv=1)",
502 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000503 ]:
504 try:
505 eval(stmt, globals(), locals())
506 except TypeError:
507 pass
508 else:
509 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000510
Thomas Wouterscf297e42007-02-23 15:07:44 +0000511 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000512 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000513 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000514 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000515 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000516 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000517 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000518 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000519 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
520
Christian Heimesc3f30c42008-02-22 16:37:40 +0000521 def test_product(self):
522 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000523 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000524 (['ab'], [('a',), ('b',)]), # one iterable
525 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
526 ([range(0), range(2), range(3)], []), # first iterable with zero length
527 ([range(2), range(0), range(3)], []), # middle iterable with zero length
528 ([range(2), range(3), range(0)], []), # last iterable with zero length
529 ]:
530 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000531 for r in range(4):
532 self.assertEqual(list(product(*(args*r))),
533 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000534 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
535 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000536
537 def product1(*args, **kwds):
538 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
539 n = len(pools)
540 if n == 0:
541 yield ()
542 return
543 if any(len(pool) == 0 for pool in pools):
544 return
545 indices = [0] * n
546 yield tuple(pool[i] for pool, i in zip(pools, indices))
547 while 1:
548 for i in reversed(range(n)): # right to left
549 if indices[i] == len(pools[i]) - 1:
550 continue
551 indices[i] += 1
552 for j in range(i+1, n):
553 indices[j] = 0
554 yield tuple(pool[i] for pool, i in zip(pools, indices))
555 break
556 else:
557 return
558
559 def product2(*args, **kwds):
560 'Pure python version used in docs'
561 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
562 result = [[]]
563 for pool in pools:
564 result = [x+[y] for x in result for y in pool]
565 for prod in result:
566 yield tuple(prod)
567
Christian Heimesc3f30c42008-02-22 16:37:40 +0000568 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
569 set('abcdefg'), range(11), tuple(range(13))]
570 for i in range(100):
571 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000572 expected_len = prod(map(len, args))
573 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000574 self.assertEqual(list(product(*args)), list(product1(*args)))
575 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000576 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000577 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000578
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000579 # Test implementation detail: tuple re-use
580 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
581 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000582
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000583 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000584 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000585 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000586 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000587 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000588 self.assertEqual(list(repeat('a', 0)), [])
589 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000590 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000591 self.assertRaises(TypeError, repeat, None, 3, 4)
592 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000593 r = repeat(1+0j)
594 self.assertEqual(repr(r), 'repeat((1+0j))')
595 r = repeat(1+0j, 5)
596 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
597 list(r)
598 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000599
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000600 def test_map(self):
601 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000602 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000603 def tupleize(*args):
604 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000605 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000606 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000607 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000608 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000609 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000610 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000611 self.assertEqual(list(map(operator.pow, [])), [])
612 self.assertRaises(TypeError, map)
613 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
614 self.assertRaises(TypeError, map, operator.neg)
615 self.assertRaises(TypeError, next, map(10, range(5)))
616 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
617 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000618
619 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000620 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
621 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000622 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000623 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000624 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000625 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
626 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000627 self.assertRaises(TypeError, starmap)
628 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000629 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
630 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
631 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000632
633 def test_islice(self):
634 for args in [ # islice(args) should agree with range(args)
635 (10, 20, 3),
636 (10, 3, 20),
637 (10, 20),
638 (10, 3),
639 (20,)
640 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000641 self.assertEqual(list(islice(range(100), *args)),
642 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000643
644 for args, tgtargs in [ # Stop when seqn is exhausted
645 ((10, 110, 3), ((10, 100, 3))),
646 ((10, 110), ((10, 100))),
647 ((110,), (100,))
648 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000649 self.assertEqual(list(islice(range(100), *args)),
650 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000651
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000652 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000653 self.assertEqual(list(islice(range(10), None)), list(range(10)))
654 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
655 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
656 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
657 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000658
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000659 # Test number of items consumed SF #1171417
660 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000661 self.assertEqual(list(islice(it, 3)), list(range(3)))
662 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000663
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000664 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000665 self.assertRaises(TypeError, islice, range(10))
666 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
667 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
668 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
669 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
670 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
671 self.assertRaises(ValueError, islice, range(10), 'a')
672 self.assertRaises(ValueError, islice, range(10), 'a', 1)
673 self.assertRaises(ValueError, islice, range(10), 1, 'a')
674 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
675 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000676 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000677
678 def test_takewhile(self):
679 data = [1, 3, 5, 20, 2, 4, 6, 8]
680 underten = lambda x: x<10
681 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000682 self.assertEqual(list(takewhile(underten, [])), [])
683 self.assertRaises(TypeError, takewhile)
684 self.assertRaises(TypeError, takewhile, operator.pow)
685 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000686 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
687 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000688 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
689 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000690 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000691
692 def test_dropwhile(self):
693 data = [1, 3, 5, 20, 2, 4, 6, 8]
694 underten = lambda x: x<10
695 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000696 self.assertEqual(list(dropwhile(underten, [])), [])
697 self.assertRaises(TypeError, dropwhile)
698 self.assertRaises(TypeError, dropwhile, operator.pow)
699 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000700 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
701 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000702
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000703 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000704 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000705 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000706 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000707 yield i
708
709 a, b = tee([]) # test empty iterator
710 self.assertEqual(list(a), [])
711 self.assertEqual(list(b), [])
712
713 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000714 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000715
716 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000717 self.assertEqual(list(a), list(range(n)))
718 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000719
720 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000721 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000722 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000723 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000724 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000725
726 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000727 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000728 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000729 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000730 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000731
Guido van Rossum805365e2007-05-07 22:24:25 +0000732 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000733 order = [0]*n + [1]*n
734 random.shuffle(order)
735 lists = ([], [])
736 its = tee(irange(n))
737 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000738 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000739 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000740 self.assertEqual(lists[0], list(range(n)))
741 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000742
Raymond Hettingerad983e72003-11-12 14:32:26 +0000743 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000744 self.assertRaises(TypeError, tee)
745 self.assertRaises(TypeError, tee, 3)
746 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000747 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000748
Raymond Hettingerad983e72003-11-12 14:32:26 +0000749 # tee object should be instantiable
750 a, b = tee('abc')
751 c = type(a)('def')
752 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000753
Raymond Hettingerad983e72003-11-12 14:32:26 +0000754 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000755 a, b, c = tee(range(2000), 3)
756 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000757 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000758 self.assertEqual(list(b), list(range(2000)))
759 self.assertEqual([next(c), next(c)], list(range(2)))
760 self.assertEqual(list(a), list(range(100,2000)))
761 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000762
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000763 # test values of n
764 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000765 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000766 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000767 result = tee('abc', n)
768 self.assertEqual(type(result), tuple)
769 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000770 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000771
Raymond Hettingerad983e72003-11-12 14:32:26 +0000772 # tee pass-through to copyable iterator
773 a, b = tee('abc')
774 c, d = tee(a)
775 self.assert_(a is c)
776
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000777 # test tee_new
778 t1, t2 = tee('abc')
779 tnew = type(t1)
780 self.assertRaises(TypeError, tnew)
781 self.assertRaises(TypeError, tnew, 10)
782 t3 = tnew(t1)
783 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000784
Raymond Hettingera9f60922004-10-17 16:40:14 +0000785 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000786 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000787 p = proxy(a)
788 self.assertEqual(getattr(p, '__class__'), type(b))
789 del a
790 self.assertRaises(ReferenceError, getattr, p, '__class__')
791
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000792 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000793 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000794
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000795 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000796 self.assertRaises(StopIteration, next, f([]))
797 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000798
Georg Brandla18af4e2007-04-21 15:47:16 +0000799 self.assertRaises(StopIteration, next, islice([], None))
800 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000801
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000802 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000803 self.assertRaises(StopIteration, next, p)
804 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000805 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000806 self.assertRaises(StopIteration, next, p)
807 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000808
Georg Brandla18af4e2007-04-21 15:47:16 +0000809 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000810
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000811 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000812 self.assertRaises(StopIteration, next, f(lambda x:x, []))
813 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000814
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000815class TestExamples(unittest.TestCase):
816
817 def test_chain(self):
818 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
819
820 def test_chain_from_iterable(self):
821 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
822
823 def test_combinations(self):
824 self.assertEqual(list(combinations('ABCD', 2)),
825 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
826 self.assertEqual(list(combinations(range(4), 3)),
827 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
828
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000829 def test_combinations_with_replacement(self):
830 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
831 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
832
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000833 def test_compress(self):
834 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
835
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000836 def test_count(self):
837 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
838
839 def test_cycle(self):
840 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
841
842 def test_dropwhile(self):
843 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
844
845 def test_groupby(self):
846 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
847 list('ABCDAB'))
848 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
849 [list('AAAA'), list('BBB'), list('CC'), list('D')])
850
851 def test_filter(self):
852 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
853
854 def test_filterfalse(self):
855 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
856
857 def test_map(self):
858 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
859
860 def test_islice(self):
861 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
862 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
863 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
864 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
865
866 def test_zip(self):
867 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
868
869 def test_zip_longest(self):
870 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
871 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
872
873 def test_permutations(self):
874 self.assertEqual(list(permutations('ABCD', 2)),
875 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
876 self.assertEqual(list(permutations(range(3))),
877 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
878
879 def test_product(self):
880 self.assertEqual(list(product('ABCD', 'xy')),
881 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
882 self.assertEqual(list(product(range(2), repeat=3)),
883 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
884 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
885
886 def test_repeat(self):
887 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
888
889 def test_stapmap(self):
890 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
891 [32, 9, 1000])
892
893 def test_takewhile(self):
894 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
895
896
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000897class TestGC(unittest.TestCase):
898
899 def makecycle(self, iterator, container):
900 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000901 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000902 del container, iterator
903
904 def test_chain(self):
905 a = []
906 self.makecycle(chain(a), a)
907
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000908 def test_chain_from_iterable(self):
909 a = []
910 self.makecycle(chain.from_iterable([a]), a)
911
912 def test_combinations(self):
913 a = []
914 self.makecycle(combinations([1,2,a,3], 3), a)
915
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000916 def test_combinations_with_replacement(self):
917 a = []
918 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
919
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000920 def test_compress(self):
921 a = []
922 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
923
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000924 def test_cycle(self):
925 a = []
926 self.makecycle(cycle([a]*2), a)
927
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000928 def test_dropwhile(self):
929 a = []
930 self.makecycle(dropwhile(bool, [0, a, a]), a)
931
932 def test_groupby(self):
933 a = []
934 self.makecycle(groupby([a]*2, lambda x:x), a)
935
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000936 def test_issue2246(self):
937 # Issue 2246 -- the _grouper iterator was not included in GC
938 n = 10
939 keyfunc = lambda x: x
940 for i, j in groupby(range(n), key=keyfunc):
941 keyfunc.__dict__.setdefault('x',[]).append(j)
942
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000943 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000944 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000945 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000946
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000947 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000948 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000949 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000950
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000951 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000952 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000953 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000954
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000955 def test_zip_longest(self):
956 a = []
957 self.makecycle(zip_longest([a]*2, [a]*3), a)
958 b = [a, None]
959 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
960
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000961 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000962 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000963 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000964
965 def test_islice(self):
966 a = []
967 self.makecycle(islice([a]*2, None), a)
968
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000969 def test_permutations(self):
970 a = []
971 self.makecycle(permutations([1,2,a,3], 3), a)
972
973 def test_product(self):
974 a = []
975 self.makecycle(product([1,2,a,3], repeat=3), a)
976
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000977 def test_repeat(self):
978 a = []
979 self.makecycle(repeat(a), a)
980
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000981 def test_starmap(self):
982 a = []
983 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
984
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000985 def test_takewhile(self):
986 a = []
987 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
988
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000989def R(seqn):
990 'Regular generator'
991 for i in seqn:
992 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000993
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000994class G:
995 'Sequence using __getitem__'
996 def __init__(self, seqn):
997 self.seqn = seqn
998 def __getitem__(self, i):
999 return self.seqn[i]
1000
1001class I:
1002 'Sequence using iterator protocol'
1003 def __init__(self, seqn):
1004 self.seqn = seqn
1005 self.i = 0
1006 def __iter__(self):
1007 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001008 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001009 if self.i >= len(self.seqn): raise StopIteration
1010 v = self.seqn[self.i]
1011 self.i += 1
1012 return v
1013
1014class Ig:
1015 'Sequence using iterator protocol defined with a generator'
1016 def __init__(self, seqn):
1017 self.seqn = seqn
1018 self.i = 0
1019 def __iter__(self):
1020 for val in self.seqn:
1021 yield val
1022
1023class X:
1024 'Missing __getitem__ and __iter__'
1025 def __init__(self, seqn):
1026 self.seqn = seqn
1027 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001028 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001029 if self.i >= len(self.seqn): raise StopIteration
1030 v = self.seqn[self.i]
1031 self.i += 1
1032 return v
1033
1034class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001035 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001036 def __init__(self, seqn):
1037 self.seqn = seqn
1038 self.i = 0
1039 def __iter__(self):
1040 return self
1041
1042class E:
1043 'Test propagation of exceptions'
1044 def __init__(self, seqn):
1045 self.seqn = seqn
1046 self.i = 0
1047 def __iter__(self):
1048 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001049 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001050 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001051
1052class S:
1053 'Test immediate stop'
1054 def __init__(self, seqn):
1055 pass
1056 def __iter__(self):
1057 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001058 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001059 raise StopIteration
1060
1061def L(seqn):
1062 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001063 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001064
1065
1066class TestVariousIteratorArgs(unittest.TestCase):
1067
1068 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001069 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001070 for g in (G, I, Ig, S, L, R):
1071 self.assertEqual(list(chain(g(s))), list(g(s)))
1072 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001073 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001074 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001075 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1076
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001077 def test_compress(self):
1078 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1079 n = len(s)
1080 for g in (G, I, Ig, S, L, R):
1081 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1082 self.assertRaises(TypeError, compress, X(s), repeat(1))
1083 self.assertRaises(TypeError, compress, N(s), repeat(1))
1084 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1085
Christian Heimesc3f30c42008-02-22 16:37:40 +00001086 def test_product(self):
1087 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1088 self.assertRaises(TypeError, product, X(s))
1089 self.assertRaises(TypeError, product, N(s))
1090 self.assertRaises(ZeroDivisionError, product, E(s))
1091
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001092 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001093 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001094 for g in (G, I, Ig, S, L, R):
1095 tgtlen = len(s) * 3
1096 expected = list(g(s))*3
1097 actual = list(islice(cycle(g(s)), tgtlen))
1098 self.assertEqual(actual, expected)
1099 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001100 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001101 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1102
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001103 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001104 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001105 for g in (G, I, Ig, S, L, R):
1106 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1107 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001108 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001109 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1110
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001111 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001112 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001113 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001114 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001115 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001116 self.assertRaises(TypeError, filter, isEven, X(s))
1117 self.assertRaises(TypeError, filter, isEven, N(s))
1118 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001119
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001120 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001121 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001122 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001123 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001124 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001125 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1126 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1127 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001128
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001129 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001130 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001131 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001132 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1133 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1134 self.assertRaises(TypeError, zip, X(s))
1135 self.assertRaises(TypeError, zip, N(s))
1136 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001137
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001138 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001139 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001140 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001141 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1142 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1143 self.assertRaises(TypeError, zip_longest, X(s))
1144 self.assertRaises(TypeError, zip_longest, N(s))
1145 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001146
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001147 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001148 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001149 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001150 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001151 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001152 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001153 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001154 self.assertRaises(TypeError, map, onearg, X(s))
1155 self.assertRaises(TypeError, map, onearg, N(s))
1156 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001157
1158 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001159 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001160 for g in (G, I, Ig, S, L, R):
1161 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1162 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001163 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001164 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1165
1166 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001167 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001168 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001169 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001170 self.assertEqual(list(starmap(operator.pow, g(ss))),
1171 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001172 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001173 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001174 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1175
1176 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001177 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001178 for g in (G, I, Ig, S, L, R):
1179 tgt = []
1180 for elem in g(s):
1181 if not isEven(elem): break
1182 tgt.append(elem)
1183 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1184 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001185 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001186 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1187
1188 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001189 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001190 for g in (G, I, Ig, S, L, R):
1191 tgt = []
1192 for elem in g(s):
1193 if not tgt and isOdd(elem): continue
1194 tgt.append(elem)
1195 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1196 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001197 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001198 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1199
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001200 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001201 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001202 for g in (G, I, Ig, S, L, R):
1203 it1, it2 = tee(g(s))
1204 self.assertEqual(list(it1), list(g(s)))
1205 self.assertEqual(list(it2), list(g(s)))
1206 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001207 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001208 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1209
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001210class LengthTransparency(unittest.TestCase):
1211
1212 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001213 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001214 self.assertEqual(len(repeat(None, 50)), 50)
1215 self.assertRaises(TypeError, len, repeat(None))
1216
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001217class RegressionTests(unittest.TestCase):
1218
1219 def test_sf_793826(self):
1220 # Fix Armin Rigo's successful efforts to wreak havoc
1221
1222 def mutatingtuple(tuple1, f, tuple2):
1223 # this builds a tuple t which is a copy of tuple1,
1224 # then calls f(t), then mutates t to be equal to tuple2
1225 # (needs len(tuple1) == len(tuple2)).
1226 def g(value, first=[1]):
1227 if first:
1228 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001229 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001230 return value
1231 items = list(tuple2)
1232 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001233 gen = map(g, items)
1234 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001235 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001236
1237 def f(t):
1238 global T
1239 T = t
1240 first[:] = list(T)
1241
1242 first = []
1243 mutatingtuple((1,2,3), f, (4,5,6))
1244 second = list(T)
1245 self.assertEqual(first, second)
1246
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001247
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001248 def test_sf_950057(self):
1249 # Make sure that chain() and cycle() catch exceptions immediately
1250 # rather than when shifting between input sources
1251
1252 def gen1():
1253 hist.append(0)
1254 yield 1
1255 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001256 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001257 hist.append(2)
1258
1259 def gen2(x):
1260 hist.append(3)
1261 yield 2
1262 hist.append(4)
1263 if x:
1264 raise StopIteration
1265
1266 hist = []
1267 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1268 self.assertEqual(hist, [0,1])
1269
1270 hist = []
1271 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1272 self.assertEqual(hist, [0,1])
1273
1274 hist = []
1275 self.assertRaises(AssertionError, list, cycle(gen1()))
1276 self.assertEqual(hist, [0,1])
1277
Thomas Woutersb2137042007-02-01 18:02:27 +00001278class SubclassWithKwargsTest(unittest.TestCase):
1279 def test_keywords_in_subclass(self):
1280 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001281 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001282 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001283 class Subclass(cls):
1284 def __init__(self, newarg=None, *args):
1285 cls.__init__(self, *args)
1286 try:
1287 Subclass(newarg=1)
1288 except TypeError as err:
1289 # we expect type errors because of wrong argument count
1290 self.failIf("does not take keyword arguments" in err.args[0])
1291
1292
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001293libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001294
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001295
1296>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001297>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001298... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001299...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001300Check 1200 is for $120.15
1301Check 1201 is for $764.05
1302Check 1202 is for $823.14
1303
1304>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001305>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001306... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001307...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000013081
13098
131027
1311
1312>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001313>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001314... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001315...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001316Alex
1317Laura
1318Martin
1319Walter
1320Samuele
1321
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001322>>> from operator import itemgetter
1323>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001324>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001325>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001326... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001327...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000013281 ['a', 'c', 'e']
13292 ['b', 'd', 'f']
13303 ['g']
1331
Raymond Hettinger734fb572004-01-20 20:04:40 +00001332# Find runs of consecutive numbers using groupby. The key to the solution
1333# is differencing with a range so that consecutive numbers all appear in
1334# same group.
1335>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001336>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001337... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001338...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001339[1]
1340[4, 5, 6]
1341[10]
1342[15, 16, 17, 18]
1343[22]
1344[25, 26, 27, 28]
1345
Georg Brandl3dbca812008-07-23 16:10:53 +00001346>>> def take(n, iterable):
1347... "Return first n items of the iterable as a list"
1348... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001349
Georg Brandl3dbca812008-07-23 16:10:53 +00001350>>> def enumerate(iterable, start=0):
1351... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001352
Georg Brandl3dbca812008-07-23 16:10:53 +00001353>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001354... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001355... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001356
1357>>> def nth(iterable, n):
Georg Brandl3dbca812008-07-23 16:10:53 +00001358... "Returns the nth item or empty list"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001359... return list(islice(iterable, n, n+1))
1360
Georg Brandl3dbca812008-07-23 16:10:53 +00001361>>> def quantify(iterable, pred=bool):
1362... "Count how many times the predicate is true"
1363... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001364
Georg Brandl3dbca812008-07-23 16:10:53 +00001365>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001366... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001367... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001368
Georg Brandl3dbca812008-07-23 16:10:53 +00001369>>> def ncycles(iterable, n):
1370... "Returns the seqeuence elements n times"
1371... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001372
1373>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001374... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001375
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001376>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001377... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001378
1379>>> def repeatfunc(func, times=None, *args):
1380... "Repeat calls to func with specified arguments."
1381... " Example: repeatfunc(random.random)"
1382... if times is None:
1383... return starmap(func, repeat(args))
1384... else:
1385... return starmap(func, repeat(args, times))
1386
Raymond Hettingerd591f662003-10-26 15:34:50 +00001387>>> def pairwise(iterable):
1388... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1389... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001390... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001391... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001392... except StopIteration:
1393... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001394... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001395
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001396>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001397... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001398... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001399... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001400
1401>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001402... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001403... # Recipe credited to George Sakkis
1404... pending = len(iterables)
1405... nexts = cycle(iter(it).__next__ for it in iterables)
1406... while pending:
1407... try:
1408... for next in nexts:
1409... yield next()
1410... except StopIteration:
1411... pending -= 1
1412... nexts = cycle(islice(nexts, pending))
1413
1414>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001415... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1416... s = list(iterable)
1417... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001418
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001419>>> def unique_everseen(iterable, key=None):
1420... "List unique elements, preserving order. Remember all elements ever seen."
1421... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1422... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1423... seen = set()
1424... seen_add = seen.add
1425... if key is None:
1426... for element in iterable:
1427... if element not in seen:
1428... seen_add(element)
1429... yield element
1430... else:
1431... for element in iterable:
1432... k = key(element)
1433... if k not in seen:
1434... seen_add(k)
1435... yield element
1436
1437>>> def unique_justseen(iterable, key=None):
1438... "List unique elements, preserving order. Remember only the element just seen."
1439... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1440... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1441... return map(next, map(itemgetter(1), groupby(iterable, key)))
1442
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001443This is not part of the examples but it tests to make sure the definitions
1444perform as purported.
1445
Raymond Hettingera098b332003-09-08 23:58:40 +00001446>>> take(10, count())
1447[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1448
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001449>>> list(enumerate('abc'))
1450[(0, 'a'), (1, 'b'), (2, 'c')]
1451
1452>>> list(islice(tabulate(lambda x: 2*x), 4))
1453[0, 2, 4, 6]
1454
1455>>> nth('abcde', 3)
1456['d']
1457
Guido van Rossum805365e2007-05-07 22:24:25 +00001458>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000145950
1460
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001461>>> a = [[1, 2, 3], [4, 5, 6]]
1462>>> flatten(a)
1463[1, 2, 3, 4, 5, 6]
1464
1465>>> list(repeatfunc(pow, 5, 2, 3))
1466[8, 8, 8, 8, 8]
1467
1468>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001469>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001470[0, 0, 0, 0, 0]
1471
Raymond Hettingerd591f662003-10-26 15:34:50 +00001472>>> list(pairwise('abcd'))
1473[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001474
Raymond Hettingerd591f662003-10-26 15:34:50 +00001475>>> list(pairwise([]))
1476[]
1477
1478>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001479[]
1480
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001481>>> list(islice(padnone('abc'), 0, 6))
1482['a', 'b', 'c', None, None, None]
1483
1484>>> list(ncycles('abc', 3))
1485['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1486
1487>>> dotproduct([1,2,3], [4,5,6])
148832
1489
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001490>>> list(grouper(3, 'abcdefg', 'x'))
1491[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1492
1493>>> list(roundrobin('abc', 'd', 'ef'))
1494['a', 'd', 'e', 'b', 'f', 'c']
1495
Raymond Hettingerace67332009-01-26 02:23:50 +00001496>>> list(powerset([1,2,3]))
1497[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001498
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001499>>> list(unique_everseen('AAAABBBCCDAABBB'))
1500['A', 'B', 'C', 'D']
1501
1502>>> list(unique_everseen('ABBCcAD', str.lower))
1503['A', 'B', 'C', 'D']
1504
1505>>> list(unique_justseen('AAAABBBCCDAABBB'))
1506['A', 'B', 'C', 'D', 'A', 'B']
1507
1508>>> list(unique_justseen('ABBCcAD', str.lower))
1509['A', 'B', 'C', 'A', 'D']
1510
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001511"""
1512
1513__test__ = {'libreftest' : libreftest}
1514
1515def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001516 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001517 RegressionTests, LengthTransparency,
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001518 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001519 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001520
1521 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001522 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001523 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001524 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001525 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001526 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001527 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001528 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001529 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001530
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001531 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001532 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001533
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001534if __name__ == "__main__":
1535 test_main(verbose=True)