blob: 753aa17afa428e6e952c27274ce9bceaf46ed02a [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))
Serhiy Storchaka53ea1622015-03-28 20:38:48 +0200952 try:
953 any(forward) # exhaust the iterator
954 del backward
955 except:
956 del forward, backward
957 raise
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200958
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000959 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000960 self.assertRaises(StopIteration, izip().next)
961
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000962 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000963 self.assertRaises(StopIteration, f([]).next)
964 self.assertRaises(StopIteration, f(StopNow()).next)
965
966 self.assertRaises(StopIteration, islice([], None).next)
967 self.assertRaises(StopIteration, islice(StopNow(), None).next)
968
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000969 p, q = tee([])
970 self.assertRaises(StopIteration, p.next)
971 self.assertRaises(StopIteration, q.next)
972 p, q = tee(StopNow())
973 self.assertRaises(StopIteration, p.next)
974 self.assertRaises(StopIteration, q.next)
975
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000976 self.assertRaises(StopIteration, repeat(None, 0).next)
977
978 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
979 self.assertRaises(StopIteration, f(lambda x:x, []).next)
980 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
981
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000982class TestExamples(unittest.TestCase):
983
984 def test_chain(self):
985 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
986
987 def test_chain_from_iterable(self):
988 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
989
990 def test_combinations(self):
991 self.assertEqual(list(combinations('ABCD', 2)),
992 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
993 self.assertEqual(list(combinations(range(4), 3)),
994 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
995
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000996 def test_combinations_with_replacement(self):
997 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
998 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
999
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001000 def test_compress(self):
1001 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1002
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001003 def test_count(self):
1004 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1005
1006 def test_cycle(self):
1007 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1008
1009 def test_dropwhile(self):
1010 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1011
1012 def test_groupby(self):
1013 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1014 list('ABCDAB'))
1015 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1016 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1017
1018 def test_ifilter(self):
1019 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
1020
1021 def test_ifilterfalse(self):
1022 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1023
1024 def test_imap(self):
1025 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1026
1027 def test_islice(self):
1028 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1029 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1030 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1031 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1032
1033 def test_izip(self):
1034 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1035
1036 def test_izip_longest(self):
1037 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
1038 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1039
1040 def test_permutations(self):
1041 self.assertEqual(list(permutations('ABCD', 2)),
1042 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
1043 self.assertEqual(list(permutations(range(3))),
1044 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1045
1046 def test_product(self):
1047 self.assertEqual(list(product('ABCD', 'xy')),
1048 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
1049 self.assertEqual(list(product(range(2), repeat=3)),
1050 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1051 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1052
1053 def test_repeat(self):
1054 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1055
1056 def test_stapmap(self):
1057 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1058 [32, 9, 1000])
1059
1060 def test_takewhile(self):
1061 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1062
1063
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001064class TestGC(unittest.TestCase):
1065
1066 def makecycle(self, iterator, container):
1067 container.append(iterator)
1068 iterator.next()
1069 del container, iterator
1070
1071 def test_chain(self):
1072 a = []
1073 self.makecycle(chain(a), a)
1074
Raymond Hettingerad47fa12008-03-06 20:52:01 +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 Hettingerd081abc2009-01-27 02:58:49 +00001083 def test_combinations_with_replacement(self):
1084 a = []
1085 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1086
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001087 def test_compress(self):
1088 a = []
1089 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1090
Raymond Hettingerb21d8102009-02-16 20:39:12 +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
Raymond Hettingera1ca94a2008-03-06 22:51:36 +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(xrange(n), key=keyfunc):
1113 keyfunc.__dict__.setdefault('x',[]).append(j)
1114
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001115 def test_ifilter(self):
1116 a = []
1117 self.makecycle(ifilter(lambda x:True, [a]*2), a)
1118
1119 def test_ifilterfalse(self):
1120 a = []
1121 self.makecycle(ifilterfalse(lambda x:False, a), a)
1122
1123 def test_izip(self):
1124 a = []
1125 self.makecycle(izip([a]*2, [a]*3), a)
1126
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001127 def test_izip_longest(self):
1128 a = []
1129 self.makecycle(izip_longest([a]*2, [a]*3), a)
1130 b = [a, None]
1131 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
1132
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001133 def test_imap(self):
1134 a = []
1135 self.makecycle(imap(lambda x:x, [a]*2), a)
1136
1137 def test_islice(self):
1138 a = []
1139 self.makecycle(islice([a]*2, None), a)
1140
Raymond Hettingerad47fa12008-03-06 20:52:01 +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
1180 def next(self):
1181 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
1200 def next(self):
1201 if self.i >= len(self.seqn): raise StopIteration
1202 v = self.seqn[self.i]
1203 self.i += 1
1204 return v
1205
1206class N:
1207 'Iterator missing next()'
1208 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
1221 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
1230 def next(self):
1231 raise StopIteration
1232
1233def L(seqn):
1234 'Test multiple tiers of iterators'
1235 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1236
1237
1238class TestVariousIteratorArgs(unittest.TestCase):
1239
1240 def test_chain(self):
1241 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1242 for g in (G, I, Ig, S, L, R):
1243 self.assertEqual(list(chain(g(s))), list(g(s)))
1244 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +00001245 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001246 self.assertRaises(TypeError, list, chain(N(s)))
1247 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1248
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001249 def test_compress(self):
1250 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1251 n = len(s)
1252 for g in (G, I, Ig, S, L, R):
1253 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1254 self.assertRaises(TypeError, compress, X(s), repeat(1))
1255 self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
1256 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1257
Raymond Hettinger50986cc2008-02-22 03:16:42 +00001258 def test_product(self):
1259 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1260 self.assertRaises(TypeError, product, X(s))
1261 self.assertRaises(TypeError, product, N(s))
1262 self.assertRaises(ZeroDivisionError, product, E(s))
1263
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001264 def test_cycle(self):
1265 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1266 for g in (G, I, Ig, S, L, R):
1267 tgtlen = len(s) * 3
1268 expected = list(g(s))*3
1269 actual = list(islice(cycle(g(s)), tgtlen))
1270 self.assertEqual(actual, expected)
1271 self.assertRaises(TypeError, cycle, X(s))
1272 self.assertRaises(TypeError, list, cycle(N(s)))
1273 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1274
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001275 def test_groupby(self):
1276 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1277 for g in (G, I, Ig, S, L, R):
1278 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1279 self.assertRaises(TypeError, groupby, X(s))
1280 self.assertRaises(TypeError, list, groupby(N(s)))
1281 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1282
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001283 def test_ifilter(self):
1284 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1285 for g in (G, I, Ig, S, L, R):
1286 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
1287 self.assertRaises(TypeError, ifilter, isEven, X(s))
1288 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
1289 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
1290
1291 def test_ifilterfalse(self):
1292 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1293 for g in (G, I, Ig, S, L, R):
1294 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
1295 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
1296 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
1297 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
1298
1299 def test_izip(self):
1300 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1301 for g in (G, I, Ig, S, L, R):
1302 self.assertEqual(list(izip(g(s))), zip(g(s)))
1303 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
1304 self.assertRaises(TypeError, izip, X(s))
1305 self.assertRaises(TypeError, list, izip(N(s)))
1306 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
1307
Raymond Hettingerd36862c2007-02-21 05:20:38 +00001308 def test_iziplongest(self):
1309 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1310 for g in (G, I, Ig, S, L, R):
1311 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
1312 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
1313 self.assertRaises(TypeError, izip_longest, X(s))
1314 self.assertRaises(TypeError, list, izip_longest(N(s)))
1315 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
1316
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001317 def test_imap(self):
1318 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1319 for g in (G, I, Ig, S, L, R):
1320 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
1321 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
1322 self.assertRaises(TypeError, imap, onearg, X(s))
1323 self.assertRaises(TypeError, list, imap(onearg, N(s)))
1324 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1325
1326 def test_islice(self):
1327 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1328 for g in (G, I, Ig, S, L, R):
1329 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1330 self.assertRaises(TypeError, islice, X(s), 10)
1331 self.assertRaises(TypeError, list, islice(N(s), 10))
1332 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1333
1334 def test_starmap(self):
1335 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1336 for g in (G, I, Ig, S, L, R):
1337 ss = zip(s, s)
1338 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1339 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1340 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1341 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1342
1343 def test_takewhile(self):
1344 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1345 for g in (G, I, Ig, S, L, R):
1346 tgt = []
1347 for elem in g(s):
1348 if not isEven(elem): break
1349 tgt.append(elem)
1350 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1351 self.assertRaises(TypeError, takewhile, isEven, X(s))
1352 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1353 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1354
1355 def test_dropwhile(self):
1356 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1357 for g in (G, I, Ig, S, L, R):
1358 tgt = []
1359 for elem in g(s):
1360 if not tgt and isOdd(elem): continue
1361 tgt.append(elem)
1362 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1363 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1364 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1365 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1366
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001367 def test_tee(self):
1368 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1369 for g in (G, I, Ig, S, L, R):
1370 it1, it2 = tee(g(s))
1371 self.assertEqual(list(it1), list(g(s)))
1372 self.assertEqual(list(it2), list(g(s)))
1373 self.assertRaises(TypeError, tee, X(s))
1374 self.assertRaises(TypeError, list, tee(N(s))[0])
1375 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1376
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001377class LengthTransparency(unittest.TestCase):
1378
1379 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001380 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001381 self.assertEqual(len(repeat(None, 50)), 50)
1382 self.assertRaises(TypeError, len, repeat(None))
1383
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001384class RegressionTests(unittest.TestCase):
1385
1386 def test_sf_793826(self):
1387 # Fix Armin Rigo's successful efforts to wreak havoc
1388
1389 def mutatingtuple(tuple1, f, tuple2):
1390 # this builds a tuple t which is a copy of tuple1,
1391 # then calls f(t), then mutates t to be equal to tuple2
1392 # (needs len(tuple1) == len(tuple2)).
1393 def g(value, first=[1]):
1394 if first:
1395 del first[:]
1396 f(z.next())
1397 return value
1398 items = list(tuple2)
1399 items[1:1] = list(tuple1)
1400 gen = imap(g, items)
1401 z = izip(*[gen]*len(tuple1))
1402 z.next()
1403
1404 def f(t):
1405 global T
1406 T = t
1407 first[:] = list(T)
1408
1409 first = []
1410 mutatingtuple((1,2,3), f, (4,5,6))
1411 second = list(T)
1412 self.assertEqual(first, second)
1413
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001414
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001415 def test_sf_950057(self):
1416 # Make sure that chain() and cycle() catch exceptions immediately
1417 # rather than when shifting between input sources
1418
1419 def gen1():
1420 hist.append(0)
1421 yield 1
1422 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001423 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001424 hist.append(2)
1425
1426 def gen2(x):
1427 hist.append(3)
1428 yield 2
1429 hist.append(4)
1430 if x:
1431 raise StopIteration
1432
1433 hist = []
1434 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1435 self.assertEqual(hist, [0,1])
1436
1437 hist = []
1438 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1439 self.assertEqual(hist, [0,1])
1440
1441 hist = []
1442 self.assertRaises(AssertionError, list, cycle(gen1()))
1443 self.assertEqual(hist, [0,1])
1444
Georg Brandlb84c1372007-01-21 10:28:43 +00001445class SubclassWithKwargsTest(unittest.TestCase):
1446 def test_keywords_in_subclass(self):
1447 # count is not subclassable...
1448 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001449 starmap, islice, takewhile, dropwhile, cycle, compress):
Georg Brandlb84c1372007-01-21 10:28:43 +00001450 class Subclass(cls):
1451 def __init__(self, newarg=None, *args):
1452 cls.__init__(self, *args)
1453 try:
1454 Subclass(newarg=1)
1455 except TypeError, err:
1456 # we expect type errors because of wrong argument count
Ezio Melottiaa980582010-01-23 23:04:36 +00001457 self.assertNotIn("does not take keyword arguments", err.args[0])
Georg Brandlb84c1372007-01-21 10:28:43 +00001458
1459
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001460libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001461
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001462
1463>>> amounts = [120.15, 764.05, 823.14]
1464>>> for checknum, amount in izip(count(1200), amounts):
1465... print 'Check %d is for $%.2f' % (checknum, amount)
1466...
1467Check 1200 is for $120.15
1468Check 1201 is for $764.05
1469Check 1202 is for $823.14
1470
1471>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001472>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1473... print cube
1474...
14751
14768
147727
1478
1479>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001480>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001481... print name.title()
1482...
1483Alex
1484Laura
1485Martin
1486Walter
1487Samuele
1488
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001489>>> from operator import itemgetter
1490>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001491>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001492>>> for k, g in groupby(di, itemgetter(1)):
1493... print k, map(itemgetter(0), g)
1494...
14951 ['a', 'c', 'e']
14962 ['b', 'd', 'f']
14973 ['g']
1498
Raymond Hettinger734fb572004-01-20 20:04:40 +00001499# Find runs of consecutive numbers using groupby. The key to the solution
1500# is differencing with a range so that consecutive numbers all appear in
1501# same group.
1502>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Ezio Melottidde5b942010-02-03 05:37:26 +00001503>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Raymond Hettinger734fb572004-01-20 20:04:40 +00001504... print map(operator.itemgetter(1), g)
1505...
1506[1]
1507[4, 5, 6]
1508[10]
1509[15, 16, 17, 18]
1510[22]
1511[25, 26, 27, 28]
1512
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001513>>> def take(n, iterable):
1514... "Return first n items of the iterable as a list"
1515... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001516
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001517>>> def enumerate(iterable, start=0):
1518... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001519
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001520>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001521... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001522... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001523
Raymond Hettingerf9bce832009-02-19 05:34:35 +00001524>>> def nth(iterable, n, default=None):
1525... "Returns the nth item or a default value"
1526... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001527
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001528>>> def quantify(iterable, pred=bool):
1529... "Count how many times the predicate is true"
1530... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001531
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001532>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001533... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001534... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001535
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001536>>> def ncycles(iterable, n):
Ezio Melottic2077b02011-03-16 12:34:31 +02001537... "Returns the sequence elements n times"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001538... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001539
1540>>> def dotproduct(vec1, vec2):
1541... return sum(imap(operator.mul, vec1, vec2))
1542
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001543>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001544... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001545
1546>>> def repeatfunc(func, times=None, *args):
1547... "Repeat calls to func with specified arguments."
1548... " Example: repeatfunc(random.random)"
1549... if times is None:
1550... return starmap(func, repeat(args))
1551... else:
1552... return starmap(func, repeat(args, times))
1553
Raymond Hettingerd591f662003-10-26 15:34:50 +00001554>>> def pairwise(iterable):
1555... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1556... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001557... for elem in b:
1558... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001559... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001560
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001561>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001562... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001563... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001564... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001565
1566>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001567... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001568... # Recipe credited to George Sakkis
1569... pending = len(iterables)
1570... nexts = cycle(iter(it).next for it in iterables)
1571... while pending:
1572... try:
1573... for next in nexts:
1574... yield next()
1575... except StopIteration:
1576... pending -= 1
1577... nexts = cycle(islice(nexts, pending))
1578
1579>>> def powerset(iterable):
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001580... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1581... s = list(iterable)
1582... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001583
Raymond Hettinger44e15812009-01-02 21:26:45 +00001584>>> def unique_everseen(iterable, key=None):
1585... "List unique elements, preserving order. Remember all elements ever seen."
1586... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1587... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1588... seen = set()
1589... seen_add = seen.add
1590... if key is None:
1591... for element in iterable:
1592... if element not in seen:
1593... seen_add(element)
1594... yield element
1595... else:
1596... for element in iterable:
1597... k = key(element)
1598... if k not in seen:
1599... seen_add(k)
1600... yield element
1601
1602>>> def unique_justseen(iterable, key=None):
1603... "List unique elements, preserving order. Remember only the element just seen."
1604... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1605... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1606... return imap(next, imap(itemgetter(1), groupby(iterable, key)))
1607
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001608This is not part of the examples but it tests to make sure the definitions
1609perform as purported.
1610
Raymond Hettingera098b332003-09-08 23:58:40 +00001611>>> take(10, count())
1612[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1613
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001614>>> list(enumerate('abc'))
1615[(0, 'a'), (1, 'b'), (2, 'c')]
1616
1617>>> list(islice(tabulate(lambda x: 2*x), 4))
1618[0, 2, 4, 6]
1619
1620>>> nth('abcde', 3)
Raymond Hettingerd507afd2009-02-04 10:52:32 +00001621'd'
1622
1623>>> nth('abcde', 9) is None
1624True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001625
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001626>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000162750
1628
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001629>>> a = [[1, 2, 3], [4, 5, 6]]
1630>>> flatten(a)
1631[1, 2, 3, 4, 5, 6]
1632
1633>>> list(repeatfunc(pow, 5, 2, 3))
1634[8, 8, 8, 8, 8]
1635
1636>>> import random
1637>>> take(5, imap(int, repeatfunc(random.random)))
1638[0, 0, 0, 0, 0]
1639
Raymond Hettingerd591f662003-10-26 15:34:50 +00001640>>> list(pairwise('abcd'))
1641[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001642
Raymond Hettingerd591f662003-10-26 15:34:50 +00001643>>> list(pairwise([]))
1644[]
1645
1646>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001647[]
1648
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001649>>> list(islice(padnone('abc'), 0, 6))
1650['a', 'b', 'c', None, None, None]
1651
1652>>> list(ncycles('abc', 3))
1653['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1654
1655>>> dotproduct([1,2,3], [4,5,6])
165632
1657
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001658>>> list(grouper(3, 'abcdefg', 'x'))
1659[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1660
1661>>> list(roundrobin('abc', 'd', 'ef'))
1662['a', 'd', 'e', 'b', 'f', 'c']
1663
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001664>>> list(powerset([1,2,3]))
1665[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001666
Raymond Hettinger560f9a82009-01-27 13:26:35 +00001667>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1668True
1669
1670>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1671True
1672
Raymond Hettinger44e15812009-01-02 21:26:45 +00001673>>> list(unique_everseen('AAAABBBCCDAABBB'))
1674['A', 'B', 'C', 'D']
1675
1676>>> list(unique_everseen('ABBCcAD', str.lower))
1677['A', 'B', 'C', 'D']
1678
1679>>> list(unique_justseen('AAAABBBCCDAABBB'))
1680['A', 'B', 'C', 'D', 'A', 'B']
1681
1682>>> list(unique_justseen('ABBCcAD', str.lower))
1683['A', 'B', 'C', 'A', 'D']
1684
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001685"""
1686
1687__test__ = {'libreftest' : libreftest}
1688
1689def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001690 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001691 RegressionTests, LengthTransparency,
Serhiy Storchaka6c467a42013-04-06 22:51:29 +03001692 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001693 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001694
1695 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001696 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001697 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001698 counts = [None] * 5
1699 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001700 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001701 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001702 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001703 print counts
1704
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001705 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001706 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001707
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001708if __name__ == "__main__":
1709 test_main(verbose=True)