blob: 3bbfdf17a976db0ace3501a3817fc65838becfb8 [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 Hettinger7c2bb5b2003-05-03 05:59:48 +00007import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00008import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +00009import copy
10import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000011from functools import reduce
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +020012import sys
13import struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +000014maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000015minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000016
Guido van Rossum801f0d72006-08-24 19:48:10 +000017def lzip(*args):
18 return list(zip(*args))
19
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000020def onearg(x):
21 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000022 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000023
24def errfunc(*args):
25 'Test function that raises an error'
26 raise ValueError
27
28def gen3():
29 'Non-restartable source sequence'
30 for i in (0, 1, 2):
31 yield i
32
33def isEven(x):
34 'Test predicate'
35 return x%2==0
36
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000037def isOdd(x):
38 'Test predicate'
39 return x%2==1
40
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000041def tupleize(*args):
42 return args
43
44def irange(n):
45 for i in range(n):
46 yield i
47
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000048class StopNow:
49 'Class emulating an empty iterable.'
50 def __iter__(self):
51 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000052 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000053 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000054
Raymond Hettinger02420702003-06-29 20:36:23 +000055def take(n, seq):
56 'Convenience function for partially consuming a long of infinite iterable'
57 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000058
Christian Heimes78644762008-03-04 23:39:23 +000059def prod(iterable):
60 return reduce(operator.mul, iterable, 1)
61
Christian Heimes380f7f22008-02-28 11:19:05 +000062def fact(n):
63 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000064 return prod(range(1, n+1))
65
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000066# root level methods for pickling ability
67def testR(r):
68 return r[0]
69
70def testR2(r):
71 return r[2]
72
73def underten(x):
74 return x<10
75
Serhiy Storchakabad12572014-12-15 14:03:42 +020076picklecopiers = [lambda s, proto=proto: pickle.loads(pickle.dumps(s, proto))
77 for proto in range(pickle.HIGHEST_PROTOCOL + 1)]
78
Raymond Hettinger96ef8112003-02-01 00:10:11 +000079class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000080
Serhiy Storchakabad12572014-12-15 14:03:42 +020081 def pickletest(self, protocol, it, stop=4, take=1, compare=None):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000082 """Test that an iterator is the same after pickling, also when part-consumed"""
83 def expand(it, i=0):
84 # Recursively expand iterables, within sensible bounds
85 if i > 10:
86 raise RuntimeError("infinite recursion encountered")
87 if isinstance(it, str):
88 return it
89 try:
90 l = list(islice(it, stop))
91 except TypeError:
92 return it # can't expand it
93 return [expand(e, i+1) for e in l]
94
95 # Test the initial copy against the original
Serhiy Storchakabad12572014-12-15 14:03:42 +020096 dump = pickle.dumps(it, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000097 i2 = pickle.loads(dump)
98 self.assertEqual(type(it), type(i2))
99 a, b = expand(it), expand(i2)
100 self.assertEqual(a, b)
101 if compare:
102 c = expand(compare)
103 self.assertEqual(a, c)
104
105 # Take from the copy, and create another copy and compare them.
106 i3 = pickle.loads(dump)
107 took = 0
108 try:
109 for i in range(take):
110 next(i3)
111 took += 1
112 except StopIteration:
113 pass #in case there is less data than 'take'
Serhiy Storchakabad12572014-12-15 14:03:42 +0200114 dump = pickle.dumps(i3, protocol)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000115 i4 = pickle.loads(dump)
116 a, b = expand(i3), expand(i4)
117 self.assertEqual(a, b)
118 if compare:
119 c = expand(compare[took:])
120 self.assertEqual(a, c);
121
Raymond Hettinger482ba772010-12-01 22:48:00 +0000122 def test_accumulate(self):
123 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000124 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
125 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
126 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000127 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000128 self.assertEqual(
129 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000130 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000131 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000132 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000133 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700134 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000135 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000136 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000137 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
138
Raymond Hettinger5d446132011-03-27 18:52:10 -0700139 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
140 self.assertEqual(list(accumulate(s, min)),
141 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
142 self.assertEqual(list(accumulate(s, max)),
143 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
144 self.assertEqual(list(accumulate(s, operator.mul)),
145 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
146 with self.assertRaises(TypeError):
147 list(accumulate(s, chr)) # unary-operation
Serhiy Storchakabad12572014-12-15 14:03:42 +0200148 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
149 self.pickletest(proto, accumulate(range(10))) # test pickling
Raymond Hettinger5d446132011-03-27 18:52:10 -0700150
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000151 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000152
153 def chain2(*iterables):
154 'Pure python version in the docs'
155 for it in iterables:
156 for element in it:
157 yield element
158
159 for c in (chain, chain2):
160 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
161 self.assertEqual(list(c('abc')), list('abc'))
162 self.assertEqual(list(c('')), [])
163 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
164 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000165
166 def test_chain_from_iterable(self):
167 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
168 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
169 self.assertEqual(list(chain.from_iterable([''])), [])
170 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
171 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000172
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000173 def test_chain_reducible(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200174 for oper in [copy.deepcopy] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000175 it = chain('abc', 'def')
176 self.assertEqual(list(oper(it)), list('abcdef'))
177 self.assertEqual(next(it), 'a')
178 self.assertEqual(list(oper(it)), list('bcdef'))
179
180 self.assertEqual(list(oper(chain(''))), [])
181 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
182 self.assertRaises(TypeError, list, oper(chain(2, 3)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200183 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
184 self.pickletest(proto, chain('abc', 'def'), compare=list('abcdef'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000185
Christian Heimes380f7f22008-02-28 11:19:05 +0000186 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000187 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000188 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000189 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000190 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000191
Serhiy Storchakabad12572014-12-15 14:03:42 +0200192 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000193 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
194
195 self.assertEqual(list(op(combinations('ABCD', 2))),
196 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
197 testIntermediate = combinations('ABCD', 2)
198 next(testIntermediate)
199 self.assertEqual(list(op(testIntermediate)),
200 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
201
202 self.assertEqual(list(op(combinations(range(4), 3))),
203 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
204 testIntermediate = combinations(range(4), 3)
205 next(testIntermediate)
206 self.assertEqual(list(op(testIntermediate)),
207 [(0,1,3), (0,2,3), (1,2,3)])
208
Christian Heimes78644762008-03-04 23:39:23 +0000209
210 def combinations1(iterable, r):
211 'Pure python version shown in the docs'
212 pool = tuple(iterable)
213 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000214 if r > n:
215 return
Christian Heimes78644762008-03-04 23:39:23 +0000216 indices = list(range(r))
217 yield tuple(pool[i] for i in indices)
218 while 1:
219 for i in reversed(range(r)):
220 if indices[i] != i + n - r:
221 break
222 else:
223 return
224 indices[i] += 1
225 for j in range(i+1, r):
226 indices[j] = indices[j-1] + 1
227 yield tuple(pool[i] for i in indices)
228
229 def combinations2(iterable, r):
230 'Pure python version shown in the docs'
231 pool = tuple(iterable)
232 n = len(pool)
233 for indices in permutations(range(n), r):
234 if sorted(indices) == list(indices):
235 yield tuple(pool[i] for i in indices)
236
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000237 def combinations3(iterable, r):
238 'Pure python version from cwr()'
239 pool = tuple(iterable)
240 n = len(pool)
241 for indices in combinations_with_replacement(range(n), r):
242 if len(set(indices)) == r:
243 yield tuple(pool[i] for i in indices)
244
Christian Heimes78644762008-03-04 23:39:23 +0000245 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000246 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000247 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000248 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000249 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 +0000250 self.assertEqual(len(result), len(set(result))) # no repeats
251 self.assertEqual(result, sorted(result)) # lexicographic order
252 for c in result:
253 self.assertEqual(len(c), r) # r-length combinations
254 self.assertEqual(len(set(c)), r) # no duplicate elements
255 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000257 self.assertEqual(list(c),
258 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000259 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000260 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000261 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000262
Serhiy Storchakabad12572014-12-15 14:03:42 +0200263 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
264 self.pickletest(proto, combinations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000265
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500266 @support.bigaddrspacetest
267 def test_combinations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200268 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500269 combinations("AA", 2**29)
270
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000271 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700272 @support.impl_detail("tuple reuse is specific to CPython")
273 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000274 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
275 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
276
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000277 def test_combinations_with_replacement(self):
278 cwr = combinations_with_replacement
279 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
280 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
281 self.assertRaises(TypeError, cwr, None) # pool is not iterable
282 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000283
Serhiy Storchakabad12572014-12-15 14:03:42 +0200284 for op in [lambda a:a] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000285 self.assertEqual(list(op(cwr('ABC', 2))),
286 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
287 testIntermediate = cwr('ABC', 2)
288 next(testIntermediate)
289 self.assertEqual(list(op(testIntermediate)),
290 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
291
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000292
293 def cwr1(iterable, r):
294 'Pure python version shown in the docs'
295 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
296 pool = tuple(iterable)
297 n = len(pool)
298 if not n and r:
299 return
300 indices = [0] * r
301 yield tuple(pool[i] for i in indices)
302 while 1:
303 for i in reversed(range(r)):
304 if indices[i] != n - 1:
305 break
306 else:
307 return
308 indices[i:] = [indices[i] + 1] * (r - i)
309 yield tuple(pool[i] for i in indices)
310
311 def cwr2(iterable, r):
312 'Pure python version shown in the docs'
313 pool = tuple(iterable)
314 n = len(pool)
315 for indices in product(range(n), repeat=r):
316 if sorted(indices) == list(indices):
317 yield tuple(pool[i] for i in indices)
318
319 def numcombs(n, r):
320 if not n:
321 return 0 if r else 1
322 return fact(n+r-1) / fact(r)/ fact(n-1)
323
324 for n in range(7):
325 values = [5*x-12 for x in range(n)]
326 for r in range(n+2):
327 result = list(cwr(values, r))
328
329 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
330 self.assertEqual(len(result), len(set(result))) # no repeats
331 self.assertEqual(result, sorted(result)) # lexicographic order
332
333 regular_combs = list(combinations(values, r)) # compare to combs without replacement
334 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000335 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000336 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000337 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000338
339 for c in result:
340 self.assertEqual(len(c), r) # r-length combinations
341 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
342 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
343 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000344 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000345 self.assertEqual(noruns,
346 [e for e in values if e in c]) # comb is a subsequence of the input iterable
347 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
348 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
349
Serhiy Storchakabad12572014-12-15 14:03:42 +0200350 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
351 self.pickletest(proto, cwr(values,r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000352
Benjamin Peterson6f082292015-02-01 21:10:47 -0500353 @support.bigaddrspacetest
354 def test_combinations_with_replacement_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200355 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson6f082292015-02-01 21:10:47 -0500356 combinations_with_replacement("AA", 2**30)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000357
Benjamin Peterson6f082292015-02-01 21:10:47 -0500358 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700359 @support.impl_detail("tuple reuse is specific to CPython")
360 def test_combinations_with_replacement_tuple_reuse(self):
361 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000362 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
363 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
364
Christian Heimes78644762008-03-04 23:39:23 +0000365 def test_permutations(self):
366 self.assertRaises(TypeError, permutations) # too few arguments
367 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000368 self.assertRaises(TypeError, permutations, None) # pool is not iterable
369 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000370 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000371 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000372 self.assertEqual(list(permutations(range(3), 2)),
373 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
374
375 def permutations1(iterable, r=None):
376 'Pure python version shown in the docs'
377 pool = tuple(iterable)
378 n = len(pool)
379 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000380 if r > n:
381 return
Christian Heimes78644762008-03-04 23:39:23 +0000382 indices = list(range(n))
383 cycles = list(range(n-r+1, n+1))[::-1]
384 yield tuple(pool[i] for i in indices[:r])
385 while n:
386 for i in reversed(range(r)):
387 cycles[i] -= 1
388 if cycles[i] == 0:
389 indices[i:] = indices[i+1:] + indices[i:i+1]
390 cycles[i] = n - i
391 else:
392 j = cycles[i]
393 indices[i], indices[-j] = indices[-j], indices[i]
394 yield tuple(pool[i] for i in indices[:r])
395 break
396 else:
397 return
398
399 def permutations2(iterable, r=None):
400 'Pure python version shown in the docs'
401 pool = tuple(iterable)
402 n = len(pool)
403 r = n if r is None else r
404 for indices in product(range(n), repeat=r):
405 if len(set(indices)) == r:
406 yield tuple(pool[i] for i in indices)
407
408 for n in range(7):
409 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000410 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000411 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000412 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 +0000413 self.assertEqual(len(result), len(set(result))) # no repeats
414 self.assertEqual(result, sorted(result)) # lexicographic order
415 for p in result:
416 self.assertEqual(len(p), r) # r-length permutations
417 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000418 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000419 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000420 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000421 if r == n:
422 self.assertEqual(result, list(permutations(values, None))) # test r as None
423 self.assertEqual(result, list(permutations(values))) # test default r
424
Serhiy Storchakabad12572014-12-15 14:03:42 +0200425 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
426 self.pickletest(proto, permutations(values, r)) # test pickling
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000427
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500428 @support.bigaddrspacetest
429 def test_permutations_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +0200430 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500431 permutations("A", 2**30)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -0500432
Zachary Waredca807b2014-04-24 13:22:05 -0500433 @support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynore151d212011-07-17 16:21:30 -0700434 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000435 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000436 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000437
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000438 def test_combinatorics(self):
439 # Test relationships between product(), permutations(),
440 # combinations() and combinations_with_replacement().
441
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000442 for n in range(6):
443 s = 'ABCDEFG'[:n]
444 for r in range(8):
445 prod = list(product(s, repeat=r))
446 cwr = list(combinations_with_replacement(s, r))
447 perm = list(permutations(s, r))
448 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000449
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000450 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000451 self.assertEqual(len(prod), n**r)
452 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
453 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
454 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000455
456 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000457 self.assertEqual(prod, sorted(set(prod)))
458 self.assertEqual(cwr, sorted(set(cwr)))
459 self.assertEqual(perm, sorted(set(perm)))
460 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000461
462 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000463 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
464 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 +0000465 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
466 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
467 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
468 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
469 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000470
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000471 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000472 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000473 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
474 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
475 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
476 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
477 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
478 n = 10000
479 data = chain.from_iterable(repeat(range(6), n))
480 selectors = chain.from_iterable(repeat((0, 1)))
481 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
482 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
483 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
484 self.assertRaises(TypeError, compress, range(6)) # too few args
485 self.assertRaises(TypeError, compress, range(6), None) # too many args
486
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000487 # check copy, deepcopy, pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +0200488 for op in [lambda a:copy.copy(a), lambda a:copy.deepcopy(a)] + picklecopiers:
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000489 for data, selectors, result1, result2 in [
490 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
491 ('ABCDEF', [0,0,0,0,0,0], '', ''),
492 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
493 ('ABCDEF', [1,0,1], 'AC', 'C'),
494 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
495 ]:
496
497 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
498 self.assertEqual(list(op(compress(data, selectors))), list(result1))
499 testIntermediate = compress(data, selectors)
500 if result1:
501 next(testIntermediate)
502 self.assertEqual(list(op(testIntermediate)), list(result2))
503
504
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000505 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000506 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
507 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
508 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000509 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
510 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000511 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000512 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000513 self.assertEqual(list(islice(count(maxsize-5), 10)),
514 list(range(maxsize-5, maxsize+5)))
515 self.assertEqual(list(islice(count(-maxsize-5), 10)),
516 list(range(-maxsize-5, -maxsize+5)))
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000517 self.assertEqual(list(islice(count(10, maxsize+5), 3)),
518 list(range(10, 10+3*(maxsize+5), maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000519 c = count(3)
520 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000521 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000522 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523 c = count(-9)
524 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000525 next(c)
Raymond Hettinger30729212009-02-12 06:28:27 +0000526 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000527 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000528 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 +0300529 # Test repr
530 r1 = repr(count(i))
531 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000532 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000533
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000534 # check copy, deepcopy, pickle
535 for value in -3, 3, maxsize-5, maxsize+5:
536 c = count(value)
537 self.assertEqual(next(copy.copy(c)), value)
538 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200539 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
540 self.pickletest(proto, count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000541
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000542 #check proper internal error handling for large "step' sizes
543 count(1, maxsize+5); sys.exc_info()
544
Raymond Hettinger30729212009-02-12 06:28:27 +0000545 def test_count_with_stride(self):
546 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000547 self.assertEqual(lzip('abc',count(start=2,step=3)),
548 [('a', 2), ('b', 5), ('c', 8)])
549 self.assertEqual(lzip('abc',count(step=-1)),
550 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000551 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
552 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000553 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000554 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
555 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
556 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000557 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
558 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000559 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
560 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000561 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
562 c = count(3, 5)
563 self.assertEqual(repr(c), 'count(3, 5)')
564 next(c)
565 self.assertEqual(repr(c), 'count(8, 5)')
566 c = count(-9, 0)
567 self.assertEqual(repr(c), 'count(-9, 0)')
568 next(c)
569 self.assertEqual(repr(c), 'count(-9, 0)')
570 c = count(-9, -3)
571 self.assertEqual(repr(c), 'count(-9, -3)')
572 next(c)
573 self.assertEqual(repr(c), 'count(-12, -3)')
574 self.assertEqual(repr(c), 'count(-12, -3)')
575 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
576 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
577 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
578 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
579 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 +0300580 # Test repr
581 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000582 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300583 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000584 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300585 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000586 self.assertEqual(r1, r2)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200587 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
588 self.pickletest(proto, count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000589
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000590 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000591 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000592 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000593 self.assertRaises(TypeError, cycle)
594 self.assertRaises(TypeError, cycle, 5)
595 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000596
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000597 # check copy, deepcopy, pickle
598 c = cycle('abc')
599 self.assertEqual(next(c), 'a')
600 #simple copy currently not supported, because __reduce__ returns
601 #an internal iterator
602 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
603 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200604 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
605 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
606 list('bcabcabcab'))
607 next(c)
608 self.assertEqual(take(10, pickle.loads(pickle.dumps(c, proto))),
609 list('cabcabcabc'))
610 next(c)
611 next(c)
612 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
613 self.pickletest(proto, cycle('abc'))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000614
Raymond Hettingera166ce52015-08-15 14:45:49 -0700615 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
616 # test with partial consumed input iterable
617 it = iter('abcde')
618 c = cycle(it)
Raymond Hettinger1cadf762015-08-15 14:47:27 -0700619 _ = [next(c) for i in range(2)] # consume 2 of 5 inputs
Raymond Hettingera166ce52015-08-15 14:45:49 -0700620 p = pickle.dumps(c, proto)
621 d = pickle.loads(p) # rebuild the cycle object
622 self.assertEqual(take(20, d), list('cdeabcdeabcdeabcdeab'))
623
624 # test with completely consumed input iterable
625 it = iter('abcde')
626 c = cycle(it)
Raymond Hettinger1cadf762015-08-15 14:47:27 -0700627 _ = [next(c) for i in range(7)] # consume 7 of 5 inputs
Raymond Hettingera166ce52015-08-15 14:45:49 -0700628 p = pickle.dumps(c, proto)
629 d = pickle.loads(p) # rebuild the cycle object
630 self.assertEqual(take(20, d), list('cdeabcdeabcdeabcdeab'))
631
Raymond Hettinger79c878d2015-08-15 13:51:59 -0700632 def test_cycle_setstate(self):
633 # Verify both modes for restoring state
634
635 # Mode 0 is efficient. It uses an incompletely consumed input
636 # iterator to build a cycle object and then passes in state with
637 # a list of previously consumed values. There is no data
638 # overlap bewteen the two.
639 c = cycle('defg')
640 c.__setstate__((list('abc'), 0))
641 self.assertEqual(take(20, c), list('defgabcdefgabcdefgab'))
642
643 # Mode 1 is inefficient. It starts with a cycle object built
644 # from an iterator over the remaining elements in a partial
645 # cycle and then passes in state with all of the previously
646 # seen values (this overlaps values included in the iterator).
647 c = cycle('defg')
648 c.__setstate__((list('abcdefg'), 1))
649 self.assertEqual(take(20, c), list('defgabcdefgabcdefgab'))
650
651 # The first argument to setstate needs to be a tuple
652 with self.assertRaises(SystemError):
653 cycle('defg').__setstate__([list('abcdefg'), 0])
654
655 # The first argument in the setstate tuple must be a list
656 with self.assertRaises(TypeError):
657 c = cycle('defg')
658 c.__setstate__((dict.fromkeys('defg'), 0))
659 take(20, c)
660
661 # The first argument in the setstate tuple must be a list
662 with self.assertRaises(TypeError):
663 cycle('defg').__setstate__((list('abcdefg'), 'x'))
664
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000665 def test_groupby(self):
666 # Check whether it accepts arguments correctly
667 self.assertEqual([], list(groupby([])))
668 self.assertEqual([], list(groupby([], key=id)))
669 self.assertRaises(TypeError, list, groupby('abc', []))
670 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000671 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000672
673 # Check normal input
674 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
675 (2,15,22), (3,16,23), (3,17,23)]
676 dup = []
677 for k, g in groupby(s, lambda r:r[0]):
678 for elem in g:
679 self.assertEqual(k, elem[0])
680 dup.append(elem)
681 self.assertEqual(s, dup)
682
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000683 # Check normal pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200684 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
685 dup = []
686 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
687 for elem in g:
688 self.assertEqual(k, elem[0])
689 dup.append(elem)
690 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000691
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000692 # Check nested case
693 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000694 for k, g in groupby(s, testR):
695 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000696 for elem in ig:
697 self.assertEqual(k, elem[0])
698 self.assertEqual(ik, elem[2])
699 dup.append(elem)
700 self.assertEqual(s, dup)
701
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000702 # Check nested and pickled
Serhiy Storchakabad12572014-12-15 14:03:42 +0200703 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
704 dup = []
705 for k, g in pickle.loads(pickle.dumps(groupby(s, testR), proto)):
706 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2), proto)):
707 for elem in ig:
708 self.assertEqual(k, elem[0])
709 self.assertEqual(ik, elem[2])
710 dup.append(elem)
711 self.assertEqual(s, dup)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000712
713
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000714 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000715 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000716 expectedkeys = set([r[0] for r in s])
717 self.assertEqual(set(keys), expectedkeys)
718 self.assertEqual(len(keys), len(expectedkeys))
719
720 # Exercise pipes and filters style
721 s = 'abracadabra'
722 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000723 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000724 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
725 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000726 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000727 self.assertEqual(r, ['a', 'b', 'r'])
728 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000729 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000730 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
731 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000732 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000733 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
734
Georg Brandla18af4e2007-04-21 15:47:16 +0000735 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000736 class ExpectedError(Exception):
737 pass
738 def delayed_raise(n=0):
739 for i in range(n):
740 yield 'yo'
741 raise ExpectedError
742 def gulp(iterable, keyp=None, func=list):
743 return [func(g) for k, g in groupby(iterable, keyp)]
744
Georg Brandla18af4e2007-04-21 15:47:16 +0000745 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000746 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000747 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000748 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
749
Serhiy Storchakaa60c2fe2015-03-12 21:56:08 +0200750 # __eq__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000751 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000752 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000753 raise ExpectedError
754 s = [DummyCmp(), DummyCmp(), None]
755
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000756 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000757 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000758 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000759 self.assertRaises(ExpectedError, gulp, s)
760
761 # keyfunc failure
762 def keyfunc(obj):
763 if keyfunc.skip > 0:
764 keyfunc.skip -= 1
765 return obj
766 else:
767 raise ExpectedError
768
769 # keyfunc failure on outer object
770 keyfunc.skip = 0
771 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
772 keyfunc.skip = 1
773 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
774
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000775 def test_filter(self):
776 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
777 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
778 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
779 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
780 self.assertRaises(TypeError, filter)
781 self.assertRaises(TypeError, filter, lambda x:x)
782 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
783 self.assertRaises(TypeError, filter, isEven, 3)
784 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000785
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000786 # check copy, deepcopy, pickle
787 ans = [0,2,4]
788
789 c = filter(isEven, range(6))
790 self.assertEqual(list(copy.copy(c)), ans)
791 c = filter(isEven, range(6))
792 self.assertEqual(list(copy.deepcopy(c)), ans)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200793 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
794 c = filter(isEven, range(6))
795 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans)
796 next(c)
797 self.assertEqual(list(pickle.loads(pickle.dumps(c, proto))), ans[1:])
798 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
799 c = filter(isEven, range(6))
800 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000801
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000802 def test_filterfalse(self):
803 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
804 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
805 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
806 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
807 self.assertRaises(TypeError, filterfalse)
808 self.assertRaises(TypeError, filterfalse, lambda x:x)
809 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
810 self.assertRaises(TypeError, filterfalse, isEven, 3)
811 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Serhiy Storchakabad12572014-12-15 14:03:42 +0200812 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
813 self.pickletest(proto, filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000814
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000815 def test_zip(self):
816 # XXX This is rather silly now that builtin zip() calls zip()...
817 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000818 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000819 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
820 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
821 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
822 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
823 self.assertEqual(list(zip()), lzip())
824 self.assertRaises(TypeError, zip, 3)
825 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000826 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000827 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000828 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000829 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700830
831 @support.impl_detail("tuple reuse is specific to CPython")
832 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000833 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000834 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000835 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000836 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000837
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000838 # check copy, deepcopy, pickle
839 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
840 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
841
842 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
843 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
844
Serhiy Storchakabad12572014-12-15 14:03:42 +0200845 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
846 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count()), proto))]
847 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000848
Serhiy Storchakabad12572014-12-15 14:03:42 +0200849 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
850 testIntermediate = zip('abc',count())
851 next(testIntermediate)
852 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate, proto))]
853 self.assertEqual(ans, [('b', 1), ('c', 2)])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000854
Serhiy Storchakabad12572014-12-15 14:03:42 +0200855 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
856 self.pickletest(proto, zip('abc', count()))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000857
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000858 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000859 for args in [
860 ['abc', range(6)],
861 [range(6), 'abc'],
862 [range(1000), range(2000,2100), range(3000,3050)],
863 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
864 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
865 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000866 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
867 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000868 self.assertEqual(list(zip_longest(*args)), target)
869 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000870 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 +0000871 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000872
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000873 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 +0000874
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000875 self.assertEqual(list(zip_longest()), list(zip()))
876 self.assertEqual(list(zip_longest([])), list(zip([])))
877 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000878
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000879 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000880 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000881 self.assertRaises(TypeError, zip_longest, 3)
882 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000883
884 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000885 "zip_longest('abc', fv=1)",
886 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000887 ]:
888 try:
889 eval(stmt, globals(), locals())
890 except TypeError:
891 pass
892 else:
893 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000894
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000895 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000896 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000897 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000898 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700899
900 @support.impl_detail("tuple reuse is specific to CPython")
901 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000902 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000903 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000904 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000905 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
906
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000907 def test_zip_longest_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200908 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
909 self.pickletest(proto, zip_longest("abc", "def"))
910 self.pickletest(proto, zip_longest("abc", "defgh"))
911 self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
912 self.pickletest(proto, zip_longest("", "defgh"))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000913
Raymond Hettingerfc438512009-11-01 20:55:33 +0000914 def test_bug_7244(self):
915
916 class Repeater:
917 # this class is similar to itertools.repeat
918 def __init__(self, o, t, e):
919 self.o = o
920 self.t = int(t)
921 self.e = e
922 def __iter__(self): # its iterator is itself
923 return self
924 def __next__(self):
925 if self.t > 0:
926 self.t -= 1
927 return self.o
928 else:
929 raise self.e
930
931 # Formerly this code in would fail in debug mode
932 # with Undetected Error and Stop Iteration
933 r1 = Repeater(1, 3, StopIteration)
934 r2 = Repeater(2, 4, StopIteration)
935 def run(r1, r2):
936 result = []
937 for i, j in zip_longest(r1, r2, fillvalue=0):
938 with support.captured_output('stdout'):
939 print((i, j))
940 result.append((i, j))
941 return result
942 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
943
944 # Formerly, the RuntimeError would be lost
945 # and StopIteration would stop as expected
946 r1 = Repeater(1, 3, RuntimeError)
947 r2 = Repeater(2, 4, StopIteration)
948 it = zip_longest(r1, r2, fillvalue=0)
949 self.assertEqual(next(it), (1, 2))
950 self.assertEqual(next(it), (1, 2))
951 self.assertEqual(next(it), (1, 2))
952 self.assertRaises(RuntimeError, next, it)
953
Christian Heimesc3f30c42008-02-22 16:37:40 +0000954 def test_product(self):
955 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000956 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000957 (['ab'], [('a',), ('b',)]), # one iterable
958 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
959 ([range(0), range(2), range(3)], []), # first iterable with zero length
960 ([range(2), range(0), range(3)], []), # middle iterable with zero length
961 ([range(2), range(3), range(0)], []), # last iterable with zero length
962 ]:
963 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000964 for r in range(4):
965 self.assertEqual(list(product(*(args*r))),
966 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000967 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
968 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000969
970 def product1(*args, **kwds):
971 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
972 n = len(pools)
973 if n == 0:
974 yield ()
975 return
976 if any(len(pool) == 0 for pool in pools):
977 return
978 indices = [0] * n
979 yield tuple(pool[i] for pool, i in zip(pools, indices))
980 while 1:
981 for i in reversed(range(n)): # right to left
982 if indices[i] == len(pools[i]) - 1:
983 continue
984 indices[i] += 1
985 for j in range(i+1, n):
986 indices[j] = 0
987 yield tuple(pool[i] for pool, i in zip(pools, indices))
988 break
989 else:
990 return
991
992 def product2(*args, **kwds):
993 'Pure python version used in docs'
994 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
995 result = [[]]
996 for pool in pools:
997 result = [x+[y] for x in result for y in pool]
998 for prod in result:
999 yield tuple(prod)
1000
Christian Heimesc3f30c42008-02-22 16:37:40 +00001001 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
1002 set('abcdefg'), range(11), tuple(range(13))]
1003 for i in range(100):
1004 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +00001005 expected_len = prod(map(len, args))
1006 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001007 self.assertEqual(list(product(*args)), list(product1(*args)))
1008 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +00001009 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +00001010 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001011
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001012 @support.bigaddrspacetest
1013 def test_product_overflow(self):
Serhiy Storchakadee948b2015-02-03 01:34:09 +02001014 with self.assertRaises((OverflowError, MemoryError)):
1015 product(*(['ab']*2**5), repeat=2**25)
Benjamin Peterson0eaabf12015-02-01 21:34:07 -05001016
Alex Gaynore151d212011-07-17 16:21:30 -07001017 @support.impl_detail("tuple reuse is specific to CPython")
1018 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001019 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
1020 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +00001021
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001022 def test_product_pickling(self):
1023 # check copy, deepcopy, pickle
1024 for args, result in [
1025 ([], [()]), # zero iterables
1026 (['ab'], [('a',), ('b',)]), # one iterable
1027 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
1028 ([range(0), range(2), range(3)], []), # first iterable with zero length
1029 ([range(2), range(0), range(3)], []), # middle iterable with zero length
1030 ([range(2), range(3), range(0)], []), # last iterable with zero length
1031 ]:
1032 self.assertEqual(list(copy.copy(product(*args))), result)
1033 self.assertEqual(list(copy.deepcopy(product(*args))), result)
Serhiy Storchakabad12572014-12-15 14:03:42 +02001034 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1035 self.pickletest(proto, product(*args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001036
Kristján Valur Jónsson102764a2015-09-12 15:20:54 +00001037 def test_product_issue_25021(self):
1038 # test that indices are properly clamped to the length of the tuples
1039 p = product((1, 2),(3,))
1040 p.__setstate__((0, 0x1000)) # will access tuple element 1 if not clamped
1041 self.assertEqual(next(p), (2, 3))
1042 # test that empty tuple in the list will result in an immediate StopIteration
1043 p = product((1, 2), (), (3,))
1044 p.__setstate__((0, 0, 0x1000)) # will access tuple element 1 if not clamped
1045 self.assertRaises(StopIteration, next, p)
1046
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001047 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +00001048 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +00001049 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001050 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +00001051 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +00001052 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001053 self.assertEqual(list(repeat('a', 0)), [])
1054 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001055 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001056 self.assertRaises(TypeError, repeat, None, 3, 4)
1057 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001058 r = repeat(1+0j)
1059 self.assertEqual(repr(r), 'repeat((1+0j))')
1060 r = repeat(1+0j, 5)
1061 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
1062 list(r)
1063 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001064
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001065 # check copy, deepcopy, pickle
1066 c = repeat(object='a', times=10)
1067 self.assertEqual(next(c), 'a')
1068 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
1069 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001070 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1071 self.pickletest(proto, repeat(object='a', times=10))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001072
Raymond Hettinger97d35552014-06-24 21:36:58 -07001073 def test_repeat_with_negative_times(self):
1074 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
1075 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
1076 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
1077 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
1078
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001079 def test_map(self):
1080 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001081 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001082 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001083 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001084 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001085 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001086 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +00001087 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001088 self.assertEqual(list(map(operator.pow, [])), [])
1089 self.assertRaises(TypeError, map)
1090 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
1091 self.assertRaises(TypeError, map, operator.neg)
1092 self.assertRaises(TypeError, next, map(10, range(5)))
1093 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
1094 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001095
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001096 # check copy, deepcopy, pickle
1097 ans = [('a',0),('b',1),('c',2)]
1098
1099 c = map(tupleize, 'abc', count())
1100 self.assertEqual(list(copy.copy(c)), ans)
1101
1102 c = map(tupleize, 'abc', count())
1103 self.assertEqual(list(copy.deepcopy(c)), ans)
1104
Serhiy Storchakabad12572014-12-15 14:03:42 +02001105 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1106 c = map(tupleize, 'abc', count())
1107 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001108
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001109 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001110 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1111 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001112 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001113 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001114 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001115 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1116 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001117 self.assertRaises(TypeError, starmap)
1118 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001119 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1120 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1121 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001122
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001123 # check copy, deepcopy, pickle
1124 ans = [0**1, 1**2, 2**3]
1125
1126 c = starmap(operator.pow, zip(range(3), range(1,7)))
1127 self.assertEqual(list(copy.copy(c)), ans)
1128
1129 c = starmap(operator.pow, zip(range(3), range(1,7)))
1130 self.assertEqual(list(copy.deepcopy(c)), ans)
1131
Serhiy Storchakabad12572014-12-15 14:03:42 +02001132 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1133 c = starmap(operator.pow, zip(range(3), range(1,7)))
1134 self.pickletest(proto, c)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001135
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001136 def test_islice(self):
1137 for args in [ # islice(args) should agree with range(args)
1138 (10, 20, 3),
1139 (10, 3, 20),
1140 (10, 20),
1141 (10, 3),
1142 (20,)
1143 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001144 self.assertEqual(list(islice(range(100), *args)),
1145 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001146
1147 for args, tgtargs in [ # Stop when seqn is exhausted
1148 ((10, 110, 3), ((10, 100, 3))),
1149 ((10, 110), ((10, 100))),
1150 ((110,), (100,))
1151 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001152 self.assertEqual(list(islice(range(100), *args)),
1153 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001154
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001155 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001156 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1157 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1158 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1159 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1160 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001161
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001162 # Test number of items consumed SF #1171417
1163 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001164 self.assertEqual(list(islice(it, 3)), list(range(3)))
1165 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001166
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001167 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001168 ra = range(10)
1169 self.assertRaises(TypeError, islice, ra)
1170 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1171 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1172 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1173 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1174 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1175 self.assertRaises(ValueError, islice, ra, 'a')
1176 self.assertRaises(ValueError, islice, ra, 'a', 1)
1177 self.assertRaises(ValueError, islice, ra, 1, 'a')
1178 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1179 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001180 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001181
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001182 # Issue #10323: Less islice in a predictable state
1183 c = count()
1184 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1185 self.assertEqual(next(c), 3)
1186
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001187 # check copy, deepcopy, pickle
1188 for args in [ # islice(args) should agree with range(args)
1189 (10, 20, 3),
1190 (10, 3, 20),
1191 (10, 20),
1192 (10, 3),
1193 (20,)
1194 ]:
1195 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1196 list(range(*args)))
1197 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1198 list(range(*args)))
Serhiy Storchakabad12572014-12-15 14:03:42 +02001199 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1200 self.pickletest(proto, islice(range(100), *args))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001201
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001202 # Issue #21321: check source iterator is not referenced
1203 # from islice() after the latter has been exhausted
1204 it = (x for x in (1, 2))
1205 wr = weakref.ref(it)
1206 it = islice(it, 1)
1207 self.assertIsNotNone(wr())
1208 list(it) # exhaust the iterator
Benjamin Peterson8e163512014-08-24 18:07:28 -05001209 support.gc_collect()
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001210 self.assertIsNone(wr())
1211
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001212 def test_takewhile(self):
1213 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001214 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001215 self.assertEqual(list(takewhile(underten, [])), [])
1216 self.assertRaises(TypeError, takewhile)
1217 self.assertRaises(TypeError, takewhile, operator.pow)
1218 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001219 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1220 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001221 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1222 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001223 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001224
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001225 # check copy, deepcopy, pickle
1226 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1227 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1228 [1, 3, 5])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001229 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1230 self.pickletest(proto, takewhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001231
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001232 def test_dropwhile(self):
1233 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001234 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001235 self.assertEqual(list(dropwhile(underten, [])), [])
1236 self.assertRaises(TypeError, dropwhile)
1237 self.assertRaises(TypeError, dropwhile, operator.pow)
1238 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001239 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1240 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001241
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001242 # check copy, deepcopy, pickle
1243 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1244 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1245 [20, 2, 4, 6, 8])
Serhiy Storchakabad12572014-12-15 14:03:42 +02001246 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1247 self.pickletest(proto, dropwhile(underten, data))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001248
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001249 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001250 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001251
1252 a, b = tee([]) # test empty iterator
1253 self.assertEqual(list(a), [])
1254 self.assertEqual(list(b), [])
1255
1256 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001257 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001258
1259 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001260 self.assertEqual(list(a), list(range(n)))
1261 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001262
1263 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001264 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001265 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001266 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001267 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001268
1269 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001270 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001271 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001272 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001273 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001274
Guido van Rossum805365e2007-05-07 22:24:25 +00001275 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001276 order = [0]*n + [1]*n
1277 random.shuffle(order)
1278 lists = ([], [])
1279 its = tee(irange(n))
1280 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001281 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001282 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001283 self.assertEqual(lists[0], list(range(n)))
1284 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001285
Raymond Hettingerad983e72003-11-12 14:32:26 +00001286 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001287 self.assertRaises(TypeError, tee)
1288 self.assertRaises(TypeError, tee, 3)
1289 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001290 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001291
Raymond Hettingerad983e72003-11-12 14:32:26 +00001292 # tee object should be instantiable
1293 a, b = tee('abc')
1294 c = type(a)('def')
1295 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001296
Raymond Hettingerad983e72003-11-12 14:32:26 +00001297 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001298 a, b, c = tee(range(2000), 3)
1299 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001300 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001301 self.assertEqual(list(b), list(range(2000)))
1302 self.assertEqual([next(c), next(c)], list(range(2)))
1303 self.assertEqual(list(a), list(range(100,2000)))
1304 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001305
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001306 # test values of n
1307 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001308 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001309 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001310 result = tee('abc', n)
1311 self.assertEqual(type(result), tuple)
1312 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001313 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001314
Raymond Hettingerad983e72003-11-12 14:32:26 +00001315 # tee pass-through to copyable iterator
1316 a, b = tee('abc')
1317 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001318 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001319
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001320 # test tee_new
1321 t1, t2 = tee('abc')
1322 tnew = type(t1)
1323 self.assertRaises(TypeError, tnew)
1324 self.assertRaises(TypeError, tnew, 10)
1325 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001326 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001327
Raymond Hettingera9f60922004-10-17 16:40:14 +00001328 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001329 a, b = tee(range(10))
Antoine Pitrou26f82ef2014-04-29 12:13:46 +02001330 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +00001331 self.assertEqual(getattr(p, '__class__'), type(b))
1332 del a
1333 self.assertRaises(ReferenceError, getattr, p, '__class__')
1334
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001335 ans = list('abc')
1336 long_ans = list(range(10000))
1337
1338 # check copy
1339 a, b = tee('abc')
1340 self.assertEqual(list(copy.copy(a)), ans)
1341 self.assertEqual(list(copy.copy(b)), ans)
1342 a, b = tee(list(range(10000)))
1343 self.assertEqual(list(copy.copy(a)), long_ans)
1344 self.assertEqual(list(copy.copy(b)), long_ans)
1345
1346 # check partially consumed copy
1347 a, b = tee('abc')
1348 take(2, a)
1349 take(1, b)
1350 self.assertEqual(list(copy.copy(a)), ans[2:])
1351 self.assertEqual(list(copy.copy(b)), ans[1:])
1352 self.assertEqual(list(a), ans[2:])
1353 self.assertEqual(list(b), ans[1:])
1354 a, b = tee(range(10000))
1355 take(100, a)
1356 take(60, b)
1357 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1358 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1359 self.assertEqual(list(a), long_ans[100:])
1360 self.assertEqual(list(b), long_ans[60:])
1361
1362 # check deepcopy
1363 a, b = tee('abc')
1364 self.assertEqual(list(copy.deepcopy(a)), ans)
1365 self.assertEqual(list(copy.deepcopy(b)), ans)
1366 self.assertEqual(list(a), ans)
1367 self.assertEqual(list(b), ans)
1368 a, b = tee(range(10000))
1369 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1370 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1371 self.assertEqual(list(a), long_ans)
1372 self.assertEqual(list(b), long_ans)
1373
1374 # check partially consumed deepcopy
1375 a, b = tee('abc')
1376 take(2, a)
1377 take(1, b)
1378 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1379 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1380 self.assertEqual(list(a), ans[2:])
1381 self.assertEqual(list(b), ans[1:])
1382 a, b = tee(range(10000))
1383 take(100, a)
1384 take(60, b)
1385 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1386 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1387 self.assertEqual(list(a), long_ans[100:])
1388 self.assertEqual(list(b), long_ans[60:])
1389
1390 # check pickle
Serhiy Storchakabad12572014-12-15 14:03:42 +02001391 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1392 self.pickletest(proto, iter(tee('abc')))
1393 a, b = tee('abc')
1394 self.pickletest(proto, a, compare=ans)
1395 self.pickletest(proto, b, compare=ans)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001396
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001397 # Issue 13454: Crash when deleting backward iterator from tee()
1398 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001399 forward, backward = tee(repeat(None, 20000000))
Serhiy Storchaka9db55002015-03-28 20:38:37 +02001400 try:
1401 any(forward) # exhaust the iterator
1402 del backward
1403 except:
1404 del forward, backward
1405 raise
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001406
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001407 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001408 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001409
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001410 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001411 self.assertRaises(StopIteration, next, f([]))
1412 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001413
Georg Brandla18af4e2007-04-21 15:47:16 +00001414 self.assertRaises(StopIteration, next, islice([], None))
1415 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001416
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001417 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001418 self.assertRaises(StopIteration, next, p)
1419 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001420 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001421 self.assertRaises(StopIteration, next, p)
1422 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001423
Georg Brandla18af4e2007-04-21 15:47:16 +00001424 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001425
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001426 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001427 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1428 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001429
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001430class TestExamples(unittest.TestCase):
1431
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001432 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001433 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1434
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001435 def test_accumulate_reducible(self):
1436 # check copy, deepcopy, pickle
1437 data = [1, 2, 3, 4, 5]
1438 accumulated = [1, 3, 6, 10, 15]
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001439
Serhiy Storchakabad12572014-12-15 14:03:42 +02001440 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1441 it = accumulate(data)
1442 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[:])
1443 self.assertEqual(next(it), 1)
1444 self.assertEqual(list(pickle.loads(pickle.dumps(it, proto))), accumulated[1:])
1445 it = accumulate(data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001446 self.assertEqual(next(it), 1)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001447 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1448 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1449
Serhiy Storchakad5516252016-03-06 14:00:45 +02001450 def test_accumulate_reducible_none(self):
1451 # Issue #25718: total is None
1452 it = accumulate([None, None, None], operator.is_)
1453 self.assertEqual(next(it), None)
1454 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1455 it_copy = pickle.loads(pickle.dumps(it, proto))
1456 self.assertEqual(list(it_copy), [True, False])
1457 self.assertEqual(list(copy.deepcopy(it)), [True, False])
1458 self.assertEqual(list(copy.copy(it)), [True, False])
1459
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001460 def test_chain(self):
1461 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1462
1463 def test_chain_from_iterable(self):
1464 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1465
1466 def test_combinations(self):
1467 self.assertEqual(list(combinations('ABCD', 2)),
1468 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1469 self.assertEqual(list(combinations(range(4), 3)),
1470 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1471
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001472 def test_combinations_with_replacement(self):
1473 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1474 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1475
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001476 def test_compress(self):
1477 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1478
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001479 def test_count(self):
1480 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1481
1482 def test_cycle(self):
1483 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1484
1485 def test_dropwhile(self):
1486 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1487
1488 def test_groupby(self):
1489 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1490 list('ABCDAB'))
1491 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1492 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1493
1494 def test_filter(self):
1495 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1496
1497 def test_filterfalse(self):
1498 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1499
1500 def test_map(self):
1501 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1502
1503 def test_islice(self):
1504 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1505 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1506 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1507 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1508
1509 def test_zip(self):
1510 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1511
1512 def test_zip_longest(self):
1513 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1514 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1515
1516 def test_permutations(self):
1517 self.assertEqual(list(permutations('ABCD', 2)),
1518 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1519 self.assertEqual(list(permutations(range(3))),
1520 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1521
1522 def test_product(self):
1523 self.assertEqual(list(product('ABCD', 'xy')),
1524 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1525 self.assertEqual(list(product(range(2), repeat=3)),
1526 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1527 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1528
1529 def test_repeat(self):
1530 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1531
1532 def test_stapmap(self):
1533 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1534 [32, 9, 1000])
1535
1536 def test_takewhile(self):
1537 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1538
1539
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001540class TestGC(unittest.TestCase):
1541
1542 def makecycle(self, iterator, container):
1543 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001544 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001545 del container, iterator
1546
Raymond Hettinger482ba772010-12-01 22:48:00 +00001547 def test_accumulate(self):
1548 a = []
1549 self.makecycle(accumulate([1,2,a,3]), a)
1550
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001551 def test_chain(self):
1552 a = []
1553 self.makecycle(chain(a), a)
1554
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001555 def test_chain_from_iterable(self):
1556 a = []
1557 self.makecycle(chain.from_iterable([a]), a)
1558
1559 def test_combinations(self):
1560 a = []
1561 self.makecycle(combinations([1,2,a,3], 3), a)
1562
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001563 def test_combinations_with_replacement(self):
1564 a = []
1565 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1566
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001567 def test_compress(self):
1568 a = []
1569 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1570
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001571 def test_count(self):
1572 a = []
1573 Int = type('Int', (int,), dict(x=a))
1574 self.makecycle(count(Int(0), Int(1)), a)
1575
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001576 def test_cycle(self):
1577 a = []
1578 self.makecycle(cycle([a]*2), a)
1579
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001580 def test_dropwhile(self):
1581 a = []
1582 self.makecycle(dropwhile(bool, [0, a, a]), a)
1583
1584 def test_groupby(self):
1585 a = []
1586 self.makecycle(groupby([a]*2, lambda x:x), a)
1587
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001588 def test_issue2246(self):
1589 # Issue 2246 -- the _grouper iterator was not included in GC
1590 n = 10
1591 keyfunc = lambda x: x
1592 for i, j in groupby(range(n), key=keyfunc):
1593 keyfunc.__dict__.setdefault('x',[]).append(j)
1594
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001595 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001596 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001597 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001598
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001599 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001600 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001601 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001602
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001603 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001604 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001605 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001606
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001607 def test_zip_longest(self):
1608 a = []
1609 self.makecycle(zip_longest([a]*2, [a]*3), a)
1610 b = [a, None]
1611 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1612
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001613 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001614 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001615 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001616
1617 def test_islice(self):
1618 a = []
1619 self.makecycle(islice([a]*2, None), a)
1620
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001621 def test_permutations(self):
1622 a = []
1623 self.makecycle(permutations([1,2,a,3], 3), a)
1624
1625 def test_product(self):
1626 a = []
1627 self.makecycle(product([1,2,a,3], repeat=3), a)
1628
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001629 def test_repeat(self):
1630 a = []
1631 self.makecycle(repeat(a), a)
1632
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001633 def test_starmap(self):
1634 a = []
1635 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1636
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001637 def test_takewhile(self):
1638 a = []
1639 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1640
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001641def R(seqn):
1642 'Regular generator'
1643 for i in seqn:
1644 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001645
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001646class G:
1647 'Sequence using __getitem__'
1648 def __init__(self, seqn):
1649 self.seqn = seqn
1650 def __getitem__(self, i):
1651 return self.seqn[i]
1652
1653class I:
1654 'Sequence using iterator protocol'
1655 def __init__(self, seqn):
1656 self.seqn = seqn
1657 self.i = 0
1658 def __iter__(self):
1659 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001660 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001661 if self.i >= len(self.seqn): raise StopIteration
1662 v = self.seqn[self.i]
1663 self.i += 1
1664 return v
1665
1666class Ig:
1667 'Sequence using iterator protocol defined with a generator'
1668 def __init__(self, seqn):
1669 self.seqn = seqn
1670 self.i = 0
1671 def __iter__(self):
1672 for val in self.seqn:
1673 yield val
1674
1675class X:
1676 'Missing __getitem__ and __iter__'
1677 def __init__(self, seqn):
1678 self.seqn = seqn
1679 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001680 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001681 if self.i >= len(self.seqn): raise StopIteration
1682 v = self.seqn[self.i]
1683 self.i += 1
1684 return v
1685
1686class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001687 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001688 def __init__(self, seqn):
1689 self.seqn = seqn
1690 self.i = 0
1691 def __iter__(self):
1692 return self
1693
1694class E:
1695 'Test propagation of exceptions'
1696 def __init__(self, seqn):
1697 self.seqn = seqn
1698 self.i = 0
1699 def __iter__(self):
1700 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001701 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001702 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001703
1704class S:
1705 'Test immediate stop'
1706 def __init__(self, seqn):
1707 pass
1708 def __iter__(self):
1709 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001710 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001711 raise StopIteration
1712
1713def L(seqn):
1714 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001715 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001716
1717
1718class TestVariousIteratorArgs(unittest.TestCase):
1719
Raymond Hettinger482ba772010-12-01 22:48:00 +00001720 def test_accumulate(self):
1721 s = [1,2,3,4,5]
1722 r = [1,3,6,10,15]
1723 n = len(s)
1724 for g in (G, I, Ig, L, R):
1725 self.assertEqual(list(accumulate(g(s))), r)
1726 self.assertEqual(list(accumulate(S(s))), [])
1727 self.assertRaises(TypeError, accumulate, X(s))
1728 self.assertRaises(TypeError, accumulate, N(s))
1729 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1730
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001731 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001732 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001733 for g in (G, I, Ig, S, L, R):
1734 self.assertEqual(list(chain(g(s))), list(g(s)))
1735 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001736 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001737 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001738 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1739
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001740 def test_compress(self):
1741 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1742 n = len(s)
1743 for g in (G, I, Ig, S, L, R):
1744 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1745 self.assertRaises(TypeError, compress, X(s), repeat(1))
1746 self.assertRaises(TypeError, compress, N(s), repeat(1))
1747 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1748
Christian Heimesc3f30c42008-02-22 16:37:40 +00001749 def test_product(self):
1750 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1751 self.assertRaises(TypeError, product, X(s))
1752 self.assertRaises(TypeError, product, N(s))
1753 self.assertRaises(ZeroDivisionError, product, E(s))
1754
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001755 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001756 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001757 for g in (G, I, Ig, S, L, R):
1758 tgtlen = len(s) * 3
1759 expected = list(g(s))*3
1760 actual = list(islice(cycle(g(s)), tgtlen))
1761 self.assertEqual(actual, expected)
1762 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001763 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001764 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1765
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001766 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001767 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001768 for g in (G, I, Ig, S, L, R):
1769 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1770 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001771 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001772 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1773
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001774 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001775 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001776 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001777 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001778 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001779 self.assertRaises(TypeError, filter, isEven, X(s))
1780 self.assertRaises(TypeError, filter, isEven, N(s))
1781 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001782
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001783 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001784 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001785 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001786 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001787 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001788 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1789 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1790 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001791
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001792 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001793 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001794 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001795 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1796 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1797 self.assertRaises(TypeError, zip, X(s))
1798 self.assertRaises(TypeError, zip, N(s))
1799 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001800
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001801 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001802 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001803 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001804 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1805 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1806 self.assertRaises(TypeError, zip_longest, X(s))
1807 self.assertRaises(TypeError, zip_longest, N(s))
1808 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001809
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001810 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001811 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001812 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001813 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001814 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001815 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001816 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001817 self.assertRaises(TypeError, map, onearg, X(s))
1818 self.assertRaises(TypeError, map, onearg, N(s))
1819 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001820
1821 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001822 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001823 for g in (G, I, Ig, S, L, R):
1824 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1825 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001826 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001827 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1828
1829 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001830 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001831 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001832 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001833 self.assertEqual(list(starmap(operator.pow, g(ss))),
1834 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001835 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001836 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001837 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1838
1839 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001840 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001841 for g in (G, I, Ig, S, L, R):
1842 tgt = []
1843 for elem in g(s):
1844 if not isEven(elem): break
1845 tgt.append(elem)
1846 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1847 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001848 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001849 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1850
1851 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001852 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001853 for g in (G, I, Ig, S, L, R):
1854 tgt = []
1855 for elem in g(s):
1856 if not tgt and isOdd(elem): continue
1857 tgt.append(elem)
1858 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1859 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001860 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001861 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1862
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001863 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001864 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001865 for g in (G, I, Ig, S, L, R):
1866 it1, it2 = tee(g(s))
1867 self.assertEqual(list(it1), list(g(s)))
1868 self.assertEqual(list(it2), list(g(s)))
1869 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001870 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001871 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1872
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001873class LengthTransparency(unittest.TestCase):
1874
1875 def test_repeat(self):
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001876 self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
Raymond Hettinger97d35552014-06-24 21:36:58 -07001877 self.assertEqual(operator.length_hint(repeat(None, 0)), 0)
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001878 self.assertEqual(operator.length_hint(repeat(None), 12), 12)
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001879
Raymond Hettinger97d35552014-06-24 21:36:58 -07001880 def test_repeat_with_negative_times(self):
1881 self.assertEqual(operator.length_hint(repeat(None, -1)), 0)
1882 self.assertEqual(operator.length_hint(repeat(None, -2)), 0)
1883 self.assertEqual(operator.length_hint(repeat(None, times=-1)), 0)
1884 self.assertEqual(operator.length_hint(repeat(None, times=-2)), 0)
1885
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001886class RegressionTests(unittest.TestCase):
1887
1888 def test_sf_793826(self):
1889 # Fix Armin Rigo's successful efforts to wreak havoc
1890
1891 def mutatingtuple(tuple1, f, tuple2):
1892 # this builds a tuple t which is a copy of tuple1,
1893 # then calls f(t), then mutates t to be equal to tuple2
1894 # (needs len(tuple1) == len(tuple2)).
1895 def g(value, first=[1]):
1896 if first:
1897 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001898 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001899 return value
1900 items = list(tuple2)
1901 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001902 gen = map(g, items)
1903 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001904 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001905
1906 def f(t):
1907 global T
1908 T = t
1909 first[:] = list(T)
1910
1911 first = []
1912 mutatingtuple((1,2,3), f, (4,5,6))
1913 second = list(T)
1914 self.assertEqual(first, second)
1915
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001916
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001917 def test_sf_950057(self):
1918 # Make sure that chain() and cycle() catch exceptions immediately
1919 # rather than when shifting between input sources
1920
1921 def gen1():
1922 hist.append(0)
1923 yield 1
1924 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001925 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001926 hist.append(2)
1927
1928 def gen2(x):
1929 hist.append(3)
1930 yield 2
1931 hist.append(4)
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001932
1933 hist = []
1934 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1935 self.assertEqual(hist, [0,1])
1936
1937 hist = []
1938 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1939 self.assertEqual(hist, [0,1])
1940
1941 hist = []
1942 self.assertRaises(AssertionError, list, cycle(gen1()))
1943 self.assertEqual(hist, [0,1])
1944
Thomas Woutersb2137042007-02-01 18:02:27 +00001945class SubclassWithKwargsTest(unittest.TestCase):
1946 def test_keywords_in_subclass(self):
1947 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001948 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001949 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001950 class Subclass(cls):
1951 def __init__(self, newarg=None, *args):
1952 cls.__init__(self, *args)
1953 try:
1954 Subclass(newarg=1)
1955 except TypeError as err:
1956 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001957 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001958
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02001959@support.cpython_only
1960class SizeofTest(unittest.TestCase):
1961 def setUp(self):
1962 self.ssize_t = struct.calcsize('n')
1963
1964 check_sizeof = support.check_sizeof
1965
1966 def test_product_sizeof(self):
1967 basesize = support.calcobjsize('3Pi')
1968 check = self.check_sizeof
1969 check(product('ab', '12'), basesize + 2 * self.ssize_t)
1970 check(product(*(('abc',) * 10)), basesize + 10 * self.ssize_t)
1971
1972 def test_combinations_sizeof(self):
1973 basesize = support.calcobjsize('3Pni')
1974 check = self.check_sizeof
1975 check(combinations('abcd', 3), basesize + 3 * self.ssize_t)
1976 check(combinations(range(10), 4), basesize + 4 * self.ssize_t)
1977
1978 def test_combinations_with_replacement_sizeof(self):
1979 cwr = combinations_with_replacement
1980 basesize = support.calcobjsize('3Pni')
1981 check = self.check_sizeof
1982 check(cwr('abcd', 3), basesize + 3 * self.ssize_t)
1983 check(cwr(range(10), 4), basesize + 4 * self.ssize_t)
1984
1985 def test_permutations_sizeof(self):
1986 basesize = support.calcobjsize('4Pni')
1987 check = self.check_sizeof
1988 check(permutations('abcd'),
1989 basesize + 4 * self.ssize_t + 4 * self.ssize_t)
1990 check(permutations('abcd', 3),
1991 basesize + 4 * self.ssize_t + 3 * self.ssize_t)
1992 check(permutations('abcde', 3),
1993 basesize + 5 * self.ssize_t + 3 * self.ssize_t)
1994 check(permutations(range(10), 4),
1995 basesize + 10 * self.ssize_t + 4 * self.ssize_t)
1996
Thomas Woutersb2137042007-02-01 18:02:27 +00001997
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001998libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001999
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002000
2001>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002002>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00002003... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002004...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002005Check 1200 is for $120.15
2006Check 1201 is for $764.05
2007Check 1202 is for $823.14
2008
2009>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002010>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00002011... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002012...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000020131
20148
201527
2016
2017>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00002018>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00002019... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00002020...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002021Alex
2022Laura
2023Martin
2024Walter
2025Samuele
2026
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002027>>> from operator import itemgetter
2028>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002029>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00002030>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002031... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002032...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000020331 ['a', 'c', 'e']
20342 ['b', 'd', 'f']
20353 ['g']
2036
Raymond Hettinger734fb572004-01-20 20:04:40 +00002037# Find runs of consecutive numbers using groupby. The key to the solution
2038# is differencing with a range so that consecutive numbers all appear in
2039# same group.
2040>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002041>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002042... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002043...
Raymond Hettinger734fb572004-01-20 20:04:40 +00002044[1]
2045[4, 5, 6]
2046[10]
2047[15, 16, 17, 18]
2048[22]
2049[25, 26, 27, 28]
2050
Georg Brandl3dbca812008-07-23 16:10:53 +00002051>>> def take(n, iterable):
2052... "Return first n items of the iterable as a list"
2053... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00002054
Georg Brandl3dbca812008-07-23 16:10:53 +00002055>>> def enumerate(iterable, start=0):
2056... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002057
Georg Brandl3dbca812008-07-23 16:10:53 +00002058>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002059... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00002060... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002061
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00002062>>> def nth(iterable, n, default=None):
2063... "Returns the nth item or a default value"
2064... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00002065
Raymond Hettingere525ee32016-03-06 18:11:38 -08002066>>> def all_equal(iterable):
2067... "Returns True if all the elements are equal to each other"
2068... g = groupby(iterable)
2069... return next(g, True) and not next(g, False)
2070
Georg Brandl3dbca812008-07-23 16:10:53 +00002071>>> def quantify(iterable, pred=bool):
2072... "Count how many times the predicate is true"
2073... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00002074
Georg Brandl3dbca812008-07-23 16:10:53 +00002075>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002076... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00002077... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002078
Georg Brandl3dbca812008-07-23 16:10:53 +00002079>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02002080... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00002081... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002082
2083>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002084... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002085
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002086>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002087... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002088
2089>>> def repeatfunc(func, times=None, *args):
2090... "Repeat calls to func with specified arguments."
2091... " Example: repeatfunc(random.random)"
2092... if times is None:
2093... return starmap(func, repeat(args))
2094... else:
2095... return starmap(func, repeat(args, times))
2096
Raymond Hettingerd591f662003-10-26 15:34:50 +00002097>>> def pairwise(iterable):
2098... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
2099... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002100... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00002101... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00002102... except StopIteration:
2103... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002104... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002105
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002106>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002107... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002108... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00002109... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002110
2111>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00002112... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002113... # Recipe credited to George Sakkis
2114... pending = len(iterables)
2115... nexts = cycle(iter(it).__next__ for it in iterables)
2116... while pending:
2117... try:
2118... for next in nexts:
2119... yield next()
2120... except StopIteration:
2121... pending -= 1
2122... nexts = cycle(islice(nexts, pending))
2123
2124>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00002125... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
2126... s = list(iterable)
2127... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002128
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002129>>> def unique_everseen(iterable, key=None):
2130... "List unique elements, preserving order. Remember all elements ever seen."
2131... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
2132... # unique_everseen('ABBCcAD', str.lower) --> A B C D
2133... seen = set()
2134... seen_add = seen.add
2135... if key is None:
2136... for element in iterable:
2137... if element not in seen:
2138... seen_add(element)
2139... yield element
2140... else:
2141... for element in iterable:
2142... k = key(element)
2143... if k not in seen:
2144... seen_add(k)
2145... yield element
2146
2147>>> def unique_justseen(iterable, key=None):
2148... "List unique elements, preserving order. Remember only the element just seen."
2149... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
2150... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
2151... return map(next, map(itemgetter(1), groupby(iterable, key)))
2152
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002153>>> def first_true(iterable, default=False, pred=None):
2154... '''Returns the first true value in the iterable.
2155...
2156... If no true value is found, returns *default*
2157...
2158... If *pred* is not None, returns the first item
2159... for which pred(item) is true.
2160...
2161... '''
2162... # first_true([a,b,c], x) --> a or b or c or x
2163... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
2164... return next(filter(pred, iterable), default)
2165
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002166This is not part of the examples but it tests to make sure the definitions
2167perform as purported.
2168
Raymond Hettingera098b332003-09-08 23:58:40 +00002169>>> take(10, count())
2170[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2171
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002172>>> list(enumerate('abc'))
2173[(0, 'a'), (1, 'b'), (2, 'c')]
2174
2175>>> list(islice(tabulate(lambda x: 2*x), 4))
2176[0, 2, 4, 6]
2177
2178>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00002179'd'
2180
2181>>> nth('abcde', 9) is None
2182True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002183
Raymond Hettingere525ee32016-03-06 18:11:38 -08002184>>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')]
2185[True, True, True, False, False]
2186
Guido van Rossum805365e2007-05-07 22:24:25 +00002187>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000218850
2189
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002190>>> a = [[1, 2, 3], [4, 5, 6]]
2191>>> flatten(a)
2192[1, 2, 3, 4, 5, 6]
2193
2194>>> list(repeatfunc(pow, 5, 2, 3))
2195[8, 8, 8, 8, 8]
2196
2197>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002198>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002199[0, 0, 0, 0, 0]
2200
Raymond Hettingerd591f662003-10-26 15:34:50 +00002201>>> list(pairwise('abcd'))
2202[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002203
Raymond Hettingerd591f662003-10-26 15:34:50 +00002204>>> list(pairwise([]))
2205[]
2206
2207>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002208[]
2209
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002210>>> list(islice(padnone('abc'), 0, 6))
2211['a', 'b', 'c', None, None, None]
2212
2213>>> list(ncycles('abc', 3))
2214['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2215
2216>>> dotproduct([1,2,3], [4,5,6])
221732
2218
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002219>>> list(grouper(3, 'abcdefg', 'x'))
2220[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2221
2222>>> list(roundrobin('abc', 'd', 'ef'))
2223['a', 'd', 'e', 'b', 'f', 'c']
2224
Raymond Hettingerace67332009-01-26 02:23:50 +00002225>>> list(powerset([1,2,3]))
2226[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002227
Raymond Hettinger191e8502009-01-27 13:29:43 +00002228>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2229True
2230
2231>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2232True
2233
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002234>>> list(unique_everseen('AAAABBBCCDAABBB'))
2235['A', 'B', 'C', 'D']
2236
2237>>> list(unique_everseen('ABBCcAD', str.lower))
2238['A', 'B', 'C', 'D']
2239
2240>>> list(unique_justseen('AAAABBBCCDAABBB'))
2241['A', 'B', 'C', 'D', 'A', 'B']
2242
2243>>> list(unique_justseen('ABBCcAD', str.lower))
2244['A', 'B', 'C', 'A', 'D']
2245
Raymond Hettinger31b26f62014-04-02 03:16:42 -07002246>>> first_true('ABC0DEF1', '9', str.isdigit)
2247'0'
2248
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002249"""
2250
2251__test__ = {'libreftest' : libreftest}
2252
2253def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002254 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002255 RegressionTests, LengthTransparency,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002256 SubclassWithKwargsTest, TestExamples,
2257 SizeofTest)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002258 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002259
2260 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002261 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002262 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002263 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002264 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002265 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002266 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002267 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002268 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002269
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002270 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002271 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002272
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002273if __name__ == "__main__":
2274 test_main(verbose=True)