blob: e054303dedbe389aec214314e701dfe92e68e5e0 [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 *
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02004import weakref
Raymond Hettinger8a882a72009-02-12 12:08:18 +00005from decimal import Decimal
Raymond Hettingerde09acf2009-02-12 12:53:53 +00006from fractions import Fraction
Raymond Hettinger2012f172003-02-07 05:32:58 +00007import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00009import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +000010import copy
11import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000012from functools import reduce
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +020013import sys
14import struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +000015maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000016minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000017
Guido van Rossum801f0d72006-08-24 19:48:10 +000018def lzip(*args):
19 return list(zip(*args))
20
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000021def onearg(x):
22 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000023 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000024
25def errfunc(*args):
26 'Test function that raises an error'
27 raise ValueError
28
29def gen3():
30 'Non-restartable source sequence'
31 for i in (0, 1, 2):
32 yield i
33
34def isEven(x):
35 'Test predicate'
36 return x%2==0
37
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000038def isOdd(x):
39 'Test predicate'
40 return x%2==1
41
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000042def tupleize(*args):
43 return args
44
45def irange(n):
46 for i in range(n):
47 yield i
48
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049class StopNow:
50 'Class emulating an empty iterable.'
51 def __iter__(self):
52 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000053 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055
Raymond Hettinger02420702003-06-29 20:36:23 +000056def take(n, seq):
57 'Convenience function for partially consuming a long of infinite iterable'
58 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000059
Christian Heimes78644762008-03-04 23:39:23 +000060def prod(iterable):
61 return reduce(operator.mul, iterable, 1)
62
Christian Heimes380f7f22008-02-28 11:19:05 +000063def fact(n):
64 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000065 return prod(range(1, n+1))
66
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000067# root level methods for pickling ability
68def testR(r):
69 return r[0]
70
71def testR2(r):
72 return r[2]
73
74def underten(x):
75 return x<10
76
Serhiy Storchakabad12572014-12-15 14:03:42 +020077picklecopiers = [lambda s, proto=proto: pickle.loads(pickle.dumps(s, proto))
78 for proto in range(pickle.HIGHEST_PROTOCOL + 1)]
79
Raymond Hettinger96ef8112003-02-01 00:10:11 +000080class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000081
Serhiy Storchakabad12572014-12-15 14:03:42 +020082 def pickletest(self, protocol, it, stop=4, take=1, compare=None):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000083 """Test that an iterator is the same after pickling, also when part-consumed"""
84 def expand(it, i=0):
85 # Recursively expand iterables, within sensible bounds
86 if i > 10:
87 raise RuntimeError("infinite recursion encountered")
88 if isinstance(it, str):
89 return it
90 try:
91 l = list(islice(it, stop))
92 except TypeError:
93 return it # can't expand it
94 return [expand(e, i+1) for e in l]
95
96 # Test the initial copy against the original
Serhiy Storchakabad12572014-12-15 14:03:42 +020097 dump = pickle.dumps(it, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000098 i2 = pickle.loads(dump)
99 self.assertEqual(type(it), type(i2))
100 a, b = expand(it), expand(i2)
101 self.assertEqual(a, b)
102 if compare:
103 c = expand(compare)
104 self.assertEqual(a, c)
105
106 # Take from the copy, and create another copy and compare them.
107 i3 = pickle.loads(dump)
108 took = 0
109 try:
110 for i in range(take):
111 next(i3)
112 took += 1
113 except StopIteration:
114 pass #in case there is less data than 'take'
Serhiy Storchakabad12572014-12-15 14:03:42 +0200115 dump = pickle.dumps(i3, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000116 i4 = pickle.loads(dump)
117 a, b = expand(i3), expand(i4)
118 self.assertEqual(a, b)
119 if compare:
120 c = expand(compare[took:])
121 self.assertEqual(a, c);
122
Raymond Hettinger482ba772010-12-01 22:48:00 +0000123 def test_accumulate(self):
124 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000125 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
126 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
127 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000128 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000129 self.assertEqual(
130 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000131 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000132 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000133 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000134 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700135 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000136 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000137 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000138 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
139
Raymond Hettinger5d446132011-03-27 18:52:10 -0700140 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
141 self.assertEqual(list(accumulate(s, min)),
142 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
143 self.assertEqual(list(accumulate(s, max)),
144 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
145 self.assertEqual(list(accumulate(s, operator.mul)),
146 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
147 with self.assertRaises(TypeError):
148 list(accumulate(s, chr)) # unary-operation
Serhiy Storchakabad12572014-12-15 14:03:42 +0200149 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
150 self.pickletest(proto, accumulate(range(10))) # test pickling
Raymond Hettinger5d446132011-03-27 18:52:10 -0700151
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000152 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000153
154 def chain2(*iterables):
155 'Pure python version in the docs'
156 for it in iterables:
157 for element in it:
158 yield element
159
160 for c in (chain, chain2):
161 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
162 self.assertEqual(list(c('abc')), list('abc'))
163 self.assertEqual(list(c('')), [])
164 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
165 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000166
167 def test_chain_from_iterable(self):
168 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
169 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
170 self.assertEqual(list(chain.from_iterable([''])), [])
171 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
172 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000173
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000174 def test_chain_reducible(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200175 for oper in [copy.deepcopy] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000176 it = chain('abc', 'def')
177 self.assertEqual(list(oper(it)), list('abcdef'))
178 self.assertEqual(next(it), 'a')
179 self.assertEqual(list(oper(it)), list('bcdef'))
180
181 self.assertEqual(list(oper(chain(''))), [])
182 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
183 self.assertRaises(TypeError, list, oper(chain(2, 3)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200184 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
185 self.pickletest(proto, chain('abc', 'def'), compare=list('abcdef'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000186
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300187 def test_chain_setstate(self):
188 self.assertRaises(TypeError, chain().__setstate__, ())
189 self.assertRaises(TypeError, chain().__setstate__, [])
190 self.assertRaises(TypeError, chain().__setstate__, 0)
191 self.assertRaises(TypeError, chain().__setstate__, ([],))
192 self.assertRaises(TypeError, chain().__setstate__, (iter([]), []))
193 it = chain()
194 it.__setstate__((iter(['abc', 'def']),))
195 self.assertEqual(list(it), ['a', 'b', 'c', 'd', 'e', 'f'])
196 it = chain()
197 it.__setstate__((iter(['abc', 'def']), iter(['ghi'])))
198 self.assertEqual(list(it), ['ghi', 'a', 'b', 'c', 'd', 'e', 'f'])
199
Christian Heimes380f7f22008-02-28 11:19:05 +0000200 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000201 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000202 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000203 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000204 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000205
Serhiy Storchakabad12572014-12-15 14:03:42 +0200206 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000207 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
208
209 self.assertEqual(list(op(combinations('ABCD', 2))),
210 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
211 testIntermediate = combinations('ABCD', 2)
212 next(testIntermediate)
213 self.assertEqual(list(op(testIntermediate)),
214 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
215
216 self.assertEqual(list(op(combinations(range(4), 3))),
217 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
218 testIntermediate = combinations(range(4), 3)
219 next(testIntermediate)
220 self.assertEqual(list(op(testIntermediate)),
221 [(0,1,3), (0,2,3), (1,2,3)])
222
Christian Heimes78644762008-03-04 23:39:23 +0000223
224 def combinations1(iterable, r):
225 'Pure python version shown in the docs'
226 pool = tuple(iterable)
227 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000228 if r > n:
229 return
Christian Heimes78644762008-03-04 23:39:23 +0000230 indices = list(range(r))
231 yield tuple(pool[i] for i in indices)
232 while 1:
233 for i in reversed(range(r)):
234 if indices[i] != i + n - r:
235 break
236 else:
237 return
238 indices[i] += 1
239 for j in range(i+1, r):
240 indices[j] = indices[j-1] + 1
241 yield tuple(pool[i] for i in indices)
242
243 def combinations2(iterable, r):
244 'Pure python version shown in the docs'
245 pool = tuple(iterable)
246 n = len(pool)
247 for indices in permutations(range(n), r):
248 if sorted(indices) == list(indices):
249 yield tuple(pool[i] for i in indices)
250
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000251 def combinations3(iterable, r):
252 'Pure python version from cwr()'
253 pool = tuple(iterable)
254 n = len(pool)
255 for indices in combinations_with_replacement(range(n), r):
256 if len(set(indices)) == r:
257 yield tuple(pool[i] for i in indices)
258
Christian Heimes78644762008-03-04 23:39:23 +0000259 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000260 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000261 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000262 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000263 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 +0000264 self.assertEqual(len(result), len(set(result))) # no repeats
265 self.assertEqual(result, sorted(result)) # lexicographic order
266 for c in result:
267 self.assertEqual(len(c), r) # r-length combinations
268 self.assertEqual(len(set(c)), r) # no duplicate elements
269 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000270 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000271 self.assertEqual(list(c),
272 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000273 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000274 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000275 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000276
Serhiy Storchakabad12572014-12-15 14:03:42 +0200277 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
278 self.pickletest(proto, combinations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000279
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500280 @support.bigaddrspacetest
281 def test_combinations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200282 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500283 combinations("AA", 2**29)
284
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000285 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700286 @support.impl_detail("tuple reuse is specific to CPython")
287 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000288 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
289 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
290
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000291 def test_combinations_with_replacement(self):
292 cwr = combinations_with_replacement
293 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
294 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
295 self.assertRaises(TypeError, cwr, None) # pool is not iterable
296 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000297
Serhiy Storchakabad12572014-12-15 14:03:42 +0200298 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000299 self.assertEqual(list(op(cwr('ABC', 2))),
300 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
301 testIntermediate = cwr('ABC', 2)
302 next(testIntermediate)
303 self.assertEqual(list(op(testIntermediate)),
304 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
305
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000306
307 def cwr1(iterable, r):
308 'Pure python version shown in the docs'
309 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
310 pool = tuple(iterable)
311 n = len(pool)
312 if not n and r:
313 return
314 indices = [0] * r
315 yield tuple(pool[i] for i in indices)
316 while 1:
317 for i in reversed(range(r)):
318 if indices[i] != n - 1:
319 break
320 else:
321 return
322 indices[i:] = [indices[i] + 1] * (r - i)
323 yield tuple(pool[i] for i in indices)
324
325 def cwr2(iterable, r):
326 'Pure python version shown in the docs'
327 pool = tuple(iterable)
328 n = len(pool)
329 for indices in product(range(n), repeat=r):
330 if sorted(indices) == list(indices):
331 yield tuple(pool[i] for i in indices)
332
333 def numcombs(n, r):
334 if not n:
335 return 0 if r else 1
336 return fact(n+r-1) / fact(r)/ fact(n-1)
337
338 for n in range(7):
339 values = [5*x-12 for x in range(n)]
340 for r in range(n+2):
341 result = list(cwr(values, r))
342
343 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
344 self.assertEqual(len(result), len(set(result))) # no repeats
345 self.assertEqual(result, sorted(result)) # lexicographic order
346
347 regular_combs = list(combinations(values, r)) # compare to combs without replacement
348 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000349 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000350 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000351 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000352
353 for c in result:
354 self.assertEqual(len(c), r) # r-length combinations
355 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
356 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
357 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000358 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000359 self.assertEqual(noruns,
360 [e for e in values if e in c]) # comb is a subsequence of the input iterable
361 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
362 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
363
Serhiy Storchakabad12572014-12-15 14:03:42 +0200364 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
365 self.pickletest(proto, cwr(values,r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000366
Benjamin Peterson6f082292015-02-01 21:10:47 -0500367 @support.bigaddrspacetest
368 def test_combinations_with_replacement_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200369 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson6f082292015-02-01 21:10:47 -0500370 combinations_with_replacement("AA", 2**30)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000371
Benjamin Peterson6f082292015-02-01 21:10:47 -0500372 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700373 @support.impl_detail("tuple reuse is specific to CPython")
374 def test_combinations_with_replacement_tuple_reuse(self):
375 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000376 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
377 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
378
Christian Heimes78644762008-03-04 23:39:23 +0000379 def test_permutations(self):
380 self.assertRaises(TypeError, permutations) # too few arguments
381 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000382 self.assertRaises(TypeError, permutations, None) # pool is not iterable
383 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000384 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000385 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000386 self.assertEqual(list(permutations(range(3), 2)),
387 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
388
389 def permutations1(iterable, r=None):
390 'Pure python version shown in the docs'
391 pool = tuple(iterable)
392 n = len(pool)
393 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000394 if r > n:
395 return
Christian Heimes78644762008-03-04 23:39:23 +0000396 indices = list(range(n))
397 cycles = list(range(n-r+1, n+1))[::-1]
398 yield tuple(pool[i] for i in indices[:r])
399 while n:
400 for i in reversed(range(r)):
401 cycles[i] -= 1
402 if cycles[i] == 0:
403 indices[i:] = indices[i+1:] + indices[i:i+1]
404 cycles[i] = n - i
405 else:
406 j = cycles[i]
407 indices[i], indices[-j] = indices[-j], indices[i]
408 yield tuple(pool[i] for i in indices[:r])
409 break
410 else:
411 return
412
413 def permutations2(iterable, r=None):
414 'Pure python version shown in the docs'
415 pool = tuple(iterable)
416 n = len(pool)
417 r = n if r is None else r
418 for indices in product(range(n), repeat=r):
419 if len(set(indices)) == r:
420 yield tuple(pool[i] for i in indices)
421
422 for n in range(7):
423 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000424 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000425 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000426 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 +0000427 self.assertEqual(len(result), len(set(result))) # no repeats
428 self.assertEqual(result, sorted(result)) # lexicographic order
429 for p in result:
430 self.assertEqual(len(p), r) # r-length permutations
431 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000432 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000433 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000434 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000435 if r == n:
436 self.assertEqual(result, list(permutations(values, None))) # test r as None
437 self.assertEqual(result, list(permutations(values))) # test default r
438
Serhiy Storchakabad12572014-12-15 14:03:42 +0200439 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
440 self.pickletest(proto, permutations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000441
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500442 @support.bigaddrspacetest
443 def test_permutations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200444 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500445 permutations("A", 2**30)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500446
Zachary Waredca807b2014-04-24 13:22:05 -0500447 @support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynore151d212011-07-17 16:21:30 -0700448 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000449 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000450 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000451
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000452 def test_combinatorics(self):
453 # Test relationships between product(), permutations(),
454 # combinations() and combinations_with_replacement().
455
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000456 for n in range(6):
457 s = 'ABCDEFG'[:n]
458 for r in range(8):
459 prod = list(product(s, repeat=r))
460 cwr = list(combinations_with_replacement(s, r))
461 perm = list(permutations(s, r))
462 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000463
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000464 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000465 self.assertEqual(len(prod), n**r)
466 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
467 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
468 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000469
470 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000471 self.assertEqual(prod, sorted(set(prod)))
472 self.assertEqual(cwr, sorted(set(cwr)))
473 self.assertEqual(perm, sorted(set(perm)))
474 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000475
476 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000477 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
478 self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000479 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
480 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
481 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
482 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
483 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000484
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000485 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000486 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000487 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
488 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
489 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
490 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
491 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
492 n = 10000
493 data = chain.from_iterable(repeat(range(6), n))
494 selectors = chain.from_iterable(repeat((0, 1)))
495 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
496 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
497 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
498 self.assertRaises(TypeError, compress, range(6)) # too few args
499 self.assertRaises(TypeError, compress, range(6), None) # too many args
500
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000501 # check copy, deepcopy, pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +0200502 for op in [lambda a:copy.copy(a), lambda a:copy.deepcopy(a)] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000503 for data, selectors, result1, result2 in [
504 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
505 ('ABCDEF', [0,0,0,0,0,0], '', ''),
506 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
507 ('ABCDEF', [1,0,1], 'AC', 'C'),
508 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
509 ]:
510
511 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
512 self.assertEqual(list(op(compress(data, selectors))), list(result1))
513 testIntermediate = compress(data, selectors)
514 if result1:
515 next(testIntermediate)
516 self.assertEqual(list(op(testIntermediate)), list(result2))
517
518
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000519 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000520 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
521 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
522 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000523 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
524 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000525 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000526 self.assertRaises(TypeError, count, 'a')
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300527 self.assertEqual(take(10, count(maxsize-5)),
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000528 list(range(maxsize-5, maxsize+5)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300529 self.assertEqual(take(10, count(-maxsize-5)),
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000530 list(range(-maxsize-5, -maxsize+5)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300531 self.assertEqual(take(3, count(3.25)), [3.25, 4.25, 5.25])
532 self.assertEqual(take(3, count(3.25-4j)), [3.25-4j, 4.25-4j, 5.25-4j])
533 self.assertEqual(take(3, count(Decimal('1.1'))),
534 [Decimal('1.1'), Decimal('2.1'), Decimal('3.1')])
535 self.assertEqual(take(3, count(Fraction(2, 3))),
536 [Fraction(2, 3), Fraction(5, 3), Fraction(8, 3)])
537 BIGINT = 1<<1000
538 self.assertEqual(take(3, count(BIGINT)), [BIGINT, BIGINT+1, BIGINT+2])
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000539 c = count(3)
540 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000541 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000542 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000543 c = count(-9)
544 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000545 next(c)
546 self.assertEqual(next(c), -8)
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300547 self.assertEqual(repr(count(10.25)), 'count(10.25)')
548 self.assertEqual(repr(count(10.0)), 'count(10.0)')
549 self.assertEqual(type(next(count(10.0))), float)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000550 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300551 # Test repr
552 r1 = repr(count(i))
553 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000554 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000555
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000556 # check copy, deepcopy, pickle
557 for value in -3, 3, maxsize-5, maxsize+5:
558 c = count(value)
559 self.assertEqual(next(copy.copy(c)), value)
560 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200561 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
562 self.pickletest(proto, count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000563
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000564 #check proper internal error handling for large "step' sizes
565 count(1, maxsize+5); sys.exc_info()
566
Raymond Hettinger30729212009-02-12 06:28:27 +0000567 def test_count_with_stride(self):
568 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000569 self.assertEqual(lzip('abc',count(start=2,step=3)),
570 [('a', 2), ('b', 5), ('c', 8)])
571 self.assertEqual(lzip('abc',count(step=-1)),
572 [('a', 0), ('b', -1), ('c', -2)])
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300573 self.assertRaises(TypeError, count, 'a', 'b')
Raymond Hettinger30729212009-02-12 06:28:27 +0000574 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
575 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000576 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000577 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
578 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300579 self.assertEqual(take(3, count(10, maxsize+5)),
580 list(range(10, 10+3*(maxsize+5), maxsize+5)))
581 self.assertEqual(take(3, count(2, 1.25)), [2, 3.25, 4.5])
Raymond Hettinger30729212009-02-12 06:28:27 +0000582 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000583 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
584 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000585 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
586 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300587 BIGINT = 1<<1000
588 self.assertEqual(take(3, count(step=BIGINT)), [0, BIGINT, 2*BIGINT])
Raymond Hettinger30729212009-02-12 06:28:27 +0000589 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
590 c = count(3, 5)
591 self.assertEqual(repr(c), 'count(3, 5)')
592 next(c)
593 self.assertEqual(repr(c), 'count(8, 5)')
594 c = count(-9, 0)
595 self.assertEqual(repr(c), 'count(-9, 0)')
596 next(c)
597 self.assertEqual(repr(c), 'count(-9, 0)')
598 c = count(-9, -3)
599 self.assertEqual(repr(c), 'count(-9, -3)')
600 next(c)
601 self.assertEqual(repr(c), 'count(-12, -3)')
602 self.assertEqual(repr(c), 'count(-12, -3)')
603 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
604 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
605 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
Serhiy Storchaka8ddcf3a2016-09-10 09:49:24 +0300606 self.assertEqual(repr(count(10, 1.00)), 'count(10, 1.0)')
607 c = count(10, 1.0)
608 self.assertEqual(type(next(c)), int)
609 self.assertEqual(type(next(c)), float)
Raymond Hettinger30729212009-02-12 06:28:27 +0000610 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
611 for j in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 1, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300612 # Test repr
613 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000614 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300615 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000616 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300617 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000618 self.assertEqual(r1, r2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200619 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
620 self.pickletest(proto, count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000621
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000622 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000623 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000624 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000625 self.assertRaises(TypeError, cycle)
626 self.assertRaises(TypeError, cycle, 5)
627 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000628
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000629 # check copy, deepcopy, pickle
630 c = cycle('abc')
631 self.assertEqual(next(c), 'a')
632 #simple copy currently not supported, because __reduce__ returns
633 #an internal iterator
634 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
635 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200636 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
637 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
638 list('bcabcabcab'))
639 next(c)
640 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
641 list('cabcabcabc'))
642 next(c)
643 next(c)
644 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
645 self.pickletest(proto, cycle('abc'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000646
Serhiy Storchaka85c3f262016-10-02 08:34:53 +0300647 def test_cycle_setstate(self):
648 self.assertRaises(TypeError, cycle('').__setstate__, ())
649 self.assertRaises(TypeError, cycle('').__setstate__, [])
650 self.assertRaises(TypeError, cycle('').__setstate__, 0)
651 self.assertRaises(TypeError, cycle('').__setstate__, ([],))
652 self.assertRaises(TypeError, cycle('').__setstate__, ((), 0))
653 it = cycle('abc')
654 it.__setstate__((['de', 'fg'], 0))
655 self.assertEqual(list(islice(it, 15)),
656 ['a', 'b', 'c', 'de', 'fg',
657 'a', 'b', 'c', 'de', 'fg',
658 'a', 'b', 'c', 'de', 'fg'])
659 it = cycle('abc')
660 it.__setstate__((['de', 'fg'], 1))
661 self.assertEqual(list(islice(it, 15)),
662 ['a', 'b', 'c', 'de', 'fg',
663 'de', 'fg', 'de', 'fg', 'de',
664 'fg', 'de', 'fg', 'de', 'fg'])
665
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000666 def test_groupby(self):
667 # Check whether it accepts arguments correctly
668 self.assertEqual([], list(groupby([])))
669 self.assertEqual([], list(groupby([], key=id)))
670 self.assertRaises(TypeError, list, groupby('abc', []))
671 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000672 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000673
674 # Check normal input
675 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
676 (2,15,22), (3,16,23), (3,17,23)]
677 dup = []
678 for k, g in groupby(s, lambda r:r[0]):
679 for elem in g:
680 self.assertEqual(k, elem[0])
681 dup.append(elem)
682 self.assertEqual(s, dup)
683
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000684 # Check normal pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200685 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
686 dup = []
687 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
688 for elem in g:
689 self.assertEqual(k, elem[0])
690 dup.append(elem)
691 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000692
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000693 # Check nested case
694 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000695 for k, g in groupby(s, testR):
696 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000697 for elem in ig:
698 self.assertEqual(k, elem[0])
699 self.assertEqual(ik, elem[2])
700 dup.append(elem)
701 self.assertEqual(s, dup)
702
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000703 # Check nested and pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200704 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
705 dup = []
706 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
707 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2), proto)):
708 for elem in ig:
709 self.assertEqual(k, elem[0])
710 self.assertEqual(ik, elem[2])
711 dup.append(elem)
712 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000713
714
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000715 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000716 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000717 expectedkeys = set([r[0] for r in s])
718 self.assertEqual(set(keys), expectedkeys)
719 self.assertEqual(len(keys), len(expectedkeys))
720
721 # Exercise pipes and filters style
722 s = 'abracadabra'
723 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000724 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000725 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
726 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000727 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000728 self.assertEqual(r, ['a', 'b', 'r'])
729 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000730 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000731 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
732 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000733 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000734 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
735
Georg Brandla18af4e2007-04-21 15:47:16 +0000736 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000737 class ExpectedError(Exception):
738 pass
739 def delayed_raise(n=0):
740 for i in range(n):
741 yield 'yo'
742 raise ExpectedError
743 def gulp(iterable, keyp=None, func=list):
744 return [func(g) for k, g in groupby(iterable, keyp)]
745
Georg Brandla18af4e2007-04-21 15:47:16 +0000746 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000747 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000748 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000749 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
750
Serhiy Storchakaa60c2fe2015-03-12 21:56:08 +0200751 # __eq__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000752 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000753 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000754 raise ExpectedError
755 s = [DummyCmp(), DummyCmp(), None]
756
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000757 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000758 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000759 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000760 self.assertRaises(ExpectedError, gulp, s)
761
762 # keyfunc failure
763 def keyfunc(obj):
764 if keyfunc.skip > 0:
765 keyfunc.skip -= 1
766 return obj
767 else:
768 raise ExpectedError
769
770 # keyfunc failure on outer object
771 keyfunc.skip = 0
772 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
773 keyfunc.skip = 1
774 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
775
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000776 def test_filter(self):
777 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
778 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
779 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
780 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
781 self.assertRaises(TypeError, filter)
782 self.assertRaises(TypeError, filter, lambda x:x)
783 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
784 self.assertRaises(TypeError, filter, isEven, 3)
785 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000786
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000787 # check copy, deepcopy, pickle
788 ans = [0,2,4]
789
790 c = filter(isEven, range(6))
791 self.assertEqual(list(copy.copy(c)), ans)
792 c = filter(isEven, range(6))
793 self.assertEqual(list(copy.deepcopy(c)), ans)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200794 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
795 c = filter(isEven, range(6))
796 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans)
797 next(c)
798 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans[1:])
799 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
800 c = filter(isEven, range(6))
801 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000802
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000803 def test_filterfalse(self):
804 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
805 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
806 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
807 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
808 self.assertRaises(TypeError, filterfalse)
809 self.assertRaises(TypeError, filterfalse, lambda x:x)
810 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
811 self.assertRaises(TypeError, filterfalse, isEven, 3)
812 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200813 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
814 self.pickletest(proto, filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000815
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000816 def test_zip(self):
817 # XXX This is rather silly now that builtin zip() calls zip()...
818 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000819 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000820 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
821 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
822 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
823 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
824 self.assertEqual(list(zip()), lzip())
825 self.assertRaises(TypeError, zip, 3)
826 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000827 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000828 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000829 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000830 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700831
832 @support.impl_detail("tuple reuse is specific to CPython")
833 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000834 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000835 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000836 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000837 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000839 # check copy, deepcopy, pickle
840 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
841 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
842
843 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
844 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
845
Serhiy Storchakabad12572014-12-15 14:03:42 +0200846 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
847 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count()), proto))]
848 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000849
Serhiy Storchakabad12572014-12-15 14:03:42 +0200850 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
851 testIntermediate = zip('abc',count())
852 next(testIntermediate)
853 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate, proto))]
854 self.assertEqual(ans, [('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000855
Serhiy Storchakabad12572014-12-15 14:03:42 +0200856 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
857 self.pickletest(proto, zip('abc', count()))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000858
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000859 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000860 for args in [
861 ['abc', range(6)],
862 [range(6), 'abc'],
863 [range(1000), range(2000,2100), range(3000,3050)],
864 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
865 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
866 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000867 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
868 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000869 self.assertEqual(list(zip_longest(*args)), target)
870 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000871 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 +0000872 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000873
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000874 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 +0000875
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000876 self.assertEqual(list(zip_longest()), list(zip()))
877 self.assertEqual(list(zip_longest([])), list(zip([])))
878 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000879
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000880 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000881 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000882 self.assertRaises(TypeError, zip_longest, 3)
883 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000884
885 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000886 "zip_longest('abc', fv=1)",
887 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000888 ]:
889 try:
890 eval(stmt, globals(), locals())
891 except TypeError:
892 pass
893 else:
894 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000895
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000896 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000897 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000898 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000899 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700900
901 @support.impl_detail("tuple reuse is specific to CPython")
902 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000903 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000904 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000905 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000906 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
907
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000908 def test_zip_longest_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200909 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
910 self.pickletest(proto, zip_longest("abc", "def"))
911 self.pickletest(proto, zip_longest("abc", "defgh"))
912 self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
913 self.pickletest(proto, zip_longest("", "defgh"))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000914
Raymond Hettingerfc438512009-11-01 20:55:33 +0000915 def test_bug_7244(self):
916
917 class Repeater:
918 # this class is similar to itertools.repeat
919 def __init__(self, o, t, e):
920 self.o = o
921 self.t = int(t)
922 self.e = e
923 def __iter__(self): # its iterator is itself
924 return self
925 def __next__(self):
926 if self.t > 0:
927 self.t -= 1
928 return self.o
929 else:
930 raise self.e
931
932 # Formerly this code in would fail in debug mode
933 # with Undetected Error and Stop Iteration
934 r1 = Repeater(1, 3, StopIteration)
935 r2 = Repeater(2, 4, StopIteration)
936 def run(r1, r2):
937 result = []
938 for i, j in zip_longest(r1, r2, fillvalue=0):
939 with support.captured_output('stdout'):
940 print((i, j))
941 result.append((i, j))
942 return result
943 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
944
945 # Formerly, the RuntimeError would be lost
946 # and StopIteration would stop as expected
947 r1 = Repeater(1, 3, RuntimeError)
948 r2 = Repeater(2, 4, StopIteration)
949 it = zip_longest(r1, r2, fillvalue=0)
950 self.assertEqual(next(it), (1, 2))
951 self.assertEqual(next(it), (1, 2))
952 self.assertEqual(next(it), (1, 2))
953 self.assertRaises(RuntimeError, next, it)
954
Christian Heimesc3f30c42008-02-22 16:37:40 +0000955 def test_product(self):
956 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000957 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000958 (['ab'], [('a',), ('b',)]), # one iterable
959 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
960 ([range(0), range(2), range(3)], []), # first iterable with zero length
961 ([range(2), range(0), range(3)], []), # middle iterable with zero length
962 ([range(2), range(3), range(0)], []), # last iterable with zero length
963 ]:
964 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000965 for r in range(4):
966 self.assertEqual(list(product(*(args*r))),
967 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000968 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
969 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000970
971 def product1(*args, **kwds):
972 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
973 n = len(pools)
974 if n == 0:
975 yield ()
976 return
977 if any(len(pool) == 0 for pool in pools):
978 return
979 indices = [0] * n
980 yield tuple(pool[i] for pool, i in zip(pools, indices))
981 while 1:
982 for i in reversed(range(n)): # right to left
983 if indices[i] == len(pools[i]) - 1:
984 continue
985 indices[i] += 1
986 for j in range(i+1, n):
987 indices[j] = 0
988 yield tuple(pool[i] for pool, i in zip(pools, indices))
989 break
990 else:
991 return
992
993 def product2(*args, **kwds):
994 'Pure python version used in docs'
995 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
996 result = [[]]
997 for pool in pools:
998 result = [x+[y] for x in result for y in pool]
999 for prod in result:
1000 yield tuple(prod)
1001
Christian Heimesc3f30c42008-02-22 16:37:40 +00001002 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
1003 set('abcdefg'), range(11), tuple(range(13))]
1004 for i in range(100):
1005 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +00001006 expected_len = prod(map(len, args))
1007 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001008 self.assertEqual(list(product(*args)), list(product1(*args)))
1009 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +00001010 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +00001011 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001012
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001013 @support.bigaddrspacetest
1014 def test_product_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +02001015 with self.assertRaises((OverflowError, MemoryError)):
1016 product(*(['ab']*2**5), repeat=2**25)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001017
Alex Gaynore151d212011-07-17 16:21:30 -07001018 @support.impl_detail("tuple reuse is specific to CPython")
1019 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001020 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
1021 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001022
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001023 def test_product_pickling(self):
1024 # check copy, deepcopy, pickle
1025 for args, result in [
1026 ([], [()]), # zero iterables
1027 (['ab'], [('a',), ('b',)]), # one iterable
1028 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
1029 ([range(0), range(2), range(3)], []), # first iterable with zero length
1030 ([range(2), range(0), range(3)], []), # middle iterable with zero length
1031 ([range(2), range(3), range(0)], []), # last iterable with zero length
1032 ]:
1033 self.assertEqual(list(copy.copy(product(*args))), result)
1034 self.assertEqual(list(copy.deepcopy(product(*args))), result)
Serhiy Storchakabad12572014-12-15 14:03:42 +02001035 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1036 self.pickletest(proto, product(*args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001037
Kristján Valur Jónsson102764a2015-09-12 15:20:54 +00001038 def test_product_issue_25021(self):
1039 # test that indices are properly clamped to the length of the tuples
1040 p = product((1, 2),(3,))
1041 p.__setstate__((0, 0x1000)) # will access tuple element 1 if not clamped
1042 self.assertEqual(next(p), (2, 3))
1043 # test that empty tuple in the list will result in an immediate StopIteration
1044 p = product((1, 2), (), (3,))
1045 p.__setstate__((0, 0, 0x1000)) # will access tuple element 1 if not clamped
1046 self.assertRaises(StopIteration, next, p)
1047
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001048 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +00001049 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +00001050 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001051 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +00001052 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +00001053 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001054 self.assertEqual(list(repeat('a', 0)), [])
1055 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001056 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001057 self.assertRaises(TypeError, repeat, None, 3, 4)
1058 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001059 r = repeat(1+0j)
1060 self.assertEqual(repr(r), 'repeat((1+0j))')
1061 r = repeat(1+0j, 5)
1062 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
1063 list(r)
1064 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001065
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001066 # check copy, deepcopy, pickle
1067 c = repeat(object='a', times=10)
1068 self.assertEqual(next(c), 'a')
1069 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
1070 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001071 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1072 self.pickletest(proto, repeat(object='a', times=10))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001073
Raymond Hettinger97d35552014-06-24 21:36:58 -07001074 def test_repeat_with_negative_times(self):
1075 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
1076 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
1077 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
1078 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
1079
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001080 def test_map(self):
1081 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001082 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001083 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001084 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001085 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001086 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001087 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001088 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001089 self.assertEqual(list(map(operator.pow, [])), [])
1090 self.assertRaises(TypeError, map)
1091 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
1092 self.assertRaises(TypeError, map, operator.neg)
1093 self.assertRaises(TypeError, next, map(10, range(5)))
1094 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
1095 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001096
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001097 # check copy, deepcopy, pickle
1098 ans = [('a',0),('b',1),('c',2)]
1099
1100 c = map(tupleize, 'abc', count())
1101 self.assertEqual(list(copy.copy(c)), ans)
1102
1103 c = map(tupleize, 'abc', count())
1104 self.assertEqual(list(copy.deepcopy(c)), ans)
1105
Serhiy Storchakabad12572014-12-15 14:03:42 +02001106 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1107 c = map(tupleize, 'abc', count())
1108 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001109
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001110 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001111 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1112 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001113 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001114 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001115 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001116 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1117 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001118 self.assertRaises(TypeError, starmap)
1119 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001120 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1121 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1122 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001123
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001124 # check copy, deepcopy, pickle
1125 ans = [0**1, 1**2, 2**3]
1126
1127 c = starmap(operator.pow, zip(range(3), range(1,7)))
1128 self.assertEqual(list(copy.copy(c)), ans)
1129
1130 c = starmap(operator.pow, zip(range(3), range(1,7)))
1131 self.assertEqual(list(copy.deepcopy(c)), ans)
1132
Serhiy Storchakabad12572014-12-15 14:03:42 +02001133 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1134 c = starmap(operator.pow, zip(range(3), range(1,7)))
1135 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001136
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001137 def test_islice(self):
1138 for args in [ # islice(args) should agree with range(args)
1139 (10, 20, 3),
1140 (10, 3, 20),
1141 (10, 20),
1142 (10, 3),
1143 (20,)
1144 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001145 self.assertEqual(list(islice(range(100), *args)),
1146 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001147
1148 for args, tgtargs in [ # Stop when seqn is exhausted
1149 ((10, 110, 3), ((10, 100, 3))),
1150 ((10, 110), ((10, 100))),
1151 ((110,), (100,))
1152 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001153 self.assertEqual(list(islice(range(100), *args)),
1154 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001155
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001156 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001157 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1158 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1159 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1160 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1161 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001162
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001163 # Test number of items consumed SF #1171417
1164 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001165 self.assertEqual(list(islice(it, 3)), list(range(3)))
1166 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001167
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001168 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001169 ra = range(10)
1170 self.assertRaises(TypeError, islice, ra)
1171 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1172 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1173 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1174 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1175 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1176 self.assertRaises(ValueError, islice, ra, 'a')
1177 self.assertRaises(ValueError, islice, ra, 'a', 1)
1178 self.assertRaises(ValueError, islice, ra, 1, 'a')
1179 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1180 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001181 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001182
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001183 # Issue #10323: Less islice in a predictable state
1184 c = count()
1185 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1186 self.assertEqual(next(c), 3)
1187
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001188 # check copy, deepcopy, pickle
1189 for args in [ # islice(args) should agree with range(args)
1190 (10, 20, 3),
1191 (10, 3, 20),
1192 (10, 20),
1193 (10, 3),
1194 (20,)
1195 ]:
1196 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1197 list(range(*args)))
1198 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1199 list(range(*args)))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001200 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1201 self.pickletest(proto, islice(range(100), *args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001202
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001203 # Issue #21321: check source iterator is not referenced
1204 # from islice() after the latter has been exhausted
1205 it = (x for x in (1, 2))
1206 wr = weakref.ref(it)
1207 it = islice(it, 1)
1208 self.assertIsNotNone(wr())
1209 list(it) # exhaust the iterator
Benjamin Peterson8e163512014-08-24 18:07:28 -05001210 support.gc_collect()
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001211 self.assertIsNone(wr())
1212
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001213 def test_takewhile(self):
1214 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001215 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001216 self.assertEqual(list(takewhile(underten, [])), [])
1217 self.assertRaises(TypeError, takewhile)
1218 self.assertRaises(TypeError, takewhile, operator.pow)
1219 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001220 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1221 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001222 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1223 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001224 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001225
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001226 # check copy, deepcopy, pickle
1227 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1228 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1229 [1, 3, 5])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001230 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1231 self.pickletest(proto, takewhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001232
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001233 def test_dropwhile(self):
1234 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001235 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001236 self.assertEqual(list(dropwhile(underten, [])), [])
1237 self.assertRaises(TypeError, dropwhile)
1238 self.assertRaises(TypeError, dropwhile, operator.pow)
1239 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001240 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1241 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001242
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001243 # check copy, deepcopy, pickle
1244 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1245 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1246 [20, 2, 4, 6, 8])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001247 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1248 self.pickletest(proto, dropwhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001249
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001250 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001251 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001252
1253 a, b = tee([]) # test empty iterator
1254 self.assertEqual(list(a), [])
1255 self.assertEqual(list(b), [])
1256
1257 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001258 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001259
1260 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001261 self.assertEqual(list(a), list(range(n)))
1262 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001263
1264 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001265 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001266 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001267 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001268 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001269
1270 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001271 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001272 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001273 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001274 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001275
Guido van Rossum805365e2007-05-07 22:24:25 +00001276 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001277 order = [0]*n + [1]*n
1278 random.shuffle(order)
1279 lists = ([], [])
1280 its = tee(irange(n))
1281 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001282 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001283 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001284 self.assertEqual(lists[0], list(range(n)))
1285 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001286
Raymond Hettingerad983e72003-11-12 14:32:26 +00001287 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001288 self.assertRaises(TypeError, tee)
1289 self.assertRaises(TypeError, tee, 3)
1290 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001291 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001292
Raymond Hettingerad983e72003-11-12 14:32:26 +00001293 # tee object should be instantiable
1294 a, b = tee('abc')
1295 c = type(a)('def')
1296 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001297
Raymond Hettingerad983e72003-11-12 14:32:26 +00001298 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001299 a, b, c = tee(range(2000), 3)
1300 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001301 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001302 self.assertEqual(list(b), list(range(2000)))
1303 self.assertEqual([next(c), next(c)], list(range(2)))
1304 self.assertEqual(list(a), list(range(100,2000)))
1305 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001306
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001307 # test values of n
1308 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001309 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001310 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001311 result = tee('abc', n)
1312 self.assertEqual(type(result), tuple)
1313 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001314 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001315
Raymond Hettingerad983e72003-11-12 14:32:26 +00001316 # tee pass-through to copyable iterator
1317 a, b = tee('abc')
1318 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001319 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001320
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001321 # test tee_new
1322 t1, t2 = tee('abc')
1323 tnew = type(t1)
1324 self.assertRaises(TypeError, tnew)
1325 self.assertRaises(TypeError, tnew, 10)
1326 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001327 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001328
Raymond Hettingera9f60922004-10-17 16:40:14 +00001329 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001330 a, b = tee(range(10))
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001331 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +00001332 self.assertEqual(getattr(p, '__class__'), type(b))
1333 del a
1334 self.assertRaises(ReferenceError, getattr, p, '__class__')
1335
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001336 ans = list('abc')
1337 long_ans = list(range(10000))
1338
1339 # check copy
1340 a, b = tee('abc')
1341 self.assertEqual(list(copy.copy(a)), ans)
1342 self.assertEqual(list(copy.copy(b)), ans)
1343 a, b = tee(list(range(10000)))
1344 self.assertEqual(list(copy.copy(a)), long_ans)
1345 self.assertEqual(list(copy.copy(b)), long_ans)
1346
1347 # check partially consumed copy
1348 a, b = tee('abc')
1349 take(2, a)
1350 take(1, b)
1351 self.assertEqual(list(copy.copy(a)), ans[2:])
1352 self.assertEqual(list(copy.copy(b)), ans[1:])
1353 self.assertEqual(list(a), ans[2:])
1354 self.assertEqual(list(b), ans[1:])
1355 a, b = tee(range(10000))
1356 take(100, a)
1357 take(60, b)
1358 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1359 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1360 self.assertEqual(list(a), long_ans[100:])
1361 self.assertEqual(list(b), long_ans[60:])
1362
1363 # check deepcopy
1364 a, b = tee('abc')
1365 self.assertEqual(list(copy.deepcopy(a)), ans)
1366 self.assertEqual(list(copy.deepcopy(b)), ans)
1367 self.assertEqual(list(a), ans)
1368 self.assertEqual(list(b), ans)
1369 a, b = tee(range(10000))
1370 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1371 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1372 self.assertEqual(list(a), long_ans)
1373 self.assertEqual(list(b), long_ans)
1374
1375 # check partially consumed deepcopy
1376 a, b = tee('abc')
1377 take(2, a)
1378 take(1, b)
1379 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1380 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1381 self.assertEqual(list(a), ans[2:])
1382 self.assertEqual(list(b), ans[1:])
1383 a, b = tee(range(10000))
1384 take(100, a)
1385 take(60, b)
1386 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1387 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1388 self.assertEqual(list(a), long_ans[100:])
1389 self.assertEqual(list(b), long_ans[60:])
1390
1391 # check pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +02001392 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1393 self.pickletest(proto, iter(tee('abc')))
1394 a, b = tee('abc')
1395 self.pickletest(proto, a, compare=ans)
1396 self.pickletest(proto, b, compare=ans)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001397
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001398 # Issue 13454: Crash when deleting backward iterator from tee()
1399 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001400 forward, backward = tee(repeat(None, 20000000))
Serhiy Storchaka9db55002015-03-28 20:38:37 +02001401 try:
1402 any(forward) # exhaust the iterator
1403 del backward
1404 except:
1405 del forward, backward
1406 raise
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001407
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001408 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001409 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001410
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001411 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001412 self.assertRaises(StopIteration, next, f([]))
1413 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001414
Georg Brandla18af4e2007-04-21 15:47:16 +00001415 self.assertRaises(StopIteration, next, islice([], None))
1416 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001417
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001418 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001419 self.assertRaises(StopIteration, next, p)
1420 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001421 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001422 self.assertRaises(StopIteration, next, p)
1423 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001424
Georg Brandla18af4e2007-04-21 15:47:16 +00001425 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001426
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001427 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001428 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1429 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001430
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001431class TestExamples(unittest.TestCase):
1432
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001433 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001434 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1435
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001436 def test_accumulate_reducible(self):
1437 # check copy, deepcopy, pickle
1438 data = [1, 2, 3, 4, 5]
1439 accumulated = [1, 3, 6, 10, 15]
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001440
Serhiy Storchakabad12572014-12-15 14:03:42 +02001441 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1442 it = accumulate(data)
1443 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[:])
1444 self.assertEqual(next(it), 1)
1445 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[1:])
1446 it = accumulate(data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001447 self.assertEqual(next(it), 1)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001448 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1449 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1450
Serhiy Storchakad5516252016-03-06 14:00:45 +02001451 def test_accumulate_reducible_none(self):
1452 # Issue #25718: total is None
1453 it = accumulate([None, None, None], operator.is_)
1454 self.assertEqual(next(it), None)
1455 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1456 it_copy = pickle.loads(pickle.dumps(it, proto))
1457 self.assertEqual(list(it_copy), [True, False])
1458 self.assertEqual(list(copy.deepcopy(it)), [True, False])
1459 self.assertEqual(list(copy.copy(it)), [True, False])
1460
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001461 def test_chain(self):
1462 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1463
1464 def test_chain_from_iterable(self):
1465 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1466
1467 def test_combinations(self):
1468 self.assertEqual(list(combinations('ABCD', 2)),
1469 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1470 self.assertEqual(list(combinations(range(4), 3)),
1471 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1472
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001473 def test_combinations_with_replacement(self):
1474 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1475 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1476
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001477 def test_compress(self):
1478 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1479
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001480 def test_count(self):
1481 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1482
1483 def test_cycle(self):
1484 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1485
1486 def test_dropwhile(self):
1487 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1488
1489 def test_groupby(self):
1490 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1491 list('ABCDAB'))
1492 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1493 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1494
1495 def test_filter(self):
1496 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1497
1498 def test_filterfalse(self):
1499 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1500
1501 def test_map(self):
1502 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1503
1504 def test_islice(self):
1505 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1506 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1507 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1508 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1509
1510 def test_zip(self):
1511 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1512
1513 def test_zip_longest(self):
1514 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1515 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1516
1517 def test_permutations(self):
1518 self.assertEqual(list(permutations('ABCD', 2)),
1519 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1520 self.assertEqual(list(permutations(range(3))),
1521 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1522
1523 def test_product(self):
1524 self.assertEqual(list(product('ABCD', 'xy')),
1525 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1526 self.assertEqual(list(product(range(2), repeat=3)),
1527 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1528 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1529
1530 def test_repeat(self):
1531 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1532
1533 def test_stapmap(self):
1534 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1535 [32, 9, 1000])
1536
1537 def test_takewhile(self):
1538 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1539
1540
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001541class TestGC(unittest.TestCase):
1542
1543 def makecycle(self, iterator, container):
1544 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001545 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001546 del container, iterator
1547
Raymond Hettinger482ba772010-12-01 22:48:00 +00001548 def test_accumulate(self):
1549 a = []
1550 self.makecycle(accumulate([1,2,a,3]), a)
1551
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001552 def test_chain(self):
1553 a = []
1554 self.makecycle(chain(a), a)
1555
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001556 def test_chain_from_iterable(self):
1557 a = []
1558 self.makecycle(chain.from_iterable([a]), a)
1559
1560 def test_combinations(self):
1561 a = []
1562 self.makecycle(combinations([1,2,a,3], 3), a)
1563
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001564 def test_combinations_with_replacement(self):
1565 a = []
1566 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1567
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001568 def test_compress(self):
1569 a = []
1570 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1571
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001572 def test_count(self):
1573 a = []
1574 Int = type('Int', (int,), dict(x=a))
1575 self.makecycle(count(Int(0), Int(1)), a)
1576
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001577 def test_cycle(self):
1578 a = []
1579 self.makecycle(cycle([a]*2), a)
1580
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001581 def test_dropwhile(self):
1582 a = []
1583 self.makecycle(dropwhile(bool, [0, a, a]), a)
1584
1585 def test_groupby(self):
1586 a = []
1587 self.makecycle(groupby([a]*2, lambda x:x), a)
1588
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001589 def test_issue2246(self):
1590 # Issue 2246 -- the _grouper iterator was not included in GC
1591 n = 10
1592 keyfunc = lambda x: x
1593 for i, j in groupby(range(n), key=keyfunc):
1594 keyfunc.__dict__.setdefault('x',[]).append(j)
1595
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001596 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001597 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001598 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001599
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001600 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001601 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001602 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001603
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001604 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001605 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001606 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001607
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001608 def test_zip_longest(self):
1609 a = []
1610 self.makecycle(zip_longest([a]*2, [a]*3), a)
1611 b = [a, None]
1612 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1613
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001614 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001615 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001616 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001617
1618 def test_islice(self):
1619 a = []
1620 self.makecycle(islice([a]*2, None), a)
1621
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001622 def test_permutations(self):
1623 a = []
1624 self.makecycle(permutations([1,2,a,3], 3), a)
1625
1626 def test_product(self):
1627 a = []
1628 self.makecycle(product([1,2,a,3], repeat=3), a)
1629
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001630 def test_repeat(self):
1631 a = []
1632 self.makecycle(repeat(a), a)
1633
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001634 def test_starmap(self):
1635 a = []
1636 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1637
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001638 def test_takewhile(self):
1639 a = []
1640 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1641
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001642def R(seqn):
1643 'Regular generator'
1644 for i in seqn:
1645 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001646
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001647class G:
1648 'Sequence using __getitem__'
1649 def __init__(self, seqn):
1650 self.seqn = seqn
1651 def __getitem__(self, i):
1652 return self.seqn[i]
1653
1654class I:
1655 'Sequence using iterator protocol'
1656 def __init__(self, seqn):
1657 self.seqn = seqn
1658 self.i = 0
1659 def __iter__(self):
1660 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001661 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001662 if self.i >= len(self.seqn): raise StopIteration
1663 v = self.seqn[self.i]
1664 self.i += 1
1665 return v
1666
1667class Ig:
1668 'Sequence using iterator protocol defined with a generator'
1669 def __init__(self, seqn):
1670 self.seqn = seqn
1671 self.i = 0
1672 def __iter__(self):
1673 for val in self.seqn:
1674 yield val
1675
1676class X:
1677 'Missing __getitem__ and __iter__'
1678 def __init__(self, seqn):
1679 self.seqn = seqn
1680 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001681 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001682 if self.i >= len(self.seqn): raise StopIteration
1683 v = self.seqn[self.i]
1684 self.i += 1
1685 return v
1686
1687class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001688 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001689 def __init__(self, seqn):
1690 self.seqn = seqn
1691 self.i = 0
1692 def __iter__(self):
1693 return self
1694
1695class E:
1696 'Test propagation of exceptions'
1697 def __init__(self, seqn):
1698 self.seqn = seqn
1699 self.i = 0
1700 def __iter__(self):
1701 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001702 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001703 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001704
1705class S:
1706 'Test immediate stop'
1707 def __init__(self, seqn):
1708 pass
1709 def __iter__(self):
1710 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001711 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001712 raise StopIteration
1713
1714def L(seqn):
1715 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001716 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001717
1718
1719class TestVariousIteratorArgs(unittest.TestCase):
1720
Raymond Hettinger482ba772010-12-01 22:48:00 +00001721 def test_accumulate(self):
1722 s = [1,2,3,4,5]
1723 r = [1,3,6,10,15]
1724 n = len(s)
1725 for g in (G, I, Ig, L, R):
1726 self.assertEqual(list(accumulate(g(s))), r)
1727 self.assertEqual(list(accumulate(S(s))), [])
1728 self.assertRaises(TypeError, accumulate, X(s))
1729 self.assertRaises(TypeError, accumulate, N(s))
1730 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1731
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001732 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001733 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001734 for g in (G, I, Ig, S, L, R):
1735 self.assertEqual(list(chain(g(s))), list(g(s)))
1736 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001737 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001738 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001739 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1740
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001741 def test_compress(self):
1742 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1743 n = len(s)
1744 for g in (G, I, Ig, S, L, R):
1745 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1746 self.assertRaises(TypeError, compress, X(s), repeat(1))
1747 self.assertRaises(TypeError, compress, N(s), repeat(1))
1748 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1749
Christian Heimesc3f30c42008-02-22 16:37:40 +00001750 def test_product(self):
1751 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1752 self.assertRaises(TypeError, product, X(s))
1753 self.assertRaises(TypeError, product, N(s))
1754 self.assertRaises(ZeroDivisionError, product, E(s))
1755
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001756 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001757 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001758 for g in (G, I, Ig, S, L, R):
1759 tgtlen = len(s) * 3
1760 expected = list(g(s))*3
1761 actual = list(islice(cycle(g(s)), tgtlen))
1762 self.assertEqual(actual, expected)
1763 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001764 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001765 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1766
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001767 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001768 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001769 for g in (G, I, Ig, S, L, R):
1770 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1771 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001772 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001773 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1774
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001775 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001776 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001777 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001778 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001779 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001780 self.assertRaises(TypeError, filter, isEven, X(s))
1781 self.assertRaises(TypeError, filter, isEven, N(s))
1782 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001783
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001784 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001785 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001786 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001787 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001788 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001789 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1790 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1791 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001792
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001793 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001794 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001795 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001796 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1797 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1798 self.assertRaises(TypeError, zip, X(s))
1799 self.assertRaises(TypeError, zip, N(s))
1800 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001801
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001802 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001803 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001804 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001805 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1806 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1807 self.assertRaises(TypeError, zip_longest, X(s))
1808 self.assertRaises(TypeError, zip_longest, N(s))
1809 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001810
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001811 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001812 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001813 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001814 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001815 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001816 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001817 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001818 self.assertRaises(TypeError, map, onearg, X(s))
1819 self.assertRaises(TypeError, map, onearg, N(s))
1820 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001821
1822 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001823 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001824 for g in (G, I, Ig, S, L, R):
1825 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1826 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001827 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001828 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1829
1830 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001831 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001832 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001833 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001834 self.assertEqual(list(starmap(operator.pow, g(ss))),
1835 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001836 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001837 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001838 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1839
1840 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001841 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001842 for g in (G, I, Ig, S, L, R):
1843 tgt = []
1844 for elem in g(s):
1845 if not isEven(elem): break
1846 tgt.append(elem)
1847 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1848 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001849 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001850 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1851
1852 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001853 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001854 for g in (G, I, Ig, S, L, R):
1855 tgt = []
1856 for elem in g(s):
1857 if not tgt and isOdd(elem): continue
1858 tgt.append(elem)
1859 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1860 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001861 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001862 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1863
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001864 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001865 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001866 for g in (G, I, Ig, S, L, R):
1867 it1, it2 = tee(g(s))
1868 self.assertEqual(list(it1), list(g(s)))
1869 self.assertEqual(list(it2), list(g(s)))
1870 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001871 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001872 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1873
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001874class LengthTransparency(unittest.TestCase):
1875
1876 def test_repeat(self):
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001877 self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
Raymond Hettinger97d35552014-06-24 21:36:58 -07001878 self.assertEqual(operator.length_hint(repeat(None, 0)), 0)
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001879 self.assertEqual(operator.length_hint(repeat(None), 12), 12)
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001880
Raymond Hettinger97d35552014-06-24 21:36:58 -07001881 def test_repeat_with_negative_times(self):
1882 self.assertEqual(operator.length_hint(repeat(None, -1)), 0)
1883 self.assertEqual(operator.length_hint(repeat(None, -2)), 0)
1884 self.assertEqual(operator.length_hint(repeat(None, times=-1)), 0)
1885 self.assertEqual(operator.length_hint(repeat(None, times=-2)), 0)
1886
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001887class RegressionTests(unittest.TestCase):
1888
1889 def test_sf_793826(self):
1890 # Fix Armin Rigo's successful efforts to wreak havoc
1891
1892 def mutatingtuple(tuple1, f, tuple2):
1893 # this builds a tuple t which is a copy of tuple1,
1894 # then calls f(t), then mutates t to be equal to tuple2
1895 # (needs len(tuple1) == len(tuple2)).
1896 def g(value, first=[1]):
1897 if first:
1898 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001899 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001900 return value
1901 items = list(tuple2)
1902 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001903 gen = map(g, items)
1904 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001905 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001906
1907 def f(t):
1908 global T
1909 T = t
1910 first[:] = list(T)
1911
1912 first = []
1913 mutatingtuple((1,2,3), f, (4,5,6))
1914 second = list(T)
1915 self.assertEqual(first, second)
1916
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001917
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001918 def test_sf_950057(self):
1919 # Make sure that chain() and cycle() catch exceptions immediately
1920 # rather than when shifting between input sources
1921
1922 def gen1():
1923 hist.append(0)
1924 yield 1
1925 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001926 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001927 hist.append(2)
1928
1929 def gen2(x):
1930 hist.append(3)
1931 yield 2
1932 hist.append(4)
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001933
1934 hist = []
1935 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1936 self.assertEqual(hist, [0,1])
1937
1938 hist = []
1939 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1940 self.assertEqual(hist, [0,1])
1941
1942 hist = []
1943 self.assertRaises(AssertionError, list, cycle(gen1()))
1944 self.assertEqual(hist, [0,1])
1945
Thomas Woutersb2137042007-02-01 18:02:27 +00001946class SubclassWithKwargsTest(unittest.TestCase):
1947 def test_keywords_in_subclass(self):
1948 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001949 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001950 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001951 class Subclass(cls):
1952 def __init__(self, newarg=None, *args):
1953 cls.__init__(self, *args)
1954 try:
1955 Subclass(newarg=1)
1956 except TypeError as err:
1957 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001958 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001959
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02001960@support.cpython_only
1961class SizeofTest(unittest.TestCase):
1962 def setUp(self):
1963 self.ssize_t = struct.calcsize('n')
1964
1965 check_sizeof = support.check_sizeof
1966
1967 def test_product_sizeof(self):
1968 basesize = support.calcobjsize('3Pi')
1969 check = self.check_sizeof
1970 check(product('ab', '12'), basesize + 2 * self.ssize_t)
1971 check(product(*(('abc',) * 10)), basesize + 10 * self.ssize_t)
1972
1973 def test_combinations_sizeof(self):
1974 basesize = support.calcobjsize('3Pni')
1975 check = self.check_sizeof
1976 check(combinations('abcd', 3), basesize + 3 * self.ssize_t)
1977 check(combinations(range(10), 4), basesize + 4 * self.ssize_t)
1978
1979 def test_combinations_with_replacement_sizeof(self):
1980 cwr = combinations_with_replacement
1981 basesize = support.calcobjsize('3Pni')
1982 check = self.check_sizeof
1983 check(cwr('abcd', 3), basesize + 3 * self.ssize_t)
1984 check(cwr(range(10), 4), basesize + 4 * self.ssize_t)
1985
1986 def test_permutations_sizeof(self):
1987 basesize = support.calcobjsize('4Pni')
1988 check = self.check_sizeof
1989 check(permutations('abcd'),
1990 basesize + 4 * self.ssize_t + 4 * self.ssize_t)
1991 check(permutations('abcd', 3),
1992 basesize + 4 * self.ssize_t + 3 * self.ssize_t)
1993 check(permutations('abcde', 3),
1994 basesize + 5 * self.ssize_t + 3 * self.ssize_t)
1995 check(permutations(range(10), 4),
1996 basesize + 10 * self.ssize_t + 4 * self.ssize_t)
1997
Thomas Woutersb2137042007-02-01 18:02:27 +00001998
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001999libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002000
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002001
2002>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002003>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00002004... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002005...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002006Check 1200 is for $120.15
2007Check 1201 is for $764.05
2008Check 1202 is for $823.14
2009
2010>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002011>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00002012... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002013...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000020141
20158
201627
2017
2018>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00002019>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00002020... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00002021...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002022Alex
2023Laura
2024Martin
2025Walter
2026Samuele
2027
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002028>>> from operator import itemgetter
2029>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002030>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002031>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002032... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002033...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000020341 ['a', 'c', 'e']
20352 ['b', 'd', 'f']
20363 ['g']
2037
Raymond Hettinger734fb572004-01-20 20:04:40 +00002038# Find runs of consecutive numbers using groupby. The key to the solution
2039# is differencing with a range so that consecutive numbers all appear in
2040# same group.
2041>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002042>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002043... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002044...
Raymond Hettinger734fb572004-01-20 20:04:40 +00002045[1]
2046[4, 5, 6]
2047[10]
2048[15, 16, 17, 18]
2049[22]
2050[25, 26, 27, 28]
2051
Georg Brandl3dbca812008-07-23 16:10:53 +00002052>>> def take(n, iterable):
2053... "Return first n items of the iterable as a list"
2054... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00002055
Georg Brandl3dbca812008-07-23 16:10:53 +00002056>>> def enumerate(iterable, start=0):
2057... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002058
Georg Brandl3dbca812008-07-23 16:10:53 +00002059>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002060... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00002061... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002062
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00002063>>> def nth(iterable, n, default=None):
2064... "Returns the nth item or a default value"
2065... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00002066
Raymond Hettingere525ee32016-03-06 18:11:38 -08002067>>> def all_equal(iterable):
2068... "Returns True if all the elements are equal to each other"
2069... g = groupby(iterable)
2070... return next(g, True) and not next(g, False)
2071
Georg Brandl3dbca812008-07-23 16:10:53 +00002072>>> def quantify(iterable, pred=bool):
2073... "Count how many times the predicate is true"
2074... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00002075
Georg Brandl3dbca812008-07-23 16:10:53 +00002076>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002077... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00002078... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002079
Georg Brandl3dbca812008-07-23 16:10:53 +00002080>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02002081... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00002082... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002083
2084>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002085... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002086
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002087>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002088... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002089
2090>>> def repeatfunc(func, times=None, *args):
2091... "Repeat calls to func with specified arguments."
2092... " Example: repeatfunc(random.random)"
2093... if times is None:
2094... return starmap(func, repeat(args))
2095... else:
2096... return starmap(func, repeat(args, times))
2097
Raymond Hettingerd591f662003-10-26 15:34:50 +00002098>>> def pairwise(iterable):
2099... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
2100... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002101... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00002102... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002103... except StopIteration:
2104... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002105... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002106
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002107>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002108... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002109... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00002110... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002111
2112>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002113... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002114... # Recipe credited to George Sakkis
2115... pending = len(iterables)
2116... nexts = cycle(iter(it).__next__ for it in iterables)
2117... while pending:
2118... try:
2119... for next in nexts:
2120... yield next()
2121... except StopIteration:
2122... pending -= 1
2123... nexts = cycle(islice(nexts, pending))
2124
2125>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00002126... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
2127... s = list(iterable)
2128... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002129
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002130>>> def unique_everseen(iterable, key=None):
2131... "List unique elements, preserving order. Remember all elements ever seen."
2132... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
2133... # unique_everseen('ABBCcAD', str.lower) --> A B C D
2134... seen = set()
2135... seen_add = seen.add
2136... if key is None:
2137... for element in iterable:
2138... if element not in seen:
2139... seen_add(element)
2140... yield element
2141... else:
2142... for element in iterable:
2143... k = key(element)
2144... if k not in seen:
2145... seen_add(k)
2146... yield element
2147
2148>>> def unique_justseen(iterable, key=None):
2149... "List unique elements, preserving order. Remember only the element just seen."
2150... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
2151... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
2152... return map(next, map(itemgetter(1), groupby(iterable, key)))
2153
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002154>>> def first_true(iterable, default=False, pred=None):
2155... '''Returns the first true value in the iterable.
2156...
2157... If no true value is found, returns *default*
2158...
2159... If *pred* is not None, returns the first item
2160... for which pred(item) is true.
2161...
2162... '''
2163... # first_true([a,b,c], x) --> a or b or c or x
2164... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
2165... return next(filter(pred, iterable), default)
2166
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002167This is not part of the examples but it tests to make sure the definitions
2168perform as purported.
2169
Raymond Hettingera098b332003-09-08 23:58:40 +00002170>>> take(10, count())
2171[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2172
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002173>>> list(enumerate('abc'))
2174[(0, 'a'), (1, 'b'), (2, 'c')]
2175
2176>>> list(islice(tabulate(lambda x: 2*x), 4))
2177[0, 2, 4, 6]
2178
2179>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00002180'd'
2181
2182>>> nth('abcde', 9) is None
2183True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002184
Raymond Hettingere525ee32016-03-06 18:11:38 -08002185>>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')]
2186[True, True, True, False, False]
2187
Guido van Rossum805365e2007-05-07 22:24:25 +00002188>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000218950
2190
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002191>>> a = [[1, 2, 3], [4, 5, 6]]
2192>>> flatten(a)
2193[1, 2, 3, 4, 5, 6]
2194
2195>>> list(repeatfunc(pow, 5, 2, 3))
2196[8, 8, 8, 8, 8]
2197
2198>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002199>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002200[0, 0, 0, 0, 0]
2201
Raymond Hettingerd591f662003-10-26 15:34:50 +00002202>>> list(pairwise('abcd'))
2203[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002204
Raymond Hettingerd591f662003-10-26 15:34:50 +00002205>>> list(pairwise([]))
2206[]
2207
2208>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002209[]
2210
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002211>>> list(islice(padnone('abc'), 0, 6))
2212['a', 'b', 'c', None, None, None]
2213
2214>>> list(ncycles('abc', 3))
2215['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2216
2217>>> dotproduct([1,2,3], [4,5,6])
221832
2219
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002220>>> list(grouper(3, 'abcdefg', 'x'))
2221[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2222
2223>>> list(roundrobin('abc', 'd', 'ef'))
2224['a', 'd', 'e', 'b', 'f', 'c']
2225
Raymond Hettingerace67332009-01-26 02:23:50 +00002226>>> list(powerset([1,2,3]))
2227[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002228
Raymond Hettinger191e8502009-01-27 13:29:43 +00002229>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2230True
2231
2232>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2233True
2234
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002235>>> list(unique_everseen('AAAABBBCCDAABBB'))
2236['A', 'B', 'C', 'D']
2237
2238>>> list(unique_everseen('ABBCcAD', str.lower))
2239['A', 'B', 'C', 'D']
2240
2241>>> list(unique_justseen('AAAABBBCCDAABBB'))
2242['A', 'B', 'C', 'D', 'A', 'B']
2243
2244>>> list(unique_justseen('ABBCcAD', str.lower))
2245['A', 'B', 'C', 'A', 'D']
2246
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002247>>> first_true('ABC0DEF1', '9', str.isdigit)
2248'0'
2249
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002250"""
2251
2252__test__ = {'libreftest' : libreftest}
2253
2254def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002255 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002256 RegressionTests, LengthTransparency,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002257 SubclassWithKwargsTest, TestExamples,
2258 SizeofTest)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002259 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002260
2261 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002262 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002263 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002264 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002265 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002266 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002267 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002268 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002269 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002270
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002271 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002272 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002273
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002274if __name__ == "__main__":
2275 test_main(verbose=True)