blob: 3bd2255ab9a532cc58d482c61aca354400b50a22 [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)
144 cycles = range(n-r+1, n+1)[::-1]
145 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
413 def product2(*args, **kwds):
414 'Pure python version used in docs'
415 pools = map(tuple, args) * kwds.get('repeat', 1)
416 result = [[]]
417 for pool in pools:
418 result = [x+[y] for x in result for y in pool]
419 for prod in result:
420 yield tuple(prod)
421
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000422 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
423 set('abcdefg'), range(11), tuple(range(13))]
424 for i in range(100):
425 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Raymond Hettingerd553d852008-03-04 04:17:08 +0000426 expected_len = prod(map(len, args))
427 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger66f91ea2008-03-05 20:59:58 +0000428 self.assertEqual(list(product(*args)), list(product2(*args)))
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000429 args = map(iter, args)
Raymond Hettingerd553d852008-03-04 04:17:08 +0000430 self.assertEqual(len(list(product(*args))), expected_len)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000431
Raymond Hettinger73d79632008-02-23 02:20:41 +0000432 # Test implementation detail: tuple re-use
433 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
434 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000435
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000436 def test_repeat(self):
437 self.assertEqual(zip(xrange(3),repeat('a')),
438 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000439 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000440 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000441 self.assertEqual(list(repeat('a', 0)), [])
442 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000443 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000444 self.assertRaises(TypeError, repeat, None, 3, 4)
445 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000446 r = repeat(1+0j)
447 self.assertEqual(repr(r), 'repeat((1+0j))')
448 r = repeat(1+0j, 5)
449 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
450 list(r)
451 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000452
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000453 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000454 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
455 [0**1, 1**2, 2**3])
456 self.assertEqual(list(imap(None, 'abc', range(5))),
457 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000458 self.assertEqual(list(imap(None, 'abc', count())),
459 [('a',0),('b',1),('c',2)])
460 self.assertEqual(take(2,imap(None, 'abc', count())),
461 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000462 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000463 self.assertRaises(TypeError, imap)
464 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000465 self.assertRaises(TypeError, imap(10, range(5)).next)
466 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
467 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000468
469 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000470 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
471 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000472 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
473 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000474 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000475 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
476 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000477 self.assertRaises(TypeError, starmap)
478 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
479 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
480 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
481 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000482
483 def test_islice(self):
484 for args in [ # islice(args) should agree with range(args)
485 (10, 20, 3),
486 (10, 3, 20),
487 (10, 20),
488 (10, 3),
489 (20,)
490 ]:
491 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
492
493 for args, tgtargs in [ # Stop when seqn is exhausted
494 ((10, 110, 3), ((10, 100, 3))),
495 ((10, 110), ((10, 100))),
496 ((110,), (100,))
497 ]:
498 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
499
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000500 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000501 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000502 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
503 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000504 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
505 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
506
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000507 # Test number of items consumed SF #1171417
508 it = iter(range(10))
509 self.assertEqual(list(islice(it, 3)), range(3))
510 self.assertEqual(list(it), range(3, 10))
511
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000512 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000513 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000514 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
515 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
516 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
517 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
518 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000519 self.assertRaises(ValueError, islice, xrange(10), 'a')
520 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
521 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
522 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
523 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000524 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000525
526 def test_takewhile(self):
527 data = [1, 3, 5, 20, 2, 4, 6, 8]
528 underten = lambda x: x<10
529 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000530 self.assertEqual(list(takewhile(underten, [])), [])
531 self.assertRaises(TypeError, takewhile)
532 self.assertRaises(TypeError, takewhile, operator.pow)
533 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
534 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
535 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000536 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
537 self.assertEqual(list(t), [1, 1, 1])
538 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000539
540 def test_dropwhile(self):
541 data = [1, 3, 5, 20, 2, 4, 6, 8]
542 underten = lambda x: x<10
543 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000544 self.assertEqual(list(dropwhile(underten, [])), [])
545 self.assertRaises(TypeError, dropwhile)
546 self.assertRaises(TypeError, dropwhile, operator.pow)
547 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
548 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
549 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000550
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000551 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000552 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000553 def irange(n):
554 for i in xrange(n):
555 yield i
556
557 a, b = tee([]) # test empty iterator
558 self.assertEqual(list(a), [])
559 self.assertEqual(list(b), [])
560
561 a, b = tee(irange(n)) # test 100% interleaved
562 self.assertEqual(zip(a,b), zip(range(n),range(n)))
563
564 a, b = tee(irange(n)) # test 0% interleaved
565 self.assertEqual(list(a), range(n))
566 self.assertEqual(list(b), range(n))
567
568 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000569 for i in xrange(100):
570 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000571 del a
572 self.assertEqual(list(b), range(n))
573
574 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000575 for i in xrange(100):
576 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000577 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000578 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000579
580 for j in xrange(5): # test randomly interleaved
581 order = [0]*n + [1]*n
582 random.shuffle(order)
583 lists = ([], [])
584 its = tee(irange(n))
585 for i in order:
586 value = its[i].next()
587 lists[i].append(value)
588 self.assertEqual(lists[0], range(n))
589 self.assertEqual(lists[1], range(n))
590
Raymond Hettingerad983e72003-11-12 14:32:26 +0000591 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000592 self.assertRaises(TypeError, tee)
593 self.assertRaises(TypeError, tee, 3)
594 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000595 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000596
Raymond Hettingerad983e72003-11-12 14:32:26 +0000597 # tee object should be instantiable
598 a, b = tee('abc')
599 c = type(a)('def')
600 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000601
Raymond Hettingerad983e72003-11-12 14:32:26 +0000602 # test long-lagged and multi-way split
603 a, b, c = tee(xrange(2000), 3)
604 for i in xrange(100):
605 self.assertEqual(a.next(), i)
606 self.assertEqual(list(b), range(2000))
607 self.assertEqual([c.next(), c.next()], range(2))
608 self.assertEqual(list(a), range(100,2000))
609 self.assertEqual(list(c), range(2,2000))
610
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000611 # test values of n
612 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000613 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000614 for n in xrange(5):
615 result = tee('abc', n)
616 self.assertEqual(type(result), tuple)
617 self.assertEqual(len(result), n)
618 self.assertEqual(map(list, result), [list('abc')]*n)
619
Raymond Hettingerad983e72003-11-12 14:32:26 +0000620 # tee pass-through to copyable iterator
621 a, b = tee('abc')
622 c, d = tee(a)
623 self.assert_(a is c)
624
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000625 # test tee_new
626 t1, t2 = tee('abc')
627 tnew = type(t1)
628 self.assertRaises(TypeError, tnew)
629 self.assertRaises(TypeError, tnew, 10)
630 t3 = tnew(t1)
631 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000632
Raymond Hettingera9f60922004-10-17 16:40:14 +0000633 # test that tee objects are weak referencable
634 a, b = tee(xrange(10))
635 p = proxy(a)
636 self.assertEqual(getattr(p, '__class__'), type(b))
637 del a
638 self.assertRaises(ReferenceError, getattr, p, '__class__')
639
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000640 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000641 self.assertRaises(StopIteration, izip().next)
642
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000643 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000644 self.assertRaises(StopIteration, f([]).next)
645 self.assertRaises(StopIteration, f(StopNow()).next)
646
647 self.assertRaises(StopIteration, islice([], None).next)
648 self.assertRaises(StopIteration, islice(StopNow(), None).next)
649
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000650 p, q = tee([])
651 self.assertRaises(StopIteration, p.next)
652 self.assertRaises(StopIteration, q.next)
653 p, q = tee(StopNow())
654 self.assertRaises(StopIteration, p.next)
655 self.assertRaises(StopIteration, q.next)
656
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000657 self.assertRaises(StopIteration, repeat(None, 0).next)
658
659 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
660 self.assertRaises(StopIteration, f(lambda x:x, []).next)
661 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
662
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000663class TestExamples(unittest.TestCase):
664
665 def test_chain(self):
666 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
667
668 def test_chain_from_iterable(self):
669 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
670
671 def test_combinations(self):
672 self.assertEqual(list(combinations('ABCD', 2)),
673 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
674 self.assertEqual(list(combinations(range(4), 3)),
675 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
676
677 def test_count(self):
678 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
679
680 def test_cycle(self):
681 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
682
683 def test_dropwhile(self):
684 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
685
686 def test_groupby(self):
687 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
688 list('ABCDAB'))
689 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
690 [list('AAAA'), list('BBB'), list('CC'), list('D')])
691
692 def test_ifilter(self):
693 self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
694
695 def test_ifilterfalse(self):
696 self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
697
698 def test_imap(self):
699 self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
700
701 def test_islice(self):
702 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
703 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
704 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
705 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
706
707 def test_izip(self):
708 self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
709
710 def test_izip_longest(self):
711 self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
712 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
713
714 def test_permutations(self):
715 self.assertEqual(list(permutations('ABCD', 2)),
716 map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
717 self.assertEqual(list(permutations(range(3))),
718 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
719
720 def test_product(self):
721 self.assertEqual(list(product('ABCD', 'xy')),
722 map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
723 self.assertEqual(list(product(range(2), repeat=3)),
724 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
725 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
726
727 def test_repeat(self):
728 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
729
730 def test_stapmap(self):
731 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
732 [32, 9, 1000])
733
734 def test_takewhile(self):
735 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
736
737
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000738class TestGC(unittest.TestCase):
739
740 def makecycle(self, iterator, container):
741 container.append(iterator)
742 iterator.next()
743 del container, iterator
744
745 def test_chain(self):
746 a = []
747 self.makecycle(chain(a), a)
748
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000749 def test_chain_from_iterable(self):
750 a = []
751 self.makecycle(chain.from_iterable([a]), a)
752
753 def test_combinations(self):
754 a = []
755 self.makecycle(combinations([1,2,a,3], 3), a)
756
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000757 def test_cycle(self):
758 a = []
759 self.makecycle(cycle([a]*2), a)
760
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000761 def test_dropwhile(self):
762 a = []
763 self.makecycle(dropwhile(bool, [0, a, a]), a)
764
765 def test_groupby(self):
766 a = []
767 self.makecycle(groupby([a]*2, lambda x:x), a)
768
Raymond Hettingera1ca94a2008-03-06 22:51:36 +0000769 def test_issue2246(self):
770 # Issue 2246 -- the _grouper iterator was not included in GC
771 n = 10
772 keyfunc = lambda x: x
773 for i, j in groupby(xrange(n), key=keyfunc):
774 keyfunc.__dict__.setdefault('x',[]).append(j)
775
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000776 def test_ifilter(self):
777 a = []
778 self.makecycle(ifilter(lambda x:True, [a]*2), a)
779
780 def test_ifilterfalse(self):
781 a = []
782 self.makecycle(ifilterfalse(lambda x:False, a), a)
783
784 def test_izip(self):
785 a = []
786 self.makecycle(izip([a]*2, [a]*3), a)
787
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000788 def test_izip_longest(self):
789 a = []
790 self.makecycle(izip_longest([a]*2, [a]*3), a)
791 b = [a, None]
792 self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
793
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000794 def test_imap(self):
795 a = []
796 self.makecycle(imap(lambda x:x, [a]*2), a)
797
798 def test_islice(self):
799 a = []
800 self.makecycle(islice([a]*2, None), a)
801
Raymond Hettingerad47fa12008-03-06 20:52:01 +0000802 def test_permutations(self):
803 a = []
804 self.makecycle(permutations([1,2,a,3], 3), a)
805
806 def test_product(self):
807 a = []
808 self.makecycle(product([1,2,a,3], repeat=3), a)
809
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000810 def test_repeat(self):
811 a = []
812 self.makecycle(repeat(a), a)
813
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000814 def test_starmap(self):
815 a = []
816 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
817
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000818 def test_takewhile(self):
819 a = []
820 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
821
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000822def R(seqn):
823 'Regular generator'
824 for i in seqn:
825 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000826
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000827class G:
828 'Sequence using __getitem__'
829 def __init__(self, seqn):
830 self.seqn = seqn
831 def __getitem__(self, i):
832 return self.seqn[i]
833
834class I:
835 'Sequence using iterator protocol'
836 def __init__(self, seqn):
837 self.seqn = seqn
838 self.i = 0
839 def __iter__(self):
840 return self
841 def next(self):
842 if self.i >= len(self.seqn): raise StopIteration
843 v = self.seqn[self.i]
844 self.i += 1
845 return v
846
847class Ig:
848 'Sequence using iterator protocol defined with a generator'
849 def __init__(self, seqn):
850 self.seqn = seqn
851 self.i = 0
852 def __iter__(self):
853 for val in self.seqn:
854 yield val
855
856class X:
857 'Missing __getitem__ and __iter__'
858 def __init__(self, seqn):
859 self.seqn = seqn
860 self.i = 0
861 def next(self):
862 if self.i >= len(self.seqn): raise StopIteration
863 v = self.seqn[self.i]
864 self.i += 1
865 return v
866
867class N:
868 'Iterator missing next()'
869 def __init__(self, seqn):
870 self.seqn = seqn
871 self.i = 0
872 def __iter__(self):
873 return self
874
875class E:
876 'Test propagation of exceptions'
877 def __init__(self, seqn):
878 self.seqn = seqn
879 self.i = 0
880 def __iter__(self):
881 return self
882 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000883 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000884
885class S:
886 'Test immediate stop'
887 def __init__(self, seqn):
888 pass
889 def __iter__(self):
890 return self
891 def next(self):
892 raise StopIteration
893
894def L(seqn):
895 'Test multiple tiers of iterators'
896 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
897
898
899class TestVariousIteratorArgs(unittest.TestCase):
900
901 def test_chain(self):
902 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
903 for g in (G, I, Ig, S, L, R):
904 self.assertEqual(list(chain(g(s))), list(g(s)))
905 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +0000906 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000907 self.assertRaises(TypeError, list, chain(N(s)))
908 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
909
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000910 def test_product(self):
911 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
912 self.assertRaises(TypeError, product, X(s))
913 self.assertRaises(TypeError, product, N(s))
914 self.assertRaises(ZeroDivisionError, product, E(s))
915
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000916 def test_cycle(self):
917 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
918 for g in (G, I, Ig, S, L, R):
919 tgtlen = len(s) * 3
920 expected = list(g(s))*3
921 actual = list(islice(cycle(g(s)), tgtlen))
922 self.assertEqual(actual, expected)
923 self.assertRaises(TypeError, cycle, X(s))
924 self.assertRaises(TypeError, list, cycle(N(s)))
925 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
926
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000927 def test_groupby(self):
928 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
929 for g in (G, I, Ig, S, L, R):
930 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
931 self.assertRaises(TypeError, groupby, X(s))
932 self.assertRaises(TypeError, list, groupby(N(s)))
933 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
934
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000935 def test_ifilter(self):
936 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
937 for g in (G, I, Ig, S, L, R):
938 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
939 self.assertRaises(TypeError, ifilter, isEven, X(s))
940 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
941 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
942
943 def test_ifilterfalse(self):
944 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
945 for g in (G, I, Ig, S, L, R):
946 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
947 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
948 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
949 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
950
951 def test_izip(self):
952 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
953 for g in (G, I, Ig, S, L, R):
954 self.assertEqual(list(izip(g(s))), zip(g(s)))
955 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
956 self.assertRaises(TypeError, izip, X(s))
957 self.assertRaises(TypeError, list, izip(N(s)))
958 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
959
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000960 def test_iziplongest(self):
961 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
962 for g in (G, I, Ig, S, L, R):
963 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
964 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
965 self.assertRaises(TypeError, izip_longest, X(s))
966 self.assertRaises(TypeError, list, izip_longest(N(s)))
967 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
968
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000969 def test_imap(self):
970 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
971 for g in (G, I, Ig, S, L, R):
972 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
973 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
974 self.assertRaises(TypeError, imap, onearg, X(s))
975 self.assertRaises(TypeError, list, imap(onearg, N(s)))
976 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
977
978 def test_islice(self):
979 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
980 for g in (G, I, Ig, S, L, R):
981 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
982 self.assertRaises(TypeError, islice, X(s), 10)
983 self.assertRaises(TypeError, list, islice(N(s), 10))
984 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
985
986 def test_starmap(self):
987 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
988 for g in (G, I, Ig, S, L, R):
989 ss = zip(s, s)
990 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
991 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
992 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
993 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
994
995 def test_takewhile(self):
996 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
997 for g in (G, I, Ig, S, L, R):
998 tgt = []
999 for elem in g(s):
1000 if not isEven(elem): break
1001 tgt.append(elem)
1002 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1003 self.assertRaises(TypeError, takewhile, isEven, X(s))
1004 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
1005 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1006
1007 def test_dropwhile(self):
1008 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
1009 for g in (G, I, Ig, S, L, R):
1010 tgt = []
1011 for elem in g(s):
1012 if not tgt and isOdd(elem): continue
1013 tgt.append(elem)
1014 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1015 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
1016 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
1017 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1018
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001019 def test_tee(self):
1020 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1021 for g in (G, I, Ig, S, L, R):
1022 it1, it2 = tee(g(s))
1023 self.assertEqual(list(it1), list(g(s)))
1024 self.assertEqual(list(it2), list(g(s)))
1025 self.assertRaises(TypeError, tee, X(s))
1026 self.assertRaises(TypeError, list, tee(N(s))[0])
1027 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1028
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001029class LengthTransparency(unittest.TestCase):
1030
1031 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001032 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001033 self.assertEqual(len(repeat(None, 50)), 50)
1034 self.assertRaises(TypeError, len, repeat(None))
1035
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001036class RegressionTests(unittest.TestCase):
1037
1038 def test_sf_793826(self):
1039 # Fix Armin Rigo's successful efforts to wreak havoc
1040
1041 def mutatingtuple(tuple1, f, tuple2):
1042 # this builds a tuple t which is a copy of tuple1,
1043 # then calls f(t), then mutates t to be equal to tuple2
1044 # (needs len(tuple1) == len(tuple2)).
1045 def g(value, first=[1]):
1046 if first:
1047 del first[:]
1048 f(z.next())
1049 return value
1050 items = list(tuple2)
1051 items[1:1] = list(tuple1)
1052 gen = imap(g, items)
1053 z = izip(*[gen]*len(tuple1))
1054 z.next()
1055
1056 def f(t):
1057 global T
1058 T = t
1059 first[:] = list(T)
1060
1061 first = []
1062 mutatingtuple((1,2,3), f, (4,5,6))
1063 second = list(T)
1064 self.assertEqual(first, second)
1065
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001066
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001067 def test_sf_950057(self):
1068 # Make sure that chain() and cycle() catch exceptions immediately
1069 # rather than when shifting between input sources
1070
1071 def gen1():
1072 hist.append(0)
1073 yield 1
1074 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001075 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001076 hist.append(2)
1077
1078 def gen2(x):
1079 hist.append(3)
1080 yield 2
1081 hist.append(4)
1082 if x:
1083 raise StopIteration
1084
1085 hist = []
1086 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1087 self.assertEqual(hist, [0,1])
1088
1089 hist = []
1090 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1091 self.assertEqual(hist, [0,1])
1092
1093 hist = []
1094 self.assertRaises(AssertionError, list, cycle(gen1()))
1095 self.assertEqual(hist, [0,1])
1096
Georg Brandlb84c1372007-01-21 10:28:43 +00001097class SubclassWithKwargsTest(unittest.TestCase):
1098 def test_keywords_in_subclass(self):
1099 # count is not subclassable...
1100 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
1101 starmap, islice, takewhile, dropwhile, cycle):
1102 class Subclass(cls):
1103 def __init__(self, newarg=None, *args):
1104 cls.__init__(self, *args)
1105 try:
1106 Subclass(newarg=1)
1107 except TypeError, err:
1108 # we expect type errors because of wrong argument count
1109 self.failIf("does not take keyword arguments" in err.args[0])
1110
1111
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001112libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001113
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001114
1115>>> amounts = [120.15, 764.05, 823.14]
1116>>> for checknum, amount in izip(count(1200), amounts):
1117... print 'Check %d is for $%.2f' % (checknum, amount)
1118...
1119Check 1200 is for $120.15
1120Check 1201 is for $764.05
1121Check 1202 is for $823.14
1122
1123>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001124>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
1125... print cube
1126...
11271
11288
112927
1130
1131>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001132>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001133... print name.title()
1134...
1135Alex
1136Laura
1137Martin
1138Walter
1139Samuele
1140
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001141>>> from operator import itemgetter
1142>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +00001143>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001144>>> for k, g in groupby(di, itemgetter(1)):
1145... print k, map(itemgetter(0), g)
1146...
11471 ['a', 'c', 'e']
11482 ['b', 'd', 'f']
11493 ['g']
1150
Raymond Hettinger734fb572004-01-20 20:04:40 +00001151# Find runs of consecutive numbers using groupby. The key to the solution
1152# is differencing with a range so that consecutive numbers all appear in
1153# same group.
1154>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
1155>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
1156... print map(operator.itemgetter(1), g)
1157...
1158[1]
1159[4, 5, 6]
1160[10]
1161[15, 16, 17, 18]
1162[22]
1163[25, 26, 27, 28]
1164
Raymond Hettingera098b332003-09-08 23:58:40 +00001165>>> def take(n, seq):
1166... return list(islice(seq, n))
1167
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001168>>> def enumerate(iterable):
1169... return izip(count(), iterable)
1170
1171>>> def tabulate(function):
1172... "Return function(0), function(1), ..."
1173... return imap(function, count())
1174
1175>>> def iteritems(mapping):
1176... return izip(mapping.iterkeys(), mapping.itervalues())
1177
1178>>> def nth(iterable, n):
1179... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001180... return list(islice(iterable, n, n+1))
1181
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001182>>> def all(seq, pred=None):
1183... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001184... for elem in ifilterfalse(pred, seq):
1185... return False
1186... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +00001187
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001188>>> def any(seq, pred=None):
1189... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001190... for elem in ifilter(pred, seq):
1191... return True
1192... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +00001193
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001194>>> def no(seq, pred=None):
1195... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +00001196... for elem in ifilter(pred, seq):
1197... return False
1198... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +00001199
Raymond Hettingerf77d0332005-03-11 22:17:30 +00001200>>> def quantify(seq, pred=None):
1201... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +00001202... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001203
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001204>>> def padnone(seq):
1205... "Returns the sequence elements and then returns None indefinitely"
1206... return chain(seq, repeat(None))
1207
1208>>> def ncycles(seq, n):
1209... "Returns the sequence elements n times"
1210... return chain(*repeat(seq, n))
1211
1212>>> def dotproduct(vec1, vec2):
1213... return sum(imap(operator.mul, vec1, vec2))
1214
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001215>>> def flatten(listOfLists):
1216... return list(chain(*listOfLists))
1217
1218>>> def repeatfunc(func, times=None, *args):
1219... "Repeat calls to func with specified arguments."
1220... " Example: repeatfunc(random.random)"
1221... if times is None:
1222... return starmap(func, repeat(args))
1223... else:
1224... return starmap(func, repeat(args, times))
1225
Raymond Hettingerd591f662003-10-26 15:34:50 +00001226>>> def pairwise(iterable):
1227... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1228... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001229... try:
1230... b.next()
1231... except StopIteration:
1232... pass
1233... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001234
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001235>>> def grouper(n, iterable, padvalue=None):
1236... "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
1237... return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
1238
1239>>> def roundrobin(*iterables):
1240... "roundrobin('abc', 'd', 'ef') --> 'a', 'd', 'e', 'b', 'f', 'c'"
1241... # Recipe credited to George Sakkis
1242... pending = len(iterables)
1243... nexts = cycle(iter(it).next for it in iterables)
1244... while pending:
1245... try:
1246... for next in nexts:
1247... yield next()
1248... except StopIteration:
1249... pending -= 1
1250... nexts = cycle(islice(nexts, pending))
1251
1252>>> def powerset(iterable):
1253... "powerset('ab') --> set([]), set(['a']), set(['b']), set(['a', 'b'])"
1254... # Recipe credited to Eric Raymond
1255... pairs = [(2**i, x) for i, x in enumerate(iterable)]
1256... for n in xrange(2**len(pairs)):
1257... yield set(x for m, x in pairs if m&n)
1258
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001259This is not part of the examples but it tests to make sure the definitions
1260perform as purported.
1261
Raymond Hettingera098b332003-09-08 23:58:40 +00001262>>> take(10, count())
1263[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1264
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001265>>> list(enumerate('abc'))
1266[(0, 'a'), (1, 'b'), (2, 'c')]
1267
1268>>> list(islice(tabulate(lambda x: 2*x), 4))
1269[0, 2, 4, 6]
1270
1271>>> nth('abcde', 3)
1272['d']
1273
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001274>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001275True
1276
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001277>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001278False
1279
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001280>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001281True
1282
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001283>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001284False
1285
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001286>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001287True
1288
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001289>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001290False
1291
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001292>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000129350
1294
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001295>>> a = [[1, 2, 3], [4, 5, 6]]
1296>>> flatten(a)
1297[1, 2, 3, 4, 5, 6]
1298
1299>>> list(repeatfunc(pow, 5, 2, 3))
1300[8, 8, 8, 8, 8]
1301
1302>>> import random
1303>>> take(5, imap(int, repeatfunc(random.random)))
1304[0, 0, 0, 0, 0]
1305
Raymond Hettingerd591f662003-10-26 15:34:50 +00001306>>> list(pairwise('abcd'))
1307[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001308
Raymond Hettingerd591f662003-10-26 15:34:50 +00001309>>> list(pairwise([]))
1310[]
1311
1312>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001313[]
1314
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001315>>> list(islice(padnone('abc'), 0, 6))
1316['a', 'b', 'c', None, None, None]
1317
1318>>> list(ncycles('abc', 3))
1319['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1320
1321>>> dotproduct([1,2,3], [4,5,6])
132232
1323
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001324>>> list(grouper(3, 'abcdefg', 'x'))
1325[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1326
1327>>> list(roundrobin('abc', 'd', 'ef'))
1328['a', 'd', 'e', 'b', 'f', 'c']
1329
1330>>> map(sorted, powerset('ab'))
1331[[], ['a'], ['b'], ['a', 'b']]
1332
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001333"""
1334
1335__test__ = {'libreftest' : libreftest}
1336
1337def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001338 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001339 RegressionTests, LengthTransparency,
Raymond Hettingerad47fa12008-03-06 20:52:01 +00001340 SubclassWithKwargsTest, TestExamples)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001341 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001342
1343 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001344 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001345 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001346 counts = [None] * 5
1347 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001348 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001349 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001350 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001351 print counts
1352
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001353 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001354 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001355
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001356if __name__ == "__main__":
1357 test_main(verbose=True)