blob: 01409b3a0f11c58c584eb40c44cc9cfd5f1da748 [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
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000281 for n in range(6):
282 s = 'ABCDEFG'[:n]
283 for r in range(8):
284 prod = list(product(s, repeat=r))
285 cwr = list(combinations_with_replacement(s, r))
286 perm = list(permutations(s, r))
287 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000288
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000289 # Check size
290 self.assertEquals(len(prod), n**r)
291 self.assertEquals(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
292 self.assertEquals(len(perm), 0 if r>n else fact(n) / fact(n-r))
293 self.assertEquals(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
294
295 # Check lexicographic order without repeated tuples
296 self.assertEquals(prod, sorted(set(prod)))
297 self.assertEquals(cwr, sorted(set(cwr)))
298 self.assertEquals(perm, sorted(set(perm)))
299 self.assertEquals(comb, sorted(set(comb)))
300
301 # Check interrelationships
302 self.assertEquals(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
303 self.assertEquals(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
304 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
305 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
306 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
307 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
308 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000309
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000310 def test_compress(self):
311 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
312 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
313 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
314 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
315 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
316 n = 10000
317 data = chain.from_iterable(repeat(range(6), n))
318 selectors = chain.from_iterable(repeat((0, 1)))
319 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
320 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
321 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
322 self.assertRaises(TypeError, compress, range(6)) # too few args
323 self.assertRaises(TypeError, compress, range(6), None) # too many args
324
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000325 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000326 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
327 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
328 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000329 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
330 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000331 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000332 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000333 self.assertEqual(list(islice(count(maxsize-5), 10)),
334 list(range(maxsize-5, maxsize+5)))
335 self.assertEqual(list(islice(count(-maxsize-5), 10)),
336 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000337 c = count(3)
338 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000339 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000340 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341 c = count(-9)
342 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000343 next(c)
344 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000345 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 +0000346 # Test repr (ignoring the L in longs)
347 r1 = repr(count(i)).replace('L', '')
348 r2 = 'count(%r)'.__mod__(i).replace('L', '')
349 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000350
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000351 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000352 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000353 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000354 self.assertRaises(TypeError, cycle)
355 self.assertRaises(TypeError, cycle, 5)
356 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000357
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000358 def test_groupby(self):
359 # Check whether it accepts arguments correctly
360 self.assertEqual([], list(groupby([])))
361 self.assertEqual([], list(groupby([], key=id)))
362 self.assertRaises(TypeError, list, groupby('abc', []))
363 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000364 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000365
366 # Check normal input
367 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
368 (2,15,22), (3,16,23), (3,17,23)]
369 dup = []
370 for k, g in groupby(s, lambda r:r[0]):
371 for elem in g:
372 self.assertEqual(k, elem[0])
373 dup.append(elem)
374 self.assertEqual(s, dup)
375
376 # Check nested case
377 dup = []
378 for k, g in groupby(s, lambda r:r[0]):
379 for ik, ig in groupby(g, lambda r:r[2]):
380 for elem in ig:
381 self.assertEqual(k, elem[0])
382 self.assertEqual(ik, elem[2])
383 dup.append(elem)
384 self.assertEqual(s, dup)
385
386 # Check case where inner iterator is not used
387 keys = [k for k, g in groupby(s, lambda r:r[0])]
388 expectedkeys = set([r[0] for r in s])
389 self.assertEqual(set(keys), expectedkeys)
390 self.assertEqual(len(keys), len(expectedkeys))
391
392 # Exercise pipes and filters style
393 s = 'abracadabra'
394 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000395 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000396 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
397 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000398 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000399 self.assertEqual(r, ['a', 'b', 'r'])
400 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000401 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000402 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
403 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000404 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000405 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
406
Georg Brandla18af4e2007-04-21 15:47:16 +0000407 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000408 class ExpectedError(Exception):
409 pass
410 def delayed_raise(n=0):
411 for i in range(n):
412 yield 'yo'
413 raise ExpectedError
414 def gulp(iterable, keyp=None, func=list):
415 return [func(g) for k, g in groupby(iterable, keyp)]
416
Georg Brandla18af4e2007-04-21 15:47:16 +0000417 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000418 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000419 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000420 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
421
422 # __cmp__ failure
423 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000424 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000425 raise ExpectedError
426 s = [DummyCmp(), DummyCmp(), None]
427
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000428 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000429 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000430 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000431 self.assertRaises(ExpectedError, gulp, s)
432
433 # keyfunc failure
434 def keyfunc(obj):
435 if keyfunc.skip > 0:
436 keyfunc.skip -= 1
437 return obj
438 else:
439 raise ExpectedError
440
441 # keyfunc failure on outer object
442 keyfunc.skip = 0
443 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
444 keyfunc.skip = 1
445 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
446
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000447 def test_filter(self):
448 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
449 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
450 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
451 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
452 self.assertRaises(TypeError, filter)
453 self.assertRaises(TypeError, filter, lambda x:x)
454 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
455 self.assertRaises(TypeError, filter, isEven, 3)
456 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000457
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000458 def test_filterfalse(self):
459 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
460 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
461 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
462 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
463 self.assertRaises(TypeError, filterfalse)
464 self.assertRaises(TypeError, filterfalse, lambda x:x)
465 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
466 self.assertRaises(TypeError, filterfalse, isEven, 3)
467 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000468
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000469 def test_zip(self):
470 # XXX This is rather silly now that builtin zip() calls zip()...
471 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000472 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000473 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
474 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
475 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
476 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
477 self.assertEqual(list(zip()), lzip())
478 self.assertRaises(TypeError, zip, 3)
479 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000480 # Check tuple re-use (implementation detail)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000481 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000482 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000483 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000484 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000485 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000486 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000487 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000488 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000489
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000490 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000491 for args in [
492 ['abc', range(6)],
493 [range(6), 'abc'],
494 [range(1000), range(2000,2100), range(3000,3050)],
495 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
496 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
497 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000498 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
499 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000500 self.assertEqual(list(zip_longest(*args)), target)
501 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000502 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 +0000503 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000504
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000505 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 +0000506
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000507 self.assertEqual(list(zip_longest()), list(zip()))
508 self.assertEqual(list(zip_longest([])), list(zip([])))
509 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000510
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000511 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000512 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000513 self.assertRaises(TypeError, zip_longest, 3)
514 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000515
516 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000517 "zip_longest('abc', fv=1)",
518 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000519 ]:
520 try:
521 eval(stmt, globals(), locals())
522 except TypeError:
523 pass
524 else:
525 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526
Thomas Wouterscf297e42007-02-23 15:07:44 +0000527 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000528 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000529 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000530 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000531 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000532 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000533 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000534 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000535 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
536
Christian Heimesc3f30c42008-02-22 16:37:40 +0000537 def test_product(self):
538 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000539 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000540 (['ab'], [('a',), ('b',)]), # one iterable
541 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
542 ([range(0), range(2), range(3)], []), # first iterable with zero length
543 ([range(2), range(0), range(3)], []), # middle iterable with zero length
544 ([range(2), range(3), range(0)], []), # last iterable with zero length
545 ]:
546 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000547 for r in range(4):
548 self.assertEqual(list(product(*(args*r))),
549 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000550 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
551 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000552
553 def product1(*args, **kwds):
554 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
555 n = len(pools)
556 if n == 0:
557 yield ()
558 return
559 if any(len(pool) == 0 for pool in pools):
560 return
561 indices = [0] * n
562 yield tuple(pool[i] for pool, i in zip(pools, indices))
563 while 1:
564 for i in reversed(range(n)): # right to left
565 if indices[i] == len(pools[i]) - 1:
566 continue
567 indices[i] += 1
568 for j in range(i+1, n):
569 indices[j] = 0
570 yield tuple(pool[i] for pool, i in zip(pools, indices))
571 break
572 else:
573 return
574
575 def product2(*args, **kwds):
576 'Pure python version used in docs'
577 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
578 result = [[]]
579 for pool in pools:
580 result = [x+[y] for x in result for y in pool]
581 for prod in result:
582 yield tuple(prod)
583
Christian Heimesc3f30c42008-02-22 16:37:40 +0000584 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
585 set('abcdefg'), range(11), tuple(range(13))]
586 for i in range(100):
587 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000588 expected_len = prod(map(len, args))
589 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000590 self.assertEqual(list(product(*args)), list(product1(*args)))
591 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000592 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000593 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000594
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000595 # Test implementation detail: tuple re-use
596 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
597 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000598
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000599 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000600 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000601 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000602 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000603 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000604 self.assertEqual(list(repeat('a', 0)), [])
605 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000606 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000607 self.assertRaises(TypeError, repeat, None, 3, 4)
608 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000609 r = repeat(1+0j)
610 self.assertEqual(repr(r), 'repeat((1+0j))')
611 r = repeat(1+0j, 5)
612 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
613 list(r)
614 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000615
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000616 def test_map(self):
617 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000618 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000619 def tupleize(*args):
620 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000621 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000622 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000623 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000624 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000625 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000626 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000627 self.assertEqual(list(map(operator.pow, [])), [])
628 self.assertRaises(TypeError, map)
629 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
630 self.assertRaises(TypeError, map, operator.neg)
631 self.assertRaises(TypeError, next, map(10, range(5)))
632 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
633 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000634
635 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000636 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
637 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000638 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000639 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000640 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000641 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
642 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000643 self.assertRaises(TypeError, starmap)
644 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000645 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
646 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
647 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000648
649 def test_islice(self):
650 for args in [ # islice(args) should agree with range(args)
651 (10, 20, 3),
652 (10, 3, 20),
653 (10, 20),
654 (10, 3),
655 (20,)
656 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000657 self.assertEqual(list(islice(range(100), *args)),
658 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000659
660 for args, tgtargs in [ # Stop when seqn is exhausted
661 ((10, 110, 3), ((10, 100, 3))),
662 ((10, 110), ((10, 100))),
663 ((110,), (100,))
664 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000665 self.assertEqual(list(islice(range(100), *args)),
666 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000667
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000668 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000669 self.assertEqual(list(islice(range(10), None)), list(range(10)))
670 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
671 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
672 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
673 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000674
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000675 # Test number of items consumed SF #1171417
676 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000677 self.assertEqual(list(islice(it, 3)), list(range(3)))
678 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000679
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000680 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000681 self.assertRaises(TypeError, islice, range(10))
682 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
683 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
684 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
685 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
686 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
687 self.assertRaises(ValueError, islice, range(10), 'a')
688 self.assertRaises(ValueError, islice, range(10), 'a', 1)
689 self.assertRaises(ValueError, islice, range(10), 1, 'a')
690 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
691 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000692 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000693
694 def test_takewhile(self):
695 data = [1, 3, 5, 20, 2, 4, 6, 8]
696 underten = lambda x: x<10
697 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000698 self.assertEqual(list(takewhile(underten, [])), [])
699 self.assertRaises(TypeError, takewhile)
700 self.assertRaises(TypeError, takewhile, operator.pow)
701 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000702 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
703 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000704 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
705 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000706 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000707
708 def test_dropwhile(self):
709 data = [1, 3, 5, 20, 2, 4, 6, 8]
710 underten = lambda x: x<10
711 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000712 self.assertEqual(list(dropwhile(underten, [])), [])
713 self.assertRaises(TypeError, dropwhile)
714 self.assertRaises(TypeError, dropwhile, operator.pow)
715 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000716 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
717 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000718
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000719 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000720 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000721 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000722 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000723 yield i
724
725 a, b = tee([]) # test empty iterator
726 self.assertEqual(list(a), [])
727 self.assertEqual(list(b), [])
728
729 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000730 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000731
732 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000733 self.assertEqual(list(a), list(range(n)))
734 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000735
736 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000737 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000738 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000739 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000740 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000741
742 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000743 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000744 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000745 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000746 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000747
Guido van Rossum805365e2007-05-07 22:24:25 +0000748 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000749 order = [0]*n + [1]*n
750 random.shuffle(order)
751 lists = ([], [])
752 its = tee(irange(n))
753 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000754 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000755 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000756 self.assertEqual(lists[0], list(range(n)))
757 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000758
Raymond Hettingerad983e72003-11-12 14:32:26 +0000759 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000760 self.assertRaises(TypeError, tee)
761 self.assertRaises(TypeError, tee, 3)
762 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000763 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000764
Raymond Hettingerad983e72003-11-12 14:32:26 +0000765 # tee object should be instantiable
766 a, b = tee('abc')
767 c = type(a)('def')
768 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000769
Raymond Hettingerad983e72003-11-12 14:32:26 +0000770 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000771 a, b, c = tee(range(2000), 3)
772 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000773 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000774 self.assertEqual(list(b), list(range(2000)))
775 self.assertEqual([next(c), next(c)], list(range(2)))
776 self.assertEqual(list(a), list(range(100,2000)))
777 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000778
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000779 # test values of n
780 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000781 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000782 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000783 result = tee('abc', n)
784 self.assertEqual(type(result), tuple)
785 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000786 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000787
Raymond Hettingerad983e72003-11-12 14:32:26 +0000788 # tee pass-through to copyable iterator
789 a, b = tee('abc')
790 c, d = tee(a)
791 self.assert_(a is c)
792
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000793 # test tee_new
794 t1, t2 = tee('abc')
795 tnew = type(t1)
796 self.assertRaises(TypeError, tnew)
797 self.assertRaises(TypeError, tnew, 10)
798 t3 = tnew(t1)
799 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000800
Raymond Hettingera9f60922004-10-17 16:40:14 +0000801 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000802 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000803 p = proxy(a)
804 self.assertEqual(getattr(p, '__class__'), type(b))
805 del a
806 self.assertRaises(ReferenceError, getattr, p, '__class__')
807
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000808 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000809 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000810
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000811 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000812 self.assertRaises(StopIteration, next, f([]))
813 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000814
Georg Brandla18af4e2007-04-21 15:47:16 +0000815 self.assertRaises(StopIteration, next, islice([], None))
816 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000817
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000818 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000819 self.assertRaises(StopIteration, next, p)
820 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000821 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000822 self.assertRaises(StopIteration, next, p)
823 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000824
Georg Brandla18af4e2007-04-21 15:47:16 +0000825 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000826
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000827 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000828 self.assertRaises(StopIteration, next, f(lambda x:x, []))
829 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000830
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000831class TestExamples(unittest.TestCase):
832
833 def test_chain(self):
834 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
835
836 def test_chain_from_iterable(self):
837 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
838
839 def test_combinations(self):
840 self.assertEqual(list(combinations('ABCD', 2)),
841 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
842 self.assertEqual(list(combinations(range(4), 3)),
843 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
844
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000845 def test_combinations_with_replacement(self):
846 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
847 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
848
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000849 def test_compress(self):
850 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
851
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000852 def test_count(self):
853 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
854
855 def test_cycle(self):
856 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
857
858 def test_dropwhile(self):
859 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
860
861 def test_groupby(self):
862 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
863 list('ABCDAB'))
864 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
865 [list('AAAA'), list('BBB'), list('CC'), list('D')])
866
867 def test_filter(self):
868 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
869
870 def test_filterfalse(self):
871 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
872
873 def test_map(self):
874 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
875
876 def test_islice(self):
877 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
878 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
879 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
880 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
881
882 def test_zip(self):
883 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
884
885 def test_zip_longest(self):
886 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
887 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
888
889 def test_permutations(self):
890 self.assertEqual(list(permutations('ABCD', 2)),
891 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
892 self.assertEqual(list(permutations(range(3))),
893 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
894
895 def test_product(self):
896 self.assertEqual(list(product('ABCD', 'xy')),
897 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
898 self.assertEqual(list(product(range(2), repeat=3)),
899 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
900 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
901
902 def test_repeat(self):
903 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
904
905 def test_stapmap(self):
906 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
907 [32, 9, 1000])
908
909 def test_takewhile(self):
910 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
911
912
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000913class TestGC(unittest.TestCase):
914
915 def makecycle(self, iterator, container):
916 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000917 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000918 del container, iterator
919
920 def test_chain(self):
921 a = []
922 self.makecycle(chain(a), a)
923
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000924 def test_chain_from_iterable(self):
925 a = []
926 self.makecycle(chain.from_iterable([a]), a)
927
928 def test_combinations(self):
929 a = []
930 self.makecycle(combinations([1,2,a,3], 3), a)
931
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000932 def test_combinations_with_replacement(self):
933 a = []
934 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
935
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000936 def test_compress(self):
937 a = []
938 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
939
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000940 def test_cycle(self):
941 a = []
942 self.makecycle(cycle([a]*2), a)
943
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000944 def test_dropwhile(self):
945 a = []
946 self.makecycle(dropwhile(bool, [0, a, a]), a)
947
948 def test_groupby(self):
949 a = []
950 self.makecycle(groupby([a]*2, lambda x:x), a)
951
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000952 def test_issue2246(self):
953 # Issue 2246 -- the _grouper iterator was not included in GC
954 n = 10
955 keyfunc = lambda x: x
956 for i, j in groupby(range(n), key=keyfunc):
957 keyfunc.__dict__.setdefault('x',[]).append(j)
958
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000959 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000960 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000961 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000962
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000963 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000964 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000965 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000966
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000967 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000968 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000969 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000970
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000971 def test_zip_longest(self):
972 a = []
973 self.makecycle(zip_longest([a]*2, [a]*3), a)
974 b = [a, None]
975 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
976
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000977 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000978 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000979 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000980
981 def test_islice(self):
982 a = []
983 self.makecycle(islice([a]*2, None), a)
984
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000985 def test_permutations(self):
986 a = []
987 self.makecycle(permutations([1,2,a,3], 3), a)
988
989 def test_product(self):
990 a = []
991 self.makecycle(product([1,2,a,3], repeat=3), a)
992
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000993 def test_repeat(self):
994 a = []
995 self.makecycle(repeat(a), a)
996
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000997 def test_starmap(self):
998 a = []
999 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1000
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001001 def test_takewhile(self):
1002 a = []
1003 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1004
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001005def R(seqn):
1006 'Regular generator'
1007 for i in seqn:
1008 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001009
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001010class G:
1011 'Sequence using __getitem__'
1012 def __init__(self, seqn):
1013 self.seqn = seqn
1014 def __getitem__(self, i):
1015 return self.seqn[i]
1016
1017class I:
1018 'Sequence using iterator protocol'
1019 def __init__(self, seqn):
1020 self.seqn = seqn
1021 self.i = 0
1022 def __iter__(self):
1023 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001024 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001025 if self.i >= len(self.seqn): raise StopIteration
1026 v = self.seqn[self.i]
1027 self.i += 1
1028 return v
1029
1030class Ig:
1031 'Sequence using iterator protocol defined with a generator'
1032 def __init__(self, seqn):
1033 self.seqn = seqn
1034 self.i = 0
1035 def __iter__(self):
1036 for val in self.seqn:
1037 yield val
1038
1039class X:
1040 'Missing __getitem__ and __iter__'
1041 def __init__(self, seqn):
1042 self.seqn = seqn
1043 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001044 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001045 if self.i >= len(self.seqn): raise StopIteration
1046 v = self.seqn[self.i]
1047 self.i += 1
1048 return v
1049
1050class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001051 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001052 def __init__(self, seqn):
1053 self.seqn = seqn
1054 self.i = 0
1055 def __iter__(self):
1056 return self
1057
1058class E:
1059 'Test propagation of exceptions'
1060 def __init__(self, seqn):
1061 self.seqn = seqn
1062 self.i = 0
1063 def __iter__(self):
1064 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001065 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001066 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001067
1068class S:
1069 'Test immediate stop'
1070 def __init__(self, seqn):
1071 pass
1072 def __iter__(self):
1073 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001074 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001075 raise StopIteration
1076
1077def L(seqn):
1078 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001079 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001080
1081
1082class TestVariousIteratorArgs(unittest.TestCase):
1083
1084 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001085 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001086 for g in (G, I, Ig, S, L, R):
1087 self.assertEqual(list(chain(g(s))), list(g(s)))
1088 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001089 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001090 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001091 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1092
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001093 def test_compress(self):
1094 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1095 n = len(s)
1096 for g in (G, I, Ig, S, L, R):
1097 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1098 self.assertRaises(TypeError, compress, X(s), repeat(1))
1099 self.assertRaises(TypeError, compress, N(s), repeat(1))
1100 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1101
Christian Heimesc3f30c42008-02-22 16:37:40 +00001102 def test_product(self):
1103 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1104 self.assertRaises(TypeError, product, X(s))
1105 self.assertRaises(TypeError, product, N(s))
1106 self.assertRaises(ZeroDivisionError, product, E(s))
1107
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001108 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001109 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001110 for g in (G, I, Ig, S, L, R):
1111 tgtlen = len(s) * 3
1112 expected = list(g(s))*3
1113 actual = list(islice(cycle(g(s)), tgtlen))
1114 self.assertEqual(actual, expected)
1115 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001116 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001117 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1118
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001119 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001120 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001121 for g in (G, I, Ig, S, L, R):
1122 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1123 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001124 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001125 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1126
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001127 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001128 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001129 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001130 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001131 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001132 self.assertRaises(TypeError, filter, isEven, X(s))
1133 self.assertRaises(TypeError, filter, isEven, N(s))
1134 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001135
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001136 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001137 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001138 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001139 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001140 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001141 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1142 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1143 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001144
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001145 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001146 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001147 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001148 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1149 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1150 self.assertRaises(TypeError, zip, X(s))
1151 self.assertRaises(TypeError, zip, N(s))
1152 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001153
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001154 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001155 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001156 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001157 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1158 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1159 self.assertRaises(TypeError, zip_longest, X(s))
1160 self.assertRaises(TypeError, zip_longest, N(s))
1161 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001162
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001163 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001164 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001165 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001166 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001167 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001168 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001169 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001170 self.assertRaises(TypeError, map, onearg, X(s))
1171 self.assertRaises(TypeError, map, onearg, N(s))
1172 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001173
1174 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001175 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001176 for g in (G, I, Ig, S, L, R):
1177 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1178 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001179 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001180 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1181
1182 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001183 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001184 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001185 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001186 self.assertEqual(list(starmap(operator.pow, g(ss))),
1187 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001188 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001189 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001190 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1191
1192 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001193 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001194 for g in (G, I, Ig, S, L, R):
1195 tgt = []
1196 for elem in g(s):
1197 if not isEven(elem): break
1198 tgt.append(elem)
1199 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1200 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001201 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001202 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1203
1204 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001205 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001206 for g in (G, I, Ig, S, L, R):
1207 tgt = []
1208 for elem in g(s):
1209 if not tgt and isOdd(elem): continue
1210 tgt.append(elem)
1211 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1212 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001213 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001214 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1215
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001216 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001217 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001218 for g in (G, I, Ig, S, L, R):
1219 it1, it2 = tee(g(s))
1220 self.assertEqual(list(it1), list(g(s)))
1221 self.assertEqual(list(it2), list(g(s)))
1222 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001223 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001224 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1225
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001226class LengthTransparency(unittest.TestCase):
1227
1228 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001229 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001230 self.assertEqual(len(repeat(None, 50)), 50)
1231 self.assertRaises(TypeError, len, repeat(None))
1232
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001233class RegressionTests(unittest.TestCase):
1234
1235 def test_sf_793826(self):
1236 # Fix Armin Rigo's successful efforts to wreak havoc
1237
1238 def mutatingtuple(tuple1, f, tuple2):
1239 # this builds a tuple t which is a copy of tuple1,
1240 # then calls f(t), then mutates t to be equal to tuple2
1241 # (needs len(tuple1) == len(tuple2)).
1242 def g(value, first=[1]):
1243 if first:
1244 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001245 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001246 return value
1247 items = list(tuple2)
1248 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001249 gen = map(g, items)
1250 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001251 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001252
1253 def f(t):
1254 global T
1255 T = t
1256 first[:] = list(T)
1257
1258 first = []
1259 mutatingtuple((1,2,3), f, (4,5,6))
1260 second = list(T)
1261 self.assertEqual(first, second)
1262
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001263
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001264 def test_sf_950057(self):
1265 # Make sure that chain() and cycle() catch exceptions immediately
1266 # rather than when shifting between input sources
1267
1268 def gen1():
1269 hist.append(0)
1270 yield 1
1271 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001272 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001273 hist.append(2)
1274
1275 def gen2(x):
1276 hist.append(3)
1277 yield 2
1278 hist.append(4)
1279 if x:
1280 raise StopIteration
1281
1282 hist = []
1283 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1284 self.assertEqual(hist, [0,1])
1285
1286 hist = []
1287 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1288 self.assertEqual(hist, [0,1])
1289
1290 hist = []
1291 self.assertRaises(AssertionError, list, cycle(gen1()))
1292 self.assertEqual(hist, [0,1])
1293
Thomas Woutersb2137042007-02-01 18:02:27 +00001294class SubclassWithKwargsTest(unittest.TestCase):
1295 def test_keywords_in_subclass(self):
1296 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001297 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001298 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001299 class Subclass(cls):
1300 def __init__(self, newarg=None, *args):
1301 cls.__init__(self, *args)
1302 try:
1303 Subclass(newarg=1)
1304 except TypeError as err:
1305 # we expect type errors because of wrong argument count
1306 self.failIf("does not take keyword arguments" in err.args[0])
1307
1308
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001309libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001310
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001311
1312>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001313>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001314... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001315...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001316Check 1200 is for $120.15
1317Check 1201 is for $764.05
1318Check 1202 is for $823.14
1319
1320>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001321>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001322... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001323...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000013241
13258
132627
1327
1328>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001329>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001330... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001331...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001332Alex
1333Laura
1334Martin
1335Walter
1336Samuele
1337
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001338>>> from operator import itemgetter
1339>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001340>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001341>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001342... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001343...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000013441 ['a', 'c', 'e']
13452 ['b', 'd', 'f']
13463 ['g']
1347
Raymond Hettinger734fb572004-01-20 20:04:40 +00001348# Find runs of consecutive numbers using groupby. The key to the solution
1349# is differencing with a range so that consecutive numbers all appear in
1350# same group.
1351>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001352>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001353... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001354...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001355[1]
1356[4, 5, 6]
1357[10]
1358[15, 16, 17, 18]
1359[22]
1360[25, 26, 27, 28]
1361
Georg Brandl3dbca812008-07-23 16:10:53 +00001362>>> def take(n, iterable):
1363... "Return first n items of the iterable as a list"
1364... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001365
Georg Brandl3dbca812008-07-23 16:10:53 +00001366>>> def enumerate(iterable, start=0):
1367... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001368
Georg Brandl3dbca812008-07-23 16:10:53 +00001369>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001370... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001371... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001372
1373>>> def nth(iterable, n):
Georg Brandl3dbca812008-07-23 16:10:53 +00001374... "Returns the nth item or empty list"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001375... return list(islice(iterable, n, n+1))
1376
Georg Brandl3dbca812008-07-23 16:10:53 +00001377>>> def quantify(iterable, pred=bool):
1378... "Count how many times the predicate is true"
1379... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001380
Georg Brandl3dbca812008-07-23 16:10:53 +00001381>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001382... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001383... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001384
Georg Brandl3dbca812008-07-23 16:10:53 +00001385>>> def ncycles(iterable, n):
1386... "Returns the seqeuence elements n times"
1387... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001388
1389>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001390... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001391
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001392>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001393... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001394
1395>>> def repeatfunc(func, times=None, *args):
1396... "Repeat calls to func with specified arguments."
1397... " Example: repeatfunc(random.random)"
1398... if times is None:
1399... return starmap(func, repeat(args))
1400... else:
1401... return starmap(func, repeat(args, times))
1402
Raymond Hettingerd591f662003-10-26 15:34:50 +00001403>>> def pairwise(iterable):
1404... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1405... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001406... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001407... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001408... except StopIteration:
1409... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001410... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001411
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001412>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001413... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001414... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001415... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001416
1417>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001418... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001419... # Recipe credited to George Sakkis
1420... pending = len(iterables)
1421... nexts = cycle(iter(it).__next__ for it in iterables)
1422... while pending:
1423... try:
1424... for next in nexts:
1425... yield next()
1426... except StopIteration:
1427... pending -= 1
1428... nexts = cycle(islice(nexts, pending))
1429
1430>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001431... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1432... s = list(iterable)
1433... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001434
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001435>>> def unique_everseen(iterable, key=None):
1436... "List unique elements, preserving order. Remember all elements ever seen."
1437... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1438... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1439... seen = set()
1440... seen_add = seen.add
1441... if key is None:
1442... for element in iterable:
1443... if element not in seen:
1444... seen_add(element)
1445... yield element
1446... else:
1447... for element in iterable:
1448... k = key(element)
1449... if k not in seen:
1450... seen_add(k)
1451... yield element
1452
1453>>> def unique_justseen(iterable, key=None):
1454... "List unique elements, preserving order. Remember only the element just seen."
1455... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1456... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1457... return map(next, map(itemgetter(1), groupby(iterable, key)))
1458
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001459This is not part of the examples but it tests to make sure the definitions
1460perform as purported.
1461
Raymond Hettingera098b332003-09-08 23:58:40 +00001462>>> take(10, count())
1463[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1464
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001465>>> list(enumerate('abc'))
1466[(0, 'a'), (1, 'b'), (2, 'c')]
1467
1468>>> list(islice(tabulate(lambda x: 2*x), 4))
1469[0, 2, 4, 6]
1470
1471>>> nth('abcde', 3)
1472['d']
1473
Guido van Rossum805365e2007-05-07 22:24:25 +00001474>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000147550
1476
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001477>>> a = [[1, 2, 3], [4, 5, 6]]
1478>>> flatten(a)
1479[1, 2, 3, 4, 5, 6]
1480
1481>>> list(repeatfunc(pow, 5, 2, 3))
1482[8, 8, 8, 8, 8]
1483
1484>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001485>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001486[0, 0, 0, 0, 0]
1487
Raymond Hettingerd591f662003-10-26 15:34:50 +00001488>>> list(pairwise('abcd'))
1489[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001490
Raymond Hettingerd591f662003-10-26 15:34:50 +00001491>>> list(pairwise([]))
1492[]
1493
1494>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001495[]
1496
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001497>>> list(islice(padnone('abc'), 0, 6))
1498['a', 'b', 'c', None, None, None]
1499
1500>>> list(ncycles('abc', 3))
1501['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1502
1503>>> dotproduct([1,2,3], [4,5,6])
150432
1505
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001506>>> list(grouper(3, 'abcdefg', 'x'))
1507[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1508
1509>>> list(roundrobin('abc', 'd', 'ef'))
1510['a', 'd', 'e', 'b', 'f', 'c']
1511
Raymond Hettingerace67332009-01-26 02:23:50 +00001512>>> list(powerset([1,2,3]))
1513[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001514
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001515>>> list(unique_everseen('AAAABBBCCDAABBB'))
1516['A', 'B', 'C', 'D']
1517
1518>>> list(unique_everseen('ABBCcAD', str.lower))
1519['A', 'B', 'C', 'D']
1520
1521>>> list(unique_justseen('AAAABBBCCDAABBB'))
1522['A', 'B', 'C', 'D', 'A', 'B']
1523
1524>>> list(unique_justseen('ABBCcAD', str.lower))
1525['A', 'B', 'C', 'A', 'D']
1526
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001527"""
1528
1529__test__ = {'libreftest' : libreftest}
1530
1531def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001532 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001533 RegressionTests, LengthTransparency,
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001534 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001535 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001536
1537 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001538 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001539 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001540 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001541 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001542 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001543 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001544 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001545 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001546
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001547 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001548 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001549
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001550if __name__ == "__main__":
1551 test_main(verbose=True)