blob: 9cd3ad8c0c112485e48e5a1ca50dd9363da3a43b [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
Benjamin Peterson17845c12015-02-01 21:10:47 -0500216 @test_support.bigaddrspacetest
217 def test_combinations_with_replacement_overflow(self):
218 with self.assertRaises(OverflowError):
219 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
Zachary Ware4e0df172014-04-24 13:20:27 -0500287 @test_support.impl_detail("tuple reuse is specific to CPython")
Alex Gaynor97376482011-07-17 16:44:31 -0700288 def test_permutations_tuple_reuse(self):
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000289 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000290 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000291
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000292 def test_combinatorics(self):
293 # Test relationships between product(), permutations(),
294 # combinations() and combinations_with_replacement().
295
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000296 for n in range(6):
297 s = 'ABCDEFG'[:n]
298 for r in range(8):
299 prod = list(product(s, repeat=r))
300 cwr = list(combinations_with_replacement(s, r))
301 perm = list(permutations(s, r))
302 comb = list(combinations(s, r))
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000303
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000304 # Check size
Ezio Melotti2623a372010-11-21 13:34:58 +0000305 self.assertEqual(len(prod), n**r)
306 self.assertEqual(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r))
307 self.assertEqual(len(perm), 0 if r>n else fact(n) // fact(n-r))
308 self.assertEqual(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000309
310 # Check lexicographic order without repeated tuples
Ezio Melotti2623a372010-11-21 13:34:58 +0000311 self.assertEqual(prod, sorted(set(prod)))
312 self.assertEqual(cwr, sorted(set(cwr)))
313 self.assertEqual(perm, sorted(set(perm)))
314 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettinger2f6c2e02009-01-27 10:36:14 +0000315
316 # Check interrelationships
Ezio Melotti2623a372010-11-21 13:34:58 +0000317 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
318 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 +0000319 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
320 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
321 self.assertEqual(comb, filter(set(cwr).__contains__, perm)) # comb: perm that is a cwr
322 self.assertEqual(comb, filter(set(perm).__contains__, cwr)) # comb: cwr that is a perm
323 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettinger2976aaa2009-01-27 09:33:06 +0000324
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000325 def test_compress(self):
Raymond Hettinger2e2909f2009-02-19 02:15:14 +0000326 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000327 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
328 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
329 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
330 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
331 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
332 n = 10000
333 data = chain.from_iterable(repeat(range(6), n))
334 selectors = chain.from_iterable(repeat((0, 1)))
335 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
336 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
337 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
338 self.assertRaises(TypeError, compress, range(6)) # too few args
339 self.assertRaises(TypeError, compress, range(6), None) # too many args
340
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000341 def test_count(self):
342 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
343 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000344 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000345 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
346 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000347 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000348 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000349 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
350 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000351 c = count(3)
352 self.assertEqual(repr(c), 'count(3)')
353 c.next()
354 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +0000355 c = count(-9)
356 self.assertEqual(repr(c), 'count(-9)')
357 c.next()
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000358 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Jack Diederich36234e82006-09-21 17:50:26 +0000359 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000360 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 +0000361 # Test repr (ignoring the L in longs)
362 r1 = repr(count(i)).replace('L', '')
363 r2 = 'count(%r)'.__mod__(i).replace('L', '')
364 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000365
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000366 # check copy, deepcopy, pickle
367 for value in -3, 3, sys.maxint-5, sys.maxint+5:
368 c = count(value)
369 self.assertEqual(next(copy.copy(c)), value)
370 self.assertEqual(next(copy.deepcopy(c)), value)
Serhiy Storchaka655720e2014-12-15 14:02:43 +0200371 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
372 self.assertEqual(next(pickle.loads(pickle.dumps(c, proto))), value)
Raymond Hettingere09f45a2009-11-30 19:44:40 +0000373
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000374 def test_count_with_stride(self):
375 self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingera4038032009-02-14 00:25:51 +0000376 self.assertEqual(zip('abc',count(start=2,step=3)),
377 [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingeraa681c72009-02-21 07:17:22 +0000378 self.assertEqual(zip('abc',count(step=-1)),
379 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000380 self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
381 self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
382 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
383 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
384 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettingeraa044612009-02-12 12:04:26 +0000385 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
386 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerdbe3bfb2009-02-12 12:43:01 +0000387 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
388 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger31c769c2009-02-12 05:39:46 +0000389 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
390 c = count(3, 5)
391 self.assertEqual(repr(c), 'count(3, 5)')
392 c.next()
393 self.assertEqual(repr(c), 'count(8, 5)')
394 c = count(-9, 0)
395 self.assertEqual(repr(c), 'count(-9, 0)')
396 c.next()
397 self.assertEqual(repr(c), 'count(-9, 0)')
398 c = count(-9, -3)
399 self.assertEqual(repr(c), 'count(-9, -3)')
400 c.next()
401 self.assertEqual(repr(c), 'count(-12, -3)')
402 self.assertEqual(repr(c), 'count(-12, -3)')
403 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
404 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
405 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
406 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
407 for j in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5):
408 # Test repr (ignoring the L in longs)
409 r1 = repr(count(i, j)).replace('L', '')
410 if j == 1:
411 r2 = ('count(%r)' % i).replace('L', '')
412 else:
413 r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
414 self.assertEqual(r1, r2)
415
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000416 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000417 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000418 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000419 self.assertRaises(TypeError, cycle)
420 self.assertRaises(TypeError, cycle, 5)
421 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000422
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000423 def test_groupby(self):
424 # Check whether it accepts arguments correctly
425 self.assertEqual([], list(groupby([])))
426 self.assertEqual([], list(groupby([], key=id)))
427 self.assertRaises(TypeError, list, groupby('abc', []))
428 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000429 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000430
431 # Check normal input
432 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
433 (2,15,22), (3,16,23), (3,17,23)]
434 dup = []
435 for k, g in groupby(s, lambda r:r[0]):
436 for elem in g:
437 self.assertEqual(k, elem[0])
438 dup.append(elem)
439 self.assertEqual(s, dup)
440
441 # Check nested case
442 dup = []
443 for k, g in groupby(s, lambda r:r[0]):
444 for ik, ig in groupby(g, lambda r:r[2]):
445 for elem in ig:
446 self.assertEqual(k, elem[0])
447 self.assertEqual(ik, elem[2])
448 dup.append(elem)
449 self.assertEqual(s, dup)
450
451 # Check case where inner iterator is not used
452 keys = [k for k, g in groupby(s, lambda r:r[0])]
453 expectedkeys = set([r[0] for r in s])
454 self.assertEqual(set(keys), expectedkeys)
455 self.assertEqual(len(keys), len(expectedkeys))
456
457 # Exercise pipes and filters style
458 s = 'abracadabra'
459 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000460 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000461 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
462 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000463 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000464 self.assertEqual(r, ['a', 'b', 'r'])
465 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000466 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000467 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
468 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000469 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000470 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
471
472 # iter.next failure
473 class ExpectedError(Exception):
474 pass
475 def delayed_raise(n=0):
476 for i in range(n):
477 yield 'yo'
478 raise ExpectedError
479 def gulp(iterable, keyp=None, func=list):
480 return [func(g) for k, g in groupby(iterable, keyp)]
481
482 # iter.next failure on outer object
483 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
484 # iter.next failure on inner object
485 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
486
487 # __cmp__ failure
488 class DummyCmp:
489 def __cmp__(self, dst):
490 raise ExpectedError
491 s = [DummyCmp(), DummyCmp(), None]
492
493 # __cmp__ failure on outer object
494 self.assertRaises(ExpectedError, gulp, s, func=id)
495 # __cmp__ failure on inner object
496 self.assertRaises(ExpectedError, gulp, s)
497
498 # keyfunc failure
499 def keyfunc(obj):
500 if keyfunc.skip > 0:
501 keyfunc.skip -= 1
502 return obj
503 else:
504 raise ExpectedError
505
506 # keyfunc failure on outer object
507 keyfunc.skip = 0
508 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
509 keyfunc.skip = 1
510 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
511
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000512 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000513 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000514 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000515 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000516 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000517 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000518 self.assertRaises(TypeError, ifilter, lambda x:x)
519 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000520 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000521 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000522
523 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000524 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
525 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000526 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000527 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000528 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000529 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
530 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000531 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000532 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000533
534 def test_izip(self):
535 ans = [(x,y) for x, y in izip('abc',count())]
536 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000537 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
538 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000539 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000540 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000541 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000542 self.assertRaises(TypeError, izip, 3)
543 self.assertRaises(TypeError, izip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000544 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
545 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000546 self.assertEqual([pair for pair in izip('abc', 'def')],
547 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700548
549 @test_support.impl_detail("tuple reuse is specific to CPython")
Zachary Ware4e0df172014-04-24 13:20:27 -0500550 def test_izip_tuple_reuse(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000551 ids = map(id, izip('abc', 'def'))
552 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000553 ids = map(id, list(izip('abc', 'def')))
554 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000555
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000556 def test_iziplongest(self):
557 for args in [
558 ['abc', range(6)],
559 [range(6), 'abc'],
560 [range(1000), range(2000,2100), range(3000,3050)],
561 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
562 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
563 ]:
Ezio Melottidde5b942010-02-03 05:37:26 +0000564 # target = map(None, *args) <- this raises a py3k warning
565 # this is the replacement:
566 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
567 for i in range(max(map(len, args)))]
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000568 self.assertEqual(list(izip_longest(*args)), target)
569 self.assertEqual(list(izip_longest(*args, **{})), target)
570 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
571 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000572
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000573 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
574
575 self.assertEqual(list(izip_longest()), zip())
576 self.assertEqual(list(izip_longest([])), zip([]))
577 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000578
Ezio Melottidde5b942010-02-03 05:37:26 +0000579 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
580 zip(list('abc') + [None], 'defg')) # empty keyword dict
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000581 self.assertRaises(TypeError, izip_longest, 3)
582 self.assertRaises(TypeError, izip_longest, range(3), 3)
583
584 for stmt in [
585 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000586 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000587 ]:
588 try:
589 eval(stmt, globals(), locals())
590 except TypeError:
591 pass
592 else:
593 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000594
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000595 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
596 zip('abc', 'def'))
597 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
598 zip('abc', 'def'))
Alex Gaynor97376482011-07-17 16:44:31 -0700599
600 @test_support.impl_detail("tuple reuse is specific to CPython")
601 def test_izip_longest_tuple_reuse(self):
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000602 ids = map(id, izip_longest('abc', 'def'))
603 self.assertEqual(min(ids), max(ids))
604 ids = map(id, list(izip_longest('abc', 'def')))
605 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
606
Raymond Hettingerfa7dadd2009-11-01 20:45:16 +0000607 def test_bug_7244(self):
608
609 class Repeater(object):
610 # this class is similar to itertools.repeat
611 def __init__(self, o, t, e):
612 self.o = o
613 self.t = int(t)
614 self.e = e
615 def __iter__(self): # its iterator is itself
616 return self
617 def next(self):
618 if self.t > 0:
619 self.t -= 1
620 return self.o
621 else:
622 raise self.e
623
624 # Formerly this code in would fail in debug mode
625 # with Undetected Error and Stop Iteration
626 r1 = Repeater(1, 3, StopIteration)
627 r2 = Repeater(2, 4, StopIteration)
628 def run(r1, r2):
629 result = []
630 for i, j in izip_longest(r1, r2, fillvalue=0):
631 with test_support.captured_output('stdout'):
632 print (i, j)
633 result.append((i, j))
634 return result
635 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
636
637 # Formerly, the RuntimeError would be lost
638 # and StopIteration would stop as expected
639 r1 = Repeater(1, 3, RuntimeError)
640 r2 = Repeater(2, 4, StopIteration)
641 it = izip_longest(r1, r2, fillvalue=0)
642 self.assertEqual(next(it), (1, 2))
643 self.assertEqual(next(it), (1, 2))
644 self.assertEqual(next(it), (1, 2))
645 self.assertRaises(RuntimeError, next, it)
646
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000647 def test_product(self):
648 for args, result in [
Raymond Hettingerd553d852008-03-04 04:17:08 +0000649 ([], [()]), # zero iterables
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000650 (['ab'], [('a',), ('b',)]), # one iterable
651 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
652 ([range(0), range(2), range(3)], []), # first iterable with zero length
653 ([range(2), range(0), range(3)], []), # middle iterable with zero length
654 ([range(2), range(3), range(0)], []), # last iterable with zero length
655 ]:
656 self.assertEqual(list(product(*args)), result)
Raymond Hettinger08ff6822008-02-29 02:21:48 +0000657 for r in range(4):
658 self.assertEqual(list(product(*(args*r))),
659 list(product(*args, **dict(repeat=r))))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000660 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
661 self.assertRaises(TypeError, product, range(6), None)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000662
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000663 def product1(*args, **kwds):
664 pools = map(tuple, args) * kwds.get('repeat', 1)
665 n = len(pools)
666 if n == 0:
667 yield ()
668 return
669 if any(len(pool) == 0 for pool in pools):
670 return
671 indices = [0] * n
672 yield tuple(pool[i] for pool, i in zip(pools, indices))
673 while 1:
674 for i in reversed(range(n)): # right to left
675 if indices[i] == len(pools[i]) - 1:
676 continue
677 indices[i] += 1
678 for j in range(i+1, n):
679 indices[j] = 0
680 yield tuple(pool[i] for pool, i in zip(pools, indices))
681 break
682 else:
683 return
684
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000685 def product2(*args, **kwds):
686 'Pure python version used in docs'
687 pools = map(tuple, args) * kwds.get('repeat', 1)
688 result = [[]]
689 for pool in pools:
690 result = [x+[y] for x in result for y in pool]
691 for prod in result:
692 yield tuple(prod)
693
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000694 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
695 set('abcdefg'), range(11), tuple(range(13))]
696 for i in range(100):
697 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000698 expected_len = prod(map(len, args))
699 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000700 self.assertEqual(list(product(*args)), list(product1(*args)))
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000701 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000702 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000703 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000704
Alex Gaynor97376482011-07-17 16:44:31 -0700705 @test_support.impl_detail("tuple reuse is specific to CPython")
706 def test_product_tuple_reuse(self):
Raymond Hettinger73d79632008-02-23 02:20:41 +0000707 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
708 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000709
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000710 def test_repeat(self):
Raymond Hettinger182edae2009-02-19 02:38:25 +0000711 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700712 self.assertEqual(list(repeat(object='a', times=0)), [])
713 self.assertEqual(list(repeat(object='a', times=-1)), [])
714 self.assertEqual(list(repeat(object='a', times=-2)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000715 self.assertEqual(zip(xrange(3),repeat('a')),
716 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000717 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000718 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000719 self.assertEqual(list(repeat('a', 0)), [])
720 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000721 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000722 self.assertRaises(TypeError, repeat, None, 3, 4)
723 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000724 r = repeat(1+0j)
725 self.assertEqual(repr(r), 'repeat((1+0j))')
726 r = repeat(1+0j, 5)
727 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
728 list(r)
729 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000730
Raymond Hettinger58ad2452014-06-24 21:53:45 -0700731 def test_repeat_with_negative_times(self):
732 self.assertEqual(repr(repeat('a', -1)), "repeat('a', 0)")
733 self.assertEqual(repr(repeat('a', -2)), "repeat('a', 0)")
734 self.assertEqual(repr(repeat('a', times=-1)), "repeat('a', 0)")
735 self.assertEqual(repr(repeat('a', times=-2)), "repeat('a', 0)")
736
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000737 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000738 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
739 [0**1, 1**2, 2**3])
740 self.assertEqual(list(imap(None, 'abc', range(5))),
741 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000742 self.assertEqual(list(imap(None, 'abc', count())),
743 [('a',0),('b',1),('c',2)])
744 self.assertEqual(take(2,imap(None, 'abc', count())),
745 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000746 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000747 self.assertRaises(TypeError, imap)
748 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000749 self.assertRaises(TypeError, imap(10, range(5)).next)
750 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
751 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000752
753 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000754 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
755 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000756 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
757 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000758 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000759 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
760 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000761 self.assertRaises(TypeError, starmap)
762 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
763 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
764 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
765 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000766
767 def test_islice(self):
768 for args in [ # islice(args) should agree with range(args)
769 (10, 20, 3),
770 (10, 3, 20),
771 (10, 20),
772 (10, 3),
773 (20,)
774 ]:
775 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
776
777 for args, tgtargs in [ # Stop when seqn is exhausted
778 ((10, 110, 3), ((10, 100, 3))),
779 ((10, 110), ((10, 100))),
780 ((110,), (100,))
781 ]:
782 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
783
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000784 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000785 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000786 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
787 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000788 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
789 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
790
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000791 # Test number of items consumed SF #1171417
792 it = iter(range(10))
793 self.assertEqual(list(islice(it, 3)), range(3))
794 self.assertEqual(list(it), range(3, 10))
795
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000796 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000797 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000798 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
799 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
800 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
801 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
802 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000803 self.assertRaises(ValueError, islice, xrange(10), 'a')
804 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
805 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
806 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
807 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000808 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000809
Raymond Hettinger061bf7a2010-11-30 03:15:35 +0000810 # Issue #10323: Less islice in a predictable state
811 c = count()
812 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
813 self.assertEqual(next(c), 3)
814
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200815 # Issue #21321: check source iterator is not referenced
816 # from islice() after the latter has been exhausted
817 it = (x for x in (1, 2))
818 wr = weakref.ref(it)
819 it = islice(it, 1)
820 self.assertIsNotNone(wr())
821 list(it) # exhaust the iterator
Benjamin Petersonec9d5472014-08-24 18:07:28 -0500822 test_support.gc_collect()
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200823 self.assertIsNone(wr())
824
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000825 def test_takewhile(self):
826 data = [1, 3, 5, 20, 2, 4, 6, 8]
827 underten = lambda x: x<10
828 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000829 self.assertEqual(list(takewhile(underten, [])), [])
830 self.assertRaises(TypeError, takewhile)
831 self.assertRaises(TypeError, takewhile, operator.pow)
832 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
833 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
834 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000835 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
836 self.assertEqual(list(t), [1, 1, 1])
837 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838
839 def test_dropwhile(self):
840 data = [1, 3, 5, 20, 2, 4, 6, 8]
841 underten = lambda x: x<10
842 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000843 self.assertEqual(list(dropwhile(underten, [])), [])
844 self.assertRaises(TypeError, dropwhile)
845 self.assertRaises(TypeError, dropwhile, operator.pow)
846 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
847 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
848 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000849
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000850 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000851 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000852 def irange(n):
853 for i in xrange(n):
854 yield i
855
856 a, b = tee([]) # test empty iterator
857 self.assertEqual(list(a), [])
858 self.assertEqual(list(b), [])
859
860 a, b = tee(irange(n)) # test 100% interleaved
861 self.assertEqual(zip(a,b), zip(range(n),range(n)))
862
863 a, b = tee(irange(n)) # test 0% interleaved
864 self.assertEqual(list(a), range(n))
865 self.assertEqual(list(b), range(n))
866
867 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000868 for i in xrange(100):
869 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000870 del a
871 self.assertEqual(list(b), range(n))
872
873 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000874 for i in xrange(100):
875 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000876 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000877 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000878
879 for j in xrange(5): # test randomly interleaved
880 order = [0]*n + [1]*n
881 random.shuffle(order)
882 lists = ([], [])
883 its = tee(irange(n))
884 for i in order:
885 value = its[i].next()
886 lists[i].append(value)
887 self.assertEqual(lists[0], range(n))
888 self.assertEqual(lists[1], range(n))
889
Raymond Hettingerad983e72003-11-12 14:32:26 +0000890 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000891 self.assertRaises(TypeError, tee)
892 self.assertRaises(TypeError, tee, 3)
893 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000894 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000895
Raymond Hettingerad983e72003-11-12 14:32:26 +0000896 # tee object should be instantiable
897 a, b = tee('abc')
898 c = type(a)('def')
899 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000900
Raymond Hettingerad983e72003-11-12 14:32:26 +0000901 # test long-lagged and multi-way split
902 a, b, c = tee(xrange(2000), 3)
903 for i in xrange(100):
904 self.assertEqual(a.next(), i)
905 self.assertEqual(list(b), range(2000))
906 self.assertEqual([c.next(), c.next()], range(2))
907 self.assertEqual(list(a), range(100,2000))
908 self.assertEqual(list(c), range(2,2000))
909
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000910 # test values of n
911 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000912 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000913 for n in xrange(5):
914 result = tee('abc', n)
915 self.assertEqual(type(result), tuple)
916 self.assertEqual(len(result), n)
917 self.assertEqual(map(list, result), [list('abc')]*n)
918
Raymond Hettingerad983e72003-11-12 14:32:26 +0000919 # tee pass-through to copyable iterator
920 a, b = tee('abc')
921 c, d = tee(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000922 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000923
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000924 # test tee_new
925 t1, t2 = tee('abc')
926 tnew = type(t1)
927 self.assertRaises(TypeError, tnew)
928 self.assertRaises(TypeError, tnew, 10)
929 t3 = tnew(t1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000930 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000931
Raymond Hettingera9f60922004-10-17 16:40:14 +0000932 # test that tee objects are weak referencable
933 a, b = tee(xrange(10))
Antoine Pitrou3ec903f2014-04-29 12:13:46 +0200934 p = weakref.proxy(a)
Raymond Hettingera9f60922004-10-17 16:40:14 +0000935 self.assertEqual(getattr(p, '__class__'), type(b))
936 del a
937 self.assertRaises(ReferenceError, getattr, p, '__class__')
938
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200939 # Issue 13454: Crash when deleting backward iterator from tee()
940 def test_tee_del_backward(self):
Serhiy Storchaka6fef14d2013-01-26 11:51:42 +0200941 forward, backward = tee(repeat(None, 20000000))
942 any(forward) # exhaust the iterator
Serhiy Storchakab09ec9b2013-01-25 13:31:05 +0200943 del backward
944
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000945 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000946 self.assertRaises(StopIteration, izip().next)
947
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000948 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000949 self.assertRaises(StopIteration, f([]).next)
950 self.assertRaises(StopIteration, f(StopNow()).next)
951
952 self.assertRaises(StopIteration, islice([], None).next)
953 self.assertRaises(StopIteration, islice(StopNow(), None).next)
954
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000955 p, q = tee([])
956 self.assertRaises(StopIteration, p.next)
957 self.assertRaises(StopIteration, q.next)
958 p, q = tee(StopNow())
959 self.assertRaises(StopIteration, p.next)
960 self.assertRaises(StopIteration, q.next)
961
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000962 self.assertRaises(StopIteration, repeat(None, 0).next)
963
964 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
965 self.assertRaises(StopIteration, f(lambda x:x, []).next)
966 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
967
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000968class TestExamples(unittest.TestCase):
969
970 def test_chain(self):
971 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
972
973 def test_chain_from_iterable(self):
974 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
975
976 def test_combinations(self):
977 self.assertEqual(list(combinations('ABCD', 2)),
978 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
979 self.assertEqual(list(combinations(range(4), 3)),
980 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
981
Raymond Hettingerd081abc2009-01-27 02:58:49 +0000982 def test_combinations_with_replacement(self):
983 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
984 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
985
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +0000986 def test_compress(self):
987 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
988
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000989 def test_count(self):
990 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
991
992 def test_cycle(self):
993 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
994
995 def test_dropwhile(self):
996 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
997
998 def test_groupby(self):
999 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1000 list('ABCDAB'))
1001 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1002 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1003
1004 def test_ifilter(self):
1005 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
1006
1007 def test_ifilterfalse(self):
1008 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1009
1010 def test_imap(self):
1011 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1012
1013 def test_islice(self):
1014 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1015 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1016 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1017 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1018
1019 def test_izip(self):
1020 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1021
1022 def test_izip_longest(self):
1023 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
1024 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1025
1026 def test_permutations(self):
1027 self.assertEqual(list(permutations('ABCD', 2)),
1028 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
1029 self.assertEqual(list(permutations(range(3))),
1030 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1031
1032 def test_product(self):
1033 self.assertEqual(list(product('ABCD', 'xy')),
1034 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
1035 self.assertEqual(list(product(range(2), repeat=3)),
1036 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1037 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1038
1039 def test_repeat(self):
1040 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1041
1042 def test_stapmap(self):
1043 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1044 [32, 9, 1000])
1045
1046 def test_takewhile(self):
1047 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1048
1049
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001050class TestGC(unittest.TestCase):
1051
1052 def makecycle(self, iterator, container):
1053 container.append(iterator)
1054 iterator.next()
1055 del container, iterator
1056
1057 def test_chain(self):
1058 a = []
1059 self.makecycle(chain(a), a)
1060
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001061 def test_chain_from_iterable(self):
1062 a = []
1063 self.makecycle(chain.from_iterable([a]), a)
1064
1065 def test_combinations(self):
1066 a = []
1067 self.makecycle(combinations([1,2,a,3], 3), a)
1068
Raymond Hettingerd081abc2009-01-27 02:58:49 +00001069 def test_combinations_with_replacement(self):
1070 a = []
1071 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1072
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001073 def test_compress(self):
1074 a = []
1075 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1076
Raymond Hettingerb21d8102009-02-16 20:39:12 +00001077 def test_count(self):
1078 a = []
1079 Int = type('Int', (int,), dict(x=a))
1080 self.makecycle(count(Int(0), Int(1)), a)
1081
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001082 def test_cycle(self):
1083 a = []
1084 self.makecycle(cycle([a]*2), a)
1085
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001086 def test_dropwhile(self):
1087 a = []
1088 self.makecycle(dropwhile(bool, [0, a, a]), a)
1089
1090 def test_groupby(self):
1091 a = []
1092 self.makecycle(groupby([a]*2, lambda x:x), a)
1093
Raymond Hettingera1ca94a2008-03-06 22:51:36 +00001094 def test_issue2246(self):
1095 # Issue 2246 -- the _grouper iterator was not included in GC
1096 n = 10
1097 keyfunc = lambda x: x
1098 for i, j in groupby(xrange(n), key=keyfunc):
1099 keyfunc.__dict__.setdefault('x',[]).append(j)
1100
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001101 def test_ifilter(self):
1102 a = []
1103 self.makecycle(ifilter(lambda x:True, [a]*2), a)
1104
1105 def test_ifilterfalse(self):
1106 a = []
1107 self.makecycle(ifilterfalse(lambda x:False, a), a)
1108
1109 def test_izip(self):
1110 a = []
1111 self.makecycle(izip([a]*2, [a]*3), a)
1112
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001113 def test_izip_longest(self):
1114 a = []
1115 self.makecycle(izip_longest([a]*2, [a]*3), a)
1116 b = [a, None]
1117 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
1118
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001119 def test_imap(self):
1120 a = []
1121 self.makecycle(imap(lambda x:x, [a]*2), a)
1122
1123 def test_islice(self):
1124 a = []
1125 self.makecycle(islice([a]*2, None), a)
1126
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001127 def test_permutations(self):
1128 a = []
1129 self.makecycle(permutations([1,2,a,3], 3), a)
1130
1131 def test_product(self):
1132 a = []
1133 self.makecycle(product([1,2,a,3], repeat=3), a)
1134
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001135 def test_repeat(self):
1136 a = []
1137 self.makecycle(repeat(a), a)
1138
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001139 def test_starmap(self):
1140 a = []
1141 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1142
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001143 def test_takewhile(self):
1144 a = []
1145 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1146
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001147def R(seqn):
1148 'Regular generator'
1149 for i in seqn:
1150 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001151
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001152class G:
1153 'Sequence using __getitem__'
1154 def __init__(self, seqn):
1155 self.seqn = seqn
1156 def __getitem__(self, i):
1157 return self.seqn[i]
1158
1159class I:
1160 'Sequence using iterator protocol'
1161 def __init__(self, seqn):
1162 self.seqn = seqn
1163 self.i = 0
1164 def __iter__(self):
1165 return self
1166 def next(self):
1167 if self.i >= len(self.seqn): raise StopIteration
1168 v = self.seqn[self.i]
1169 self.i += 1
1170 return v
1171
1172class Ig:
1173 'Sequence using iterator protocol defined with a generator'
1174 def __init__(self, seqn):
1175 self.seqn = seqn
1176 self.i = 0
1177 def __iter__(self):
1178 for val in self.seqn:
1179 yield val
1180
1181class X:
1182 'Missing __getitem__ and __iter__'
1183 def __init__(self, seqn):
1184 self.seqn = seqn
1185 self.i = 0
1186 def next(self):
1187 if self.i >= len(self.seqn): raise StopIteration
1188 v = self.seqn[self.i]
1189 self.i += 1
1190 return v
1191
1192class N:
1193 'Iterator missing next()'
1194 def __init__(self, seqn):
1195 self.seqn = seqn
1196 self.i = 0
1197 def __iter__(self):
1198 return self
1199
1200class E:
1201 'Test propagation of exceptions'
1202 def __init__(self, seqn):
1203 self.seqn = seqn
1204 self.i = 0
1205 def __iter__(self):
1206 return self
1207 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001208 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001209
1210class S:
1211 'Test immediate stop'
1212 def __init__(self, seqn):
1213 pass
1214 def __iter__(self):
1215 return self
1216 def next(self):
1217 raise StopIteration
1218
1219def L(seqn):
1220 'Test multiple tiers of iterators'
1221 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1222
1223
1224class TestVariousIteratorArgs(unittest.TestCase):
1225
1226 def test_chain(self):
1227 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1228 for g in (G, I, Ig, S, L, R):
1229 self.assertEqual(list(chain(g(s))), list(g(s)))
1230 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +00001231 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001232 self.assertRaises(TypeError, list, chain(N(s)))
1233 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1234
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001235 def test_compress(self):
1236 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1237 n = len(s)
1238 for g in (G, I, Ig, S, L, R):
1239 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1240 self.assertRaises(TypeError, compress, X(s), repeat(1))
1241 self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
1242 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1243
Raymond Hettinger50986cc2008-02-22 03:16:42 +00001244 def test_product(self):
1245 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1246 self.assertRaises(TypeError, product, X(s))
1247 self.assertRaises(TypeError, product, N(s))
1248 self.assertRaises(ZeroDivisionError, product, E(s))
1249
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001250 def test_cycle(self):
1251 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1252 for g in (G, I, Ig, S, L, R):
1253 tgtlen = len(s) * 3
1254 expected = list(g(s))*3
1255 actual = list(islice(cycle(g(s)), tgtlen))
1256 self.assertEqual(actual, expected)
1257 self.assertRaises(TypeError, cycle, X(s))
1258 self.assertRaises(TypeError, list, cycle(N(s)))
1259 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1260
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001261 def test_groupby(self):
1262 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1263 for g in (G, I, Ig, S, L, R):
1264 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1265 self.assertRaises(TypeError, groupby, X(s))
1266 self.assertRaises(TypeError, list, groupby(N(s)))
1267 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1268
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001269 def test_ifilter(self):
1270 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1271 for g in (G, I, Ig, S, L, R):
1272 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
1273 self.assertRaises(TypeError, ifilter, isEven, X(s))
1274 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
1275 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
1276
1277 def test_ifilterfalse(self):
1278 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1279 for g in (G, I, Ig, S, L, R):
1280 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
1281 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
1282 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
1283 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
1284
1285 def test_izip(self):
1286 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1287 for g in (G, I, Ig, S, L, R):
1288 self.assertEqual(list(izip(g(s))), zip(g(s)))
1289 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
1290 self.assertRaises(TypeError, izip, X(s))
1291 self.assertRaises(TypeError, list, izip(N(s)))
1292 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
1293
Raymond Hettingerd36862c2007-02-21 05:20:38 +00001294 def test_iziplongest(self):
1295 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1296 for g in (G, I, Ig, S, L, R):
1297 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
1298 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
1299 self.assertRaises(TypeError, izip_longest, X(s))
1300 self.assertRaises(TypeError, list, izip_longest(N(s)))
1301 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
1302
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001303 def test_imap(self):
1304 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1305 for g in (G, I, Ig, S, L, R):
1306 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
1307 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
1308 self.assertRaises(TypeError, imap, onearg, X(s))
1309 self.assertRaises(TypeError, list, imap(onearg, N(s)))
1310 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1311
1312 def test_islice(self):
1313 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1314 for g in (G, I, Ig, S, L, R):
1315 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1316 self.assertRaises(TypeError, islice, X(s), 10)
1317 self.assertRaises(TypeError, list, islice(N(s), 10))
1318 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1319
1320 def test_starmap(self):
1321 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1322 for g in (G, I, Ig, S, L, R):
1323 ss = zip(s, s)
1324 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1325 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1326 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1327 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1328
1329 def test_takewhile(self):
1330 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1331 for g in (G, I, Ig, S, L, R):
1332 tgt = []
1333 for elem in g(s):
1334 if not isEven(elem): break
1335 tgt.append(elem)
1336 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1337 self.assertRaises(TypeError, takewhile, isEven, X(s))
1338 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1339 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1340
1341 def test_dropwhile(self):
1342 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1343 for g in (G, I, Ig, S, L, R):
1344 tgt = []
1345 for elem in g(s):
1346 if not tgt and isOdd(elem): continue
1347 tgt.append(elem)
1348 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1349 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1350 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1351 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1352
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001353 def test_tee(self):
1354 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1355 for g in (G, I, Ig, S, L, R):
1356 it1, it2 = tee(g(s))
1357 self.assertEqual(list(it1), list(g(s)))
1358 self.assertEqual(list(it2), list(g(s)))
1359 self.assertRaises(TypeError, tee, X(s))
1360 self.assertRaises(TypeError, list, tee(N(s))[0])
1361 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1362
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001363class LengthTransparency(unittest.TestCase):
1364
1365 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001366 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001367 self.assertEqual(len(repeat(None, 50)), 50)
1368 self.assertRaises(TypeError, len, repeat(None))
1369
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001370class RegressionTests(unittest.TestCase):
1371
1372 def test_sf_793826(self):
1373 # Fix Armin Rigo's successful efforts to wreak havoc
1374
1375 def mutatingtuple(tuple1, f, tuple2):
1376 # this builds a tuple t which is a copy of tuple1,
1377 # then calls f(t), then mutates t to be equal to tuple2
1378 # (needs len(tuple1) == len(tuple2)).
1379 def g(value, first=[1]):
1380 if first:
1381 del first[:]
1382 f(z.next())
1383 return value
1384 items = list(tuple2)
1385 items[1:1] = list(tuple1)
1386 gen = imap(g, items)
1387 z = izip(*[gen]*len(tuple1))
1388 z.next()
1389
1390 def f(t):
1391 global T
1392 T = t
1393 first[:] = list(T)
1394
1395 first = []
1396 mutatingtuple((1,2,3), f, (4,5,6))
1397 second = list(T)
1398 self.assertEqual(first, second)
1399
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001400
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001401 def test_sf_950057(self):
1402 # Make sure that chain() and cycle() catch exceptions immediately
1403 # rather than when shifting between input sources
1404
1405 def gen1():
1406 hist.append(0)
1407 yield 1
1408 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001409 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001410 hist.append(2)
1411
1412 def gen2(x):
1413 hist.append(3)
1414 yield 2
1415 hist.append(4)
1416 if x:
1417 raise StopIteration
1418
1419 hist = []
1420 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1421 self.assertEqual(hist, [0,1])
1422
1423 hist = []
1424 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1425 self.assertEqual(hist, [0,1])
1426
1427 hist = []
1428 self.assertRaises(AssertionError, list, cycle(gen1()))
1429 self.assertEqual(hist, [0,1])
1430
Georg Brandlb84c1372007-01-21 10:28:43 +00001431class SubclassWithKwargsTest(unittest.TestCase):
1432 def test_keywords_in_subclass(self):
1433 # count is not subclassable...
1434 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
Raymond Hettinger2bcb8e92009-01-25 21:04:14 +00001435 starmap, islice, takewhile, dropwhile, cycle, compress):
Georg Brandlb84c1372007-01-21 10:28:43 +00001436 class Subclass(cls):
1437 def __init__(self, newarg=None, *args):
1438 cls.__init__(self, *args)
1439 try:
1440 Subclass(newarg=1)
1441 except TypeError, err:
1442 # we expect type errors because of wrong argument count
Ezio Melottiaa980582010-01-23 23:04:36 +00001443 self.assertNotIn("does not take keyword arguments", err.args[0])
Georg Brandlb84c1372007-01-21 10:28:43 +00001444
1445
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001446libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001447
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001448
1449>>> amounts = [120.15, 764.05, 823.14]
1450>>> for checknum, amount in izip(count(1200), amounts):
1451... print 'Check %d is for $%.2f' % (checknum, amount)
1452...
1453Check 1200 is for $120.15
1454Check 1201 is for $764.05
1455Check 1202 is for $823.14
1456
1457>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001458>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1459... print cube
1460...
14611
14628
146327
1464
1465>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001466>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001467... print name.title()
1468...
1469Alex
1470Laura
1471Martin
1472Walter
1473Samuele
1474
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001475>>> from operator import itemgetter
1476>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001477>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001478>>> for k, g in groupby(di, itemgetter(1)):
1479... print k, map(itemgetter(0), g)
1480...
14811 ['a', 'c', 'e']
14822 ['b', 'd', 'f']
14833 ['g']
1484
Raymond Hettinger734fb572004-01-20 20:04:40 +00001485# Find runs of consecutive numbers using groupby. The key to the solution
1486# is differencing with a range so that consecutive numbers all appear in
1487# same group.
1488>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Ezio Melottidde5b942010-02-03 05:37:26 +00001489>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Raymond Hettinger734fb572004-01-20 20:04:40 +00001490... print map(operator.itemgetter(1), g)
1491...
1492[1]
1493[4, 5, 6]
1494[10]
1495[15, 16, 17, 18]
1496[22]
1497[25, 26, 27, 28]
1498
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001499>>> def take(n, iterable):
1500... "Return first n items of the iterable as a list"
1501... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001502
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001503>>> def enumerate(iterable, start=0):
1504... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001505
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001506>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001507... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001508... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001509
Raymond Hettingerf9bce832009-02-19 05:34:35 +00001510>>> def nth(iterable, n, default=None):
1511... "Returns the nth item or a default value"
1512... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001513
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001514>>> def quantify(iterable, pred=bool):
1515... "Count how many times the predicate is true"
1516... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001517
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001518>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001519... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001520... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001521
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001522>>> def ncycles(iterable, n):
Ezio Melottic2077b02011-03-16 12:34:31 +02001523... "Returns the sequence elements n times"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001524... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001525
1526>>> def dotproduct(vec1, vec2):
1527... return sum(imap(operator.mul, vec1, vec2))
1528
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001529>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001530... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001531
1532>>> def repeatfunc(func, times=None, *args):
1533... "Repeat calls to func with specified arguments."
1534... " Example: repeatfunc(random.random)"
1535... if times is None:
1536... return starmap(func, repeat(args))
1537... else:
1538... return starmap(func, repeat(args, times))
1539
Raymond Hettingerd591f662003-10-26 15:34:50 +00001540>>> def pairwise(iterable):
1541... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1542... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001543... for elem in b:
1544... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001545... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001546
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001547>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001548... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001549... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001550... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001551
1552>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001553... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001554... # Recipe credited to George Sakkis
1555... pending = len(iterables)
1556... nexts = cycle(iter(it).next for it in iterables)
1557... while pending:
1558... try:
1559... for next in nexts:
1560... yield next()
1561... except StopIteration:
1562... pending -= 1
1563... nexts = cycle(islice(nexts, pending))
1564
1565>>> def powerset(iterable):
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001566... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1567... s = list(iterable)
1568... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001569
Raymond Hettinger44e15812009-01-02 21:26:45 +00001570>>> def unique_everseen(iterable, key=None):
1571... "List unique elements, preserving order. Remember all elements ever seen."
1572... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1573... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1574... seen = set()
1575... seen_add = seen.add
1576... if key is None:
1577... for element in iterable:
1578... if element not in seen:
1579... seen_add(element)
1580... yield element
1581... else:
1582... for element in iterable:
1583... k = key(element)
1584... if k not in seen:
1585... seen_add(k)
1586... yield element
1587
1588>>> def unique_justseen(iterable, key=None):
1589... "List unique elements, preserving order. Remember only the element just seen."
1590... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1591... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1592... return imap(next, imap(itemgetter(1), groupby(iterable, key)))
1593
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001594This is not part of the examples but it tests to make sure the definitions
1595perform as purported.
1596
Raymond Hettingera098b332003-09-08 23:58:40 +00001597>>> take(10, count())
1598[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1599
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001600>>> list(enumerate('abc'))
1601[(0, 'a'), (1, 'b'), (2, 'c')]
1602
1603>>> list(islice(tabulate(lambda x: 2*x), 4))
1604[0, 2, 4, 6]
1605
1606>>> nth('abcde', 3)
Raymond Hettingerd507afd2009-02-04 10:52:32 +00001607'd'
1608
1609>>> nth('abcde', 9) is None
1610True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001611
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001612>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000161350
1614
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001615>>> a = [[1, 2, 3], [4, 5, 6]]
1616>>> flatten(a)
1617[1, 2, 3, 4, 5, 6]
1618
1619>>> list(repeatfunc(pow, 5, 2, 3))
1620[8, 8, 8, 8, 8]
1621
1622>>> import random
1623>>> take(5, imap(int, repeatfunc(random.random)))
1624[0, 0, 0, 0, 0]
1625
Raymond Hettingerd591f662003-10-26 15:34:50 +00001626>>> list(pairwise('abcd'))
1627[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001628
Raymond Hettingerd591f662003-10-26 15:34:50 +00001629>>> list(pairwise([]))
1630[]
1631
1632>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001633[]
1634
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001635>>> list(islice(padnone('abc'), 0, 6))
1636['a', 'b', 'c', None, None, None]
1637
1638>>> list(ncycles('abc', 3))
1639['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1640
1641>>> dotproduct([1,2,3], [4,5,6])
164232
1643
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001644>>> list(grouper(3, 'abcdefg', 'x'))
1645[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1646
1647>>> list(roundrobin('abc', 'd', 'ef'))
1648['a', 'd', 'e', 'b', 'f', 'c']
1649
Raymond Hettinger68d919e2009-01-25 21:31:47 +00001650>>> list(powerset([1,2,3]))
1651[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001652
Raymond Hettinger560f9a82009-01-27 13:26:35 +00001653>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
1654True
1655
1656>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
1657True
1658
Raymond Hettinger44e15812009-01-02 21:26:45 +00001659>>> list(unique_everseen('AAAABBBCCDAABBB'))
1660['A', 'B', 'C', 'D']
1661
1662>>> list(unique_everseen('ABBCcAD', str.lower))
1663['A', 'B', 'C', 'D']
1664
1665>>> list(unique_justseen('AAAABBBCCDAABBB'))
1666['A', 'B', 'C', 'D', 'A', 'B']
1667
1668>>> list(unique_justseen('ABBCcAD', str.lower))
1669['A', 'B', 'C', 'A', 'D']
1670
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001671"""
1672
1673__test__ = {'libreftest' : libreftest}
1674
1675def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001676 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001677 RegressionTests, LengthTransparency,
Serhiy Storchaka6c467a42013-04-06 22:51:29 +03001678 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001679 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001680
1681 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001682 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001683 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001684 counts = [None] * 5
1685 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001686 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001687 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001688 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001689 print counts
1690
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001691 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001692 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001693
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001694if __name__ == "__main__":
1695 test_main(verbose=True)