blob: 957991cc09edc97d0c5801933a2eaf1d18d36a74 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger8a882a72009-02-12 12:08:18 +00005from decimal import Decimal
Raymond Hettingerde09acf2009-02-12 12:53:53 +00006from fractions import Fraction
Raymond Hettinger2012f172003-02-07 05:32:58 +00007import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00009import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +000010import copy
11import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000012from functools import reduce
Benjamin Petersonee8712c2008-05-20 21:35:26 +000013maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000014minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015
Guido van Rossum801f0d72006-08-24 19:48:10 +000016def lzip(*args):
17 return list(zip(*args))
18
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000019def onearg(x):
20 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000021 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000022
23def errfunc(*args):
24 'Test function that raises an error'
25 raise ValueError
26
27def gen3():
28 'Non-restartable source sequence'
29 for i in (0, 1, 2):
30 yield i
31
32def isEven(x):
33 'Test predicate'
34 return x%2==0
35
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000036def isOdd(x):
37 'Test predicate'
38 return x%2==1
39
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000040class StopNow:
41 'Class emulating an empty iterable.'
42 def __iter__(self):
43 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000044 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000045 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000046
Raymond Hettinger02420702003-06-29 20:36:23 +000047def take(n, seq):
48 'Convenience function for partially consuming a long of infinite iterable'
49 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000050
Christian Heimes78644762008-03-04 23:39:23 +000051def prod(iterable):
52 return reduce(operator.mul, iterable, 1)
53
Christian Heimes380f7f22008-02-28 11:19:05 +000054def fact(n):
55 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000056 return prod(range(1, n+1))
57
Raymond Hettinger96ef8112003-02-01 00:10:11 +000058class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000059
60 def test_accumulate(self):
61 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +000062 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
63 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
64 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +000065 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +000066 self.assertEqual(
67 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +000068 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +000069 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +000070 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +000071 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -070072 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +000073 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +000074 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +000075 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
76
Raymond Hettinger5d446132011-03-27 18:52:10 -070077 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
78 self.assertEqual(list(accumulate(s, min)),
79 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
80 self.assertEqual(list(accumulate(s, max)),
81 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
82 self.assertEqual(list(accumulate(s, operator.mul)),
83 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
84 with self.assertRaises(TypeError):
85 list(accumulate(s, chr)) # unary-operation
86
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000087 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +000088
89 def chain2(*iterables):
90 'Pure python version in the docs'
91 for it in iterables:
92 for element in it:
93 yield element
94
95 for c in (chain, chain2):
96 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
97 self.assertEqual(list(c('abc')), list('abc'))
98 self.assertEqual(list(c('')), [])
99 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
100 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000101
102 def test_chain_from_iterable(self):
103 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
104 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
105 self.assertEqual(list(chain.from_iterable([''])), [])
106 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
107 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000108
Christian Heimes380f7f22008-02-28 11:19:05 +0000109 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000110 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000111 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000112 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000113 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000114 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Christian Heimes380f7f22008-02-28 11:19:05 +0000115 self.assertEqual(list(combinations(range(4), 3)),
116 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +0000117
118 def combinations1(iterable, r):
119 'Pure python version shown in the docs'
120 pool = tuple(iterable)
121 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000122 if r > n:
123 return
Christian Heimes78644762008-03-04 23:39:23 +0000124 indices = list(range(r))
125 yield tuple(pool[i] for i in indices)
126 while 1:
127 for i in reversed(range(r)):
128 if indices[i] != i + n - r:
129 break
130 else:
131 return
132 indices[i] += 1
133 for j in range(i+1, r):
134 indices[j] = indices[j-1] + 1
135 yield tuple(pool[i] for i in indices)
136
137 def combinations2(iterable, r):
138 'Pure python version shown in the docs'
139 pool = tuple(iterable)
140 n = len(pool)
141 for indices in permutations(range(n), r):
142 if sorted(indices) == list(indices):
143 yield tuple(pool[i] for i in indices)
144
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000145 def combinations3(iterable, r):
146 'Pure python version from cwr()'
147 pool = tuple(iterable)
148 n = len(pool)
149 for indices in combinations_with_replacement(range(n), r):
150 if len(set(indices)) == r:
151 yield tuple(pool[i] for i in indices)
152
Christian Heimes78644762008-03-04 23:39:23 +0000153 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000154 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000155 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000156 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000157 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 +0000158 self.assertEqual(len(result), len(set(result))) # no repeats
159 self.assertEqual(result, sorted(result)) # lexicographic order
160 for c in result:
161 self.assertEqual(len(c), r) # r-length combinations
162 self.assertEqual(len(set(c)), r) # no duplicate elements
163 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000164 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000165 self.assertEqual(list(c),
166 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000167 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000168 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000169 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000170
Alex Gaynore151d212011-07-17 16:21:30 -0700171 @support.impl_detail("tuple reuse is specific to CPython")
172 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000173 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
174 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
175
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000176 def test_combinations_with_replacement(self):
177 cwr = combinations_with_replacement
178 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
179 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
180 self.assertRaises(TypeError, cwr, None) # pool is not iterable
181 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
182 self.assertEqual(list(cwr('ABC', 2)),
183 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
184
185 def cwr1(iterable, r):
186 'Pure python version shown in the docs'
187 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
188 pool = tuple(iterable)
189 n = len(pool)
190 if not n and r:
191 return
192 indices = [0] * r
193 yield tuple(pool[i] for i in indices)
194 while 1:
195 for i in reversed(range(r)):
196 if indices[i] != n - 1:
197 break
198 else:
199 return
200 indices[i:] = [indices[i] + 1] * (r - i)
201 yield tuple(pool[i] for i in indices)
202
203 def cwr2(iterable, r):
204 'Pure python version shown in the docs'
205 pool = tuple(iterable)
206 n = len(pool)
207 for indices in product(range(n), repeat=r):
208 if sorted(indices) == list(indices):
209 yield tuple(pool[i] for i in indices)
210
211 def numcombs(n, r):
212 if not n:
213 return 0 if r else 1
214 return fact(n+r-1) / fact(r)/ fact(n-1)
215
216 for n in range(7):
217 values = [5*x-12 for x in range(n)]
218 for r in range(n+2):
219 result = list(cwr(values, r))
220
221 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
222 self.assertEqual(len(result), len(set(result))) # no repeats
223 self.assertEqual(result, sorted(result)) # lexicographic order
224
225 regular_combs = list(combinations(values, r)) # compare to combs without replacement
226 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000227 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000228 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000229 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000230
231 for c in result:
232 self.assertEqual(len(c), r) # r-length combinations
233 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
234 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
235 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000236 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000237 self.assertEqual(noruns,
238 [e for e in values if e in c]) # comb is a subsequence of the input iterable
239 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
240 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
241
Alex Gaynore151d212011-07-17 16:21:30 -0700242 @support.impl_detail("tuple reuse is specific to CPython")
243 def test_combinations_with_replacement_tuple_reuse(self):
244 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000245 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
246 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
247
Christian Heimes78644762008-03-04 23:39:23 +0000248 def test_permutations(self):
249 self.assertRaises(TypeError, permutations) # too few arguments
250 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000251 self.assertRaises(TypeError, permutations, None) # pool is not iterable
252 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000253 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000254 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000255 self.assertEqual(list(permutations(range(3), 2)),
256 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
257
258 def permutations1(iterable, r=None):
259 'Pure python version shown in the docs'
260 pool = tuple(iterable)
261 n = len(pool)
262 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000263 if r > n:
264 return
Christian Heimes78644762008-03-04 23:39:23 +0000265 indices = list(range(n))
266 cycles = list(range(n-r+1, n+1))[::-1]
267 yield tuple(pool[i] for i in indices[:r])
268 while n:
269 for i in reversed(range(r)):
270 cycles[i] -= 1
271 if cycles[i] == 0:
272 indices[i:] = indices[i+1:] + indices[i:i+1]
273 cycles[i] = n - i
274 else:
275 j = cycles[i]
276 indices[i], indices[-j] = indices[-j], indices[i]
277 yield tuple(pool[i] for i in indices[:r])
278 break
279 else:
280 return
281
282 def permutations2(iterable, r=None):
283 'Pure python version shown in the docs'
284 pool = tuple(iterable)
285 n = len(pool)
286 r = n if r is None else r
287 for indices in product(range(n), repeat=r):
288 if len(set(indices)) == r:
289 yield tuple(pool[i] for i in indices)
290
291 for n in range(7):
292 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000293 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000294 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000295 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 +0000296 self.assertEqual(len(result), len(set(result))) # no repeats
297 self.assertEqual(result, sorted(result)) # lexicographic order
298 for p in result:
299 self.assertEqual(len(p), r) # r-length permutations
300 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000301 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000302 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000303 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000304 if r == n:
305 self.assertEqual(result, list(permutations(values, None))) # test r as None
306 self.assertEqual(result, list(permutations(values))) # test default r
307
Alex Gaynore151d212011-07-17 16:21:30 -0700308 @support.impl_detail("tuple resuse is CPython specific")
309 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000310 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000311 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000312
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000313 def test_combinatorics(self):
314 # Test relationships between product(), permutations(),
315 # combinations() and combinations_with_replacement().
316
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000317 for n in range(6):
318 s = 'ABCDEFG'[:n]
319 for r in range(8):
320 prod = list(product(s, repeat=r))
321 cwr = list(combinations_with_replacement(s, r))
322 perm = list(permutations(s, r))
323 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000324
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000325 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000326 self.assertEqual(len(prod), n**r)
327 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
328 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
329 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000330
331 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000332 self.assertEqual(prod, sorted(set(prod)))
333 self.assertEqual(cwr, sorted(set(cwr)))
334 self.assertEqual(perm, sorted(set(perm)))
335 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000336
337 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000338 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
339 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 +0000340 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
341 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
342 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
343 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
344 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000345
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000346 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000347 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000348 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
349 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
350 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
351 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
352 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
353 n = 10000
354 data = chain.from_iterable(repeat(range(6), n))
355 selectors = chain.from_iterable(repeat((0, 1)))
356 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
357 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
358 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
359 self.assertRaises(TypeError, compress, range(6)) # too few args
360 self.assertRaises(TypeError, compress, range(6), None) # too many args
361
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000362 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000363 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
364 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
365 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000366 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
367 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000368 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000369 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000370 self.assertEqual(list(islice(count(maxsize-5), 10)),
371 list(range(maxsize-5, maxsize+5)))
372 self.assertEqual(list(islice(count(-maxsize-5), 10)),
373 list(range(-maxsize-5, -maxsize+5)))
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000374 self.assertEqual(list(islice(count(10, maxsize+5), 3)),
375 list(range(10, 10+3*(maxsize+5), maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000376 c = count(3)
377 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000378 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000379 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000380 c = count(-9)
381 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000382 next(c)
Raymond Hettinger30729212009-02-12 06:28:27 +0000383 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000384 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000385 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000386 # Test repr (ignoring the L in longs)
387 r1 = repr(count(i)).replace('L', '')
388 r2 = 'count(%r)'.__mod__(i).replace('L', '')
389 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000390
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000391 # check copy, deepcopy, pickle
392 for value in -3, 3, maxsize-5, maxsize+5:
393 c = count(value)
394 self.assertEqual(next(copy.copy(c)), value)
395 self.assertEqual(next(copy.deepcopy(c)), value)
396 self.assertEqual(next(pickle.loads(pickle.dumps(c))), value)
397
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000398 #check proper internal error handling for large "step' sizes
399 count(1, maxsize+5); sys.exc_info()
400
Raymond Hettinger30729212009-02-12 06:28:27 +0000401 def test_count_with_stride(self):
402 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000403 self.assertEqual(lzip('abc',count(start=2,step=3)),
404 [('a', 2), ('b', 5), ('c', 8)])
405 self.assertEqual(lzip('abc',count(step=-1)),
406 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000407 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
408 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000409 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000410 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
411 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
412 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000413 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
414 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000415 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
416 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000417 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
418 c = count(3, 5)
419 self.assertEqual(repr(c), 'count(3, 5)')
420 next(c)
421 self.assertEqual(repr(c), 'count(8, 5)')
422 c = count(-9, 0)
423 self.assertEqual(repr(c), 'count(-9, 0)')
424 next(c)
425 self.assertEqual(repr(c), 'count(-9, 0)')
426 c = count(-9, -3)
427 self.assertEqual(repr(c), 'count(-9, -3)')
428 next(c)
429 self.assertEqual(repr(c), 'count(-12, -3)')
430 self.assertEqual(repr(c), 'count(-12, -3)')
431 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
432 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
433 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
434 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
435 for j in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 1, 10, sys.maxsize-5, sys.maxsize+5):
436 # Test repr (ignoring the L in longs)
437 r1 = repr(count(i, j)).replace('L', '')
438 if j == 1:
439 r2 = ('count(%r)' % i).replace('L', '')
440 else:
441 r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
442 self.assertEqual(r1, r2)
443
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000444 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000445 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000446 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000447 self.assertRaises(TypeError, cycle)
448 self.assertRaises(TypeError, cycle, 5)
449 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000450
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000451 def test_groupby(self):
452 # Check whether it accepts arguments correctly
453 self.assertEqual([], list(groupby([])))
454 self.assertEqual([], list(groupby([], key=id)))
455 self.assertRaises(TypeError, list, groupby('abc', []))
456 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000457 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000458
459 # Check normal input
460 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
461 (2,15,22), (3,16,23), (3,17,23)]
462 dup = []
463 for k, g in groupby(s, lambda r:r[0]):
464 for elem in g:
465 self.assertEqual(k, elem[0])
466 dup.append(elem)
467 self.assertEqual(s, dup)
468
469 # Check nested case
470 dup = []
471 for k, g in groupby(s, lambda r:r[0]):
472 for ik, ig in groupby(g, lambda r:r[2]):
473 for elem in ig:
474 self.assertEqual(k, elem[0])
475 self.assertEqual(ik, elem[2])
476 dup.append(elem)
477 self.assertEqual(s, dup)
478
479 # Check case where inner iterator is not used
480 keys = [k for k, g in groupby(s, lambda r:r[0])]
481 expectedkeys = set([r[0] for r in s])
482 self.assertEqual(set(keys), expectedkeys)
483 self.assertEqual(len(keys), len(expectedkeys))
484
485 # Exercise pipes and filters style
486 s = 'abracadabra'
487 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000488 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000489 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
490 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000491 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000492 self.assertEqual(r, ['a', 'b', 'r'])
493 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000494 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000495 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
496 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000497 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000498 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
499
Georg Brandla18af4e2007-04-21 15:47:16 +0000500 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000501 class ExpectedError(Exception):
502 pass
503 def delayed_raise(n=0):
504 for i in range(n):
505 yield 'yo'
506 raise ExpectedError
507 def gulp(iterable, keyp=None, func=list):
508 return [func(g) for k, g in groupby(iterable, keyp)]
509
Georg Brandla18af4e2007-04-21 15:47:16 +0000510 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000511 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000512 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000513 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
514
515 # __cmp__ failure
516 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000517 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000518 raise ExpectedError
519 s = [DummyCmp(), DummyCmp(), None]
520
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000521 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000522 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000523 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000524 self.assertRaises(ExpectedError, gulp, s)
525
526 # keyfunc failure
527 def keyfunc(obj):
528 if keyfunc.skip > 0:
529 keyfunc.skip -= 1
530 return obj
531 else:
532 raise ExpectedError
533
534 # keyfunc failure on outer object
535 keyfunc.skip = 0
536 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
537 keyfunc.skip = 1
538 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
539
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000540 def test_filter(self):
541 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
542 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
543 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
544 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
545 self.assertRaises(TypeError, filter)
546 self.assertRaises(TypeError, filter, lambda x:x)
547 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
548 self.assertRaises(TypeError, filter, isEven, 3)
549 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000550
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000551 def test_filterfalse(self):
552 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
553 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
554 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
555 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
556 self.assertRaises(TypeError, filterfalse)
557 self.assertRaises(TypeError, filterfalse, lambda x:x)
558 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
559 self.assertRaises(TypeError, filterfalse, isEven, 3)
560 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000561
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000562 def test_zip(self):
563 # XXX This is rather silly now that builtin zip() calls zip()...
564 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000565 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000566 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
567 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
568 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
569 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
570 self.assertEqual(list(zip()), lzip())
571 self.assertRaises(TypeError, zip, 3)
572 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000573 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000574 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000575 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000576 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700577
578 @support.impl_detail("tuple reuse is specific to CPython")
579 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000580 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000581 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000582 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000583 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000584
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000585 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000586 for args in [
587 ['abc', range(6)],
588 [range(6), 'abc'],
589 [range(1000), range(2000,2100), range(3000,3050)],
590 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
591 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
592 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000593 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
594 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000595 self.assertEqual(list(zip_longest(*args)), target)
596 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000597 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 +0000598 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000599
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000600 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 +0000601
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000602 self.assertEqual(list(zip_longest()), list(zip()))
603 self.assertEqual(list(zip_longest([])), list(zip([])))
604 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000605
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000606 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000607 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000608 self.assertRaises(TypeError, zip_longest, 3)
609 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000610
611 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000612 "zip_longest('abc', fv=1)",
613 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000614 ]:
615 try:
616 eval(stmt, globals(), locals())
617 except TypeError:
618 pass
619 else:
620 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000621
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000622 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000623 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000624 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000625 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700626
627 @support.impl_detail("tuple reuse is specific to CPython")
628 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000629 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000630 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000631 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000632 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
633
Raymond Hettingerfc438512009-11-01 20:55:33 +0000634 def test_bug_7244(self):
635
636 class Repeater:
637 # this class is similar to itertools.repeat
638 def __init__(self, o, t, e):
639 self.o = o
640 self.t = int(t)
641 self.e = e
642 def __iter__(self): # its iterator is itself
643 return self
644 def __next__(self):
645 if self.t > 0:
646 self.t -= 1
647 return self.o
648 else:
649 raise self.e
650
651 # Formerly this code in would fail in debug mode
652 # with Undetected Error and Stop Iteration
653 r1 = Repeater(1, 3, StopIteration)
654 r2 = Repeater(2, 4, StopIteration)
655 def run(r1, r2):
656 result = []
657 for i, j in zip_longest(r1, r2, fillvalue=0):
658 with support.captured_output('stdout'):
659 print((i, j))
660 result.append((i, j))
661 return result
662 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
663
664 # Formerly, the RuntimeError would be lost
665 # and StopIteration would stop as expected
666 r1 = Repeater(1, 3, RuntimeError)
667 r2 = Repeater(2, 4, StopIteration)
668 it = zip_longest(r1, r2, fillvalue=0)
669 self.assertEqual(next(it), (1, 2))
670 self.assertEqual(next(it), (1, 2))
671 self.assertEqual(next(it), (1, 2))
672 self.assertRaises(RuntimeError, next, it)
673
Christian Heimesc3f30c42008-02-22 16:37:40 +0000674 def test_product(self):
675 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000676 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000677 (['ab'], [('a',), ('b',)]), # one iterable
678 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
679 ([range(0), range(2), range(3)], []), # first iterable with zero length
680 ([range(2), range(0), range(3)], []), # middle iterable with zero length
681 ([range(2), range(3), range(0)], []), # last iterable with zero length
682 ]:
683 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000684 for r in range(4):
685 self.assertEqual(list(product(*(args*r))),
686 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000687 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
688 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000689
690 def product1(*args, **kwds):
691 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
692 n = len(pools)
693 if n == 0:
694 yield ()
695 return
696 if any(len(pool) == 0 for pool in pools):
697 return
698 indices = [0] * n
699 yield tuple(pool[i] for pool, i in zip(pools, indices))
700 while 1:
701 for i in reversed(range(n)): # right to left
702 if indices[i] == len(pools[i]) - 1:
703 continue
704 indices[i] += 1
705 for j in range(i+1, n):
706 indices[j] = 0
707 yield tuple(pool[i] for pool, i in zip(pools, indices))
708 break
709 else:
710 return
711
712 def product2(*args, **kwds):
713 'Pure python version used in docs'
714 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
715 result = [[]]
716 for pool in pools:
717 result = [x+[y] for x in result for y in pool]
718 for prod in result:
719 yield tuple(prod)
720
Christian Heimesc3f30c42008-02-22 16:37:40 +0000721 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
722 set('abcdefg'), range(11), tuple(range(13))]
723 for i in range(100):
724 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000725 expected_len = prod(map(len, args))
726 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000727 self.assertEqual(list(product(*args)), list(product1(*args)))
728 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000729 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000730 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000731
Alex Gaynore151d212011-07-17 16:21:30 -0700732 @support.impl_detail("tuple reuse is specific to CPython")
733 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000734 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
735 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000736
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000737 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +0000738 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +0000739 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000740 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000741 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000742 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000743 self.assertEqual(list(repeat('a', 0)), [])
744 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000745 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000746 self.assertRaises(TypeError, repeat, None, 3, 4)
747 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000748 r = repeat(1+0j)
749 self.assertEqual(repr(r), 'repeat((1+0j))')
750 r = repeat(1+0j, 5)
751 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
752 list(r)
753 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000754
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000755 def test_map(self):
756 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000757 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000758 def tupleize(*args):
759 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000760 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000761 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000762 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000763 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000764 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000765 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000766 self.assertEqual(list(map(operator.pow, [])), [])
767 self.assertRaises(TypeError, map)
768 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
769 self.assertRaises(TypeError, map, operator.neg)
770 self.assertRaises(TypeError, next, map(10, range(5)))
771 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
772 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000773
774 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000775 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
776 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000777 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000778 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000779 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000780 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
781 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000782 self.assertRaises(TypeError, starmap)
783 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000784 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
785 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
786 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000787
788 def test_islice(self):
789 for args in [ # islice(args) should agree with range(args)
790 (10, 20, 3),
791 (10, 3, 20),
792 (10, 20),
793 (10, 3),
794 (20,)
795 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000796 self.assertEqual(list(islice(range(100), *args)),
797 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000798
799 for args, tgtargs in [ # Stop when seqn is exhausted
800 ((10, 110, 3), ((10, 100, 3))),
801 ((10, 110), ((10, 100))),
802 ((110,), (100,))
803 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000804 self.assertEqual(list(islice(range(100), *args)),
805 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000806
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000807 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000808 self.assertEqual(list(islice(range(10), None)), list(range(10)))
809 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
810 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
811 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
812 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000813
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000814 # Test number of items consumed SF #1171417
815 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000816 self.assertEqual(list(islice(it, 3)), list(range(3)))
817 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000818
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000819 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000820 self.assertRaises(TypeError, islice, range(10))
821 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
822 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
823 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
824 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
825 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
826 self.assertRaises(ValueError, islice, range(10), 'a')
827 self.assertRaises(ValueError, islice, range(10), 'a', 1)
828 self.assertRaises(ValueError, islice, range(10), 1, 'a')
829 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
830 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000831 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000832
Raymond Hettinger69b34bf2010-11-30 02:49:29 +0000833 # Issue #10323: Less islice in a predictable state
834 c = count()
835 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
836 self.assertEqual(next(c), 3)
837
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838 def test_takewhile(self):
839 data = [1, 3, 5, 20, 2, 4, 6, 8]
840 underten = lambda x: x<10
841 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000842 self.assertEqual(list(takewhile(underten, [])), [])
843 self.assertRaises(TypeError, takewhile)
844 self.assertRaises(TypeError, takewhile, operator.pow)
845 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000846 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
847 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000848 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
849 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000850 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000851
852 def test_dropwhile(self):
853 data = [1, 3, 5, 20, 2, 4, 6, 8]
854 underten = lambda x: x<10
855 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000856 self.assertEqual(list(dropwhile(underten, [])), [])
857 self.assertRaises(TypeError, dropwhile)
858 self.assertRaises(TypeError, dropwhile, operator.pow)
859 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000860 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
861 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000862
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000863 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000864 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000865 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000866 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000867 yield i
868
869 a, b = tee([]) # test empty iterator
870 self.assertEqual(list(a), [])
871 self.assertEqual(list(b), [])
872
873 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000874 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000875
876 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000877 self.assertEqual(list(a), list(range(n)))
878 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000879
880 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000881 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000882 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000883 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000884 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000885
886 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000887 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000888 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000889 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000890 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000891
Guido van Rossum805365e2007-05-07 22:24:25 +0000892 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000893 order = [0]*n + [1]*n
894 random.shuffle(order)
895 lists = ([], [])
896 its = tee(irange(n))
897 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000898 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000899 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000900 self.assertEqual(lists[0], list(range(n)))
901 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000902
Raymond Hettingerad983e72003-11-12 14:32:26 +0000903 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000904 self.assertRaises(TypeError, tee)
905 self.assertRaises(TypeError, tee, 3)
906 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000907 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000908
Raymond Hettingerad983e72003-11-12 14:32:26 +0000909 # tee object should be instantiable
910 a, b = tee('abc')
911 c = type(a)('def')
912 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000913
Raymond Hettingerad983e72003-11-12 14:32:26 +0000914 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000915 a, b, c = tee(range(2000), 3)
916 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000917 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000918 self.assertEqual(list(b), list(range(2000)))
919 self.assertEqual([next(c), next(c)], list(range(2)))
920 self.assertEqual(list(a), list(range(100,2000)))
921 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000922
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000923 # test values of n
924 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000926 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000927 result = tee('abc', n)
928 self.assertEqual(type(result), tuple)
929 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000930 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000931
Raymond Hettingerad983e72003-11-12 14:32:26 +0000932 # tee pass-through to copyable iterator
933 a, b = tee('abc')
934 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000935 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000936
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000937 # test tee_new
938 t1, t2 = tee('abc')
939 tnew = type(t1)
940 self.assertRaises(TypeError, tnew)
941 self.assertRaises(TypeError, tnew, 10)
942 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000943 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000944
Raymond Hettingera9f60922004-10-17 16:40:14 +0000945 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000946 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000947 p = proxy(a)
948 self.assertEqual(getattr(p, '__class__'), type(b))
949 del a
950 self.assertRaises(ReferenceError, getattr, p, '__class__')
951
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000952 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000953 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000954
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000955 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000956 self.assertRaises(StopIteration, next, f([]))
957 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000958
Georg Brandla18af4e2007-04-21 15:47:16 +0000959 self.assertRaises(StopIteration, next, islice([], None))
960 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000961
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000962 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000963 self.assertRaises(StopIteration, next, p)
964 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000965 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000966 self.assertRaises(StopIteration, next, p)
967 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000968
Georg Brandla18af4e2007-04-21 15:47:16 +0000969 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000970
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000971 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000972 self.assertRaises(StopIteration, next, f(lambda x:x, []))
973 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000974
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000975class TestExamples(unittest.TestCase):
976
Raymond Hettinger482ba772010-12-01 22:48:00 +0000977 def test_accumlate(self):
978 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
979
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000980 def test_chain(self):
981 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
982
983 def test_chain_from_iterable(self):
984 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
985
986 def test_combinations(self):
987 self.assertEqual(list(combinations('ABCD', 2)),
988 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
989 self.assertEqual(list(combinations(range(4), 3)),
990 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
991
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000992 def test_combinations_with_replacement(self):
993 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
994 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
995
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000996 def test_compress(self):
997 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
998
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000999 def test_count(self):
1000 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1001
1002 def test_cycle(self):
1003 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1004
1005 def test_dropwhile(self):
1006 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1007
1008 def test_groupby(self):
1009 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1010 list('ABCDAB'))
1011 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1012 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1013
1014 def test_filter(self):
1015 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1016
1017 def test_filterfalse(self):
1018 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1019
1020 def test_map(self):
1021 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1022
1023 def test_islice(self):
1024 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1025 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1026 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1027 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1028
1029 def test_zip(self):
1030 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1031
1032 def test_zip_longest(self):
1033 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1034 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1035
1036 def test_permutations(self):
1037 self.assertEqual(list(permutations('ABCD', 2)),
1038 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1039 self.assertEqual(list(permutations(range(3))),
1040 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1041
1042 def test_product(self):
1043 self.assertEqual(list(product('ABCD', 'xy')),
1044 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1045 self.assertEqual(list(product(range(2), repeat=3)),
1046 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1047 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1048
1049 def test_repeat(self):
1050 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1051
1052 def test_stapmap(self):
1053 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1054 [32, 9, 1000])
1055
1056 def test_takewhile(self):
1057 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1058
1059
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001060class TestGC(unittest.TestCase):
1061
1062 def makecycle(self, iterator, container):
1063 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001064 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001065 del container, iterator
1066
Raymond Hettinger482ba772010-12-01 22:48:00 +00001067 def test_accumulate(self):
1068 a = []
1069 self.makecycle(accumulate([1,2,a,3]), a)
1070
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001071 def test_chain(self):
1072 a = []
1073 self.makecycle(chain(a), a)
1074
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001075 def test_chain_from_iterable(self):
1076 a = []
1077 self.makecycle(chain.from_iterable([a]), a)
1078
1079 def test_combinations(self):
1080 a = []
1081 self.makecycle(combinations([1,2,a,3], 3), a)
1082
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001083 def test_combinations_with_replacement(self):
1084 a = []
1085 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1086
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001087 def test_compress(self):
1088 a = []
1089 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1090
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001091 def test_count(self):
1092 a = []
1093 Int = type('Int', (int,), dict(x=a))
1094 self.makecycle(count(Int(0), Int(1)), a)
1095
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001096 def test_cycle(self):
1097 a = []
1098 self.makecycle(cycle([a]*2), a)
1099
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001100 def test_dropwhile(self):
1101 a = []
1102 self.makecycle(dropwhile(bool, [0, a, a]), a)
1103
1104 def test_groupby(self):
1105 a = []
1106 self.makecycle(groupby([a]*2, lambda x:x), a)
1107
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001108 def test_issue2246(self):
1109 # Issue 2246 -- the _grouper iterator was not included in GC
1110 n = 10
1111 keyfunc = lambda x: x
1112 for i, j in groupby(range(n), key=keyfunc):
1113 keyfunc.__dict__.setdefault('x',[]).append(j)
1114
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001115 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001116 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001117 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001118
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001119 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001120 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001121 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001122
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001123 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001124 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001125 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001126
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001127 def test_zip_longest(self):
1128 a = []
1129 self.makecycle(zip_longest([a]*2, [a]*3), a)
1130 b = [a, None]
1131 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1132
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001133 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001134 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001135 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001136
1137 def test_islice(self):
1138 a = []
1139 self.makecycle(islice([a]*2, None), a)
1140
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001141 def test_permutations(self):
1142 a = []
1143 self.makecycle(permutations([1,2,a,3], 3), a)
1144
1145 def test_product(self):
1146 a = []
1147 self.makecycle(product([1,2,a,3], repeat=3), a)
1148
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001149 def test_repeat(self):
1150 a = []
1151 self.makecycle(repeat(a), a)
1152
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001153 def test_starmap(self):
1154 a = []
1155 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1156
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001157 def test_takewhile(self):
1158 a = []
1159 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1160
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001161def R(seqn):
1162 'Regular generator'
1163 for i in seqn:
1164 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001165
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001166class G:
1167 'Sequence using __getitem__'
1168 def __init__(self, seqn):
1169 self.seqn = seqn
1170 def __getitem__(self, i):
1171 return self.seqn[i]
1172
1173class I:
1174 'Sequence using iterator protocol'
1175 def __init__(self, seqn):
1176 self.seqn = seqn
1177 self.i = 0
1178 def __iter__(self):
1179 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001180 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001181 if self.i >= len(self.seqn): raise StopIteration
1182 v = self.seqn[self.i]
1183 self.i += 1
1184 return v
1185
1186class Ig:
1187 'Sequence using iterator protocol defined with a generator'
1188 def __init__(self, seqn):
1189 self.seqn = seqn
1190 self.i = 0
1191 def __iter__(self):
1192 for val in self.seqn:
1193 yield val
1194
1195class X:
1196 'Missing __getitem__ and __iter__'
1197 def __init__(self, seqn):
1198 self.seqn = seqn
1199 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001200 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001201 if self.i >= len(self.seqn): raise StopIteration
1202 v = self.seqn[self.i]
1203 self.i += 1
1204 return v
1205
1206class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001207 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001208 def __init__(self, seqn):
1209 self.seqn = seqn
1210 self.i = 0
1211 def __iter__(self):
1212 return self
1213
1214class E:
1215 'Test propagation of exceptions'
1216 def __init__(self, seqn):
1217 self.seqn = seqn
1218 self.i = 0
1219 def __iter__(self):
1220 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001221 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001222 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001223
1224class S:
1225 'Test immediate stop'
1226 def __init__(self, seqn):
1227 pass
1228 def __iter__(self):
1229 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001230 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001231 raise StopIteration
1232
1233def L(seqn):
1234 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001235 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001236
1237
1238class TestVariousIteratorArgs(unittest.TestCase):
1239
Raymond Hettinger482ba772010-12-01 22:48:00 +00001240 def test_accumulate(self):
1241 s = [1,2,3,4,5]
1242 r = [1,3,6,10,15]
1243 n = len(s)
1244 for g in (G, I, Ig, L, R):
1245 self.assertEqual(list(accumulate(g(s))), r)
1246 self.assertEqual(list(accumulate(S(s))), [])
1247 self.assertRaises(TypeError, accumulate, X(s))
1248 self.assertRaises(TypeError, accumulate, N(s))
1249 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1250
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001251 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001252 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001253 for g in (G, I, Ig, S, L, R):
1254 self.assertEqual(list(chain(g(s))), list(g(s)))
1255 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001256 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001257 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001258 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1259
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001260 def test_compress(self):
1261 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1262 n = len(s)
1263 for g in (G, I, Ig, S, L, R):
1264 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1265 self.assertRaises(TypeError, compress, X(s), repeat(1))
1266 self.assertRaises(TypeError, compress, N(s), repeat(1))
1267 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1268
Christian Heimesc3f30c42008-02-22 16:37:40 +00001269 def test_product(self):
1270 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1271 self.assertRaises(TypeError, product, X(s))
1272 self.assertRaises(TypeError, product, N(s))
1273 self.assertRaises(ZeroDivisionError, product, E(s))
1274
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001275 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001276 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001277 for g in (G, I, Ig, S, L, R):
1278 tgtlen = len(s) * 3
1279 expected = list(g(s))*3
1280 actual = list(islice(cycle(g(s)), tgtlen))
1281 self.assertEqual(actual, expected)
1282 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001283 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001284 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1285
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001286 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001287 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001288 for g in (G, I, Ig, S, L, R):
1289 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1290 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001291 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001292 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1293
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001294 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001295 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001296 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001297 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001298 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001299 self.assertRaises(TypeError, filter, isEven, X(s))
1300 self.assertRaises(TypeError, filter, isEven, N(s))
1301 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001302
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001303 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001304 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001305 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001306 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001307 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001308 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1309 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1310 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001311
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001312 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001313 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001314 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001315 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1316 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1317 self.assertRaises(TypeError, zip, X(s))
1318 self.assertRaises(TypeError, zip, N(s))
1319 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001320
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001321 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001322 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001323 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001324 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1325 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1326 self.assertRaises(TypeError, zip_longest, X(s))
1327 self.assertRaises(TypeError, zip_longest, N(s))
1328 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001329
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001330 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001331 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001332 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001333 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001334 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001335 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001336 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001337 self.assertRaises(TypeError, map, onearg, X(s))
1338 self.assertRaises(TypeError, map, onearg, N(s))
1339 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001340
1341 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001342 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001343 for g in (G, I, Ig, S, L, R):
1344 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1345 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001346 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001347 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1348
1349 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001350 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001351 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001352 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001353 self.assertEqual(list(starmap(operator.pow, g(ss))),
1354 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001355 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001356 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001357 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1358
1359 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001360 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001361 for g in (G, I, Ig, S, L, R):
1362 tgt = []
1363 for elem in g(s):
1364 if not isEven(elem): break
1365 tgt.append(elem)
1366 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1367 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001368 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001369 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1370
1371 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001372 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001373 for g in (G, I, Ig, S, L, R):
1374 tgt = []
1375 for elem in g(s):
1376 if not tgt and isOdd(elem): continue
1377 tgt.append(elem)
1378 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1379 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001380 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001381 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1382
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001383 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001384 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001385 for g in (G, I, Ig, S, L, R):
1386 it1, it2 = tee(g(s))
1387 self.assertEqual(list(it1), list(g(s)))
1388 self.assertEqual(list(it2), list(g(s)))
1389 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001390 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001391 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1392
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001393class LengthTransparency(unittest.TestCase):
1394
1395 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001396 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001397 self.assertEqual(len(repeat(None, 50)), 50)
1398 self.assertRaises(TypeError, len, repeat(None))
1399
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001400class RegressionTests(unittest.TestCase):
1401
1402 def test_sf_793826(self):
1403 # Fix Armin Rigo's successful efforts to wreak havoc
1404
1405 def mutatingtuple(tuple1, f, tuple2):
1406 # this builds a tuple t which is a copy of tuple1,
1407 # then calls f(t), then mutates t to be equal to tuple2
1408 # (needs len(tuple1) == len(tuple2)).
1409 def g(value, first=[1]):
1410 if first:
1411 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001412 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001413 return value
1414 items = list(tuple2)
1415 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001416 gen = map(g, items)
1417 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001418 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001419
1420 def f(t):
1421 global T
1422 T = t
1423 first[:] = list(T)
1424
1425 first = []
1426 mutatingtuple((1,2,3), f, (4,5,6))
1427 second = list(T)
1428 self.assertEqual(first, second)
1429
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001430
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001431 def test_sf_950057(self):
1432 # Make sure that chain() and cycle() catch exceptions immediately
1433 # rather than when shifting between input sources
1434
1435 def gen1():
1436 hist.append(0)
1437 yield 1
1438 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001439 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001440 hist.append(2)
1441
1442 def gen2(x):
1443 hist.append(3)
1444 yield 2
1445 hist.append(4)
1446 if x:
1447 raise StopIteration
1448
1449 hist = []
1450 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1451 self.assertEqual(hist, [0,1])
1452
1453 hist = []
1454 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1455 self.assertEqual(hist, [0,1])
1456
1457 hist = []
1458 self.assertRaises(AssertionError, list, cycle(gen1()))
1459 self.assertEqual(hist, [0,1])
1460
Thomas Woutersb2137042007-02-01 18:02:27 +00001461class SubclassWithKwargsTest(unittest.TestCase):
1462 def test_keywords_in_subclass(self):
1463 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001464 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001465 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001466 class Subclass(cls):
1467 def __init__(self, newarg=None, *args):
1468 cls.__init__(self, *args)
1469 try:
1470 Subclass(newarg=1)
1471 except TypeError as err:
1472 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001473 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001474
1475
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001476libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001477
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001478
1479>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001480>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001481... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001482...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001483Check 1200 is for $120.15
1484Check 1201 is for $764.05
1485Check 1202 is for $823.14
1486
1487>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001488>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001489... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001490...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000014911
14928
149327
1494
1495>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001496>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001497... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001499Alex
1500Laura
1501Martin
1502Walter
1503Samuele
1504
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001505>>> from operator import itemgetter
1506>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001507>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001508>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001509... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001510...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000015111 ['a', 'c', 'e']
15122 ['b', 'd', 'f']
15133 ['g']
1514
Raymond Hettinger734fb572004-01-20 20:04:40 +00001515# Find runs of consecutive numbers using groupby. The key to the solution
1516# is differencing with a range so that consecutive numbers all appear in
1517# same group.
1518>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001519>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001520... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001521...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001522[1]
1523[4, 5, 6]
1524[10]
1525[15, 16, 17, 18]
1526[22]
1527[25, 26, 27, 28]
1528
Georg Brandl3dbca812008-07-23 16:10:53 +00001529>>> def take(n, iterable):
1530... "Return first n items of the iterable as a list"
1531... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001532
Georg Brandl3dbca812008-07-23 16:10:53 +00001533>>> def enumerate(iterable, start=0):
1534... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001535
Georg Brandl3dbca812008-07-23 16:10:53 +00001536>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001537... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001538... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001539
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00001540>>> def nth(iterable, n, default=None):
1541... "Returns the nth item or a default value"
1542... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001543
Georg Brandl3dbca812008-07-23 16:10:53 +00001544>>> def quantify(iterable, pred=bool):
1545... "Count how many times the predicate is true"
1546... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001547
Georg Brandl3dbca812008-07-23 16:10:53 +00001548>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001549... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001550... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001551
Georg Brandl3dbca812008-07-23 16:10:53 +00001552>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02001553... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00001554... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001555
1556>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001557... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001558
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001559>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001560... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001561
1562>>> def repeatfunc(func, times=None, *args):
1563... "Repeat calls to func with specified arguments."
1564... " Example: repeatfunc(random.random)"
1565... if times is None:
1566... return starmap(func, repeat(args))
1567... else:
1568... return starmap(func, repeat(args, times))
1569
Raymond Hettingerd591f662003-10-26 15:34:50 +00001570>>> def pairwise(iterable):
1571... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1572... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001573... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001574... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001575... except StopIteration:
1576... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001577... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001578
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001579>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001580... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001581... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001582... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001583
1584>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001585... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001586... # Recipe credited to George Sakkis
1587... pending = len(iterables)
1588... nexts = cycle(iter(it).__next__ for it in iterables)
1589... while pending:
1590... try:
1591... for next in nexts:
1592... yield next()
1593... except StopIteration:
1594... pending -= 1
1595... nexts = cycle(islice(nexts, pending))
1596
1597>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001598... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1599... s = list(iterable)
1600... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001601
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001602>>> def unique_everseen(iterable, key=None):
1603... "List unique elements, preserving order. Remember all elements ever seen."
1604... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1605... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1606... seen = set()
1607... seen_add = seen.add
1608... if key is None:
1609... for element in iterable:
1610... if element not in seen:
1611... seen_add(element)
1612... yield element
1613... else:
1614... for element in iterable:
1615... k = key(element)
1616... if k not in seen:
1617... seen_add(k)
1618... yield element
1619
1620>>> def unique_justseen(iterable, key=None):
1621... "List unique elements, preserving order. Remember only the element just seen."
1622... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1623... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1624... return map(next, map(itemgetter(1), groupby(iterable, key)))
1625
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001626This is not part of the examples but it tests to make sure the definitions
1627perform as purported.
1628
Raymond Hettingera098b332003-09-08 23:58:40 +00001629>>> take(10, count())
1630[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1631
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001632>>> list(enumerate('abc'))
1633[(0, 'a'), (1, 'b'), (2, 'c')]
1634
1635>>> list(islice(tabulate(lambda x: 2*x), 4))
1636[0, 2, 4, 6]
1637
1638>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00001639'd'
1640
1641>>> nth('abcde', 9) is None
1642True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001643
Guido van Rossum805365e2007-05-07 22:24:25 +00001644>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000164550
1646
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001647>>> a = [[1, 2, 3], [4, 5, 6]]
1648>>> flatten(a)
1649[1, 2, 3, 4, 5, 6]
1650
1651>>> list(repeatfunc(pow, 5, 2, 3))
1652[8, 8, 8, 8, 8]
1653
1654>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001655>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001656[0, 0, 0, 0, 0]
1657
Raymond Hettingerd591f662003-10-26 15:34:50 +00001658>>> list(pairwise('abcd'))
1659[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001660
Raymond Hettingerd591f662003-10-26 15:34:50 +00001661>>> list(pairwise([]))
1662[]
1663
1664>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001665[]
1666
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001667>>> list(islice(padnone('abc'), 0, 6))
1668['a', 'b', 'c', None, None, None]
1669
1670>>> list(ncycles('abc', 3))
1671['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1672
1673>>> dotproduct([1,2,3], [4,5,6])
167432
1675
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001676>>> list(grouper(3, 'abcdefg', 'x'))
1677[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1678
1679>>> list(roundrobin('abc', 'd', 'ef'))
1680['a', 'd', 'e', 'b', 'f', 'c']
1681
Raymond Hettingerace67332009-01-26 02:23:50 +00001682>>> list(powerset([1,2,3]))
1683[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001684
Raymond Hettinger191e8502009-01-27 13:29:43 +00001685>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1686True
1687
1688>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1689True
1690
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001691>>> list(unique_everseen('AAAABBBCCDAABBB'))
1692['A', 'B', 'C', 'D']
1693
1694>>> list(unique_everseen('ABBCcAD', str.lower))
1695['A', 'B', 'C', 'D']
1696
1697>>> list(unique_justseen('AAAABBBCCDAABBB'))
1698['A', 'B', 'C', 'D', 'A', 'B']
1699
1700>>> list(unique_justseen('ABBCcAD', str.lower))
1701['A', 'B', 'C', 'A', 'D']
1702
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001703"""
1704
1705__test__ = {'libreftest' : libreftest}
1706
1707def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001708 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001709 RegressionTests, LengthTransparency,
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001710 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001711 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001712
1713 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001714 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001715 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001716 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001717 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001718 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001719 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001720 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001721 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001722
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001723 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001724 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001725
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001726if __name__ == "__main__":
1727 test_main(verbose=True)