blob: 6912ac74215767cb4c68ca43b1a1281cab6adcaf [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from 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
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettingerd553d852008-03-04 04:17:08 +000043def prod(iterable):
44 return reduce(operator.mul, iterable, 1)
45
Raymond Hettinger93e804d2008-02-26 23:40:50 +000046def fact(n):
47 'Factorial'
Raymond Hettingerd553d852008-03-04 04:17:08 +000048 return prod(range(1, n+1))
49
Raymond Hettinger96ef8112003-02-01 00:10:11 +000050class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000051 def test_chain(self):
Raymond Hettingerad47fa12008-03-06 20:52:01 +000052
53 def chain2(*iterables):
54 'Pure python version in the docs'
55 for it in iterables:
56 for element in it:
57 yield element
58
59 for c in (chain, chain2):
60 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
61 self.assertEqual(list(c('abc')), list('abc'))
62 self.assertEqual(list(c('')), [])
63 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
64 self.assertRaises(TypeError, list,c(2, 3))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000065
Raymond Hettingerb4cbc982008-02-28 22:46:41 +000066 def test_chain_from_iterable(self):
67 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
68 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
69 self.assertEqual(list(chain.from_iterable([''])), [])
70 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
71 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
72
Raymond Hettinger93e804d2008-02-26 23:40:50 +000073 def test_combinations(self):
74 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
75 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Raymond Hettingerd553d852008-03-04 04:17:08 +000076 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Raymond Hettinger93e804d2008-02-26 23:40:50 +000077 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
78 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
79 self.assertEqual(list(combinations(range(4), 3)),
80 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Raymond Hettingerd553d852008-03-04 04:17:08 +000081
82 def combinations1(iterable, r):
83 'Pure python version shown in the docs'
84 pool = tuple(iterable)
85 n = len(pool)
86 indices = range(r)
87 yield tuple(pool[i] for i in indices)
88 while 1:
89 for i in reversed(range(r)):
90 if indices[i] != i + n - r:
91 break
92 else:
93 return
94 indices[i] += 1
95 for j in range(i+1, r):
96 indices[j] = indices[j-1] + 1
97 yield tuple(pool[i] for i in indices)
98
99 def combinations2(iterable, r):
100 'Pure python version shown in the docs'
101 pool = tuple(iterable)
102 n = len(pool)
103 for indices in permutations(range(n), r):
104 if sorted(indices) == list(indices):
105 yield tuple(pool[i] for i in indices)
106
107 for n in range(7):
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000108 values = [5*x-12 for x in range(n)]
109 for r in range(n+1):
110 result = list(combinations(values, r))
111 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
112 self.assertEqual(len(result), len(set(result))) # no repeats
113 self.assertEqual(result, sorted(result)) # lexicographic order
114 for c in result:
115 self.assertEqual(len(c), r) # r-length combinations
116 self.assertEqual(len(set(c)), r) # no duplicate elements
117 self.assertEqual(list(c), sorted(c)) # keep original ordering
118 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000119 self.assertEqual(list(c),
120 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Raymond Hettingerd553d852008-03-04 04:17:08 +0000121 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
122 self.assertEqual(result, list(combinations2(values, r))) # matches first pure python version
123
124 # Test implementation detail: tuple re-use
125 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
126 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
127
128 def test_permutations(self):
129 self.assertRaises(TypeError, permutations) # too few arguments
130 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000131 self.assertRaises(TypeError, permutations, None) # pool is not iterable
132 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
133 self.assertRaises(ValueError, permutations, 'abc', 32) # r is too big
134 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Raymond Hettingerd553d852008-03-04 04:17:08 +0000135 self.assertEqual(list(permutations(range(3), 2)),
136 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
137
138 def permutations1(iterable, r=None):
139 'Pure python version shown in the docs'
140 pool = tuple(iterable)
141 n = len(pool)
142 r = n if r is None else r
143 indices = range(n)
Raymond Hettingere70bb8d2008-03-23 00:55:46 +0000144 cycles = range(n, n-r, -1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000145 yield tuple(pool[i] for i in indices[:r])
146 while n:
147 for i in reversed(range(r)):
148 cycles[i] -= 1
149 if cycles[i] == 0:
150 indices[i:] = indices[i+1:] + indices[i:i+1]
151 cycles[i] = n - i
152 else:
153 j = cycles[i]
154 indices[i], indices[-j] = indices[-j], indices[i]
155 yield tuple(pool[i] for i in indices[:r])
156 break
157 else:
158 return
159
160 def permutations2(iterable, r=None):
161 'Pure python version shown in the docs'
162 pool = tuple(iterable)
163 n = len(pool)
164 r = n if r is None else r
165 for indices in product(range(n), repeat=r):
166 if len(set(indices)) == r:
167 yield tuple(pool[i] for i in indices)
168
169 for n in range(7):
170 values = [5*x-12 for x in range(n)]
171 for r in range(n+1):
172 result = list(permutations(values, r))
173 self.assertEqual(len(result), fact(n) / fact(n-r)) # right number of perms
174 self.assertEqual(len(result), len(set(result))) # no repeats
175 self.assertEqual(result, sorted(result)) # lexicographic order
176 for p in result:
177 self.assertEqual(len(p), r) # r-length permutations
178 self.assertEqual(len(set(p)), r) # no duplicate elements
179 self.assert_(all(e in values for e in p)) # elements taken from input iterable
180 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
181 self.assertEqual(result, list(permutations2(values, r))) # matches first pure python version
182 if r == n:
183 self.assertEqual(result, list(permutations(values, None))) # test r as None
184 self.assertEqual(result, list(permutations(values))) # test default r
185
186 # Test implementation detail: tuple re-use
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000187 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000188 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Raymond Hettinger93e804d2008-02-26 23:40:50 +0000189
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000190 def test_count(self):
191 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
192 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000193 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000194 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
195 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000196 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000197 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000198 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
199 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000200 c = count(3)
201 self.assertEqual(repr(c), 'count(3)')
202 c.next()
203 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +0000204 c = count(-9)
205 self.assertEqual(repr(c), 'count(-9)')
206 c.next()
207 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000208 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 +0000209 # Test repr (ignoring the L in longs)
210 r1 = repr(count(i)).replace('L', '')
211 r2 = 'count(%r)'.__mod__(i).replace('L', '')
212 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000213
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000214 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000215 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000216 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000217 self.assertRaises(TypeError, cycle)
218 self.assertRaises(TypeError, cycle, 5)
219 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000220
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000221 def test_groupby(self):
222 # Check whether it accepts arguments correctly
223 self.assertEqual([], list(groupby([])))
224 self.assertEqual([], list(groupby([], key=id)))
225 self.assertRaises(TypeError, list, groupby('abc', []))
226 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000227 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000228
229 # Check normal input
230 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
231 (2,15,22), (3,16,23), (3,17,23)]
232 dup = []
233 for k, g in groupby(s, lambda r:r[0]):
234 for elem in g:
235 self.assertEqual(k, elem[0])
236 dup.append(elem)
237 self.assertEqual(s, dup)
238
239 # Check nested case
240 dup = []
241 for k, g in groupby(s, lambda r:r[0]):
242 for ik, ig in groupby(g, lambda r:r[2]):
243 for elem in ig:
244 self.assertEqual(k, elem[0])
245 self.assertEqual(ik, elem[2])
246 dup.append(elem)
247 self.assertEqual(s, dup)
248
249 # Check case where inner iterator is not used
250 keys = [k for k, g in groupby(s, lambda r:r[0])]
251 expectedkeys = set([r[0] for r in s])
252 self.assertEqual(set(keys), expectedkeys)
253 self.assertEqual(len(keys), len(expectedkeys))
254
255 # Exercise pipes and filters style
256 s = 'abracadabra'
257 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000258 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000259 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
260 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000261 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000262 self.assertEqual(r, ['a', 'b', 'r'])
263 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000264 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000265 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
266 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000267 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000268 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
269
270 # iter.next failure
271 class ExpectedError(Exception):
272 pass
273 def delayed_raise(n=0):
274 for i in range(n):
275 yield 'yo'
276 raise ExpectedError
277 def gulp(iterable, keyp=None, func=list):
278 return [func(g) for k, g in groupby(iterable, keyp)]
279
280 # iter.next failure on outer object
281 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
282 # iter.next failure on inner object
283 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
284
285 # __cmp__ failure
286 class DummyCmp:
287 def __cmp__(self, dst):
288 raise ExpectedError
289 s = [DummyCmp(), DummyCmp(), None]
290
291 # __cmp__ failure on outer object
292 self.assertRaises(ExpectedError, gulp, s, func=id)
293 # __cmp__ failure on inner object
294 self.assertRaises(ExpectedError, gulp, s)
295
296 # keyfunc failure
297 def keyfunc(obj):
298 if keyfunc.skip > 0:
299 keyfunc.skip -= 1
300 return obj
301 else:
302 raise ExpectedError
303
304 # keyfunc failure on outer object
305 keyfunc.skip = 0
306 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
307 keyfunc.skip = 1
308 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
309
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000310 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000311 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000312 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000313 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000314 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000316 self.assertRaises(TypeError, ifilter, lambda x:x)
317 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000318 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000319 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000320
321 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000322 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
323 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000324 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000325 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000326 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000327 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
328 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000329 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000330 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000331
332 def test_izip(self):
333 ans = [(x,y) for x, y in izip('abc',count())]
334 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000335 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
336 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000337 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000338 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000339 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000340 self.assertRaises(TypeError, izip, 3)
341 self.assertRaises(TypeError, izip, range(3), 3)
342 # Check tuple re-use (implementation detail)
343 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
344 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000345 self.assertEqual([pair for pair in izip('abc', 'def')],
346 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000347 ids = map(id, izip('abc', 'def'))
348 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000349 ids = map(id, list(izip('abc', 'def')))
350 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000351
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000352 def test_iziplongest(self):
353 for args in [
354 ['abc', range(6)],
355 [range(6), 'abc'],
356 [range(1000), range(2000,2100), range(3000,3050)],
357 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
358 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
359 ]:
360 target = map(None, *args)
361 self.assertEqual(list(izip_longest(*args)), target)
362 self.assertEqual(list(izip_longest(*args, **{})), target)
363 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
364 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000365
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000366 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
367
368 self.assertEqual(list(izip_longest()), zip())
369 self.assertEqual(list(izip_longest([])), zip([]))
370 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000371
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000372 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
373 self.assertRaises(TypeError, izip_longest, 3)
374 self.assertRaises(TypeError, izip_longest, range(3), 3)
375
376 for stmt in [
377 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000378 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000379 ]:
380 try:
381 eval(stmt, globals(), locals())
382 except TypeError:
383 pass
384 else:
385 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000386
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000387 # Check tuple re-use (implementation detail)
388 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
389 zip('abc', 'def'))
390 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
391 zip('abc', 'def'))
392 ids = map(id, izip_longest('abc', 'def'))
393 self.assertEqual(min(ids), max(ids))
394 ids = map(id, list(izip_longest('abc', 'def')))
395 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
396
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000397 def test_product(self):
398 for args, result in [
Raymond Hettingerd553d852008-03-04 04:17:08 +0000399 ([], [()]), # zero iterables
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000400 (['ab'], [('a',), ('b',)]), # one iterable
401 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
402 ([range(0), range(2), range(3)], []), # first iterable with zero length
403 ([range(2), range(0), range(3)], []), # middle iterable with zero length
404 ([range(2), range(3), range(0)], []), # last iterable with zero length
405 ]:
406 self.assertEqual(list(product(*args)), result)
Raymond Hettinger08ff6822008-02-29 02:21:48 +0000407 for r in range(4):
408 self.assertEqual(list(product(*(args*r))),
409 list(product(*args, **dict(repeat=r))))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000410 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
411 self.assertRaises(TypeError, product, range(6), None)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000412
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000413 def product1(*args, **kwds):
414 pools = map(tuple, args) * kwds.get('repeat', 1)
415 n = len(pools)
416 if n == 0:
417 yield ()
418 return
419 if any(len(pool) == 0 for pool in pools):
420 return
421 indices = [0] * n
422 yield tuple(pool[i] for pool, i in zip(pools, indices))
423 while 1:
424 for i in reversed(range(n)): # right to left
425 if indices[i] == len(pools[i]) - 1:
426 continue
427 indices[i] += 1
428 for j in range(i+1, n):
429 indices[j] = 0
430 yield tuple(pool[i] for pool, i in zip(pools, indices))
431 break
432 else:
433 return
434
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000435 def product2(*args, **kwds):
436 'Pure python version used in docs'
437 pools = map(tuple, args) * kwds.get('repeat', 1)
438 result = [[]]
439 for pool in pools:
440 result = [x+[y] for x in result for y in pool]
441 for prod in result:
442 yield tuple(prod)
443
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000444 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
445 set('abcdefg'), range(11), tuple(range(13))]
446 for i in range(100):
447 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000448 expected_len = prod(map(len, args))
449 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +0000450 self.assertEqual(list(product(*args)), list(product1(*args)))
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000451 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000452 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000453 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000454
Raymond Hettinger73d79632008-02-23 02:20:41 +0000455 # Test implementation detail: tuple re-use
456 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
457 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000458
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000459 def test_repeat(self):
460 self.assertEqual(zip(xrange(3),repeat('a')),
461 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000462 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000463 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000464 self.assertEqual(list(repeat('a', 0)), [])
465 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000466 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000467 self.assertRaises(TypeError, repeat, None, 3, 4)
468 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000469 r = repeat(1+0j)
470 self.assertEqual(repr(r), 'repeat((1+0j))')
471 r = repeat(1+0j, 5)
472 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
473 list(r)
474 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000475
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000476 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000477 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
478 [0**1, 1**2, 2**3])
479 self.assertEqual(list(imap(None, 'abc', range(5))),
480 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000481 self.assertEqual(list(imap(None, 'abc', count())),
482 [('a',0),('b',1),('c',2)])
483 self.assertEqual(take(2,imap(None, 'abc', count())),
484 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000485 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000486 self.assertRaises(TypeError, imap)
487 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000488 self.assertRaises(TypeError, imap(10, range(5)).next)
489 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
490 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000491
492 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000493 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
494 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000495 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
496 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000497 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000498 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
499 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000500 self.assertRaises(TypeError, starmap)
501 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
502 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
503 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
504 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000505
506 def test_islice(self):
507 for args in [ # islice(args) should agree with range(args)
508 (10, 20, 3),
509 (10, 3, 20),
510 (10, 20),
511 (10, 3),
512 (20,)
513 ]:
514 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
515
516 for args, tgtargs in [ # Stop when seqn is exhausted
517 ((10, 110, 3), ((10, 100, 3))),
518 ((10, 110), ((10, 100))),
519 ((110,), (100,))
520 ]:
521 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
522
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000523 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000524 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000525 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
526 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000527 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
528 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
529
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000530 # Test number of items consumed SF #1171417
531 it = iter(range(10))
532 self.assertEqual(list(islice(it, 3)), range(3))
533 self.assertEqual(list(it), range(3, 10))
534
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000535 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000536 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000537 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
538 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
539 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
540 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
541 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000542 self.assertRaises(ValueError, islice, xrange(10), 'a')
543 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
544 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
545 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
546 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000547 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000548
549 def test_takewhile(self):
550 data = [1, 3, 5, 20, 2, 4, 6, 8]
551 underten = lambda x: x<10
552 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000553 self.assertEqual(list(takewhile(underten, [])), [])
554 self.assertRaises(TypeError, takewhile)
555 self.assertRaises(TypeError, takewhile, operator.pow)
556 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
557 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
558 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000559 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
560 self.assertEqual(list(t), [1, 1, 1])
561 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000562
563 def test_dropwhile(self):
564 data = [1, 3, 5, 20, 2, 4, 6, 8]
565 underten = lambda x: x<10
566 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000567 self.assertEqual(list(dropwhile(underten, [])), [])
568 self.assertRaises(TypeError, dropwhile)
569 self.assertRaises(TypeError, dropwhile, operator.pow)
570 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
571 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
572 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000573
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000574 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000575 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000576 def irange(n):
577 for i in xrange(n):
578 yield i
579
580 a, b = tee([]) # test empty iterator
581 self.assertEqual(list(a), [])
582 self.assertEqual(list(b), [])
583
584 a, b = tee(irange(n)) # test 100% interleaved
585 self.assertEqual(zip(a,b), zip(range(n),range(n)))
586
587 a, b = tee(irange(n)) # test 0% interleaved
588 self.assertEqual(list(a), range(n))
589 self.assertEqual(list(b), range(n))
590
591 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000592 for i in xrange(100):
593 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000594 del a
595 self.assertEqual(list(b), range(n))
596
597 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000598 for i in xrange(100):
599 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000600 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000601 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000602
603 for j in xrange(5): # test randomly interleaved
604 order = [0]*n + [1]*n
605 random.shuffle(order)
606 lists = ([], [])
607 its = tee(irange(n))
608 for i in order:
609 value = its[i].next()
610 lists[i].append(value)
611 self.assertEqual(lists[0], range(n))
612 self.assertEqual(lists[1], range(n))
613
Raymond Hettingerad983e72003-11-12 14:32:26 +0000614 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000615 self.assertRaises(TypeError, tee)
616 self.assertRaises(TypeError, tee, 3)
617 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000618 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000619
Raymond Hettingerad983e72003-11-12 14:32:26 +0000620 # tee object should be instantiable
621 a, b = tee('abc')
622 c = type(a)('def')
623 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000624
Raymond Hettingerad983e72003-11-12 14:32:26 +0000625 # test long-lagged and multi-way split
626 a, b, c = tee(xrange(2000), 3)
627 for i in xrange(100):
628 self.assertEqual(a.next(), i)
629 self.assertEqual(list(b), range(2000))
630 self.assertEqual([c.next(), c.next()], range(2))
631 self.assertEqual(list(a), range(100,2000))
632 self.assertEqual(list(c), range(2,2000))
633
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000634 # test values of n
635 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000636 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000637 for n in xrange(5):
638 result = tee('abc', n)
639 self.assertEqual(type(result), tuple)
640 self.assertEqual(len(result), n)
641 self.assertEqual(map(list, result), [list('abc')]*n)
642
Raymond Hettingerad983e72003-11-12 14:32:26 +0000643 # tee pass-through to copyable iterator
644 a, b = tee('abc')
645 c, d = tee(a)
646 self.assert_(a is c)
647
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000648 # test tee_new
649 t1, t2 = tee('abc')
650 tnew = type(t1)
651 self.assertRaises(TypeError, tnew)
652 self.assertRaises(TypeError, tnew, 10)
653 t3 = tnew(t1)
654 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000655
Raymond Hettingera9f60922004-10-17 16:40:14 +0000656 # test that tee objects are weak referencable
657 a, b = tee(xrange(10))
658 p = proxy(a)
659 self.assertEqual(getattr(p, '__class__'), type(b))
660 del a
661 self.assertRaises(ReferenceError, getattr, p, '__class__')
662
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000663 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000664 self.assertRaises(StopIteration, izip().next)
665
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000666 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000667 self.assertRaises(StopIteration, f([]).next)
668 self.assertRaises(StopIteration, f(StopNow()).next)
669
670 self.assertRaises(StopIteration, islice([], None).next)
671 self.assertRaises(StopIteration, islice(StopNow(), None).next)
672
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000673 p, q = tee([])
674 self.assertRaises(StopIteration, p.next)
675 self.assertRaises(StopIteration, q.next)
676 p, q = tee(StopNow())
677 self.assertRaises(StopIteration, p.next)
678 self.assertRaises(StopIteration, q.next)
679
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000680 self.assertRaises(StopIteration, repeat(None, 0).next)
681
682 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
683 self.assertRaises(StopIteration, f(lambda x:x, []).next)
684 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
685
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000686class TestExamples(unittest.TestCase):
687
688 def test_chain(self):
689 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
690
691 def test_chain_from_iterable(self):
692 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
693
694 def test_combinations(self):
695 self.assertEqual(list(combinations('ABCD', 2)),
696 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
697 self.assertEqual(list(combinations(range(4), 3)),
698 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
699
700 def test_count(self):
701 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
702
703 def test_cycle(self):
704 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
705
706 def test_dropwhile(self):
707 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
708
709 def test_groupby(self):
710 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
711 list('ABCDAB'))
712 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
713 [list('AAAA'), list('BBB'), list('CC'), list('D')])
714
715 def test_ifilter(self):
716 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
717
718 def test_ifilterfalse(self):
719 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
720
721 def test_imap(self):
722 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
723
724 def test_islice(self):
725 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
726 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
727 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
728 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
729
730 def test_izip(self):
731 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
732
733 def test_izip_longest(self):
734 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
735 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
736
737 def test_permutations(self):
738 self.assertEqual(list(permutations('ABCD', 2)),
739 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
740 self.assertEqual(list(permutations(range(3))),
741 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
742
743 def test_product(self):
744 self.assertEqual(list(product('ABCD', 'xy')),
745 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
746 self.assertEqual(list(product(range(2), repeat=3)),
747 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
748 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
749
750 def test_repeat(self):
751 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
752
753 def test_stapmap(self):
754 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
755 [32, 9, 1000])
756
757 def test_takewhile(self):
758 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
759
760
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000761class TestGC(unittest.TestCase):
762
763 def makecycle(self, iterator, container):
764 container.append(iterator)
765 iterator.next()
766 del container, iterator
767
768 def test_chain(self):
769 a = []
770 self.makecycle(chain(a), a)
771
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000772 def test_chain_from_iterable(self):
773 a = []
774 self.makecycle(chain.from_iterable([a]), a)
775
776 def test_combinations(self):
777 a = []
778 self.makecycle(combinations([1,2,a,3], 3), a)
779
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000780 def test_cycle(self):
781 a = []
782 self.makecycle(cycle([a]*2), a)
783
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000784 def test_dropwhile(self):
785 a = []
786 self.makecycle(dropwhile(bool, [0, a, a]), a)
787
788 def test_groupby(self):
789 a = []
790 self.makecycle(groupby([a]*2, lambda x:x), a)
791
Raymond Hettingera1ca94a2008-03-06 22:51:36 +0000792 def test_issue2246(self):
793 # Issue 2246 -- the _grouper iterator was not included in GC
794 n = 10
795 keyfunc = lambda x: x
796 for i, j in groupby(xrange(n), key=keyfunc):
797 keyfunc.__dict__.setdefault('x',[]).append(j)
798
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000799 def test_ifilter(self):
800 a = []
801 self.makecycle(ifilter(lambda x:True, [a]*2), a)
802
803 def test_ifilterfalse(self):
804 a = []
805 self.makecycle(ifilterfalse(lambda x:False, a), a)
806
807 def test_izip(self):
808 a = []
809 self.makecycle(izip([a]*2, [a]*3), a)
810
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000811 def test_izip_longest(self):
812 a = []
813 self.makecycle(izip_longest([a]*2, [a]*3), a)
814 b = [a, None]
815 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
816
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000817 def test_imap(self):
818 a = []
819 self.makecycle(imap(lambda x:x, [a]*2), a)
820
821 def test_islice(self):
822 a = []
823 self.makecycle(islice([a]*2, None), a)
824
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000825 def test_permutations(self):
826 a = []
827 self.makecycle(permutations([1,2,a,3], 3), a)
828
829 def test_product(self):
830 a = []
831 self.makecycle(product([1,2,a,3], repeat=3), a)
832
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000833 def test_repeat(self):
834 a = []
835 self.makecycle(repeat(a), a)
836
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000837 def test_starmap(self):
838 a = []
839 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
840
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000841 def test_takewhile(self):
842 a = []
843 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
844
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000845def R(seqn):
846 'Regular generator'
847 for i in seqn:
848 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000849
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000850class G:
851 'Sequence using __getitem__'
852 def __init__(self, seqn):
853 self.seqn = seqn
854 def __getitem__(self, i):
855 return self.seqn[i]
856
857class I:
858 'Sequence using iterator protocol'
859 def __init__(self, seqn):
860 self.seqn = seqn
861 self.i = 0
862 def __iter__(self):
863 return self
864 def next(self):
865 if self.i >= len(self.seqn): raise StopIteration
866 v = self.seqn[self.i]
867 self.i += 1
868 return v
869
870class Ig:
871 'Sequence using iterator protocol defined with a generator'
872 def __init__(self, seqn):
873 self.seqn = seqn
874 self.i = 0
875 def __iter__(self):
876 for val in self.seqn:
877 yield val
878
879class X:
880 'Missing __getitem__ and __iter__'
881 def __init__(self, seqn):
882 self.seqn = seqn
883 self.i = 0
884 def next(self):
885 if self.i >= len(self.seqn): raise StopIteration
886 v = self.seqn[self.i]
887 self.i += 1
888 return v
889
890class N:
891 'Iterator missing next()'
892 def __init__(self, seqn):
893 self.seqn = seqn
894 self.i = 0
895 def __iter__(self):
896 return self
897
898class E:
899 'Test propagation of exceptions'
900 def __init__(self, seqn):
901 self.seqn = seqn
902 self.i = 0
903 def __iter__(self):
904 return self
905 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000906 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000907
908class S:
909 'Test immediate stop'
910 def __init__(self, seqn):
911 pass
912 def __iter__(self):
913 return self
914 def next(self):
915 raise StopIteration
916
917def L(seqn):
918 'Test multiple tiers of iterators'
919 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
920
921
922class TestVariousIteratorArgs(unittest.TestCase):
923
924 def test_chain(self):
925 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
926 for g in (G, I, Ig, S, L, R):
927 self.assertEqual(list(chain(g(s))), list(g(s)))
928 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +0000929 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000930 self.assertRaises(TypeError, list, chain(N(s)))
931 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
932
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000933 def test_product(self):
934 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
935 self.assertRaises(TypeError, product, X(s))
936 self.assertRaises(TypeError, product, N(s))
937 self.assertRaises(ZeroDivisionError, product, E(s))
938
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000939 def test_cycle(self):
940 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
941 for g in (G, I, Ig, S, L, R):
942 tgtlen = len(s) * 3
943 expected = list(g(s))*3
944 actual = list(islice(cycle(g(s)), tgtlen))
945 self.assertEqual(actual, expected)
946 self.assertRaises(TypeError, cycle, X(s))
947 self.assertRaises(TypeError, list, cycle(N(s)))
948 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
949
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000950 def test_groupby(self):
951 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
952 for g in (G, I, Ig, S, L, R):
953 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
954 self.assertRaises(TypeError, groupby, X(s))
955 self.assertRaises(TypeError, list, groupby(N(s)))
956 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
957
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000958 def test_ifilter(self):
959 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
960 for g in (G, I, Ig, S, L, R):
961 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
962 self.assertRaises(TypeError, ifilter, isEven, X(s))
963 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
964 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
965
966 def test_ifilterfalse(self):
967 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
968 for g in (G, I, Ig, S, L, R):
969 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
970 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
971 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
972 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
973
974 def test_izip(self):
975 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
976 for g in (G, I, Ig, S, L, R):
977 self.assertEqual(list(izip(g(s))), zip(g(s)))
978 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
979 self.assertRaises(TypeError, izip, X(s))
980 self.assertRaises(TypeError, list, izip(N(s)))
981 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
982
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000983 def test_iziplongest(self):
984 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
985 for g in (G, I, Ig, S, L, R):
986 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
987 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
988 self.assertRaises(TypeError, izip_longest, X(s))
989 self.assertRaises(TypeError, list, izip_longest(N(s)))
990 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
991
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000992 def test_imap(self):
993 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
994 for g in (G, I, Ig, S, L, R):
995 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
996 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
997 self.assertRaises(TypeError, imap, onearg, X(s))
998 self.assertRaises(TypeError, list, imap(onearg, N(s)))
999 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
1000
1001 def test_islice(self):
1002 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1003 for g in (G, I, Ig, S, L, R):
1004 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1005 self.assertRaises(TypeError, islice, X(s), 10)
1006 self.assertRaises(TypeError, list, islice(N(s), 10))
1007 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1008
1009 def test_starmap(self):
1010 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
1011 for g in (G, I, Ig, S, L, R):
1012 ss = zip(s, s)
1013 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
1014 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
1015 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
1016 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1017
1018 def test_takewhile(self):
1019 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1020 for g in (G, I, Ig, S, L, R):
1021 tgt = []
1022 for elem in g(s):
1023 if not isEven(elem): break
1024 tgt.append(elem)
1025 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1026 self.assertRaises(TypeError, takewhile, isEven, X(s))
1027 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1028 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1029
1030 def test_dropwhile(self):
1031 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1032 for g in (G, I, Ig, S, L, R):
1033 tgt = []
1034 for elem in g(s):
1035 if not tgt and isOdd(elem): continue
1036 tgt.append(elem)
1037 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1038 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1039 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1040 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1041
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001042 def test_tee(self):
1043 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1044 for g in (G, I, Ig, S, L, R):
1045 it1, it2 = tee(g(s))
1046 self.assertEqual(list(it1), list(g(s)))
1047 self.assertEqual(list(it2), list(g(s)))
1048 self.assertRaises(TypeError, tee, X(s))
1049 self.assertRaises(TypeError, list, tee(N(s))[0])
1050 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1051
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001052class LengthTransparency(unittest.TestCase):
1053
1054 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001055 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001056 self.assertEqual(len(repeat(None, 50)), 50)
1057 self.assertRaises(TypeError, len, repeat(None))
1058
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001059class RegressionTests(unittest.TestCase):
1060
1061 def test_sf_793826(self):
1062 # Fix Armin Rigo's successful efforts to wreak havoc
1063
1064 def mutatingtuple(tuple1, f, tuple2):
1065 # this builds a tuple t which is a copy of tuple1,
1066 # then calls f(t), then mutates t to be equal to tuple2
1067 # (needs len(tuple1) == len(tuple2)).
1068 def g(value, first=[1]):
1069 if first:
1070 del first[:]
1071 f(z.next())
1072 return value
1073 items = list(tuple2)
1074 items[1:1] = list(tuple1)
1075 gen = imap(g, items)
1076 z = izip(*[gen]*len(tuple1))
1077 z.next()
1078
1079 def f(t):
1080 global T
1081 T = t
1082 first[:] = list(T)
1083
1084 first = []
1085 mutatingtuple((1,2,3), f, (4,5,6))
1086 second = list(T)
1087 self.assertEqual(first, second)
1088
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001089
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001090 def test_sf_950057(self):
1091 # Make sure that chain() and cycle() catch exceptions immediately
1092 # rather than when shifting between input sources
1093
1094 def gen1():
1095 hist.append(0)
1096 yield 1
1097 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001098 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001099 hist.append(2)
1100
1101 def gen2(x):
1102 hist.append(3)
1103 yield 2
1104 hist.append(4)
1105 if x:
1106 raise StopIteration
1107
1108 hist = []
1109 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1110 self.assertEqual(hist, [0,1])
1111
1112 hist = []
1113 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1114 self.assertEqual(hist, [0,1])
1115
1116 hist = []
1117 self.assertRaises(AssertionError, list, cycle(gen1()))
1118 self.assertEqual(hist, [0,1])
1119
Georg Brandlb84c1372007-01-21 10:28:43 +00001120class SubclassWithKwargsTest(unittest.TestCase):
1121 def test_keywords_in_subclass(self):
1122 # count is not subclassable...
1123 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
1124 starmap, islice, takewhile, dropwhile, cycle):
1125 class Subclass(cls):
1126 def __init__(self, newarg=None, *args):
1127 cls.__init__(self, *args)
1128 try:
1129 Subclass(newarg=1)
1130 except TypeError, err:
1131 # we expect type errors because of wrong argument count
1132 self.failIf("does not take keyword arguments" in err.args[0])
1133
1134
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001135libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001136
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001137
1138>>> amounts = [120.15, 764.05, 823.14]
1139>>> for checknum, amount in izip(count(1200), amounts):
1140... print 'Check %d is for $%.2f' % (checknum, amount)
1141...
1142Check 1200 is for $120.15
1143Check 1201 is for $764.05
1144Check 1202 is for $823.14
1145
1146>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001147>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1148... print cube
1149...
11501
11518
115227
1153
1154>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001155>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001156... print name.title()
1157...
1158Alex
1159Laura
1160Martin
1161Walter
1162Samuele
1163
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001164>>> from operator import itemgetter
1165>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001166>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001167>>> for k, g in groupby(di, itemgetter(1)):
1168... print k, map(itemgetter(0), g)
1169...
11701 ['a', 'c', 'e']
11712 ['b', 'd', 'f']
11723 ['g']
1173
Raymond Hettinger734fb572004-01-20 20:04:40 +00001174# Find runs of consecutive numbers using groupby. The key to the solution
1175# is differencing with a range so that consecutive numbers all appear in
1176# same group.
1177>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
1178>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
1179... print map(operator.itemgetter(1), g)
1180...
1181[1]
1182[4, 5, 6]
1183[10]
1184[15, 16, 17, 18]
1185[22]
1186[25, 26, 27, 28]
1187
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001188>>> def take(n, iterable):
1189... "Return first n items of the iterable as a list"
1190... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001191
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001192>>> def enumerate(iterable, start=0):
1193... return izip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001194
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001195>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001196... "Return function(0), function(1), ..."
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001197... return imap(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001198
1199>>> def nth(iterable, n):
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001200... "Returns the nth item or empty list"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001201... return list(islice(iterable, n, n+1))
1202
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001203>>> def quantify(iterable, pred=bool):
1204... "Count how many times the predicate is true"
1205... return sum(imap(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001206
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001207>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001208... "Returns the sequence elements and then returns None indefinitely"
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001209... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001210
Raymond Hettingerf1f46f02008-07-19 23:58:47 +00001211>>> def ncycles(iterable, n):
1212... "Returns the seqeuence elements n times"
1213... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001214
1215>>> def dotproduct(vec1, vec2):
1216... return sum(imap(operator.mul, vec1, vec2))
1217
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001218>>> def flatten(listOfLists):
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001219... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001220
1221>>> def repeatfunc(func, times=None, *args):
1222... "Repeat calls to func with specified arguments."
1223... " Example: repeatfunc(random.random)"
1224... if times is None:
1225... return starmap(func, repeat(args))
1226... else:
1227... return starmap(func, repeat(args, times))
1228
Raymond Hettingerd591f662003-10-26 15:34:50 +00001229>>> def pairwise(iterable):
1230... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1231... a, b = tee(iterable)
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001232... for elem in b:
1233... break
Raymond Hettingerad983e72003-11-12 14:32:26 +00001234... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001235
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001236>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001237... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Raymond Hettinger38fb9be2008-03-07 01:33:20 +00001238... args = [iter(iterable)] * n
Raymond Hettingerf080e6d2008-07-31 01:19:50 +00001239... return izip_longest(fillvalue=fillvalue, *args)
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001240
1241>>> def roundrobin(*iterables):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001242... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001243... # Recipe credited to George Sakkis
1244... pending = len(iterables)
1245... nexts = cycle(iter(it).next for it in iterables)
1246... while pending:
1247... try:
1248... for next in nexts:
1249... yield next()
1250... except StopIteration:
1251... pending -= 1
1252... nexts = cycle(islice(nexts, pending))
1253
1254>>> def powerset(iterable):
1255... "powerset('ab') --> set([]), set(['a']), set(['b']), set(['a', 'b'])"
1256... # Recipe credited to Eric Raymond
1257... pairs = [(2**i, x) for i, x in enumerate(iterable)]
1258... for n in xrange(2**len(pairs)):
1259... yield set(x for m, x in pairs if m&n)
1260
Raymond Hettingere8b4b602008-03-11 00:19:07 +00001261>>> def compress(data, selectors):
Raymond Hettingerefdf7062008-07-30 07:27:30 +00001262... "compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F"
1263... return (d for d, s in izip(data, selectors) if s)
Raymond Hettingere8b4b602008-03-11 00:19:07 +00001264
Raymond Hettinger33691672008-07-19 00:43:00 +00001265>>> def combinations_with_replacement(iterable, r):
1266... "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC"
1267... pool = tuple(iterable)
1268... n = len(pool)
1269... indices = [0] * r
1270... yield tuple(pool[i] for i in indices)
1271... while 1:
1272... for i in reversed(range(r)):
1273... if indices[i] != n - 1:
1274... break
1275... else:
1276... return
1277... indices[i:] = [indices[i] + 1] * (r - i)
1278... yield tuple(pool[i] for i in indices)
1279
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001280This is not part of the examples but it tests to make sure the definitions
1281perform as purported.
1282
Raymond Hettingera098b332003-09-08 23:58:40 +00001283>>> take(10, count())
1284[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1285
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001286>>> list(enumerate('abc'))
1287[(0, 'a'), (1, 'b'), (2, 'c')]
1288
1289>>> list(islice(tabulate(lambda x: 2*x), 4))
1290[0, 2, 4, 6]
1291
1292>>> nth('abcde', 3)
1293['d']
1294
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001295>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000129650
1297
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001298>>> a = [[1, 2, 3], [4, 5, 6]]
1299>>> flatten(a)
1300[1, 2, 3, 4, 5, 6]
1301
1302>>> list(repeatfunc(pow, 5, 2, 3))
1303[8, 8, 8, 8, 8]
1304
1305>>> import random
1306>>> take(5, imap(int, repeatfunc(random.random)))
1307[0, 0, 0, 0, 0]
1308
Raymond Hettingerd591f662003-10-26 15:34:50 +00001309>>> list(pairwise('abcd'))
1310[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001311
Raymond Hettingerd591f662003-10-26 15:34:50 +00001312>>> list(pairwise([]))
1313[]
1314
1315>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001316[]
1317
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001318>>> list(islice(padnone('abc'), 0, 6))
1319['a', 'b', 'c', None, None, None]
1320
1321>>> list(ncycles('abc', 3))
1322['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1323
1324>>> dotproduct([1,2,3], [4,5,6])
132532
1326
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001327>>> list(grouper(3, 'abcdefg', 'x'))
1328[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1329
1330>>> list(roundrobin('abc', 'd', 'ef'))
1331['a', 'd', 'e', 'b', 'f', 'c']
1332
1333>>> map(sorted, powerset('ab'))
1334[[], ['a'], ['b'], ['a', 'b']]
1335
Raymond Hettingere8b4b602008-03-11 00:19:07 +00001336>>> list(compress('abcdef', [1,0,1,0,1,1]))
1337['a', 'c', 'e', 'f']
1338
Raymond Hettinger33691672008-07-19 00:43:00 +00001339>>> list(combinations_with_replacement('abc', 2))
1340[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
1341
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001342"""
1343
1344__test__ = {'libreftest' : libreftest}
1345
1346def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001347 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001348 RegressionTests, LengthTransparency,
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001349 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001350 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001351
1352 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001353 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001354 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001355 counts = [None] * 5
1356 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001357 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001358 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001359 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001360 print counts
1361
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001362 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001363 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001364
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001365if __name__ == "__main__":
1366 test_main(verbose=True)