blob: 1b1fe09837f189ecfb71f4996a13077546120df3 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Benjamin Petersonee8712c2008-05-20 21:35:26 +00009maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000010minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
Guido van Rossum801f0d72006-08-24 19:48:10 +000012def lzip(*args):
13 return list(zip(*args))
14
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015def onearg(x):
16 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000017 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000018
19def errfunc(*args):
20 'Test function that raises an error'
21 raise ValueError
22
23def gen3():
24 'Non-restartable source sequence'
25 for i in (0, 1, 2):
26 yield i
27
28def isEven(x):
29 'Test predicate'
30 return x%2==0
31
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000032def isOdd(x):
33 'Test predicate'
34 return x%2==1
35
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000036class StopNow:
37 'Class emulating an empty iterable.'
38 def __iter__(self):
39 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000040 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000041 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000042
Raymond Hettinger02420702003-06-29 20:36:23 +000043def take(n, seq):
44 'Convenience function for partially consuming a long of infinite iterable'
45 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000046
Christian Heimes78644762008-03-04 23:39:23 +000047def prod(iterable):
48 return reduce(operator.mul, iterable, 1)
49
Christian Heimes380f7f22008-02-28 11:19:05 +000050def fact(n):
51 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000052 return prod(range(1, n+1))
53
Raymond Hettinger96ef8112003-02-01 00:10:11 +000054class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000055 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +000056
57 def chain2(*iterables):
58 'Pure python version in the docs'
59 for it in iterables:
60 for element in it:
61 yield element
62
63 for c in (chain, chain2):
64 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
65 self.assertEqual(list(c('abc')), list('abc'))
66 self.assertEqual(list(c('')), [])
67 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
68 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +000069
70 def test_chain_from_iterable(self):
71 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
72 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
73 self.assertEqual(list(chain.from_iterable([''])), [])
74 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
75 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000076
Christian Heimes380f7f22008-02-28 11:19:05 +000077 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000078 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +000079 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +000080 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +000081 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000082 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Christian Heimes380f7f22008-02-28 11:19:05 +000083 self.assertEqual(list(combinations(range(4), 3)),
84 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +000085
86 def combinations1(iterable, r):
87 'Pure python version shown in the docs'
88 pool = tuple(iterable)
89 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000090 if r > n:
91 return
Christian Heimes78644762008-03-04 23:39:23 +000092 indices = list(range(r))
93 yield tuple(pool[i] for i in indices)
94 while 1:
95 for i in reversed(range(r)):
96 if indices[i] != i + n - r:
97 break
98 else:
99 return
100 indices[i] += 1
101 for j in range(i+1, r):
102 indices[j] = indices[j-1] + 1
103 yield tuple(pool[i] for i in indices)
104
105 def combinations2(iterable, r):
106 'Pure python version shown in the docs'
107 pool = tuple(iterable)
108 n = len(pool)
109 for indices in permutations(range(n), r):
110 if sorted(indices) == list(indices):
111 yield tuple(pool[i] for i in indices)
112
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000113 def combinations3(iterable, r):
114 'Pure python version from cwr()'
115 pool = tuple(iterable)
116 n = len(pool)
117 for indices in combinations_with_replacement(range(n), r):
118 if len(set(indices)) == r:
119 yield tuple(pool[i] for i in indices)
120
Christian Heimes78644762008-03-04 23:39:23 +0000121 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000122 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000123 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000124 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000125 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs
Christian Heimes380f7f22008-02-28 11:19:05 +0000126 self.assertEqual(len(result), len(set(result))) # no repeats
127 self.assertEqual(result, sorted(result)) # lexicographic order
128 for c in result:
129 self.assertEqual(len(c), r) # r-length combinations
130 self.assertEqual(len(set(c)), r) # no duplicate elements
131 self.assertEqual(list(c), sorted(c)) # keep original ordering
132 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000133 self.assertEqual(list(c),
134 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000135 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000136 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000137 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000138
139 # Test implementation detail: tuple re-use
140 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
141 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
142
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000143 def test_combinations_with_replacement(self):
144 cwr = combinations_with_replacement
145 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
146 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
147 self.assertRaises(TypeError, cwr, None) # pool is not iterable
148 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
149 self.assertEqual(list(cwr('ABC', 2)),
150 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
151
152 def cwr1(iterable, r):
153 'Pure python version shown in the docs'
154 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
155 pool = tuple(iterable)
156 n = len(pool)
157 if not n and r:
158 return
159 indices = [0] * r
160 yield tuple(pool[i] for i in indices)
161 while 1:
162 for i in reversed(range(r)):
163 if indices[i] != n - 1:
164 break
165 else:
166 return
167 indices[i:] = [indices[i] + 1] * (r - i)
168 yield tuple(pool[i] for i in indices)
169
170 def cwr2(iterable, r):
171 'Pure python version shown in the docs'
172 pool = tuple(iterable)
173 n = len(pool)
174 for indices in product(range(n), repeat=r):
175 if sorted(indices) == list(indices):
176 yield tuple(pool[i] for i in indices)
177
178 def numcombs(n, r):
179 if not n:
180 return 0 if r else 1
181 return fact(n+r-1) / fact(r)/ fact(n-1)
182
183 for n in range(7):
184 values = [5*x-12 for x in range(n)]
185 for r in range(n+2):
186 result = list(cwr(values, r))
187
188 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
189 self.assertEqual(len(result), len(set(result))) # no repeats
190 self.assertEqual(result, sorted(result)) # lexicographic order
191
192 regular_combs = list(combinations(values, r)) # compare to combs without replacement
193 if n == 0 or r <= 1:
194 self.assertEquals(result, regular_combs) # cases that should be identical
195 else:
196 self.assert_(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
197
198 for c in result:
199 self.assertEqual(len(c), r) # r-length combinations
200 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
201 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
202 self.assertEqual(list(c), sorted(c)) # keep original ordering
203 self.assert_(all(e in values for e in c)) # elements taken from input iterable
204 self.assertEqual(noruns,
205 [e for e in values if e in c]) # comb is a subsequence of the input iterable
206 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
207 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
208
209 # Test implementation detail: tuple re-use
210 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
211 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
212
Christian Heimes78644762008-03-04 23:39:23 +0000213 def test_permutations(self):
214 self.assertRaises(TypeError, permutations) # too few arguments
215 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000216 self.assertRaises(TypeError, permutations, None) # pool is not iterable
217 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000218 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000219 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000220 self.assertEqual(list(permutations(range(3), 2)),
221 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
222
223 def permutations1(iterable, r=None):
224 'Pure python version shown in the docs'
225 pool = tuple(iterable)
226 n = len(pool)
227 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000228 if r > n:
229 return
Christian Heimes78644762008-03-04 23:39:23 +0000230 indices = list(range(n))
231 cycles = list(range(n-r+1, n+1))[::-1]
232 yield tuple(pool[i] for i in indices[:r])
233 while n:
234 for i in reversed(range(r)):
235 cycles[i] -= 1
236 if cycles[i] == 0:
237 indices[i:] = indices[i+1:] + indices[i:i+1]
238 cycles[i] = n - i
239 else:
240 j = cycles[i]
241 indices[i], indices[-j] = indices[-j], indices[i]
242 yield tuple(pool[i] for i in indices[:r])
243 break
244 else:
245 return
246
247 def permutations2(iterable, r=None):
248 'Pure python version shown in the docs'
249 pool = tuple(iterable)
250 n = len(pool)
251 r = n if r is None else r
252 for indices in product(range(n), repeat=r):
253 if len(set(indices)) == r:
254 yield tuple(pool[i] for i in indices)
255
256 for n in range(7):
257 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000258 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000259 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000260 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms
Christian Heimes78644762008-03-04 23:39:23 +0000261 self.assertEqual(len(result), len(set(result))) # no repeats
262 self.assertEqual(result, sorted(result)) # lexicographic order
263 for p in result:
264 self.assertEqual(len(p), r) # r-length permutations
265 self.assertEqual(len(set(p)), r) # no duplicate elements
266 self.assert_(all(e in values for e in p)) # elements taken from input iterable
267 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000268 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000269 if r == n:
270 self.assertEqual(result, list(permutations(values, None))) # test r as None
271 self.assertEqual(result, list(permutations(values))) # test default r
272
273 # Test implementation detail: tuple re-use
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000274 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000275 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000276
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000277 def test_combinatorics(self):
278 # Test relationships between product(), permutations(),
279 # combinations() and combinations_with_replacement().
280
281 s = 'ABCDE'
282 for r in range(8):
283 prod = list(product(s, repeat=r))
284 cwr = list(combinations_with_replacement(s, r))
285 perm = list(permutations(s, r))
286 comb = list(combinations(s, r))
287
Raymond Hettingerd17ad8d2009-01-27 09:56:30 +0000288 self.assertEquals(len(prod), len(s)**r)
289 self.assertEquals(prod, sorted(set(prod))) # prod in lexicographic order without repeats
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000290 self.assertEquals(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
291 self.assertEquals(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
292 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
293 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
Raymond Hettingerd17ad8d2009-01-27 09:56:30 +0000294 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
295 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
296 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000297
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000298 def test_compress(self):
299 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
300 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
301 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
302 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
303 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
304 n = 10000
305 data = chain.from_iterable(repeat(range(6), n))
306 selectors = chain.from_iterable(repeat((0, 1)))
307 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
308 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
309 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
310 self.assertRaises(TypeError, compress, range(6)) # too few args
311 self.assertRaises(TypeError, compress, range(6), None) # too many args
312
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000313 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000314 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
315 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
316 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000317 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
318 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000319 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000320 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000321 self.assertEqual(list(islice(count(maxsize-5), 10)),
322 list(range(maxsize-5, maxsize+5)))
323 self.assertEqual(list(islice(count(-maxsize-5), 10)),
324 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000325 c = count(3)
326 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000327 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000328 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000329 c = count(-9)
330 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000331 next(c)
332 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000333 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000334 # Test repr (ignoring the L in longs)
335 r1 = repr(count(i)).replace('L', '')
336 r2 = 'count(%r)'.__mod__(i).replace('L', '')
337 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000338
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000339 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000340 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000341 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000342 self.assertRaises(TypeError, cycle)
343 self.assertRaises(TypeError, cycle, 5)
344 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000345
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000346 def test_groupby(self):
347 # Check whether it accepts arguments correctly
348 self.assertEqual([], list(groupby([])))
349 self.assertEqual([], list(groupby([], key=id)))
350 self.assertRaises(TypeError, list, groupby('abc', []))
351 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000352 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000353
354 # Check normal input
355 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
356 (2,15,22), (3,16,23), (3,17,23)]
357 dup = []
358 for k, g in groupby(s, lambda r:r[0]):
359 for elem in g:
360 self.assertEqual(k, elem[0])
361 dup.append(elem)
362 self.assertEqual(s, dup)
363
364 # Check nested case
365 dup = []
366 for k, g in groupby(s, lambda r:r[0]):
367 for ik, ig in groupby(g, lambda r:r[2]):
368 for elem in ig:
369 self.assertEqual(k, elem[0])
370 self.assertEqual(ik, elem[2])
371 dup.append(elem)
372 self.assertEqual(s, dup)
373
374 # Check case where inner iterator is not used
375 keys = [k for k, g in groupby(s, lambda r:r[0])]
376 expectedkeys = set([r[0] for r in s])
377 self.assertEqual(set(keys), expectedkeys)
378 self.assertEqual(len(keys), len(expectedkeys))
379
380 # Exercise pipes and filters style
381 s = 'abracadabra'
382 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000383 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000384 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
385 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000386 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000387 self.assertEqual(r, ['a', 'b', 'r'])
388 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000389 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000390 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
391 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000392 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000393 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
394
Georg Brandla18af4e2007-04-21 15:47:16 +0000395 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000396 class ExpectedError(Exception):
397 pass
398 def delayed_raise(n=0):
399 for i in range(n):
400 yield 'yo'
401 raise ExpectedError
402 def gulp(iterable, keyp=None, func=list):
403 return [func(g) for k, g in groupby(iterable, keyp)]
404
Georg Brandla18af4e2007-04-21 15:47:16 +0000405 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000406 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000407 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000408 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
409
410 # __cmp__ failure
411 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000412 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000413 raise ExpectedError
414 s = [DummyCmp(), DummyCmp(), None]
415
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000416 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000417 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000418 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000419 self.assertRaises(ExpectedError, gulp, s)
420
421 # keyfunc failure
422 def keyfunc(obj):
423 if keyfunc.skip > 0:
424 keyfunc.skip -= 1
425 return obj
426 else:
427 raise ExpectedError
428
429 # keyfunc failure on outer object
430 keyfunc.skip = 0
431 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
432 keyfunc.skip = 1
433 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
434
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000435 def test_filter(self):
436 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
437 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
438 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
439 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
440 self.assertRaises(TypeError, filter)
441 self.assertRaises(TypeError, filter, lambda x:x)
442 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
443 self.assertRaises(TypeError, filter, isEven, 3)
444 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000445
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000446 def test_filterfalse(self):
447 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
448 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
449 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
450 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
451 self.assertRaises(TypeError, filterfalse)
452 self.assertRaises(TypeError, filterfalse, lambda x:x)
453 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
454 self.assertRaises(TypeError, filterfalse, isEven, 3)
455 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000456
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000457 def test_zip(self):
458 # XXX This is rather silly now that builtin zip() calls zip()...
459 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000460 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000461 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
462 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
463 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
464 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
465 self.assertEqual(list(zip()), lzip())
466 self.assertRaises(TypeError, zip, 3)
467 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000468 # Check tuple re-use (implementation detail)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000469 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000470 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000471 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000472 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000473 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000474 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000475 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000476 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000477
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000478 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000479 for args in [
480 ['abc', range(6)],
481 [range(6), 'abc'],
482 [range(1000), range(2000,2100), range(3000,3050)],
483 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
484 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
485 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000486 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
487 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000488 self.assertEqual(list(zip_longest(*args)), target)
489 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000490 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000491 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000493 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000494
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000495 self.assertEqual(list(zip_longest()), list(zip()))
496 self.assertEqual(list(zip_longest([])), list(zip([])))
497 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000498
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000499 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000500 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000501 self.assertRaises(TypeError, zip_longest, 3)
502 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000503
504 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000505 "zip_longest('abc', fv=1)",
506 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000507 ]:
508 try:
509 eval(stmt, globals(), locals())
510 except TypeError:
511 pass
512 else:
513 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514
Thomas Wouterscf297e42007-02-23 15:07:44 +0000515 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000516 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000517 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000518 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000519 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000520 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000521 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000522 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000523 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
524
Christian Heimesc3f30c42008-02-22 16:37:40 +0000525 def test_product(self):
526 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000527 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000528 (['ab'], [('a',), ('b',)]), # one iterable
529 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
530 ([range(0), range(2), range(3)], []), # first iterable with zero length
531 ([range(2), range(0), range(3)], []), # middle iterable with zero length
532 ([range(2), range(3), range(0)], []), # last iterable with zero length
533 ]:
534 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000535 for r in range(4):
536 self.assertEqual(list(product(*(args*r))),
537 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000538 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
539 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000540
541 def product1(*args, **kwds):
542 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
543 n = len(pools)
544 if n == 0:
545 yield ()
546 return
547 if any(len(pool) == 0 for pool in pools):
548 return
549 indices = [0] * n
550 yield tuple(pool[i] for pool, i in zip(pools, indices))
551 while 1:
552 for i in reversed(range(n)): # right to left
553 if indices[i] == len(pools[i]) - 1:
554 continue
555 indices[i] += 1
556 for j in range(i+1, n):
557 indices[j] = 0
558 yield tuple(pool[i] for pool, i in zip(pools, indices))
559 break
560 else:
561 return
562
563 def product2(*args, **kwds):
564 'Pure python version used in docs'
565 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
566 result = [[]]
567 for pool in pools:
568 result = [x+[y] for x in result for y in pool]
569 for prod in result:
570 yield tuple(prod)
571
Christian Heimesc3f30c42008-02-22 16:37:40 +0000572 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
573 set('abcdefg'), range(11), tuple(range(13))]
574 for i in range(100):
575 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000576 expected_len = prod(map(len, args))
577 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000578 self.assertEqual(list(product(*args)), list(product1(*args)))
579 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000580 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000581 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000582
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000583 # Test implementation detail: tuple re-use
584 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
585 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000586
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000587 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000588 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000589 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000590 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000591 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000592 self.assertEqual(list(repeat('a', 0)), [])
593 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000594 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000595 self.assertRaises(TypeError, repeat, None, 3, 4)
596 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000597 r = repeat(1+0j)
598 self.assertEqual(repr(r), 'repeat((1+0j))')
599 r = repeat(1+0j, 5)
600 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
601 list(r)
602 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000603
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000604 def test_map(self):
605 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000606 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000607 def tupleize(*args):
608 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000609 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000610 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000611 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000612 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000613 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000614 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000615 self.assertEqual(list(map(operator.pow, [])), [])
616 self.assertRaises(TypeError, map)
617 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
618 self.assertRaises(TypeError, map, operator.neg)
619 self.assertRaises(TypeError, next, map(10, range(5)))
620 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
621 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000622
623 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000624 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
625 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000626 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000627 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000628 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000629 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
630 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000631 self.assertRaises(TypeError, starmap)
632 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000633 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
634 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
635 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000636
637 def test_islice(self):
638 for args in [ # islice(args) should agree with range(args)
639 (10, 20, 3),
640 (10, 3, 20),
641 (10, 20),
642 (10, 3),
643 (20,)
644 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000645 self.assertEqual(list(islice(range(100), *args)),
646 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000647
648 for args, tgtargs in [ # Stop when seqn is exhausted
649 ((10, 110, 3), ((10, 100, 3))),
650 ((10, 110), ((10, 100))),
651 ((110,), (100,))
652 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000653 self.assertEqual(list(islice(range(100), *args)),
654 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000655
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000656 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000657 self.assertEqual(list(islice(range(10), None)), list(range(10)))
658 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
659 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
660 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
661 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000662
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000663 # Test number of items consumed SF #1171417
664 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000665 self.assertEqual(list(islice(it, 3)), list(range(3)))
666 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000667
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000668 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000669 self.assertRaises(TypeError, islice, range(10))
670 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
671 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
672 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
673 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
674 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
675 self.assertRaises(ValueError, islice, range(10), 'a')
676 self.assertRaises(ValueError, islice, range(10), 'a', 1)
677 self.assertRaises(ValueError, islice, range(10), 1, 'a')
678 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
679 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000680 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000681
682 def test_takewhile(self):
683 data = [1, 3, 5, 20, 2, 4, 6, 8]
684 underten = lambda x: x<10
685 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000686 self.assertEqual(list(takewhile(underten, [])), [])
687 self.assertRaises(TypeError, takewhile)
688 self.assertRaises(TypeError, takewhile, operator.pow)
689 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000690 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
691 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000692 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
693 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000694 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000695
696 def test_dropwhile(self):
697 data = [1, 3, 5, 20, 2, 4, 6, 8]
698 underten = lambda x: x<10
699 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000700 self.assertEqual(list(dropwhile(underten, [])), [])
701 self.assertRaises(TypeError, dropwhile)
702 self.assertRaises(TypeError, dropwhile, operator.pow)
703 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000704 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
705 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000706
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000707 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000708 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000709 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000710 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000711 yield i
712
713 a, b = tee([]) # test empty iterator
714 self.assertEqual(list(a), [])
715 self.assertEqual(list(b), [])
716
717 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000718 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000719
720 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000721 self.assertEqual(list(a), list(range(n)))
722 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000723
724 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000725 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000726 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000727 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000728 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000729
730 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000731 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000732 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000733 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000734 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000735
Guido van Rossum805365e2007-05-07 22:24:25 +0000736 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000737 order = [0]*n + [1]*n
738 random.shuffle(order)
739 lists = ([], [])
740 its = tee(irange(n))
741 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000742 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000743 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000744 self.assertEqual(lists[0], list(range(n)))
745 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000746
Raymond Hettingerad983e72003-11-12 14:32:26 +0000747 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000748 self.assertRaises(TypeError, tee)
749 self.assertRaises(TypeError, tee, 3)
750 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000751 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000752
Raymond Hettingerad983e72003-11-12 14:32:26 +0000753 # tee object should be instantiable
754 a, b = tee('abc')
755 c = type(a)('def')
756 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000757
Raymond Hettingerad983e72003-11-12 14:32:26 +0000758 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000759 a, b, c = tee(range(2000), 3)
760 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000761 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000762 self.assertEqual(list(b), list(range(2000)))
763 self.assertEqual([next(c), next(c)], list(range(2)))
764 self.assertEqual(list(a), list(range(100,2000)))
765 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000766
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000767 # test values of n
768 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000769 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000770 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000771 result = tee('abc', n)
772 self.assertEqual(type(result), tuple)
773 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000774 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000775
Raymond Hettingerad983e72003-11-12 14:32:26 +0000776 # tee pass-through to copyable iterator
777 a, b = tee('abc')
778 c, d = tee(a)
779 self.assert_(a is c)
780
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000781 # test tee_new
782 t1, t2 = tee('abc')
783 tnew = type(t1)
784 self.assertRaises(TypeError, tnew)
785 self.assertRaises(TypeError, tnew, 10)
786 t3 = tnew(t1)
787 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000788
Raymond Hettingera9f60922004-10-17 16:40:14 +0000789 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000790 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000791 p = proxy(a)
792 self.assertEqual(getattr(p, '__class__'), type(b))
793 del a
794 self.assertRaises(ReferenceError, getattr, p, '__class__')
795
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000796 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000797 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000798
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000799 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000800 self.assertRaises(StopIteration, next, f([]))
801 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000802
Georg Brandla18af4e2007-04-21 15:47:16 +0000803 self.assertRaises(StopIteration, next, islice([], None))
804 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000805
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000806 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000807 self.assertRaises(StopIteration, next, p)
808 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000809 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000810 self.assertRaises(StopIteration, next, p)
811 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000812
Georg Brandla18af4e2007-04-21 15:47:16 +0000813 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000814
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000815 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000816 self.assertRaises(StopIteration, next, f(lambda x:x, []))
817 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000818
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000819class TestExamples(unittest.TestCase):
820
821 def test_chain(self):
822 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
823
824 def test_chain_from_iterable(self):
825 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
826
827 def test_combinations(self):
828 self.assertEqual(list(combinations('ABCD', 2)),
829 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
830 self.assertEqual(list(combinations(range(4), 3)),
831 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
832
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000833 def test_combinations_with_replacement(self):
834 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
835 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
836
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000837 def test_compress(self):
838 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
839
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000840 def test_count(self):
841 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
842
843 def test_cycle(self):
844 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
845
846 def test_dropwhile(self):
847 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
848
849 def test_groupby(self):
850 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
851 list('ABCDAB'))
852 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
853 [list('AAAA'), list('BBB'), list('CC'), list('D')])
854
855 def test_filter(self):
856 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
857
858 def test_filterfalse(self):
859 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
860
861 def test_map(self):
862 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
863
864 def test_islice(self):
865 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
866 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
867 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
868 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
869
870 def test_zip(self):
871 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
872
873 def test_zip_longest(self):
874 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
875 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
876
877 def test_permutations(self):
878 self.assertEqual(list(permutations('ABCD', 2)),
879 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
880 self.assertEqual(list(permutations(range(3))),
881 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
882
883 def test_product(self):
884 self.assertEqual(list(product('ABCD', 'xy')),
885 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
886 self.assertEqual(list(product(range(2), repeat=3)),
887 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
888 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
889
890 def test_repeat(self):
891 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
892
893 def test_stapmap(self):
894 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
895 [32, 9, 1000])
896
897 def test_takewhile(self):
898 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
899
900
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000901class TestGC(unittest.TestCase):
902
903 def makecycle(self, iterator, container):
904 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000905 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000906 del container, iterator
907
908 def test_chain(self):
909 a = []
910 self.makecycle(chain(a), a)
911
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000912 def test_chain_from_iterable(self):
913 a = []
914 self.makecycle(chain.from_iterable([a]), a)
915
916 def test_combinations(self):
917 a = []
918 self.makecycle(combinations([1,2,a,3], 3), a)
919
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000920 def test_combinations_with_replacement(self):
921 a = []
922 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
923
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000924 def test_compress(self):
925 a = []
926 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
927
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000928 def test_cycle(self):
929 a = []
930 self.makecycle(cycle([a]*2), a)
931
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000932 def test_dropwhile(self):
933 a = []
934 self.makecycle(dropwhile(bool, [0, a, a]), a)
935
936 def test_groupby(self):
937 a = []
938 self.makecycle(groupby([a]*2, lambda x:x), a)
939
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000940 def test_issue2246(self):
941 # Issue 2246 -- the _grouper iterator was not included in GC
942 n = 10
943 keyfunc = lambda x: x
944 for i, j in groupby(range(n), key=keyfunc):
945 keyfunc.__dict__.setdefault('x',[]).append(j)
946
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000947 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000948 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000949 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000950
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000951 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000952 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000953 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000954
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000955 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000956 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000957 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000958
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000959 def test_zip_longest(self):
960 a = []
961 self.makecycle(zip_longest([a]*2, [a]*3), a)
962 b = [a, None]
963 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
964
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000965 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000966 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000967 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000968
969 def test_islice(self):
970 a = []
971 self.makecycle(islice([a]*2, None), a)
972
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000973 def test_permutations(self):
974 a = []
975 self.makecycle(permutations([1,2,a,3], 3), a)
976
977 def test_product(self):
978 a = []
979 self.makecycle(product([1,2,a,3], repeat=3), a)
980
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000981 def test_repeat(self):
982 a = []
983 self.makecycle(repeat(a), a)
984
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000985 def test_starmap(self):
986 a = []
987 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
988
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000989 def test_takewhile(self):
990 a = []
991 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
992
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000993def R(seqn):
994 'Regular generator'
995 for i in seqn:
996 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000997
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000998class G:
999 'Sequence using __getitem__'
1000 def __init__(self, seqn):
1001 self.seqn = seqn
1002 def __getitem__(self, i):
1003 return self.seqn[i]
1004
1005class I:
1006 'Sequence using iterator protocol'
1007 def __init__(self, seqn):
1008 self.seqn = seqn
1009 self.i = 0
1010 def __iter__(self):
1011 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001012 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001013 if self.i >= len(self.seqn): raise StopIteration
1014 v = self.seqn[self.i]
1015 self.i += 1
1016 return v
1017
1018class Ig:
1019 'Sequence using iterator protocol defined with a generator'
1020 def __init__(self, seqn):
1021 self.seqn = seqn
1022 self.i = 0
1023 def __iter__(self):
1024 for val in self.seqn:
1025 yield val
1026
1027class X:
1028 'Missing __getitem__ and __iter__'
1029 def __init__(self, seqn):
1030 self.seqn = seqn
1031 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001032 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001033 if self.i >= len(self.seqn): raise StopIteration
1034 v = self.seqn[self.i]
1035 self.i += 1
1036 return v
1037
1038class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001039 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001040 def __init__(self, seqn):
1041 self.seqn = seqn
1042 self.i = 0
1043 def __iter__(self):
1044 return self
1045
1046class E:
1047 'Test propagation of exceptions'
1048 def __init__(self, seqn):
1049 self.seqn = seqn
1050 self.i = 0
1051 def __iter__(self):
1052 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001053 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001054 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001055
1056class S:
1057 'Test immediate stop'
1058 def __init__(self, seqn):
1059 pass
1060 def __iter__(self):
1061 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001062 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001063 raise StopIteration
1064
1065def L(seqn):
1066 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001067 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001068
1069
1070class TestVariousIteratorArgs(unittest.TestCase):
1071
1072 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001073 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001074 for g in (G, I, Ig, S, L, R):
1075 self.assertEqual(list(chain(g(s))), list(g(s)))
1076 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001077 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001078 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001079 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1080
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001081 def test_compress(self):
1082 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1083 n = len(s)
1084 for g in (G, I, Ig, S, L, R):
1085 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1086 self.assertRaises(TypeError, compress, X(s), repeat(1))
1087 self.assertRaises(TypeError, compress, N(s), repeat(1))
1088 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1089
Christian Heimesc3f30c42008-02-22 16:37:40 +00001090 def test_product(self):
1091 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1092 self.assertRaises(TypeError, product, X(s))
1093 self.assertRaises(TypeError, product, N(s))
1094 self.assertRaises(ZeroDivisionError, product, E(s))
1095
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001096 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001097 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001098 for g in (G, I, Ig, S, L, R):
1099 tgtlen = len(s) * 3
1100 expected = list(g(s))*3
1101 actual = list(islice(cycle(g(s)), tgtlen))
1102 self.assertEqual(actual, expected)
1103 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001104 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001105 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1106
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001107 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001108 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001109 for g in (G, I, Ig, S, L, R):
1110 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1111 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001112 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001113 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1114
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001115 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001116 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001117 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001118 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001119 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001120 self.assertRaises(TypeError, filter, isEven, X(s))
1121 self.assertRaises(TypeError, filter, isEven, N(s))
1122 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001123
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001124 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001125 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001126 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001127 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001128 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001129 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1130 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1131 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001132
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001133 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001134 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001135 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001136 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1137 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1138 self.assertRaises(TypeError, zip, X(s))
1139 self.assertRaises(TypeError, zip, N(s))
1140 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001141
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001142 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001143 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001144 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001145 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1146 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1147 self.assertRaises(TypeError, zip_longest, X(s))
1148 self.assertRaises(TypeError, zip_longest, N(s))
1149 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001150
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001151 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001152 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001153 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001154 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001155 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001156 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001157 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001158 self.assertRaises(TypeError, map, onearg, X(s))
1159 self.assertRaises(TypeError, map, onearg, N(s))
1160 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001161
1162 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001163 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001164 for g in (G, I, Ig, S, L, R):
1165 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1166 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001167 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001168 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1169
1170 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001171 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001172 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001173 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001174 self.assertEqual(list(starmap(operator.pow, g(ss))),
1175 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001176 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001177 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001178 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1179
1180 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001181 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001182 for g in (G, I, Ig, S, L, R):
1183 tgt = []
1184 for elem in g(s):
1185 if not isEven(elem): break
1186 tgt.append(elem)
1187 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1188 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001189 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001190 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1191
1192 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001193 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001194 for g in (G, I, Ig, S, L, R):
1195 tgt = []
1196 for elem in g(s):
1197 if not tgt and isOdd(elem): continue
1198 tgt.append(elem)
1199 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1200 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001201 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001202 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1203
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001204 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001205 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001206 for g in (G, I, Ig, S, L, R):
1207 it1, it2 = tee(g(s))
1208 self.assertEqual(list(it1), list(g(s)))
1209 self.assertEqual(list(it2), list(g(s)))
1210 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001211 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001212 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1213
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001214class LengthTransparency(unittest.TestCase):
1215
1216 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001217 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001218 self.assertEqual(len(repeat(None, 50)), 50)
1219 self.assertRaises(TypeError, len, repeat(None))
1220
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001221class RegressionTests(unittest.TestCase):
1222
1223 def test_sf_793826(self):
1224 # Fix Armin Rigo's successful efforts to wreak havoc
1225
1226 def mutatingtuple(tuple1, f, tuple2):
1227 # this builds a tuple t which is a copy of tuple1,
1228 # then calls f(t), then mutates t to be equal to tuple2
1229 # (needs len(tuple1) == len(tuple2)).
1230 def g(value, first=[1]):
1231 if first:
1232 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001233 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001234 return value
1235 items = list(tuple2)
1236 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001237 gen = map(g, items)
1238 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001239 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001240
1241 def f(t):
1242 global T
1243 T = t
1244 first[:] = list(T)
1245
1246 first = []
1247 mutatingtuple((1,2,3), f, (4,5,6))
1248 second = list(T)
1249 self.assertEqual(first, second)
1250
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001251
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001252 def test_sf_950057(self):
1253 # Make sure that chain() and cycle() catch exceptions immediately
1254 # rather than when shifting between input sources
1255
1256 def gen1():
1257 hist.append(0)
1258 yield 1
1259 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001260 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001261 hist.append(2)
1262
1263 def gen2(x):
1264 hist.append(3)
1265 yield 2
1266 hist.append(4)
1267 if x:
1268 raise StopIteration
1269
1270 hist = []
1271 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1272 self.assertEqual(hist, [0,1])
1273
1274 hist = []
1275 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1276 self.assertEqual(hist, [0,1])
1277
1278 hist = []
1279 self.assertRaises(AssertionError, list, cycle(gen1()))
1280 self.assertEqual(hist, [0,1])
1281
Thomas Woutersb2137042007-02-01 18:02:27 +00001282class SubclassWithKwargsTest(unittest.TestCase):
1283 def test_keywords_in_subclass(self):
1284 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001285 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001286 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001287 class Subclass(cls):
1288 def __init__(self, newarg=None, *args):
1289 cls.__init__(self, *args)
1290 try:
1291 Subclass(newarg=1)
1292 except TypeError as err:
1293 # we expect type errors because of wrong argument count
1294 self.failIf("does not take keyword arguments" in err.args[0])
1295
1296
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001297libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001298
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001299
1300>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001301>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001302... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001303...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001304Check 1200 is for $120.15
1305Check 1201 is for $764.05
1306Check 1202 is for $823.14
1307
1308>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001309>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001310... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001311...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000013121
13138
131427
1315
1316>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001317>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001318... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001319...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001320Alex
1321Laura
1322Martin
1323Walter
1324Samuele
1325
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001326>>> from operator import itemgetter
1327>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001328>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001329>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001330... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001331...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000013321 ['a', 'c', 'e']
13332 ['b', 'd', 'f']
13343 ['g']
1335
Raymond Hettinger734fb572004-01-20 20:04:40 +00001336# Find runs of consecutive numbers using groupby. The key to the solution
1337# is differencing with a range so that consecutive numbers all appear in
1338# same group.
1339>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001340>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001341... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001342...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001343[1]
1344[4, 5, 6]
1345[10]
1346[15, 16, 17, 18]
1347[22]
1348[25, 26, 27, 28]
1349
Georg Brandl3dbca812008-07-23 16:10:53 +00001350>>> def take(n, iterable):
1351... "Return first n items of the iterable as a list"
1352... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001353
Georg Brandl3dbca812008-07-23 16:10:53 +00001354>>> def enumerate(iterable, start=0):
1355... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001356
Georg Brandl3dbca812008-07-23 16:10:53 +00001357>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001358... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001359... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001360
1361>>> def nth(iterable, n):
Georg Brandl3dbca812008-07-23 16:10:53 +00001362... "Returns the nth item or empty list"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001363... return list(islice(iterable, n, n+1))
1364
Georg Brandl3dbca812008-07-23 16:10:53 +00001365>>> def quantify(iterable, pred=bool):
1366... "Count how many times the predicate is true"
1367... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001368
Georg Brandl3dbca812008-07-23 16:10:53 +00001369>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001370... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001371... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001372
Georg Brandl3dbca812008-07-23 16:10:53 +00001373>>> def ncycles(iterable, n):
1374... "Returns the seqeuence elements n times"
1375... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001376
1377>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001378... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001379
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001380>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001381... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001382
1383>>> def repeatfunc(func, times=None, *args):
1384... "Repeat calls to func with specified arguments."
1385... " Example: repeatfunc(random.random)"
1386... if times is None:
1387... return starmap(func, repeat(args))
1388... else:
1389... return starmap(func, repeat(args, times))
1390
Raymond Hettingerd591f662003-10-26 15:34:50 +00001391>>> def pairwise(iterable):
1392... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1393... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001394... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001395... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001396... except StopIteration:
1397... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001398... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001399
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001400>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001401... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001402... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001403... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001404
1405>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001406... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001407... # Recipe credited to George Sakkis
1408... pending = len(iterables)
1409... nexts = cycle(iter(it).__next__ for it in iterables)
1410... while pending:
1411... try:
1412... for next in nexts:
1413... yield next()
1414... except StopIteration:
1415... pending -= 1
1416... nexts = cycle(islice(nexts, pending))
1417
1418>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001419... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1420... s = list(iterable)
1421... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001422
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001423>>> def unique_everseen(iterable, key=None):
1424... "List unique elements, preserving order. Remember all elements ever seen."
1425... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1426... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1427... seen = set()
1428... seen_add = seen.add
1429... if key is None:
1430... for element in iterable:
1431... if element not in seen:
1432... seen_add(element)
1433... yield element
1434... else:
1435... for element in iterable:
1436... k = key(element)
1437... if k not in seen:
1438... seen_add(k)
1439... yield element
1440
1441>>> def unique_justseen(iterable, key=None):
1442... "List unique elements, preserving order. Remember only the element just seen."
1443... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1444... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1445... return map(next, map(itemgetter(1), groupby(iterable, key)))
1446
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001447This is not part of the examples but it tests to make sure the definitions
1448perform as purported.
1449
Raymond Hettingera098b332003-09-08 23:58:40 +00001450>>> take(10, count())
1451[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1452
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001453>>> list(enumerate('abc'))
1454[(0, 'a'), (1, 'b'), (2, 'c')]
1455
1456>>> list(islice(tabulate(lambda x: 2*x), 4))
1457[0, 2, 4, 6]
1458
1459>>> nth('abcde', 3)
1460['d']
1461
Guido van Rossum805365e2007-05-07 22:24:25 +00001462>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000146350
1464
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001465>>> a = [[1, 2, 3], [4, 5, 6]]
1466>>> flatten(a)
1467[1, 2, 3, 4, 5, 6]
1468
1469>>> list(repeatfunc(pow, 5, 2, 3))
1470[8, 8, 8, 8, 8]
1471
1472>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001473>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001474[0, 0, 0, 0, 0]
1475
Raymond Hettingerd591f662003-10-26 15:34:50 +00001476>>> list(pairwise('abcd'))
1477[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001478
Raymond Hettingerd591f662003-10-26 15:34:50 +00001479>>> list(pairwise([]))
1480[]
1481
1482>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001483[]
1484
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001485>>> list(islice(padnone('abc'), 0, 6))
1486['a', 'b', 'c', None, None, None]
1487
1488>>> list(ncycles('abc', 3))
1489['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1490
1491>>> dotproduct([1,2,3], [4,5,6])
149232
1493
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001494>>> list(grouper(3, 'abcdefg', 'x'))
1495[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1496
1497>>> list(roundrobin('abc', 'd', 'ef'))
1498['a', 'd', 'e', 'b', 'f', 'c']
1499
Raymond Hettingerace67332009-01-26 02:23:50 +00001500>>> list(powerset([1,2,3]))
1501[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001502
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001503>>> list(unique_everseen('AAAABBBCCDAABBB'))
1504['A', 'B', 'C', 'D']
1505
1506>>> list(unique_everseen('ABBCcAD', str.lower))
1507['A', 'B', 'C', 'D']
1508
1509>>> list(unique_justseen('AAAABBBCCDAABBB'))
1510['A', 'B', 'C', 'D', 'A', 'B']
1511
1512>>> list(unique_justseen('ABBCcAD', str.lower))
1513['A', 'B', 'C', 'A', 'D']
1514
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001515"""
1516
1517__test__ = {'libreftest' : libreftest}
1518
1519def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001520 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001521 RegressionTests, LengthTransparency,
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001522 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001523 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001524
1525 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001526 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001527 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001528 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001529 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001530 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001531 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001532 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001533 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001534
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001535 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001536 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001537
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001538if __name__ == "__main__":
1539 test_main(verbose=True)