blob: cbb1b9266d1e435ce2a8e1bde887e1b68793023d [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):
142 with self.assertRaises(OverflowError):
143 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
Alex Gaynor97376482011-07-17 16:44:31 -0700216 @test_support.impl_detail("tuple reuse is specific to CPython")
217 def test_combinations_with_replacement_tuple_reuse(self):
218 cwr = combinations_with_replacement
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000219 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
220 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
221
Raymond Hettingerd553d852008-03-04 04:17:08 +0000222 def test_permutations(self):
223 self.assertRaises(TypeError, permutations) # too few arguments
224 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000225 self.assertRaises(TypeError, permutations, None) # pool is not iterable
226 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000227 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000228 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Raymond Hettingerd553d852008-03-04 04:17:08 +0000229 self.assertEqual(list(permutations(range(3), 2)),
230 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
231
232 def permutations1(iterable, r=None):
233 'Pure python version shown in the docs'
234 pool = tuple(iterable)
235 n = len(pool)
236 r = n if r is None else r
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000237 if r > n:
238 return
Raymond Hettingerd553d852008-03-04 04:17:08 +0000239 indices = range(n)
Raymond Hettingere70bb8d2008-03-23 00:55:46 +0000240 cycles = range(n, n-r, -1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000241 yield tuple(pool[i] for i in indices[:r])
242 while n:
243 for i in reversed(range(r)):
244 cycles[i] -= 1
245 if cycles[i] == 0:
246 indices[i:] = indices[i+1:] + indices[i:i+1]
247 cycles[i] = n - i
248 else:
249 j = cycles[i]
250 indices[i], indices[-j] = indices[-j], indices[i]
251 yield tuple(pool[i] for i in indices[:r])
252 break
253 else:
254 return
255
256 def permutations2(iterable, r=None):
257 'Pure python version shown in the docs'
258 pool = tuple(iterable)
259 n = len(pool)
260 r = n if r is None else r
261 for indices in product(range(n), repeat=r):
262 if len(set(indices)) == r:
263 yield tuple(pool[i] for i in indices)
264
265 for n in range(7):
266 values = [5*x-12 for x in range(n)]
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000267 for r in range(n+2):
Raymond Hettingerd553d852008-03-04 04:17:08 +0000268 result = list(permutations(values, r))
Ezio Melottidde5b942010-02-03 05:37:26 +0000269 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 +0000270 self.assertEqual(len(result), len(set(result))) # no repeats
271 self.assertEqual(result, sorted(result)) # lexicographic order
272 for p in result:
273 self.assertEqual(len(p), r) # r-length permutations
274 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000275 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000276 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5b913e32009-01-08 06:39:04 +0000277 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Raymond Hettingerd553d852008-03-04 04:17:08 +0000278 if r == n:
279 self.assertEqual(result, list(permutations(values, None))) # test r as None
280 self.assertEqual(result, list(permutations(values))) # test default r
281
Zachary Ware4e0df172014-04-24 13:20:27 -0500282 @test_support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynor97376482011-07-17 16:44:31 -0700283 def test_permutations_tuple_reuse(self):
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000284 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000285 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000286
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000287 def test_combinatorics(self):
288 # Test relationships between product(), permutations(),
289 # combinations() and combinations_with_replacement().
290
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000291 for n in range(6):
292 s = 'ABCDEFG'[:n]
293 for r in range(8):
294 prod = list(product(s, repeat=r))
295 cwr = list(combinations_with_replacement(s, r))
296 perm = list(permutations(s, r))
297 comb = list(combinations(s, r))
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000298
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000299 # Check size
Ezio Melotti2623a372010-11-21 13:34:58 +0000300 self.assertEqual(len(prod), n**r)
301 self.assertEqual(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r))
302 self.assertEqual(len(perm), 0 if r>n else fact(n) // fact(n-r))
303 self.assertEqual(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000304
305 # Check lexicographic order without repeated tuples
Ezio Melotti2623a372010-11-21 13:34:58 +0000306 self.assertEqual(prod, sorted(set(prod)))
307 self.assertEqual(cwr, sorted(set(cwr)))
308 self.assertEqual(perm, sorted(set(perm)))
309 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000310
311 # Check interrelationships
Ezio Melotti2623a372010-11-21 13:34:58 +0000312 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
313 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 +0000314 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
315 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
316 self.assertEqual(comb, filter(set(cwr).__contains__, perm)) # comb: perm that is a cwr
317 self.assertEqual(comb, filter(set(perm).__contains__, cwr)) # comb: cwr that is a perm
318 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000319
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000320 def test_compress(self):
Raymond Hettinger2e2909f2009-02-19 02:15:14 +0000321 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000322 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
323 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
324 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
325 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
326 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
327 n = 10000
328 data = chain.from_iterable(repeat(range(6), n))
329 selectors = chain.from_iterable(repeat((0, 1)))
330 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
331 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
332 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
333 self.assertRaises(TypeError, compress, range(6)) # too few args
334 self.assertRaises(TypeError, compress, range(6), None) # too many args
335
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000336 def test_count(self):
337 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
338 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000339 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000340 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
341 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000342 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000343 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000344 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
345 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000346 c = count(3)
347 self.assertEqual(repr(c), 'count(3)')
348 c.next()
349 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +0000350 c = count(-9)
351 self.assertEqual(repr(c), 'count(-9)')
352 c.next()
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000353 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Jack Diederich36234e82006-09-21 17:50:26 +0000354 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000355 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 +0000356 # Test repr (ignoring the L in longs)
357 r1 = repr(count(i)).replace('L', '')
358 r2 = 'count(%r)'.__mod__(i).replace('L', '')
359 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000360
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000361 # check copy, deepcopy, pickle
362 for value in -3, 3, sys.maxint-5, sys.maxint+5:
363 c = count(value)
364 self.assertEqual(next(copy.copy(c)), value)
365 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchaka655720e2014-12-15 14:02:43 +0200366 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
367 self.assertEqual(next(pickle.loads(pickle.dumps(c, proto))), value)
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000368
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000369 def test_count_with_stride(self):
370 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingera4038032009-02-14 00:25:51 +0000371 self.assertEqual(zip('abc',count(start=2,step=3)),
372 [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingeraa681c72009-02-21 07:17:22 +0000373 self.assertEqual(zip('abc',count(step=-1)),
374 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000375 self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
376 self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
377 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
378 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
379 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettingeraa044612009-02-12 12:04:26 +0000380 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
381 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +0000382 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
383 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000384 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
385 c = count(3, 5)
386 self.assertEqual(repr(c), 'count(3, 5)')
387 c.next()
388 self.assertEqual(repr(c), 'count(8, 5)')
389 c = count(-9, 0)
390 self.assertEqual(repr(c), 'count(-9, 0)')
391 c.next()
392 self.assertEqual(repr(c), 'count(-9, 0)')
393 c = count(-9, -3)
394 self.assertEqual(repr(c), 'count(-9, -3)')
395 c.next()
396 self.assertEqual(repr(c), 'count(-12, -3)')
397 self.assertEqual(repr(c), 'count(-12, -3)')
398 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
399 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
400 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
401 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
402 for j in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5):
403 # Test repr (ignoring the L in longs)
404 r1 = repr(count(i, j)).replace('L', '')
405 if j == 1:
406 r2 = ('count(%r)' % i).replace('L', '')
407 else:
408 r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
409 self.assertEqual(r1, r2)
410
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000411 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000412 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000413 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000414 self.assertRaises(TypeError, cycle)
415 self.assertRaises(TypeError, cycle, 5)
416 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000417
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000418 def test_groupby(self):
419 # Check whether it accepts arguments correctly
420 self.assertEqual([], list(groupby([])))
421 self.assertEqual([], list(groupby([], key=id)))
422 self.assertRaises(TypeError, list, groupby('abc', []))
423 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000424 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000425
426 # Check normal input
427 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
428 (2,15,22), (3,16,23), (3,17,23)]
429 dup = []
430 for k, g in groupby(s, lambda r:r[0]):
431 for elem in g:
432 self.assertEqual(k, elem[0])
433 dup.append(elem)
434 self.assertEqual(s, dup)
435
436 # Check nested case
437 dup = []
438 for k, g in groupby(s, lambda r:r[0]):
439 for ik, ig in groupby(g, lambda r:r[2]):
440 for elem in ig:
441 self.assertEqual(k, elem[0])
442 self.assertEqual(ik, elem[2])
443 dup.append(elem)
444 self.assertEqual(s, dup)
445
446 # Check case where inner iterator is not used
447 keys = [k for k, g in groupby(s, lambda r:r[0])]
448 expectedkeys = set([r[0] for r in s])
449 self.assertEqual(set(keys), expectedkeys)
450 self.assertEqual(len(keys), len(expectedkeys))
451
452 # Exercise pipes and filters style
453 s = 'abracadabra'
454 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000455 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000456 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
457 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000458 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000459 self.assertEqual(r, ['a', 'b', 'r'])
460 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000461 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000462 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
463 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000464 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000465 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
466
467 # iter.next failure
468 class ExpectedError(Exception):
469 pass
470 def delayed_raise(n=0):
471 for i in range(n):
472 yield 'yo'
473 raise ExpectedError
474 def gulp(iterable, keyp=None, func=list):
475 return [func(g) for k, g in groupby(iterable, keyp)]
476
477 # iter.next failure on outer object
478 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
479 # iter.next failure on inner object
480 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
481
482 # __cmp__ failure
483 class DummyCmp:
484 def __cmp__(self, dst):
485 raise ExpectedError
486 s = [DummyCmp(), DummyCmp(), None]
487
488 # __cmp__ failure on outer object
489 self.assertRaises(ExpectedError, gulp, s, func=id)
490 # __cmp__ failure on inner object
491 self.assertRaises(ExpectedError, gulp, s)
492
493 # keyfunc failure
494 def keyfunc(obj):
495 if keyfunc.skip > 0:
496 keyfunc.skip -= 1
497 return obj
498 else:
499 raise ExpectedError
500
501 # keyfunc failure on outer object
502 keyfunc.skip = 0
503 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
504 keyfunc.skip = 1
505 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
506
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000507 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000508 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000509 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000510 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000511 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000512 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000513 self.assertRaises(TypeError, ifilter, lambda x:x)
514 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000515 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000516 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000517
518 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000519 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
520 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000521 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000522 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000523 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000524 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
525 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000526 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000527 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000528
529 def test_izip(self):
530 ans = [(x,y) for x, y in izip('abc',count())]
531 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000532 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
533 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000534 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000535 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000536 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000537 self.assertRaises(TypeError, izip, 3)
538 self.assertRaises(TypeError, izip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000539 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
540 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000541 self.assertEqual([pair for pair in izip('abc', 'def')],
542 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700543
544 @test_support.impl_detail("tuple reuse is specific to CPython")
Zachary Ware4e0df172014-04-24 13:20:27 -0500545 def test_izip_tuple_reuse(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000546 ids = map(id, izip('abc', 'def'))
547 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000548 ids = map(id, list(izip('abc', 'def')))
549 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000550
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000551 def test_iziplongest(self):
552 for args in [
553 ['abc', range(6)],
554 [range(6), 'abc'],
555 [range(1000), range(2000,2100), range(3000,3050)],
556 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
557 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
558 ]:
Ezio Melottidde5b942010-02-03 05:37:26 +0000559 # target = map(None, *args) <- this raises a py3k warning
560 # this is the replacement:
561 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
562 for i in range(max(map(len, args)))]
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000563 self.assertEqual(list(izip_longest(*args)), target)
564 self.assertEqual(list(izip_longest(*args, **{})), target)
565 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
566 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000567
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000568 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
569
570 self.assertEqual(list(izip_longest()), zip())
571 self.assertEqual(list(izip_longest([])), zip([]))
572 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000573
Ezio Melottidde5b942010-02-03 05:37:26 +0000574 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
575 zip(list('abc') + [None], 'defg')) # empty keyword dict
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000576 self.assertRaises(TypeError, izip_longest, 3)
577 self.assertRaises(TypeError, izip_longest, range(3), 3)
578
579 for stmt in [
580 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000581 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000582 ]:
583 try:
584 eval(stmt, globals(), locals())
585 except TypeError:
586 pass
587 else:
588 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000589
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000590 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
591 zip('abc', 'def'))
592 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
593 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700594
595 @test_support.impl_detail("tuple reuse is specific to CPython")
596 def test_izip_longest_tuple_reuse(self):
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000597 ids = map(id, izip_longest('abc', 'def'))
598 self.assertEqual(min(ids), max(ids))
599 ids = map(id, list(izip_longest('abc', 'def')))
600 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
601
Raymond Hettingerfa7dadd2009-11-01 20:45:16 +0000602 def test_bug_7244(self):
603
604 class Repeater(object):
605 # this class is similar to itertools.repeat
606 def __init__(self, o, t, e):
607 self.o = o
608 self.t = int(t)
609 self.e = e
610 def __iter__(self): # its iterator is itself
611 return self
612 def next(self):
613 if self.t > 0:
614 self.t -= 1
615 return self.o
616 else:
617 raise self.e
618
619 # Formerly this code in would fail in debug mode
620 # with Undetected Error and Stop Iteration
621 r1 = Repeater(1, 3, StopIteration)
622 r2 = Repeater(2, 4, StopIteration)
623 def run(r1, r2):
624 result = []
625 for i, j in izip_longest(r1, r2, fillvalue=0):
626 with test_support.captured_output('stdout'):
627 print (i, j)
628 result.append((i, j))
629 return result
630 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
631
632 # Formerly, the RuntimeError would be lost
633 # and StopIteration would stop as expected
634 r1 = Repeater(1, 3, RuntimeError)
635 r2 = Repeater(2, 4, StopIteration)
636 it = izip_longest(r1, r2, fillvalue=0)
637 self.assertEqual(next(it), (1, 2))
638 self.assertEqual(next(it), (1, 2))
639 self.assertEqual(next(it), (1, 2))
640 self.assertRaises(RuntimeError, next, it)
641
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000642 def test_product(self):
643 for args, result in [
Raymond Hettingerd553d852008-03-04 04:17:08 +0000644 ([], [()]), # zero iterables
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000645 (['ab'], [('a',), ('b',)]), # one iterable
646 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
647 ([range(0), range(2), range(3)], []), # first iterable with zero length
648 ([range(2), range(0), range(3)], []), # middle iterable with zero length
649 ([range(2), range(3), range(0)], []), # last iterable with zero length
650 ]:
651 self.assertEqual(list(product(*args)), result)
Raymond Hettinger08ff6822008-02-29 02:21:48 +0000652 for r in range(4):
653 self.assertEqual(list(product(*(args*r))),
654 list(product(*args, **dict(repeat=r))))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000655 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
656 self.assertRaises(TypeError, product, range(6), None)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000657
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000658 def product1(*args, **kwds):
659 pools = map(tuple, args) * kwds.get('repeat', 1)
660 n = len(pools)
661 if n == 0:
662 yield ()
663 return
664 if any(len(pool) == 0 for pool in pools):
665 return
666 indices = [0] * n
667 yield tuple(pool[i] for pool, i in zip(pools, indices))
668 while 1:
669 for i in reversed(range(n)): # right to left
670 if indices[i] == len(pools[i]) - 1:
671 continue
672 indices[i] += 1
673 for j in range(i+1, n):
674 indices[j] = 0
675 yield tuple(pool[i] for pool, i in zip(pools, indices))
676 break
677 else:
678 return
679
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000680 def product2(*args, **kwds):
681 'Pure python version used in docs'
682 pools = map(tuple, args) * kwds.get('repeat', 1)
683 result = [[]]
684 for pool in pools:
685 result = [x+[y] for x in result for y in pool]
686 for prod in result:
687 yield tuple(prod)
688
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000689 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
690 set('abcdefg'), range(11), tuple(range(13))]
691 for i in range(100):
692 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000693 expected_len = prod(map(len, args))
694 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000695 self.assertEqual(list(product(*args)), list(product1(*args)))
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000696 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000697 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000698 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000699
Alex Gaynor97376482011-07-17 16:44:31 -0700700 @test_support.impl_detail("tuple reuse is specific to CPython")
701 def test_product_tuple_reuse(self):
Raymond Hettinger73d79632008-02-23 02:20:41 +0000702 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
703 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000704
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000705 def test_repeat(self):
Raymond Hettinger182edae2009-02-19 02:38:25 +0000706 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700707 self.assertEqual(list(repeat(object='a', times=0)), [])
708 self.assertEqual(list(repeat(object='a', times=-1)), [])
709 self.assertEqual(list(repeat(object='a', times=-2)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000710 self.assertEqual(zip(xrange(3),repeat('a')),
711 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000712 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000713 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000714 self.assertEqual(list(repeat('a', 0)), [])
715 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000716 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000717 self.assertRaises(TypeError, repeat, None, 3, 4)
718 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000719 r = repeat(1+0j)
720 self.assertEqual(repr(r), 'repeat((1+0j))')
721 r = repeat(1+0j, 5)
722 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
723 list(r)
724 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000725
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700726 def test_repeat_with_negative_times(self):
727 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
728 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
729 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
730 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
731
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000732 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000733 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
734 [0**1, 1**2, 2**3])
735 self.assertEqual(list(imap(None, 'abc', range(5))),
736 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000737 self.assertEqual(list(imap(None, 'abc', count())),
738 [('a',0),('b',1),('c',2)])
739 self.assertEqual(take(2,imap(None, 'abc', count())),
740 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000741 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000742 self.assertRaises(TypeError, imap)
743 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000744 self.assertRaises(TypeError, imap(10, range(5)).next)
745 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
746 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000747
748 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000749 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
750 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000751 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
752 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000753 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000754 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
755 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000756 self.assertRaises(TypeError, starmap)
757 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
758 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
759 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
760 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000761
762 def test_islice(self):
763 for args in [ # islice(args) should agree with range(args)
764 (10, 20, 3),
765 (10, 3, 20),
766 (10, 20),
767 (10, 3),
768 (20,)
769 ]:
770 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
771
772 for args, tgtargs in [ # Stop when seqn is exhausted
773 ((10, 110, 3), ((10, 100, 3))),
774 ((10, 110), ((10, 100))),
775 ((110,), (100,))
776 ]:
777 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
778
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000779 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000780 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000781 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
782 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000783 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
784 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
785
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000786 # Test number of items consumed SF #1171417
787 it = iter(range(10))
788 self.assertEqual(list(islice(it, 3)), range(3))
789 self.assertEqual(list(it), range(3, 10))
790
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000791 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000792 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000793 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
794 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
795 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
796 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
797 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000798 self.assertRaises(ValueError, islice, xrange(10), 'a')
799 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
800 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
801 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
802 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000803 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000804
Raymond Hettinger061bf7a2010-11-30 03:15:35 +0000805 # Issue #10323: Less islice in a predictable state
806 c = count()
807 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
808 self.assertEqual(next(c), 3)
809
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200810 # Issue #21321: check source iterator is not referenced
811 # from islice() after the latter has been exhausted
812 it = (x for x in (1, 2))
813 wr = weakref.ref(it)
814 it = islice(it, 1)
815 self.assertIsNotNone(wr())
816 list(it) # exhaust the iterator
Benjamin Petersonec9d5472014-08-24 18:07:28 -0500817 test_support.gc_collect()
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200818 self.assertIsNone(wr())
819
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000820 def test_takewhile(self):
821 data = [1, 3, 5, 20, 2, 4, 6, 8]
822 underten = lambda x: x<10
823 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000824 self.assertEqual(list(takewhile(underten, [])), [])
825 self.assertRaises(TypeError, takewhile)
826 self.assertRaises(TypeError, takewhile, operator.pow)
827 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
828 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
829 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000830 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
831 self.assertEqual(list(t), [1, 1, 1])
832 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000833
834 def test_dropwhile(self):
835 data = [1, 3, 5, 20, 2, 4, 6, 8]
836 underten = lambda x: x<10
837 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000838 self.assertEqual(list(dropwhile(underten, [])), [])
839 self.assertRaises(TypeError, dropwhile)
840 self.assertRaises(TypeError, dropwhile, operator.pow)
841 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
842 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
843 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000844
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000845 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000846 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000847 def irange(n):
848 for i in xrange(n):
849 yield i
850
851 a, b = tee([]) # test empty iterator
852 self.assertEqual(list(a), [])
853 self.assertEqual(list(b), [])
854
855 a, b = tee(irange(n)) # test 100% interleaved
856 self.assertEqual(zip(a,b), zip(range(n),range(n)))
857
858 a, b = tee(irange(n)) # test 0% interleaved
859 self.assertEqual(list(a), range(n))
860 self.assertEqual(list(b), range(n))
861
862 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000863 for i in xrange(100):
864 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000865 del a
866 self.assertEqual(list(b), range(n))
867
868 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000869 for i in xrange(100):
870 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000871 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000872 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000873
874 for j in xrange(5): # test randomly interleaved
875 order = [0]*n + [1]*n
876 random.shuffle(order)
877 lists = ([], [])
878 its = tee(irange(n))
879 for i in order:
880 value = its[i].next()
881 lists[i].append(value)
882 self.assertEqual(lists[0], range(n))
883 self.assertEqual(lists[1], range(n))
884
Raymond Hettingerad983e72003-11-12 14:32:26 +0000885 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000886 self.assertRaises(TypeError, tee)
887 self.assertRaises(TypeError, tee, 3)
888 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000889 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000890
Raymond Hettingerad983e72003-11-12 14:32:26 +0000891 # tee object should be instantiable
892 a, b = tee('abc')
893 c = type(a)('def')
894 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000895
Raymond Hettingerad983e72003-11-12 14:32:26 +0000896 # test long-lagged and multi-way split
897 a, b, c = tee(xrange(2000), 3)
898 for i in xrange(100):
899 self.assertEqual(a.next(), i)
900 self.assertEqual(list(b), range(2000))
901 self.assertEqual([c.next(), c.next()], range(2))
902 self.assertEqual(list(a), range(100,2000))
903 self.assertEqual(list(c), range(2,2000))
904
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000905 # test values of n
906 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000907 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000908 for n in xrange(5):
909 result = tee('abc', n)
910 self.assertEqual(type(result), tuple)
911 self.assertEqual(len(result), n)
912 self.assertEqual(map(list, result), [list('abc')]*n)
913
Raymond Hettingerad983e72003-11-12 14:32:26 +0000914 # tee pass-through to copyable iterator
915 a, b = tee('abc')
916 c, d = tee(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000917 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000918
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000919 # test tee_new
920 t1, t2 = tee('abc')
921 tnew = type(t1)
922 self.assertRaises(TypeError, tnew)
923 self.assertRaises(TypeError, tnew, 10)
924 t3 = tnew(t1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000925 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000926
Raymond Hettingera9f60922004-10-17 16:40:14 +0000927 # test that tee objects are weak referencable
928 a, b = tee(xrange(10))
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200929 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +0000930 self.assertEqual(getattr(p, '__class__'), type(b))
931 del a
932 self.assertRaises(ReferenceError, getattr, p, '__class__')
933
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200934 # Issue 13454: Crash when deleting backward iterator from tee()
935 def test_tee_del_backward(self):
Serhiy Storchaka6fef14d2013-01-26 11:51:42 +0200936 forward, backward = tee(repeat(None, 20000000))
937 any(forward) # exhaust the iterator
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200938 del backward
939
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000940 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000941 self.assertRaises(StopIteration, izip().next)
942
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000943 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000944 self.assertRaises(StopIteration, f([]).next)
945 self.assertRaises(StopIteration, f(StopNow()).next)
946
947 self.assertRaises(StopIteration, islice([], None).next)
948 self.assertRaises(StopIteration, islice(StopNow(), None).next)
949
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000950 p, q = tee([])
951 self.assertRaises(StopIteration, p.next)
952 self.assertRaises(StopIteration, q.next)
953 p, q = tee(StopNow())
954 self.assertRaises(StopIteration, p.next)
955 self.assertRaises(StopIteration, q.next)
956
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000957 self.assertRaises(StopIteration, repeat(None, 0).next)
958
959 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
960 self.assertRaises(StopIteration, f(lambda x:x, []).next)
961 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
962
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000963class TestExamples(unittest.TestCase):
964
965 def test_chain(self):
966 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
967
968 def test_chain_from_iterable(self):
969 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
970
971 def test_combinations(self):
972 self.assertEqual(list(combinations('ABCD', 2)),
973 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
974 self.assertEqual(list(combinations(range(4), 3)),
975 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
976
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000977 def test_combinations_with_replacement(self):
978 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
979 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
980
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000981 def test_compress(self):
982 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
983
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000984 def test_count(self):
985 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
986
987 def test_cycle(self):
988 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
989
990 def test_dropwhile(self):
991 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
992
993 def test_groupby(self):
994 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
995 list('ABCDAB'))
996 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
997 [list('AAAA'), list('BBB'), list('CC'), list('D')])
998
999 def test_ifilter(self):
1000 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
1001
1002 def test_ifilterfalse(self):
1003 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1004
1005 def test_imap(self):
1006 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1007
1008 def test_islice(self):
1009 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1010 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1011 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1012 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1013
1014 def test_izip(self):
1015 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1016
1017 def test_izip_longest(self):
1018 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
1019 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1020
1021 def test_permutations(self):
1022 self.assertEqual(list(permutations('ABCD', 2)),
1023 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
1024 self.assertEqual(list(permutations(range(3))),
1025 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1026
1027 def test_product(self):
1028 self.assertEqual(list(product('ABCD', 'xy')),
1029 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
1030 self.assertEqual(list(product(range(2), repeat=3)),
1031 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1032 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1033
1034 def test_repeat(self):
1035 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1036
1037 def test_stapmap(self):
1038 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1039 [32, 9, 1000])
1040
1041 def test_takewhile(self):
1042 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1043
1044
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001045class TestGC(unittest.TestCase):
1046
1047 def makecycle(self, iterator, container):
1048 container.append(iterator)
1049 iterator.next()
1050 del container, iterator
1051
1052 def test_chain(self):
1053 a = []
1054 self.makecycle(chain(a), a)
1055
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001056 def test_chain_from_iterable(self):
1057 a = []
1058 self.makecycle(chain.from_iterable([a]), a)
1059
1060 def test_combinations(self):
1061 a = []
1062 self.makecycle(combinations([1,2,a,3], 3), a)
1063
Raymond Hettingerd081abc2009-01-27 02:58:49 +00001064 def test_combinations_with_replacement(self):
1065 a = []
1066 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1067
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001068 def test_compress(self):
1069 a = []
1070 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1071
Raymond Hettingerb21d8102009-02-16 20:39:12 +00001072 def test_count(self):
1073 a = []
1074 Int = type('Int', (int,), dict(x=a))
1075 self.makecycle(count(Int(0), Int(1)), a)
1076
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001077 def test_cycle(self):
1078 a = []
1079 self.makecycle(cycle([a]*2), a)
1080
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001081 def test_dropwhile(self):
1082 a = []
1083 self.makecycle(dropwhile(bool, [0, a, a]), a)
1084
1085 def test_groupby(self):
1086 a = []
1087 self.makecycle(groupby([a]*2, lambda x:x), a)
1088
Raymond Hettingera1ca94a2008-03-06 22:51:36 +00001089 def test_issue2246(self):
1090 # Issue 2246 -- the _grouper iterator was not included in GC
1091 n = 10
1092 keyfunc = lambda x: x
1093 for i, j in groupby(xrange(n), key=keyfunc):
1094 keyfunc.__dict__.setdefault('x',[]).append(j)
1095
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001096 def test_ifilter(self):
1097 a = []
1098 self.makecycle(ifilter(lambda x:True, [a]*2), a)
1099
1100 def test_ifilterfalse(self):
1101 a = []
1102 self.makecycle(ifilterfalse(lambda x:False, a), a)
1103
1104 def test_izip(self):
1105 a = []
1106 self.makecycle(izip([a]*2, [a]*3), a)
1107
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001108 def test_izip_longest(self):
1109 a = []
1110 self.makecycle(izip_longest([a]*2, [a]*3), a)
1111 b = [a, None]
1112 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
1113
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001114 def test_imap(self):
1115 a = []
1116 self.makecycle(imap(lambda x:x, [a]*2), a)
1117
1118 def test_islice(self):
1119 a = []
1120 self.makecycle(islice([a]*2, None), a)
1121
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001122 def test_permutations(self):
1123 a = []
1124 self.makecycle(permutations([1,2,a,3], 3), a)
1125
1126 def test_product(self):
1127 a = []
1128 self.makecycle(product([1,2,a,3], repeat=3), a)
1129
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001130 def test_repeat(self):
1131 a = []
1132 self.makecycle(repeat(a), a)
1133
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001134 def test_starmap(self):
1135 a = []
1136 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1137
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001138 def test_takewhile(self):
1139 a = []
1140 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1141
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001142def R(seqn):
1143 'Regular generator'
1144 for i in seqn:
1145 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001146
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001147class G:
1148 'Sequence using __getitem__'
1149 def __init__(self, seqn):
1150 self.seqn = seqn
1151 def __getitem__(self, i):
1152 return self.seqn[i]
1153
1154class I:
1155 'Sequence using iterator protocol'
1156 def __init__(self, seqn):
1157 self.seqn = seqn
1158 self.i = 0
1159 def __iter__(self):
1160 return self
1161 def next(self):
1162 if self.i >= len(self.seqn): raise StopIteration
1163 v = self.seqn[self.i]
1164 self.i += 1
1165 return v
1166
1167class Ig:
1168 'Sequence using iterator protocol defined with a generator'
1169 def __init__(self, seqn):
1170 self.seqn = seqn
1171 self.i = 0
1172 def __iter__(self):
1173 for val in self.seqn:
1174 yield val
1175
1176class X:
1177 'Missing __getitem__ and __iter__'
1178 def __init__(self, seqn):
1179 self.seqn = seqn
1180 self.i = 0
1181 def next(self):
1182 if self.i >= len(self.seqn): raise StopIteration
1183 v = self.seqn[self.i]
1184 self.i += 1
1185 return v
1186
1187class N:
1188 'Iterator missing next()'
1189 def __init__(self, seqn):
1190 self.seqn = seqn
1191 self.i = 0
1192 def __iter__(self):
1193 return self
1194
1195class E:
1196 'Test propagation of exceptions'
1197 def __init__(self, seqn):
1198 self.seqn = seqn
1199 self.i = 0
1200 def __iter__(self):
1201 return self
1202 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001203 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001204
1205class S:
1206 'Test immediate stop'
1207 def __init__(self, seqn):
1208 pass
1209 def __iter__(self):
1210 return self
1211 def next(self):
1212 raise StopIteration
1213
1214def L(seqn):
1215 'Test multiple tiers of iterators'
1216 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1217
1218
1219class TestVariousIteratorArgs(unittest.TestCase):
1220
1221 def test_chain(self):
1222 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1223 for g in (G, I, Ig, S, L, R):
1224 self.assertEqual(list(chain(g(s))), list(g(s)))
1225 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +00001226 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001227 self.assertRaises(TypeError, list, chain(N(s)))
1228 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1229
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001230 def test_compress(self):
1231 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1232 n = len(s)
1233 for g in (G, I, Ig, S, L, R):
1234 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1235 self.assertRaises(TypeError, compress, X(s), repeat(1))
1236 self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
1237 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1238
Raymond Hettinger50986cc2008-02-22 03:16:42 +00001239 def test_product(self):
1240 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1241 self.assertRaises(TypeError, product, X(s))
1242 self.assertRaises(TypeError, product, N(s))
1243 self.assertRaises(ZeroDivisionError, product, E(s))
1244
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001245 def test_cycle(self):
1246 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1247 for g in (G, I, Ig, S, L, R):
1248 tgtlen = len(s) * 3
1249 expected = list(g(s))*3
1250 actual = list(islice(cycle(g(s)), tgtlen))
1251 self.assertEqual(actual, expected)
1252 self.assertRaises(TypeError, cycle, X(s))
1253 self.assertRaises(TypeError, list, cycle(N(s)))
1254 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1255
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001256 def test_groupby(self):
1257 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1258 for g in (G, I, Ig, S, L, R):
1259 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1260 self.assertRaises(TypeError, groupby, X(s))
1261 self.assertRaises(TypeError, list, groupby(N(s)))
1262 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1263
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001264 def test_ifilter(self):
1265 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1266 for g in (G, I, Ig, S, L, R):
1267 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
1268 self.assertRaises(TypeError, ifilter, isEven, X(s))
1269 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
1270 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
1271
1272 def test_ifilterfalse(self):
1273 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1274 for g in (G, I, Ig, S, L, R):
1275 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
1276 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
1277 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
1278 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
1279
1280 def test_izip(self):
1281 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1282 for g in (G, I, Ig, S, L, R):
1283 self.assertEqual(list(izip(g(s))), zip(g(s)))
1284 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
1285 self.assertRaises(TypeError, izip, X(s))
1286 self.assertRaises(TypeError, list, izip(N(s)))
1287 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
1288
Raymond Hettingerd36862c2007-02-21 05:20:38 +00001289 def test_iziplongest(self):
1290 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1291 for g in (G, I, Ig, S, L, R):
1292 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
1293 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
1294 self.assertRaises(TypeError, izip_longest, X(s))
1295 self.assertRaises(TypeError, list, izip_longest(N(s)))
1296 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
1297
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001298 def test_imap(self):
1299 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1300 for g in (G, I, Ig, S, L, R):
1301 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
1302 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
1303 self.assertRaises(TypeError, imap, onearg, X(s))
1304 self.assertRaises(TypeError, list, imap(onearg, N(s)))
1305 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1306
1307 def test_islice(self):
1308 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1309 for g in (G, I, Ig, S, L, R):
1310 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1311 self.assertRaises(TypeError, islice, X(s), 10)
1312 self.assertRaises(TypeError, list, islice(N(s), 10))
1313 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1314
1315 def test_starmap(self):
1316 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1317 for g in (G, I, Ig, S, L, R):
1318 ss = zip(s, s)
1319 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1320 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1321 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1322 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1323
1324 def test_takewhile(self):
1325 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1326 for g in (G, I, Ig, S, L, R):
1327 tgt = []
1328 for elem in g(s):
1329 if not isEven(elem): break
1330 tgt.append(elem)
1331 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1332 self.assertRaises(TypeError, takewhile, isEven, X(s))
1333 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1334 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1335
1336 def test_dropwhile(self):
1337 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1338 for g in (G, I, Ig, S, L, R):
1339 tgt = []
1340 for elem in g(s):
1341 if not tgt and isOdd(elem): continue
1342 tgt.append(elem)
1343 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1344 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1345 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1346 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1347
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001348 def test_tee(self):
1349 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1350 for g in (G, I, Ig, S, L, R):
1351 it1, it2 = tee(g(s))
1352 self.assertEqual(list(it1), list(g(s)))
1353 self.assertEqual(list(it2), list(g(s)))
1354 self.assertRaises(TypeError, tee, X(s))
1355 self.assertRaises(TypeError, list, tee(N(s))[0])
1356 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1357
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001358class LengthTransparency(unittest.TestCase):
1359
1360 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001361 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001362 self.assertEqual(len(repeat(None, 50)), 50)
1363 self.assertRaises(TypeError, len, repeat(None))
1364
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001365class RegressionTests(unittest.TestCase):
1366
1367 def test_sf_793826(self):
1368 # Fix Armin Rigo's successful efforts to wreak havoc
1369
1370 def mutatingtuple(tuple1, f, tuple2):
1371 # this builds a tuple t which is a copy of tuple1,
1372 # then calls f(t), then mutates t to be equal to tuple2
1373 # (needs len(tuple1) == len(tuple2)).
1374 def g(value, first=[1]):
1375 if first:
1376 del first[:]
1377 f(z.next())
1378 return value
1379 items = list(tuple2)
1380 items[1:1] = list(tuple1)
1381 gen = imap(g, items)
1382 z = izip(*[gen]*len(tuple1))
1383 z.next()
1384
1385 def f(t):
1386 global T
1387 T = t
1388 first[:] = list(T)
1389
1390 first = []
1391 mutatingtuple((1,2,3), f, (4,5,6))
1392 second = list(T)
1393 self.assertEqual(first, second)
1394
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001395
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001396 def test_sf_950057(self):
1397 # Make sure that chain() and cycle() catch exceptions immediately
1398 # rather than when shifting between input sources
1399
1400 def gen1():
1401 hist.append(0)
1402 yield 1
1403 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001404 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001405 hist.append(2)
1406
1407 def gen2(x):
1408 hist.append(3)
1409 yield 2
1410 hist.append(4)
1411 if x:
1412 raise StopIteration
1413
1414 hist = []
1415 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1416 self.assertEqual(hist, [0,1])
1417
1418 hist = []
1419 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1420 self.assertEqual(hist, [0,1])
1421
1422 hist = []
1423 self.assertRaises(AssertionError, list, cycle(gen1()))
1424 self.assertEqual(hist, [0,1])
1425
Georg Brandlb84c1372007-01-21 10:28:43 +00001426class SubclassWithKwargsTest(unittest.TestCase):
1427 def test_keywords_in_subclass(self):
1428 # count is not subclassable...
1429 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001430 starmap, islice, takewhile, dropwhile, cycle, compress):
Georg Brandlb84c1372007-01-21 10:28:43 +00001431 class Subclass(cls):
1432 def __init__(self, newarg=None, *args):
1433 cls.__init__(self, *args)
1434 try:
1435 Subclass(newarg=1)
1436 except TypeError, err:
1437 # we expect type errors because of wrong argument count
Ezio Melottiaa980582010-01-23 23:04:36 +00001438 self.assertNotIn("does not take keyword arguments", err.args[0])
Georg Brandlb84c1372007-01-21 10:28:43 +00001439
1440
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001441libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001442
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001443
1444>>> amounts = [120.15, 764.05, 823.14]
1445>>> for checknum, amount in izip(count(1200), amounts):
1446... print 'Check %d is for $%.2f' % (checknum, amount)
1447...
1448Check 1200 is for $120.15
1449Check 1201 is for $764.05
1450Check 1202 is for $823.14
1451
1452>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001453>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1454... print cube
1455...
14561
14578
145827
1459
1460>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001461>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001462... print name.title()
1463...
1464Alex
1465Laura
1466Martin
1467Walter
1468Samuele
1469
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001470>>> from operator import itemgetter
1471>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001472>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001473>>> for k, g in groupby(di, itemgetter(1)):
1474... print k, map(itemgetter(0), g)
1475...
14761 ['a', 'c', 'e']
14772 ['b', 'd', 'f']
14783 ['g']
1479
Raymond Hettinger734fb572004-01-20 20:04:40 +00001480# Find runs of consecutive numbers using groupby. The key to the solution
1481# is differencing with a range so that consecutive numbers all appear in
1482# same group.
1483>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Ezio Melottidde5b942010-02-03 05:37:26 +00001484>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Raymond Hettinger734fb572004-01-20 20:04:40 +00001485... print map(operator.itemgetter(1), g)
1486...
1487[1]
1488[4, 5, 6]
1489[10]
1490[15, 16, 17, 18]
1491[22]
1492[25, 26, 27, 28]
1493
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001494>>> def take(n, iterable):
1495... "Return first n items of the iterable as a list"
1496... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001497
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001498>>> def enumerate(iterable, start=0):
1499... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001500
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001501>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001502... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001503... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001504
Raymond Hettingerf9bce832009-02-19 05:34:35 +00001505>>> def nth(iterable, n, default=None):
1506... "Returns the nth item or a default value"
1507... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001508
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001509>>> def quantify(iterable, pred=bool):
1510... "Count how many times the predicate is true"
1511... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001512
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001513>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001514... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001515... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001516
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001517>>> def ncycles(iterable, n):
Ezio Melottic2077b02011-03-16 12:34:31 +02001518... "Returns the sequence elements n times"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001519... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001520
1521>>> def dotproduct(vec1, vec2):
1522... return sum(imap(operator.mul, vec1, vec2))
1523
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001524>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001525... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001526
1527>>> def repeatfunc(func, times=None, *args):
1528... "Repeat calls to func with specified arguments."
1529... " Example: repeatfunc(random.random)"
1530... if times is None:
1531... return starmap(func, repeat(args))
1532... else:
1533... return starmap(func, repeat(args, times))
1534
Raymond Hettingerd591f662003-10-26 15:34:50 +00001535>>> def pairwise(iterable):
1536... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1537... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001538... for elem in b:
1539... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001540... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001541
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001542>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001543... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001544... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001545... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001546
1547>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001548... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001549... # Recipe credited to George Sakkis
1550... pending = len(iterables)
1551... nexts = cycle(iter(it).next for it in iterables)
1552... while pending:
1553... try:
1554... for next in nexts:
1555... yield next()
1556... except StopIteration:
1557... pending -= 1
1558... nexts = cycle(islice(nexts, pending))
1559
1560>>> def powerset(iterable):
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001561... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1562... s = list(iterable)
1563... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001564
Raymond Hettinger44e15812009-01-02 21:26:45 +00001565>>> def unique_everseen(iterable, key=None):
1566... "List unique elements, preserving order. Remember all elements ever seen."
1567... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1568... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1569... seen = set()
1570... seen_add = seen.add
1571... if key is None:
1572... for element in iterable:
1573... if element not in seen:
1574... seen_add(element)
1575... yield element
1576... else:
1577... for element in iterable:
1578... k = key(element)
1579... if k not in seen:
1580... seen_add(k)
1581... yield element
1582
1583>>> def unique_justseen(iterable, key=None):
1584... "List unique elements, preserving order. Remember only the element just seen."
1585... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1586... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1587... return imap(next, imap(itemgetter(1), groupby(iterable, key)))
1588
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001589This is not part of the examples but it tests to make sure the definitions
1590perform as purported.
1591
Raymond Hettingera098b332003-09-08 23:58:40 +00001592>>> take(10, count())
1593[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1594
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001595>>> list(enumerate('abc'))
1596[(0, 'a'), (1, 'b'), (2, 'c')]
1597
1598>>> list(islice(tabulate(lambda x: 2*x), 4))
1599[0, 2, 4, 6]
1600
1601>>> nth('abcde', 3)
Raymond Hettingerd507afd2009-02-04 10:52:32 +00001602'd'
1603
1604>>> nth('abcde', 9) is None
1605True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001606
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001607>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000160850
1609
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001610>>> a = [[1, 2, 3], [4, 5, 6]]
1611>>> flatten(a)
1612[1, 2, 3, 4, 5, 6]
1613
1614>>> list(repeatfunc(pow, 5, 2, 3))
1615[8, 8, 8, 8, 8]
1616
1617>>> import random
1618>>> take(5, imap(int, repeatfunc(random.random)))
1619[0, 0, 0, 0, 0]
1620
Raymond Hettingerd591f662003-10-26 15:34:50 +00001621>>> list(pairwise('abcd'))
1622[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001623
Raymond Hettingerd591f662003-10-26 15:34:50 +00001624>>> list(pairwise([]))
1625[]
1626
1627>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001628[]
1629
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001630>>> list(islice(padnone('abc'), 0, 6))
1631['a', 'b', 'c', None, None, None]
1632
1633>>> list(ncycles('abc', 3))
1634['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1635
1636>>> dotproduct([1,2,3], [4,5,6])
163732
1638
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001639>>> list(grouper(3, 'abcdefg', 'x'))
1640[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1641
1642>>> list(roundrobin('abc', 'd', 'ef'))
1643['a', 'd', 'e', 'b', 'f', 'c']
1644
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001645>>> list(powerset([1,2,3]))
1646[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001647
Raymond Hettinger560f9a82009-01-27 13:26:35 +00001648>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1649True
1650
1651>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1652True
1653
Raymond Hettinger44e15812009-01-02 21:26:45 +00001654>>> list(unique_everseen('AAAABBBCCDAABBB'))
1655['A', 'B', 'C', 'D']
1656
1657>>> list(unique_everseen('ABBCcAD', str.lower))
1658['A', 'B', 'C', 'D']
1659
1660>>> list(unique_justseen('AAAABBBCCDAABBB'))
1661['A', 'B', 'C', 'D', 'A', 'B']
1662
1663>>> list(unique_justseen('ABBCcAD', str.lower))
1664['A', 'B', 'C', 'A', 'D']
1665
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001666"""
1667
1668__test__ = {'libreftest' : libreftest}
1669
1670def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001671 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001672 RegressionTests, LengthTransparency,
Serhiy Storchaka6c467a42013-04-06 22:51:29 +03001673 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001674 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001675
1676 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001677 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001678 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001679 counts = [None] * 5
1680 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001681 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001682 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001683 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001684 print counts
1685
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001686 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001687 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001688
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001689if __name__ == "__main__":
1690 test_main(verbose=True)