blob: bde7ab6ddea599825025950a293aa270e64cac5f [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Antoine Pitrou3ec903f2014-04-29 12:13:46 +02004import weakref
Raymond Hettingeraa044612009-02-12 12:04:26 +00005from decimal import Decimal
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +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 Hettingere09f45a2009-11-30 19:44:40 +000010import copy
11import pickle
Ezio Melottidde5b942010-02-03 05:37:26 +000012from functools import reduce
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +000013maxsize = test_support.MAX_Py_ssize_t
14minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015
16def onearg(x):
17 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000018 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000019
20def errfunc(*args):
21 'Test function that raises an error'
22 raise ValueError
23
24def gen3():
25 'Non-restartable source sequence'
26 for i in (0, 1, 2):
27 yield i
28
29def isEven(x):
30 'Test predicate'
31 return x%2==0
32
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000033def isOdd(x):
34 'Test predicate'
35 return x%2==1
36
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000037class StopNow:
38 'Class emulating an empty iterable.'
39 def __iter__(self):
40 return self
41 def next(self):
42 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043
Raymond Hettinger02420702003-06-29 20:36:23 +000044def take(n, seq):
45 'Convenience function for partially consuming a long of infinite iterable'
46 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000047
Raymond Hettingerd553d852008-03-04 04:17:08 +000048def prod(iterable):
49 return reduce(operator.mul, iterable, 1)
50
Raymond Hettinger93e804d2008-02-26 23:40:50 +000051def fact(n):
52 'Factorial'
Raymond Hettingerd553d852008-03-04 04:17:08 +000053 return prod(range(1, n+1))
54
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000056 def test_chain(self):
Raymond Hettingerad47fa12008-03-06 20:52:01 +000057
58 def chain2(*iterables):
59 'Pure python version in the docs'
60 for it in iterables:
61 for element in it:
62 yield element
63
64 for c in (chain, chain2):
65 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
66 self.assertEqual(list(c('abc')), list('abc'))
67 self.assertEqual(list(c('')), [])
68 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
69 self.assertRaises(TypeError, list,c(2, 3))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000070
Raymond Hettingerb4cbc982008-02-28 22:46:41 +000071 def test_chain_from_iterable(self):
72 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
73 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
74 self.assertEqual(list(chain.from_iterable([''])), [])
75 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
76 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
77
Raymond Hettinger93e804d2008-02-26 23:40:50 +000078 def test_combinations(self):
Raymond Hettinger5b913e32009-01-08 06:39:04 +000079 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Raymond Hettinger93e804d2008-02-26 23:40:50 +000080 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Raymond Hettingerd553d852008-03-04 04:17:08 +000081 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Raymond Hettinger93e804d2008-02-26 23:40:50 +000082 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5b913e32009-01-08 06:39:04 +000083 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Raymond Hettinger93e804d2008-02-26 23:40:50 +000084 self.assertEqual(list(combinations(range(4), 3)),
85 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Raymond Hettingerd553d852008-03-04 04:17:08 +000086
87 def combinations1(iterable, r):
88 'Pure python version shown in the docs'
89 pool = tuple(iterable)
90 n = len(pool)
Raymond Hettinger5b913e32009-01-08 06:39:04 +000091 if r > n:
92 return
Raymond Hettingerd553d852008-03-04 04:17:08 +000093 indices = range(r)
94 yield tuple(pool[i] for i in indices)
95 while 1:
96 for i in reversed(range(r)):
97 if indices[i] != i + n - r:
98 break
99 else:
100 return
101 indices[i] += 1
102 for j in range(i+1, r):
103 indices[j] = indices[j-1] + 1
104 yield tuple(pool[i] for i in indices)
105
106 def combinations2(iterable, r):
107 'Pure python version shown in the docs'
108 pool = tuple(iterable)
109 n = len(pool)
110 for indices in permutations(range(n), r):
111 if sorted(indices) == list(indices):
112 yield tuple(pool[i] for i in indices)
113
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000114 def combinations3(iterable, r):
115 'Pure python version from cwr()'
116 pool = tuple(iterable)
117 n = len(pool)
118 for indices in combinations_with_replacement(range(n), r):
119 if len(set(indices)) == r:
120 yield tuple(pool[i] for i in indices)
121
Raymond Hettingerd553d852008-03-04 04:17:08 +0000122 for n in range(7):
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000123 values = [5*x-12 for x in range(n)]
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000124 for r in range(n+2):
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000125 result = list(combinations(values, r))
Ezio Melottidde5b942010-02-03 05:37:26 +0000126 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(r) // fact(n-r)) # right number of combs
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000127 self.assertEqual(len(result), len(set(result))) # no repeats
128 self.assertEqual(result, sorted(result)) # lexicographic order
129 for c in result:
130 self.assertEqual(len(c), r) # r-length combinations
131 self.assertEqual(len(set(c)), r) # no duplicate elements
132 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000133 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000134 self.assertEqual(list(c),
135 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000136 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000137 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000138 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Raymond Hettingerd553d852008-03-04 04:17:08 +0000139
Benjamin Peterson021dec12015-02-01 20:59:00 -0500140 @test_support.bigaddrspacetest
141 def test_combinations_overflow(self):
Serhiy Storchaka42aa9c02015-02-03 01:34:09 +0200142 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson021dec12015-02-01 20:59:00 -0500143 combinations("AA", 2**29)
144
Alex Gaynor97376482011-07-17 16:44:31 -0700145 @test_support.impl_detail("tuple reuse is specific to CPython")
146 def test_combinations_tuple_reuse(self):
Raymond Hettingerd553d852008-03-04 04:17:08 +0000147 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
148 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
149
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000150 def test_combinations_with_replacement(self):
151 cwr = combinations_with_replacement
152 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
153 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
154 self.assertRaises(TypeError, cwr, None) # pool is not iterable
155 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
156 self.assertEqual(list(cwr('ABC', 2)),
157 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
158
159 def cwr1(iterable, r):
160 'Pure python version shown in the docs'
161 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
162 pool = tuple(iterable)
163 n = len(pool)
164 if not n and r:
165 return
166 indices = [0] * r
167 yield tuple(pool[i] for i in indices)
168 while 1:
169 for i in reversed(range(r)):
170 if indices[i] != n - 1:
171 break
172 else:
173 return
174 indices[i:] = [indices[i] + 1] * (r - i)
175 yield tuple(pool[i] for i in indices)
176
177 def cwr2(iterable, r):
178 'Pure python version shown in the docs'
179 pool = tuple(iterable)
180 n = len(pool)
181 for indices in product(range(n), repeat=r):
182 if sorted(indices) == list(indices):
183 yield tuple(pool[i] for i in indices)
184
185 def numcombs(n, r):
186 if not n:
187 return 0 if r else 1
Ezio Melottidde5b942010-02-03 05:37:26 +0000188 return fact(n+r-1) // fact(r) // fact(n-1)
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000189
190 for n in range(7):
191 values = [5*x-12 for x in range(n)]
192 for r in range(n+2):
193 result = list(cwr(values, r))
194
195 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
196 self.assertEqual(len(result), len(set(result))) # no repeats
197 self.assertEqual(result, sorted(result)) # lexicographic order
198
199 regular_combs = list(combinations(values, r)) # compare to combs without replacement
200 if n == 0 or r <= 1:
Ezio Melotti2623a372010-11-21 13:34:58 +0000201 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000202 else:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000203 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000204
205 for c in result:
206 self.assertEqual(len(c), r) # r-length combinations
207 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
208 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
209 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000210 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000211 self.assertEqual(noruns,
212 [e for e in values if e in c]) # comb is a subsequence of the input iterable
213 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
214 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
215
Benjamin Peterson17845c12015-02-01 21:10:47 -0500216 @test_support.bigaddrspacetest
217 def test_combinations_with_replacement_overflow(self):
Serhiy Storchaka42aa9c02015-02-03 01:34:09 +0200218 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Peterson17845c12015-02-01 21:10:47 -0500219 combinations_with_replacement("AA", 2**30)
220
Alex Gaynor97376482011-07-17 16:44:31 -0700221 @test_support.impl_detail("tuple reuse is specific to CPython")
222 def test_combinations_with_replacement_tuple_reuse(self):
223 cwr = combinations_with_replacement
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000224 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
225 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
226
Raymond Hettingerd553d852008-03-04 04:17:08 +0000227 def test_permutations(self):
228 self.assertRaises(TypeError, permutations) # too few arguments
229 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000230 self.assertRaises(TypeError, permutations, None) # pool is not iterable
231 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000232 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000233 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Raymond Hettingerd553d852008-03-04 04:17:08 +0000234 self.assertEqual(list(permutations(range(3), 2)),
235 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
236
237 def permutations1(iterable, r=None):
238 'Pure python version shown in the docs'
239 pool = tuple(iterable)
240 n = len(pool)
241 r = n if r is None else r
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000242 if r > n:
243 return
Raymond Hettingerd553d852008-03-04 04:17:08 +0000244 indices = range(n)
Raymond Hettingere70bb8d2008-03-23 00:55:46 +0000245 cycles = range(n, n-r, -1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000246 yield tuple(pool[i] for i in indices[:r])
247 while n:
248 for i in reversed(range(r)):
249 cycles[i] -= 1
250 if cycles[i] == 0:
251 indices[i:] = indices[i+1:] + indices[i:i+1]
252 cycles[i] = n - i
253 else:
254 j = cycles[i]
255 indices[i], indices[-j] = indices[-j], indices[i]
256 yield tuple(pool[i] for i in indices[:r])
257 break
258 else:
259 return
260
261 def permutations2(iterable, r=None):
262 'Pure python version shown in the docs'
263 pool = tuple(iterable)
264 n = len(pool)
265 r = n if r is None else r
266 for indices in product(range(n), repeat=r):
267 if len(set(indices)) == r:
268 yield tuple(pool[i] for i in indices)
269
270 for n in range(7):
271 values = [5*x-12 for x in range(n)]
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000272 for r in range(n+2):
Raymond Hettingerd553d852008-03-04 04:17:08 +0000273 result = list(permutations(values, r))
Ezio Melottidde5b942010-02-03 05:37:26 +0000274 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(n-r)) # right number of perms
Raymond Hettingerd553d852008-03-04 04:17:08 +0000275 self.assertEqual(len(result), len(set(result))) # no repeats
276 self.assertEqual(result, sorted(result)) # lexicographic order
277 for p in result:
278 self.assertEqual(len(p), r) # r-length permutations
279 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000280 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000281 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000282 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Raymond Hettingerd553d852008-03-04 04:17:08 +0000283 if r == n:
284 self.assertEqual(result, list(permutations(values, None))) # test r as None
285 self.assertEqual(result, list(permutations(values))) # test default r
286
Benjamin Petersondda91212015-02-01 21:34:07 -0500287 @test_support.bigaddrspacetest
288 def test_permutations_overflow(self):
Serhiy Storchaka42aa9c02015-02-03 01:34:09 +0200289 with self.assertRaises((OverflowError, MemoryError)):
Benjamin Petersondda91212015-02-01 21:34:07 -0500290 permutations("A", 2**30)
Benjamin Petersondda91212015-02-01 21:34:07 -0500291
Zachary Ware4e0df172014-04-24 13:20:27 -0500292 @test_support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynor97376482011-07-17 16:44:31 -0700293 def test_permutations_tuple_reuse(self):
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000294 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000295 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000296
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000297 def test_combinatorics(self):
298 # Test relationships between product(), permutations(),
299 # combinations() and combinations_with_replacement().
300
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000301 for n in range(6):
302 s = 'ABCDEFG'[:n]
303 for r in range(8):
304 prod = list(product(s, repeat=r))
305 cwr = list(combinations_with_replacement(s, r))
306 perm = list(permutations(s, r))
307 comb = list(combinations(s, r))
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000308
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000309 # Check size
Ezio Melotti2623a372010-11-21 13:34:58 +0000310 self.assertEqual(len(prod), n**r)
311 self.assertEqual(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r))
312 self.assertEqual(len(perm), 0 if r>n else fact(n) // fact(n-r))
313 self.assertEqual(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000314
315 # Check lexicographic order without repeated tuples
Ezio Melotti2623a372010-11-21 13:34:58 +0000316 self.assertEqual(prod, sorted(set(prod)))
317 self.assertEqual(cwr, sorted(set(cwr)))
318 self.assertEqual(perm, sorted(set(perm)))
319 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000320
321 # Check interrelationships
Ezio Melotti2623a372010-11-21 13:34:58 +0000322 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
323 self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000324 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
325 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
326 self.assertEqual(comb, filter(set(cwr).__contains__, perm)) # comb: perm that is a cwr
327 self.assertEqual(comb, filter(set(perm).__contains__, cwr)) # comb: cwr that is a perm
328 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000329
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000330 def test_compress(self):
Raymond Hettinger2e2909f2009-02-19 02:15:14 +0000331 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000332 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
333 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
334 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
335 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
336 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
337 n = 10000
338 data = chain.from_iterable(repeat(range(6), n))
339 selectors = chain.from_iterable(repeat((0, 1)))
340 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
341 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
342 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
343 self.assertRaises(TypeError, compress, range(6)) # too few args
344 self.assertRaises(TypeError, compress, range(6), None) # too many args
345
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000346 def test_count(self):
347 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
348 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000349 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000350 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
351 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000352 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000353 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000354 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
355 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000356 c = count(3)
357 self.assertEqual(repr(c), 'count(3)')
358 c.next()
359 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +0000360 c = count(-9)
361 self.assertEqual(repr(c), 'count(-9)')
362 c.next()
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000363 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Jack Diederich36234e82006-09-21 17:50:26 +0000364 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000365 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
Raymond Hettinger3a0de082007-10-12 17:53:11 +0000366 # Test repr (ignoring the L in longs)
367 r1 = repr(count(i)).replace('L', '')
368 r2 = 'count(%r)'.__mod__(i).replace('L', '')
369 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000370
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000371 # check copy, deepcopy, pickle
372 for value in -3, 3, sys.maxint-5, sys.maxint+5:
373 c = count(value)
374 self.assertEqual(next(copy.copy(c)), value)
375 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchaka655720e2014-12-15 14:02:43 +0200376 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
377 self.assertEqual(next(pickle.loads(pickle.dumps(c, proto))), value)
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000378
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000379 def test_count_with_stride(self):
380 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingera4038032009-02-14 00:25:51 +0000381 self.assertEqual(zip('abc',count(start=2,step=3)),
382 [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingeraa681c72009-02-21 07:17:22 +0000383 self.assertEqual(zip('abc',count(step=-1)),
384 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000385 self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
386 self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
387 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
388 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
389 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettingeraa044612009-02-12 12:04:26 +0000390 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
391 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +0000392 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
393 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000394 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
395 c = count(3, 5)
396 self.assertEqual(repr(c), 'count(3, 5)')
397 c.next()
398 self.assertEqual(repr(c), 'count(8, 5)')
399 c = count(-9, 0)
400 self.assertEqual(repr(c), 'count(-9, 0)')
401 c.next()
402 self.assertEqual(repr(c), 'count(-9, 0)')
403 c = count(-9, -3)
404 self.assertEqual(repr(c), 'count(-9, -3)')
405 c.next()
406 self.assertEqual(repr(c), 'count(-12, -3)')
407 self.assertEqual(repr(c), 'count(-12, -3)')
408 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
409 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
410 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
411 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
412 for j in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5):
413 # Test repr (ignoring the L in longs)
414 r1 = repr(count(i, j)).replace('L', '')
415 if j == 1:
416 r2 = ('count(%r)' % i).replace('L', '')
417 else:
418 r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
419 self.assertEqual(r1, r2)
420
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000421 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000422 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000423 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000424 self.assertRaises(TypeError, cycle)
425 self.assertRaises(TypeError, cycle, 5)
426 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000427
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000428 def test_groupby(self):
429 # Check whether it accepts arguments correctly
430 self.assertEqual([], list(groupby([])))
431 self.assertEqual([], list(groupby([], key=id)))
432 self.assertRaises(TypeError, list, groupby('abc', []))
433 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000434 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000435
436 # Check normal input
437 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
438 (2,15,22), (3,16,23), (3,17,23)]
439 dup = []
440 for k, g in groupby(s, lambda r:r[0]):
441 for elem in g:
442 self.assertEqual(k, elem[0])
443 dup.append(elem)
444 self.assertEqual(s, dup)
445
446 # Check nested case
447 dup = []
448 for k, g in groupby(s, lambda r:r[0]):
449 for ik, ig in groupby(g, lambda r:r[2]):
450 for elem in ig:
451 self.assertEqual(k, elem[0])
452 self.assertEqual(ik, elem[2])
453 dup.append(elem)
454 self.assertEqual(s, dup)
455
456 # Check case where inner iterator is not used
457 keys = [k for k, g in groupby(s, lambda r:r[0])]
458 expectedkeys = set([r[0] for r in s])
459 self.assertEqual(set(keys), expectedkeys)
460 self.assertEqual(len(keys), len(expectedkeys))
461
462 # Exercise pipes and filters style
463 s = 'abracadabra'
464 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000465 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000466 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
467 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000468 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000469 self.assertEqual(r, ['a', 'b', 'r'])
470 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000471 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000472 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
473 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000474 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000475 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
476
477 # iter.next failure
478 class ExpectedError(Exception):
479 pass
480 def delayed_raise(n=0):
481 for i in range(n):
482 yield 'yo'
483 raise ExpectedError
484 def gulp(iterable, keyp=None, func=list):
485 return [func(g) for k, g in groupby(iterable, keyp)]
486
487 # iter.next failure on outer object
488 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
489 # iter.next failure on inner object
490 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
491
492 # __cmp__ failure
493 class DummyCmp:
494 def __cmp__(self, dst):
495 raise ExpectedError
496 s = [DummyCmp(), DummyCmp(), None]
497
498 # __cmp__ failure on outer object
499 self.assertRaises(ExpectedError, gulp, s, func=id)
500 # __cmp__ failure on inner object
501 self.assertRaises(ExpectedError, gulp, s)
502
503 # keyfunc failure
504 def keyfunc(obj):
505 if keyfunc.skip > 0:
506 keyfunc.skip -= 1
507 return obj
508 else:
509 raise ExpectedError
510
511 # keyfunc failure on outer object
512 keyfunc.skip = 0
513 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
514 keyfunc.skip = 1
515 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
516
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000517 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000518 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000519 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000520 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000521 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000522 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000523 self.assertRaises(TypeError, ifilter, lambda x:x)
524 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000525 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000526 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000527
528 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000529 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
530 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000531 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000532 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000533 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000534 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
535 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000536 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000537 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000538
539 def test_izip(self):
540 ans = [(x,y) for x, y in izip('abc',count())]
541 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000542 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
543 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000544 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000545 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000546 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000547 self.assertRaises(TypeError, izip, 3)
548 self.assertRaises(TypeError, izip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000549 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
550 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000551 self.assertEqual([pair for pair in izip('abc', 'def')],
552 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700553
554 @test_support.impl_detail("tuple reuse is specific to CPython")
Zachary Ware4e0df172014-04-24 13:20:27 -0500555 def test_izip_tuple_reuse(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000556 ids = map(id, izip('abc', 'def'))
557 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000558 ids = map(id, list(izip('abc', 'def')))
559 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000560
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000561 def test_iziplongest(self):
562 for args in [
563 ['abc', range(6)],
564 [range(6), 'abc'],
565 [range(1000), range(2000,2100), range(3000,3050)],
566 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
567 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
568 ]:
Ezio Melottidde5b942010-02-03 05:37:26 +0000569 # target = map(None, *args) <- this raises a py3k warning
570 # this is the replacement:
571 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
572 for i in range(max(map(len, args)))]
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000573 self.assertEqual(list(izip_longest(*args)), target)
574 self.assertEqual(list(izip_longest(*args, **{})), target)
575 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
576 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000577
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000578 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
579
580 self.assertEqual(list(izip_longest()), zip())
581 self.assertEqual(list(izip_longest([])), zip([]))
582 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000583
Ezio Melottidde5b942010-02-03 05:37:26 +0000584 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
585 zip(list('abc') + [None], 'defg')) # empty keyword dict
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000586 self.assertRaises(TypeError, izip_longest, 3)
587 self.assertRaises(TypeError, izip_longest, range(3), 3)
588
589 for stmt in [
590 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000591 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000592 ]:
593 try:
594 eval(stmt, globals(), locals())
595 except TypeError:
596 pass
597 else:
598 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000599
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000600 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
601 zip('abc', 'def'))
602 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
603 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700604
605 @test_support.impl_detail("tuple reuse is specific to CPython")
606 def test_izip_longest_tuple_reuse(self):
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000607 ids = map(id, izip_longest('abc', 'def'))
608 self.assertEqual(min(ids), max(ids))
609 ids = map(id, list(izip_longest('abc', 'def')))
610 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
611
Raymond Hettingerfa7dadd2009-11-01 20:45:16 +0000612 def test_bug_7244(self):
613
614 class Repeater(object):
615 # this class is similar to itertools.repeat
616 def __init__(self, o, t, e):
617 self.o = o
618 self.t = int(t)
619 self.e = e
620 def __iter__(self): # its iterator is itself
621 return self
622 def next(self):
623 if self.t > 0:
624 self.t -= 1
625 return self.o
626 else:
627 raise self.e
628
629 # Formerly this code in would fail in debug mode
630 # with Undetected Error and Stop Iteration
631 r1 = Repeater(1, 3, StopIteration)
632 r2 = Repeater(2, 4, StopIteration)
633 def run(r1, r2):
634 result = []
635 for i, j in izip_longest(r1, r2, fillvalue=0):
636 with test_support.captured_output('stdout'):
637 print (i, j)
638 result.append((i, j))
639 return result
640 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
641
642 # Formerly, the RuntimeError would be lost
643 # and StopIteration would stop as expected
644 r1 = Repeater(1, 3, RuntimeError)
645 r2 = Repeater(2, 4, StopIteration)
646 it = izip_longest(r1, r2, fillvalue=0)
647 self.assertEqual(next(it), (1, 2))
648 self.assertEqual(next(it), (1, 2))
649 self.assertEqual(next(it), (1, 2))
650 self.assertRaises(RuntimeError, next, it)
651
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000652 def test_product(self):
653 for args, result in [
Raymond Hettingerd553d852008-03-04 04:17:08 +0000654 ([], [()]), # zero iterables
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000655 (['ab'], [('a',), ('b',)]), # one iterable
656 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
657 ([range(0), range(2), range(3)], []), # first iterable with zero length
658 ([range(2), range(0), range(3)], []), # middle iterable with zero length
659 ([range(2), range(3), range(0)], []), # last iterable with zero length
660 ]:
661 self.assertEqual(list(product(*args)), result)
Raymond Hettinger08ff6822008-02-29 02:21:48 +0000662 for r in range(4):
663 self.assertEqual(list(product(*(args*r))),
664 list(product(*args, **dict(repeat=r))))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000665 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
666 self.assertRaises(TypeError, product, range(6), None)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000667
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000668 def product1(*args, **kwds):
669 pools = map(tuple, args) * kwds.get('repeat', 1)
670 n = len(pools)
671 if n == 0:
672 yield ()
673 return
674 if any(len(pool) == 0 for pool in pools):
675 return
676 indices = [0] * n
677 yield tuple(pool[i] for pool, i in zip(pools, indices))
678 while 1:
679 for i in reversed(range(n)): # right to left
680 if indices[i] == len(pools[i]) - 1:
681 continue
682 indices[i] += 1
683 for j in range(i+1, n):
684 indices[j] = 0
685 yield tuple(pool[i] for pool, i in zip(pools, indices))
686 break
687 else:
688 return
689
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000690 def product2(*args, **kwds):
691 'Pure python version used in docs'
692 pools = map(tuple, args) * kwds.get('repeat', 1)
693 result = [[]]
694 for pool in pools:
695 result = [x+[y] for x in result for y in pool]
696 for prod in result:
697 yield tuple(prod)
698
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000699 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
700 set('abcdefg'), range(11), tuple(range(13))]
701 for i in range(100):
702 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000703 expected_len = prod(map(len, args))
704 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000705 self.assertEqual(list(product(*args)), list(product1(*args)))
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000706 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000707 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000708 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000709
Benjamin Petersondda91212015-02-01 21:34:07 -0500710 @test_support.bigaddrspacetest
711 def test_product_overflow(self):
Serhiy Storchaka42aa9c02015-02-03 01:34:09 +0200712 with self.assertRaises((OverflowError, MemoryError)):
713 product(*(['ab']*2**5), repeat=2**25)
Benjamin Petersondda91212015-02-01 21:34:07 -0500714
Alex Gaynor97376482011-07-17 16:44:31 -0700715 @test_support.impl_detail("tuple reuse is specific to CPython")
716 def test_product_tuple_reuse(self):
Raymond Hettinger73d79632008-02-23 02:20:41 +0000717 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
718 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000719
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000720 def test_repeat(self):
Raymond Hettinger182edae2009-02-19 02:38:25 +0000721 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700722 self.assertEqual(list(repeat(object='a', times=0)), [])
723 self.assertEqual(list(repeat(object='a', times=-1)), [])
724 self.assertEqual(list(repeat(object='a', times=-2)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000725 self.assertEqual(zip(xrange(3),repeat('a')),
726 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000727 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000728 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000729 self.assertEqual(list(repeat('a', 0)), [])
730 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000731 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000732 self.assertRaises(TypeError, repeat, None, 3, 4)
733 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000734 r = repeat(1+0j)
735 self.assertEqual(repr(r), 'repeat((1+0j))')
736 r = repeat(1+0j, 5)
737 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
738 list(r)
739 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000740
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700741 def test_repeat_with_negative_times(self):
742 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
743 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
744 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
745 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
746
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000747 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000748 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
749 [0**1, 1**2, 2**3])
750 self.assertEqual(list(imap(None, 'abc', range(5))),
751 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000752 self.assertEqual(list(imap(None, 'abc', count())),
753 [('a',0),('b',1),('c',2)])
754 self.assertEqual(take(2,imap(None, 'abc', count())),
755 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000756 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000757 self.assertRaises(TypeError, imap)
758 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000759 self.assertRaises(TypeError, imap(10, range(5)).next)
760 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
761 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000762
763 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000764 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
765 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000766 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
767 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000768 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000769 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
770 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000771 self.assertRaises(TypeError, starmap)
772 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
773 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
774 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
775 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000776
777 def test_islice(self):
778 for args in [ # islice(args) should agree with range(args)
779 (10, 20, 3),
780 (10, 3, 20),
781 (10, 20),
782 (10, 3),
783 (20,)
784 ]:
785 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
786
787 for args, tgtargs in [ # Stop when seqn is exhausted
788 ((10, 110, 3), ((10, 100, 3))),
789 ((10, 110), ((10, 100))),
790 ((110,), (100,))
791 ]:
792 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
793
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000794 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000795 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000796 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
797 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000798 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
799 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
800
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000801 # Test number of items consumed SF #1171417
802 it = iter(range(10))
803 self.assertEqual(list(islice(it, 3)), range(3))
804 self.assertEqual(list(it), range(3, 10))
805
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000806 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000807 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000808 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
809 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
810 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
811 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
812 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000813 self.assertRaises(ValueError, islice, xrange(10), 'a')
814 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
815 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
816 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
817 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000818 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000819
Raymond Hettinger061bf7a2010-11-30 03:15:35 +0000820 # Issue #10323: Less islice in a predictable state
821 c = count()
822 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
823 self.assertEqual(next(c), 3)
824
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200825 # Issue #21321: check source iterator is not referenced
826 # from islice() after the latter has been exhausted
827 it = (x for x in (1, 2))
828 wr = weakref.ref(it)
829 it = islice(it, 1)
830 self.assertIsNotNone(wr())
831 list(it) # exhaust the iterator
Benjamin Petersonec9d5472014-08-24 18:07:28 -0500832 test_support.gc_collect()
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200833 self.assertIsNone(wr())
834
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000835 def test_takewhile(self):
836 data = [1, 3, 5, 20, 2, 4, 6, 8]
837 underten = lambda x: x<10
838 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000839 self.assertEqual(list(takewhile(underten, [])), [])
840 self.assertRaises(TypeError, takewhile)
841 self.assertRaises(TypeError, takewhile, operator.pow)
842 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
843 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
844 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000845 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
846 self.assertEqual(list(t), [1, 1, 1])
847 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000848
849 def test_dropwhile(self):
850 data = [1, 3, 5, 20, 2, 4, 6, 8]
851 underten = lambda x: x<10
852 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000853 self.assertEqual(list(dropwhile(underten, [])), [])
854 self.assertRaises(TypeError, dropwhile)
855 self.assertRaises(TypeError, dropwhile, operator.pow)
856 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
857 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
858 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000859
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000860 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000861 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000862 def irange(n):
863 for i in xrange(n):
864 yield i
865
866 a, b = tee([]) # test empty iterator
867 self.assertEqual(list(a), [])
868 self.assertEqual(list(b), [])
869
870 a, b = tee(irange(n)) # test 100% interleaved
871 self.assertEqual(zip(a,b), zip(range(n),range(n)))
872
873 a, b = tee(irange(n)) # test 0% interleaved
874 self.assertEqual(list(a), range(n))
875 self.assertEqual(list(b), range(n))
876
877 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000878 for i in xrange(100):
879 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000880 del a
881 self.assertEqual(list(b), range(n))
882
883 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000884 for i in xrange(100):
885 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000886 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000887 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000888
889 for j in xrange(5): # test randomly interleaved
890 order = [0]*n + [1]*n
891 random.shuffle(order)
892 lists = ([], [])
893 its = tee(irange(n))
894 for i in order:
895 value = its[i].next()
896 lists[i].append(value)
897 self.assertEqual(lists[0], range(n))
898 self.assertEqual(lists[1], range(n))
899
Raymond Hettingerad983e72003-11-12 14:32:26 +0000900 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000901 self.assertRaises(TypeError, tee)
902 self.assertRaises(TypeError, tee, 3)
903 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000904 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000905
Raymond Hettingerad983e72003-11-12 14:32:26 +0000906 # tee object should be instantiable
907 a, b = tee('abc')
908 c = type(a)('def')
909 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000910
Raymond Hettingerad983e72003-11-12 14:32:26 +0000911 # test long-lagged and multi-way split
912 a, b, c = tee(xrange(2000), 3)
913 for i in xrange(100):
914 self.assertEqual(a.next(), i)
915 self.assertEqual(list(b), range(2000))
916 self.assertEqual([c.next(), c.next()], range(2))
917 self.assertEqual(list(a), range(100,2000))
918 self.assertEqual(list(c), range(2,2000))
919
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000920 # test values of n
921 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000922 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000923 for n in xrange(5):
924 result = tee('abc', n)
925 self.assertEqual(type(result), tuple)
926 self.assertEqual(len(result), n)
927 self.assertEqual(map(list, result), [list('abc')]*n)
928
Raymond Hettingerad983e72003-11-12 14:32:26 +0000929 # tee pass-through to copyable iterator
930 a, b = tee('abc')
931 c, d = tee(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000932 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000933
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000934 # test tee_new
935 t1, t2 = tee('abc')
936 tnew = type(t1)
937 self.assertRaises(TypeError, tnew)
938 self.assertRaises(TypeError, tnew, 10)
939 t3 = tnew(t1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000940 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000941
Raymond Hettingera9f60922004-10-17 16:40:14 +0000942 # test that tee objects are weak referencable
943 a, b = tee(xrange(10))
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200944 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +0000945 self.assertEqual(getattr(p, '__class__'), type(b))
946 del a
947 self.assertRaises(ReferenceError, getattr, p, '__class__')
948
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200949 # Issue 13454: Crash when deleting backward iterator from tee()
950 def test_tee_del_backward(self):
Serhiy Storchaka6fef14d2013-01-26 11:51:42 +0200951 forward, backward = tee(repeat(None, 20000000))
952 any(forward) # exhaust the iterator
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200953 del backward
954
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000955 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000956 self.assertRaises(StopIteration, izip().next)
957
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000958 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000959 self.assertRaises(StopIteration, f([]).next)
960 self.assertRaises(StopIteration, f(StopNow()).next)
961
962 self.assertRaises(StopIteration, islice([], None).next)
963 self.assertRaises(StopIteration, islice(StopNow(), None).next)
964
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000965 p, q = tee([])
966 self.assertRaises(StopIteration, p.next)
967 self.assertRaises(StopIteration, q.next)
968 p, q = tee(StopNow())
969 self.assertRaises(StopIteration, p.next)
970 self.assertRaises(StopIteration, q.next)
971
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000972 self.assertRaises(StopIteration, repeat(None, 0).next)
973
974 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
975 self.assertRaises(StopIteration, f(lambda x:x, []).next)
976 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
977
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000978class TestExamples(unittest.TestCase):
979
980 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 Hettingerd081abc2009-01-27 02:58:49 +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 Hettinger2bcb8e92009-01-25 21:04:14 +0000996 def test_compress(self):
997 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
998
Raymond Hettingerad47fa12008-03-06 20:52:01 +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_ifilter(self):
1015 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
1016
1017 def test_ifilterfalse(self):
1018 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1019
1020 def test_imap(self):
1021 self.assertEqual(list(imap(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_izip(self):
1030 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1031
1032 def test_izip_longest(self):
1033 self.assertEqual(list(izip_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 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 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)
1064 iterator.next()
1065 del container, iterator
1066
1067 def test_chain(self):
1068 a = []
1069 self.makecycle(chain(a), a)
1070
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001071 def test_chain_from_iterable(self):
1072 a = []
1073 self.makecycle(chain.from_iterable([a]), a)
1074
1075 def test_combinations(self):
1076 a = []
1077 self.makecycle(combinations([1,2,a,3], 3), a)
1078
Raymond Hettingerd081abc2009-01-27 02:58:49 +00001079 def test_combinations_with_replacement(self):
1080 a = []
1081 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1082
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001083 def test_compress(self):
1084 a = []
1085 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1086
Raymond Hettingerb21d8102009-02-16 20:39:12 +00001087 def test_count(self):
1088 a = []
1089 Int = type('Int', (int,), dict(x=a))
1090 self.makecycle(count(Int(0), Int(1)), a)
1091
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001092 def test_cycle(self):
1093 a = []
1094 self.makecycle(cycle([a]*2), a)
1095
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001096 def test_dropwhile(self):
1097 a = []
1098 self.makecycle(dropwhile(bool, [0, a, a]), a)
1099
1100 def test_groupby(self):
1101 a = []
1102 self.makecycle(groupby([a]*2, lambda x:x), a)
1103
Raymond Hettingera1ca94a2008-03-06 22:51:36 +00001104 def test_issue2246(self):
1105 # Issue 2246 -- the _grouper iterator was not included in GC
1106 n = 10
1107 keyfunc = lambda x: x
1108 for i, j in groupby(xrange(n), key=keyfunc):
1109 keyfunc.__dict__.setdefault('x',[]).append(j)
1110
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001111 def test_ifilter(self):
1112 a = []
1113 self.makecycle(ifilter(lambda x:True, [a]*2), a)
1114
1115 def test_ifilterfalse(self):
1116 a = []
1117 self.makecycle(ifilterfalse(lambda x:False, a), a)
1118
1119 def test_izip(self):
1120 a = []
1121 self.makecycle(izip([a]*2, [a]*3), a)
1122
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001123 def test_izip_longest(self):
1124 a = []
1125 self.makecycle(izip_longest([a]*2, [a]*3), a)
1126 b = [a, None]
1127 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
1128
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001129 def test_imap(self):
1130 a = []
1131 self.makecycle(imap(lambda x:x, [a]*2), a)
1132
1133 def test_islice(self):
1134 a = []
1135 self.makecycle(islice([a]*2, None), a)
1136
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001137 def test_permutations(self):
1138 a = []
1139 self.makecycle(permutations([1,2,a,3], 3), a)
1140
1141 def test_product(self):
1142 a = []
1143 self.makecycle(product([1,2,a,3], repeat=3), a)
1144
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001145 def test_repeat(self):
1146 a = []
1147 self.makecycle(repeat(a), a)
1148
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001149 def test_starmap(self):
1150 a = []
1151 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1152
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001153 def test_takewhile(self):
1154 a = []
1155 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1156
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001157def R(seqn):
1158 'Regular generator'
1159 for i in seqn:
1160 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001161
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001162class G:
1163 'Sequence using __getitem__'
1164 def __init__(self, seqn):
1165 self.seqn = seqn
1166 def __getitem__(self, i):
1167 return self.seqn[i]
1168
1169class I:
1170 'Sequence using iterator protocol'
1171 def __init__(self, seqn):
1172 self.seqn = seqn
1173 self.i = 0
1174 def __iter__(self):
1175 return self
1176 def next(self):
1177 if self.i >= len(self.seqn): raise StopIteration
1178 v = self.seqn[self.i]
1179 self.i += 1
1180 return v
1181
1182class Ig:
1183 'Sequence using iterator protocol defined with a generator'
1184 def __init__(self, seqn):
1185 self.seqn = seqn
1186 self.i = 0
1187 def __iter__(self):
1188 for val in self.seqn:
1189 yield val
1190
1191class X:
1192 'Missing __getitem__ and __iter__'
1193 def __init__(self, seqn):
1194 self.seqn = seqn
1195 self.i = 0
1196 def next(self):
1197 if self.i >= len(self.seqn): raise StopIteration
1198 v = self.seqn[self.i]
1199 self.i += 1
1200 return v
1201
1202class N:
1203 'Iterator missing next()'
1204 def __init__(self, seqn):
1205 self.seqn = seqn
1206 self.i = 0
1207 def __iter__(self):
1208 return self
1209
1210class E:
1211 'Test propagation of exceptions'
1212 def __init__(self, seqn):
1213 self.seqn = seqn
1214 self.i = 0
1215 def __iter__(self):
1216 return self
1217 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001218 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001219
1220class S:
1221 'Test immediate stop'
1222 def __init__(self, seqn):
1223 pass
1224 def __iter__(self):
1225 return self
1226 def next(self):
1227 raise StopIteration
1228
1229def L(seqn):
1230 'Test multiple tiers of iterators'
1231 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1232
1233
1234class TestVariousIteratorArgs(unittest.TestCase):
1235
1236 def test_chain(self):
1237 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1238 for g in (G, I, Ig, S, L, R):
1239 self.assertEqual(list(chain(g(s))), list(g(s)))
1240 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +00001241 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001242 self.assertRaises(TypeError, list, chain(N(s)))
1243 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1244
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001245 def test_compress(self):
1246 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1247 n = len(s)
1248 for g in (G, I, Ig, S, L, R):
1249 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1250 self.assertRaises(TypeError, compress, X(s), repeat(1))
1251 self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
1252 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1253
Raymond Hettinger50986cc2008-02-22 03:16:42 +00001254 def test_product(self):
1255 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1256 self.assertRaises(TypeError, product, X(s))
1257 self.assertRaises(TypeError, product, N(s))
1258 self.assertRaises(ZeroDivisionError, product, E(s))
1259
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001260 def test_cycle(self):
1261 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1262 for g in (G, I, Ig, S, L, R):
1263 tgtlen = len(s) * 3
1264 expected = list(g(s))*3
1265 actual = list(islice(cycle(g(s)), tgtlen))
1266 self.assertEqual(actual, expected)
1267 self.assertRaises(TypeError, cycle, X(s))
1268 self.assertRaises(TypeError, list, cycle(N(s)))
1269 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1270
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001271 def test_groupby(self):
1272 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1273 for g in (G, I, Ig, S, L, R):
1274 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1275 self.assertRaises(TypeError, groupby, X(s))
1276 self.assertRaises(TypeError, list, groupby(N(s)))
1277 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1278
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001279 def test_ifilter(self):
1280 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1281 for g in (G, I, Ig, S, L, R):
1282 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
1283 self.assertRaises(TypeError, ifilter, isEven, X(s))
1284 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
1285 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
1286
1287 def test_ifilterfalse(self):
1288 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1289 for g in (G, I, Ig, S, L, R):
1290 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
1291 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
1292 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
1293 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
1294
1295 def test_izip(self):
1296 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1297 for g in (G, I, Ig, S, L, R):
1298 self.assertEqual(list(izip(g(s))), zip(g(s)))
1299 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
1300 self.assertRaises(TypeError, izip, X(s))
1301 self.assertRaises(TypeError, list, izip(N(s)))
1302 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
1303
Raymond Hettingerd36862c2007-02-21 05:20:38 +00001304 def test_iziplongest(self):
1305 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1306 for g in (G, I, Ig, S, L, R):
1307 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
1308 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
1309 self.assertRaises(TypeError, izip_longest, X(s))
1310 self.assertRaises(TypeError, list, izip_longest(N(s)))
1311 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
1312
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001313 def test_imap(self):
1314 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1315 for g in (G, I, Ig, S, L, R):
1316 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
1317 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
1318 self.assertRaises(TypeError, imap, onearg, X(s))
1319 self.assertRaises(TypeError, list, imap(onearg, N(s)))
1320 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1321
1322 def test_islice(self):
1323 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1324 for g in (G, I, Ig, S, L, R):
1325 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1326 self.assertRaises(TypeError, islice, X(s), 10)
1327 self.assertRaises(TypeError, list, islice(N(s), 10))
1328 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1329
1330 def test_starmap(self):
1331 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1332 for g in (G, I, Ig, S, L, R):
1333 ss = zip(s, s)
1334 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1335 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1336 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1337 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1338
1339 def test_takewhile(self):
1340 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1341 for g in (G, I, Ig, S, L, R):
1342 tgt = []
1343 for elem in g(s):
1344 if not isEven(elem): break
1345 tgt.append(elem)
1346 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1347 self.assertRaises(TypeError, takewhile, isEven, X(s))
1348 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1349 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1350
1351 def test_dropwhile(self):
1352 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1353 for g in (G, I, Ig, S, L, R):
1354 tgt = []
1355 for elem in g(s):
1356 if not tgt and isOdd(elem): continue
1357 tgt.append(elem)
1358 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1359 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1360 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1361 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1362
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001363 def test_tee(self):
1364 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1365 for g in (G, I, Ig, S, L, R):
1366 it1, it2 = tee(g(s))
1367 self.assertEqual(list(it1), list(g(s)))
1368 self.assertEqual(list(it2), list(g(s)))
1369 self.assertRaises(TypeError, tee, X(s))
1370 self.assertRaises(TypeError, list, tee(N(s))[0])
1371 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1372
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001373class LengthTransparency(unittest.TestCase):
1374
1375 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001376 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001377 self.assertEqual(len(repeat(None, 50)), 50)
1378 self.assertRaises(TypeError, len, repeat(None))
1379
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001380class RegressionTests(unittest.TestCase):
1381
1382 def test_sf_793826(self):
1383 # Fix Armin Rigo's successful efforts to wreak havoc
1384
1385 def mutatingtuple(tuple1, f, tuple2):
1386 # this builds a tuple t which is a copy of tuple1,
1387 # then calls f(t), then mutates t to be equal to tuple2
1388 # (needs len(tuple1) == len(tuple2)).
1389 def g(value, first=[1]):
1390 if first:
1391 del first[:]
1392 f(z.next())
1393 return value
1394 items = list(tuple2)
1395 items[1:1] = list(tuple1)
1396 gen = imap(g, items)
1397 z = izip(*[gen]*len(tuple1))
1398 z.next()
1399
1400 def f(t):
1401 global T
1402 T = t
1403 first[:] = list(T)
1404
1405 first = []
1406 mutatingtuple((1,2,3), f, (4,5,6))
1407 second = list(T)
1408 self.assertEqual(first, second)
1409
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001410
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001411 def test_sf_950057(self):
1412 # Make sure that chain() and cycle() catch exceptions immediately
1413 # rather than when shifting between input sources
1414
1415 def gen1():
1416 hist.append(0)
1417 yield 1
1418 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001419 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001420 hist.append(2)
1421
1422 def gen2(x):
1423 hist.append(3)
1424 yield 2
1425 hist.append(4)
1426 if x:
1427 raise StopIteration
1428
1429 hist = []
1430 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1431 self.assertEqual(hist, [0,1])
1432
1433 hist = []
1434 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1435 self.assertEqual(hist, [0,1])
1436
1437 hist = []
1438 self.assertRaises(AssertionError, list, cycle(gen1()))
1439 self.assertEqual(hist, [0,1])
1440
Georg Brandlb84c1372007-01-21 10:28:43 +00001441class SubclassWithKwargsTest(unittest.TestCase):
1442 def test_keywords_in_subclass(self):
1443 # count is not subclassable...
1444 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001445 starmap, islice, takewhile, dropwhile, cycle, compress):
Georg Brandlb84c1372007-01-21 10:28:43 +00001446 class Subclass(cls):
1447 def __init__(self, newarg=None, *args):
1448 cls.__init__(self, *args)
1449 try:
1450 Subclass(newarg=1)
1451 except TypeError, err:
1452 # we expect type errors because of wrong argument count
Ezio Melottiaa980582010-01-23 23:04:36 +00001453 self.assertNotIn("does not take keyword arguments", err.args[0])
Georg Brandlb84c1372007-01-21 10:28:43 +00001454
1455
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001456libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001457
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001458
1459>>> amounts = [120.15, 764.05, 823.14]
1460>>> for checknum, amount in izip(count(1200), amounts):
1461... print 'Check %d is for $%.2f' % (checknum, amount)
1462...
1463Check 1200 is for $120.15
1464Check 1201 is for $764.05
1465Check 1202 is for $823.14
1466
1467>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001468>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1469... print cube
1470...
14711
14728
147327
1474
1475>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001476>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001477... print name.title()
1478...
1479Alex
1480Laura
1481Martin
1482Walter
1483Samuele
1484
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001485>>> from operator import itemgetter
1486>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001487>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001488>>> for k, g in groupby(di, itemgetter(1)):
1489... print k, map(itemgetter(0), g)
1490...
14911 ['a', 'c', 'e']
14922 ['b', 'd', 'f']
14933 ['g']
1494
Raymond Hettinger734fb572004-01-20 20:04:40 +00001495# Find runs of consecutive numbers using groupby. The key to the solution
1496# is differencing with a range so that consecutive numbers all appear in
1497# same group.
1498>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Ezio Melottidde5b942010-02-03 05:37:26 +00001499>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Raymond Hettinger734fb572004-01-20 20:04:40 +00001500... print map(operator.itemgetter(1), g)
1501...
1502[1]
1503[4, 5, 6]
1504[10]
1505[15, 16, 17, 18]
1506[22]
1507[25, 26, 27, 28]
1508
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001509>>> def take(n, iterable):
1510... "Return first n items of the iterable as a list"
1511... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001512
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001513>>> def enumerate(iterable, start=0):
1514... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001515
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001516>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001517... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001518... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001519
Raymond Hettingerf9bce832009-02-19 05:34:35 +00001520>>> def nth(iterable, n, default=None):
1521... "Returns the nth item or a default value"
1522... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001523
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001524>>> def quantify(iterable, pred=bool):
1525... "Count how many times the predicate is true"
1526... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001527
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001528>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001529... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001530... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001531
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001532>>> def ncycles(iterable, n):
Ezio Melottic2077b02011-03-16 12:34:31 +02001533... "Returns the sequence elements n times"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001534... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001535
1536>>> def dotproduct(vec1, vec2):
1537... return sum(imap(operator.mul, vec1, vec2))
1538
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001539>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001540... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001541
1542>>> def repeatfunc(func, times=None, *args):
1543... "Repeat calls to func with specified arguments."
1544... " Example: repeatfunc(random.random)"
1545... if times is None:
1546... return starmap(func, repeat(args))
1547... else:
1548... return starmap(func, repeat(args, times))
1549
Raymond Hettingerd591f662003-10-26 15:34:50 +00001550>>> def pairwise(iterable):
1551... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1552... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001553... for elem in b:
1554... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001555... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001556
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001557>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001558... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001559... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001560... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001561
1562>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001563... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001564... # Recipe credited to George Sakkis
1565... pending = len(iterables)
1566... nexts = cycle(iter(it).next for it in iterables)
1567... while pending:
1568... try:
1569... for next in nexts:
1570... yield next()
1571... except StopIteration:
1572... pending -= 1
1573... nexts = cycle(islice(nexts, pending))
1574
1575>>> def powerset(iterable):
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001576... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1577... s = list(iterable)
1578... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001579
Raymond Hettinger44e15812009-01-02 21:26:45 +00001580>>> def unique_everseen(iterable, key=None):
1581... "List unique elements, preserving order. Remember all elements ever seen."
1582... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1583... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1584... seen = set()
1585... seen_add = seen.add
1586... if key is None:
1587... for element in iterable:
1588... if element not in seen:
1589... seen_add(element)
1590... yield element
1591... else:
1592... for element in iterable:
1593... k = key(element)
1594... if k not in seen:
1595... seen_add(k)
1596... yield element
1597
1598>>> def unique_justseen(iterable, key=None):
1599... "List unique elements, preserving order. Remember only the element just seen."
1600... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1601... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1602... return imap(next, imap(itemgetter(1), groupby(iterable, key)))
1603
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001604This is not part of the examples but it tests to make sure the definitions
1605perform as purported.
1606
Raymond Hettingera098b332003-09-08 23:58:40 +00001607>>> take(10, count())
1608[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1609
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001610>>> list(enumerate('abc'))
1611[(0, 'a'), (1, 'b'), (2, 'c')]
1612
1613>>> list(islice(tabulate(lambda x: 2*x), 4))
1614[0, 2, 4, 6]
1615
1616>>> nth('abcde', 3)
Raymond Hettingerd507afd2009-02-04 10:52:32 +00001617'd'
1618
1619>>> nth('abcde', 9) is None
1620True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001621
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001622>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000162350
1624
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001625>>> a = [[1, 2, 3], [4, 5, 6]]
1626>>> flatten(a)
1627[1, 2, 3, 4, 5, 6]
1628
1629>>> list(repeatfunc(pow, 5, 2, 3))
1630[8, 8, 8, 8, 8]
1631
1632>>> import random
1633>>> take(5, imap(int, repeatfunc(random.random)))
1634[0, 0, 0, 0, 0]
1635
Raymond Hettingerd591f662003-10-26 15:34:50 +00001636>>> list(pairwise('abcd'))
1637[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001638
Raymond Hettingerd591f662003-10-26 15:34:50 +00001639>>> list(pairwise([]))
1640[]
1641
1642>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001643[]
1644
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001645>>> list(islice(padnone('abc'), 0, 6))
1646['a', 'b', 'c', None, None, None]
1647
1648>>> list(ncycles('abc', 3))
1649['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1650
1651>>> dotproduct([1,2,3], [4,5,6])
165232
1653
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001654>>> list(grouper(3, 'abcdefg', 'x'))
1655[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1656
1657>>> list(roundrobin('abc', 'd', 'ef'))
1658['a', 'd', 'e', 'b', 'f', 'c']
1659
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001660>>> list(powerset([1,2,3]))
1661[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001662
Raymond Hettinger560f9a82009-01-27 13:26:35 +00001663>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1664True
1665
1666>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1667True
1668
Raymond Hettinger44e15812009-01-02 21:26:45 +00001669>>> list(unique_everseen('AAAABBBCCDAABBB'))
1670['A', 'B', 'C', 'D']
1671
1672>>> list(unique_everseen('ABBCcAD', str.lower))
1673['A', 'B', 'C', 'D']
1674
1675>>> list(unique_justseen('AAAABBBCCDAABBB'))
1676['A', 'B', 'C', 'D', 'A', 'B']
1677
1678>>> list(unique_justseen('ABBCcAD', str.lower))
1679['A', 'B', 'C', 'A', 'D']
1680
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001681"""
1682
1683__test__ = {'libreftest' : libreftest}
1684
1685def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001686 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001687 RegressionTests, LengthTransparency,
Serhiy Storchaka6c467a42013-04-06 22:51:29 +03001688 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001689 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001690
1691 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001692 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001693 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001694 counts = [None] * 5
1695 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001696 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001697 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001698 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001699 print counts
1700
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001701 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001702 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001703
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001704if __name__ == "__main__":
1705 test_main(verbose=True)