blob: b1c1033f422f54797d17dd87557a7e56fa7e5c57 [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
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Guido van Rossum360e4b82007-05-14 22:51:27 +00009maxsize = test_support.MAX_Py_ssize_t
10minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
Guido van Rossum801f0d72006-08-24 19:48:10 +000012def lzip(*args):
13 return list(zip(*args))
14
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015def onearg(x):
16 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000017 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000018
19def errfunc(*args):
20 'Test function that raises an error'
21 raise ValueError
22
23def gen3():
24 'Non-restartable source sequence'
25 for i in (0, 1, 2):
26 yield i
27
28def isEven(x):
29 'Test predicate'
30 return x%2==0
31
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000032def isOdd(x):
33 'Test predicate'
34 return x%2==1
35
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000036class StopNow:
37 'Class emulating an empty iterable.'
38 def __iter__(self):
39 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000040 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000041 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000042
Raymond Hettinger02420702003-06-29 20:36:23 +000043def take(n, seq):
44 'Convenience function for partially consuming a long of infinite iterable'
45 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000046
Christian Heimes380f7f22008-02-28 11:19:05 +000047def fact(n):
48 'Factorial'
49 return reduce(operator.mul, range(1, n+1), 1)
50
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000052 def test_chain(self):
53 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 self.assertEqual(list(chain('abc')), list('abc'))
55 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000056 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Christian Heimesf16baeb2008-02-29 14:57:44 +000057 self.assertRaises(TypeError, list,chain(2, 3))
58
59 def test_chain_from_iterable(self):
60 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
61 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
62 self.assertEqual(list(chain.from_iterable([''])), [])
63 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
64 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000065
Christian Heimes380f7f22008-02-28 11:19:05 +000066 def test_combinations(self):
67 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
68 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
69 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
70 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
71 self.assertEqual(list(combinations(range(4), 3)),
72 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
73 for n in range(8):
74 values = [5*x-12 for x in range(n)]
75 for r in range(n+1):
76 result = list(combinations(values, r))
77 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
78 self.assertEqual(len(result), len(set(result))) # no repeats
79 self.assertEqual(result, sorted(result)) # lexicographic order
80 for c in result:
81 self.assertEqual(len(c), r) # r-length combinations
82 self.assertEqual(len(set(c)), r) # no duplicate elements
83 self.assertEqual(list(c), sorted(c)) # keep original ordering
84 self.assert_(all(e in values for e in c)) # elements taken from input iterable
85
Raymond Hettinger96ef8112003-02-01 00:10:11 +000086 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +000087 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
88 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
89 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +000090 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
91 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000092 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000093 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +000094 self.assertEqual(list(islice(count(maxsize-5), 10)),
95 list(range(maxsize-5, maxsize+5)))
96 self.assertEqual(list(islice(count(-maxsize-5), 10)),
97 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000098 c = count(3)
99 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000100 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000101 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000102 c = count(-9)
103 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000104 next(c)
105 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000106 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000107 # Test repr (ignoring the L in longs)
108 r1 = repr(count(i)).replace('L', '')
109 r2 = 'count(%r)'.__mod__(i).replace('L', '')
110 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000111
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000112 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000113 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000114 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000115 self.assertRaises(TypeError, cycle)
116 self.assertRaises(TypeError, cycle, 5)
117 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000118
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000119 def test_groupby(self):
120 # Check whether it accepts arguments correctly
121 self.assertEqual([], list(groupby([])))
122 self.assertEqual([], list(groupby([], key=id)))
123 self.assertRaises(TypeError, list, groupby('abc', []))
124 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000125 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126
127 # Check normal input
128 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
129 (2,15,22), (3,16,23), (3,17,23)]
130 dup = []
131 for k, g in groupby(s, lambda r:r[0]):
132 for elem in g:
133 self.assertEqual(k, elem[0])
134 dup.append(elem)
135 self.assertEqual(s, dup)
136
137 # Check nested case
138 dup = []
139 for k, g in groupby(s, lambda r:r[0]):
140 for ik, ig in groupby(g, lambda r:r[2]):
141 for elem in ig:
142 self.assertEqual(k, elem[0])
143 self.assertEqual(ik, elem[2])
144 dup.append(elem)
145 self.assertEqual(s, dup)
146
147 # Check case where inner iterator is not used
148 keys = [k for k, g in groupby(s, lambda r:r[0])]
149 expectedkeys = set([r[0] for r in s])
150 self.assertEqual(set(keys), expectedkeys)
151 self.assertEqual(len(keys), len(expectedkeys))
152
153 # Exercise pipes and filters style
154 s = 'abracadabra'
155 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000156 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000157 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
158 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000159 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000160 self.assertEqual(r, ['a', 'b', 'r'])
161 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000162 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000163 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
164 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000165 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000166 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
167
Georg Brandla18af4e2007-04-21 15:47:16 +0000168 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000169 class ExpectedError(Exception):
170 pass
171 def delayed_raise(n=0):
172 for i in range(n):
173 yield 'yo'
174 raise ExpectedError
175 def gulp(iterable, keyp=None, func=list):
176 return [func(g) for k, g in groupby(iterable, keyp)]
177
Georg Brandla18af4e2007-04-21 15:47:16 +0000178 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000179 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000180 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000181 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
182
183 # __cmp__ failure
184 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000185 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000186 raise ExpectedError
187 s = [DummyCmp(), DummyCmp(), None]
188
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000189 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000190 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000191 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000192 self.assertRaises(ExpectedError, gulp, s)
193
194 # keyfunc failure
195 def keyfunc(obj):
196 if keyfunc.skip > 0:
197 keyfunc.skip -= 1
198 return obj
199 else:
200 raise ExpectedError
201
202 # keyfunc failure on outer object
203 keyfunc.skip = 0
204 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
205 keyfunc.skip = 1
206 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
207
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000208 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000209 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Christian Heimes836baa52008-02-26 08:18:30 +0000211 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000212 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000213 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000214 self.assertRaises(TypeError, ifilter, lambda x:x)
215 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000216 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000217 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000218
219 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000220 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
221 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Christian Heimes836baa52008-02-26 08:18:30 +0000222 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000223 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000224 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000225 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
226 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000227 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000228 self.assertRaises(TypeError, next, ifilterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000229
230 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000231 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000232 ans = [(x,y) for x, y in izip('abc',count())]
233 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000234 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
235 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
236 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
237 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
238 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000239 self.assertRaises(TypeError, izip, 3)
240 self.assertRaises(TypeError, izip, range(3), 3)
241 # Check tuple re-use (implementation detail)
242 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000243 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000244 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000245 lzip('abc', 'def'))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000246 ids = list(map(id, izip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000247 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000248 ids = list(map(id, list(izip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000249 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000250
Thomas Wouterscf297e42007-02-23 15:07:44 +0000251 def test_iziplongest(self):
252 for args in [
253 ['abc', range(6)],
254 [range(6), 'abc'],
255 [range(1000), range(2000,2100), range(3000,3050)],
256 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
257 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
258 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000259 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
260 for i in range(max(map(len, args)))]
Thomas Wouterscf297e42007-02-23 15:07:44 +0000261 self.assertEqual(list(izip_longest(*args)), target)
262 self.assertEqual(list(izip_longest(*args, **{})), target)
263 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
264 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000265
Thomas Wouterscf297e42007-02-23 15:07:44 +0000266 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
267
268 self.assertEqual(list(izip_longest()), list(zip()))
269 self.assertEqual(list(izip_longest([])), list(zip([])))
270 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000271
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000272 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000273 list(izip(list('abc')+[None], 'defg'))) # empty keyword dict
Thomas Wouterscf297e42007-02-23 15:07:44 +0000274 self.assertRaises(TypeError, izip_longest, 3)
275 self.assertRaises(TypeError, izip_longest, range(3), 3)
276
277 for stmt in [
278 "izip_longest('abc', fv=1)",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000280 ]:
281 try:
282 eval(stmt, globals(), locals())
283 except TypeError:
284 pass
285 else:
286 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000287
Thomas Wouterscf297e42007-02-23 15:07:44 +0000288 # Check tuple re-use (implementation detail)
289 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
290 list(zip('abc', 'def')))
291 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
292 list(zip('abc', 'def')))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000293 ids = list(map(id, izip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000294 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000295 ids = list(map(id, list(izip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000296 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
297
Christian Heimesc3f30c42008-02-22 16:37:40 +0000298 def test_product(self):
299 for args, result in [
300 ([], []), # zero iterables ??? is this correct
301 (['ab'], [('a',), ('b',)]), # one iterable
302 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
303 ([range(0), range(2), range(3)], []), # first iterable with zero length
304 ([range(2), range(0), range(3)], []), # middle iterable with zero length
305 ([range(2), range(3), range(0)], []), # last iterable with zero length
306 ]:
307 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000308 for r in range(4):
309 self.assertEqual(list(product(*(args*r))),
310 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000311 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
312 self.assertRaises(TypeError, product, range(6), None)
313 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
314 set('abcdefg'), range(11), tuple(range(13))]
315 for i in range(100):
316 args = [random.choice(argtypes) for j in range(random.randrange(5))]
317 n = reduce(operator.mul, map(len, args), 1) if args else 0
318 self.assertEqual(len(list(product(*args))), n)
319 args = map(iter, args)
320 self.assertEqual(len(list(product(*args))), n)
321
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000322 # Test implementation detail: tuple re-use
323 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
324 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000325
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000326 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000327 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000328 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000329 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000330 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000331 self.assertEqual(list(repeat('a', 0)), [])
332 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000333 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000334 self.assertRaises(TypeError, repeat, None, 3, 4)
335 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000336 r = repeat(1+0j)
337 self.assertEqual(repr(r), 'repeat((1+0j))')
338 r = repeat(1+0j, 5)
339 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
340 list(r)
341 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000342
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000343 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000344 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
345 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000346 def tupleize(*args):
347 return args
348 self.assertEqual(list(imap(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000349 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000350 self.assertEqual(list(imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000351 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000352 self.assertEqual(take(2,imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000353 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000354 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000355 self.assertRaises(TypeError, imap)
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000356 self.assertRaises(TypeError, list, imap(None, range(3), range(3)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000357 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000358 self.assertRaises(TypeError, next, imap(10, range(5)))
359 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
360 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000361
362 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000363 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
364 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000365 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
366 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000367 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000368 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
369 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000370 self.assertRaises(TypeError, starmap)
371 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000372 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
373 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
374 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000375
376 def test_islice(self):
377 for args in [ # islice(args) should agree with range(args)
378 (10, 20, 3),
379 (10, 3, 20),
380 (10, 20),
381 (10, 3),
382 (20,)
383 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000384 self.assertEqual(list(islice(range(100), *args)),
385 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000386
387 for args, tgtargs in [ # Stop when seqn is exhausted
388 ((10, 110, 3), ((10, 100, 3))),
389 ((10, 110), ((10, 100))),
390 ((110,), (100,))
391 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000392 self.assertEqual(list(islice(range(100), *args)),
393 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000394
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000395 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000396 self.assertEqual(list(islice(range(10), None)), list(range(10)))
397 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
398 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
399 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
400 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000401
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000402 # Test number of items consumed SF #1171417
403 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000404 self.assertEqual(list(islice(it, 3)), list(range(3)))
405 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000406
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000407 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000408 self.assertRaises(TypeError, islice, range(10))
409 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
410 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
411 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
412 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
413 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
414 self.assertRaises(ValueError, islice, range(10), 'a')
415 self.assertRaises(ValueError, islice, range(10), 'a', 1)
416 self.assertRaises(ValueError, islice, range(10), 1, 'a')
417 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
418 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000419 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000420
421 def test_takewhile(self):
422 data = [1, 3, 5, 20, 2, 4, 6, 8]
423 underten = lambda x: x<10
424 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000425 self.assertEqual(list(takewhile(underten, [])), [])
426 self.assertRaises(TypeError, takewhile)
427 self.assertRaises(TypeError, takewhile, operator.pow)
428 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000429 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
430 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000431 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
432 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000433 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000434
435 def test_dropwhile(self):
436 data = [1, 3, 5, 20, 2, 4, 6, 8]
437 underten = lambda x: x<10
438 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000439 self.assertEqual(list(dropwhile(underten, [])), [])
440 self.assertRaises(TypeError, dropwhile)
441 self.assertRaises(TypeError, dropwhile, operator.pow)
442 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000443 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
444 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000445
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000446 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000447 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000448 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000449 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000450 yield i
451
452 a, b = tee([]) # test empty iterator
453 self.assertEqual(list(a), [])
454 self.assertEqual(list(b), [])
455
456 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000457 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000458
459 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000460 self.assertEqual(list(a), list(range(n)))
461 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000462
463 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000464 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000465 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000466 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000467 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000468
469 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000470 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000471 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000472 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000473 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000474
Guido van Rossum805365e2007-05-07 22:24:25 +0000475 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000476 order = [0]*n + [1]*n
477 random.shuffle(order)
478 lists = ([], [])
479 its = tee(irange(n))
480 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000481 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000482 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000483 self.assertEqual(lists[0], list(range(n)))
484 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000485
Raymond Hettingerad983e72003-11-12 14:32:26 +0000486 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000487 self.assertRaises(TypeError, tee)
488 self.assertRaises(TypeError, tee, 3)
489 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000490 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000491
Raymond Hettingerad983e72003-11-12 14:32:26 +0000492 # tee object should be instantiable
493 a, b = tee('abc')
494 c = type(a)('def')
495 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000496
Raymond Hettingerad983e72003-11-12 14:32:26 +0000497 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000498 a, b, c = tee(range(2000), 3)
499 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000500 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000501 self.assertEqual(list(b), list(range(2000)))
502 self.assertEqual([next(c), next(c)], list(range(2)))
503 self.assertEqual(list(a), list(range(100,2000)))
504 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000505
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000506 # test values of n
507 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000509 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000510 result = tee('abc', n)
511 self.assertEqual(type(result), tuple)
512 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000513 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000514
Raymond Hettingerad983e72003-11-12 14:32:26 +0000515 # tee pass-through to copyable iterator
516 a, b = tee('abc')
517 c, d = tee(a)
518 self.assert_(a is c)
519
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000520 # test tee_new
521 t1, t2 = tee('abc')
522 tnew = type(t1)
523 self.assertRaises(TypeError, tnew)
524 self.assertRaises(TypeError, tnew, 10)
525 t3 = tnew(t1)
526 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000527
Raymond Hettingera9f60922004-10-17 16:40:14 +0000528 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000529 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000530 p = proxy(a)
531 self.assertEqual(getattr(p, '__class__'), type(b))
532 del a
533 self.assertRaises(ReferenceError, getattr, p, '__class__')
534
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000535 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000536 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000537
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000538 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000539 self.assertRaises(StopIteration, next, f([]))
540 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000541
Georg Brandla18af4e2007-04-21 15:47:16 +0000542 self.assertRaises(StopIteration, next, islice([], None))
543 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000544
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000545 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000546 self.assertRaises(StopIteration, next, p)
547 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000548 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000549 self.assertRaises(StopIteration, next, p)
550 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000551
Georg Brandla18af4e2007-04-21 15:47:16 +0000552 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000553
554 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000555 self.assertRaises(StopIteration, next, f(lambda x:x, []))
556 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000557
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000558class TestGC(unittest.TestCase):
559
560 def makecycle(self, iterator, container):
561 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000562 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000563 del container, iterator
564
565 def test_chain(self):
566 a = []
567 self.makecycle(chain(a), a)
568
569 def test_cycle(self):
570 a = []
571 self.makecycle(cycle([a]*2), a)
572
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000573 def test_dropwhile(self):
574 a = []
575 self.makecycle(dropwhile(bool, [0, a, a]), a)
576
577 def test_groupby(self):
578 a = []
579 self.makecycle(groupby([a]*2, lambda x:x), a)
580
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000581 def test_ifilter(self):
582 a = []
583 self.makecycle(ifilter(lambda x:True, [a]*2), a)
584
585 def test_ifilterfalse(self):
586 a = []
587 self.makecycle(ifilterfalse(lambda x:False, a), a)
588
589 def test_izip(self):
590 a = []
591 self.makecycle(izip([a]*2, [a]*3), a)
592
593 def test_imap(self):
594 a = []
595 self.makecycle(imap(lambda x:x, [a]*2), a)
596
597 def test_islice(self):
598 a = []
599 self.makecycle(islice([a]*2, None), a)
600
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000601 def test_repeat(self):
602 a = []
603 self.makecycle(repeat(a), a)
604
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000605 def test_starmap(self):
606 a = []
607 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
608
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000609 def test_takewhile(self):
610 a = []
611 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
612
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000613def R(seqn):
614 'Regular generator'
615 for i in seqn:
616 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000617
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000618class G:
619 'Sequence using __getitem__'
620 def __init__(self, seqn):
621 self.seqn = seqn
622 def __getitem__(self, i):
623 return self.seqn[i]
624
625class I:
626 'Sequence using iterator protocol'
627 def __init__(self, seqn):
628 self.seqn = seqn
629 self.i = 0
630 def __iter__(self):
631 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000632 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000633 if self.i >= len(self.seqn): raise StopIteration
634 v = self.seqn[self.i]
635 self.i += 1
636 return v
637
638class Ig:
639 'Sequence using iterator protocol defined with a generator'
640 def __init__(self, seqn):
641 self.seqn = seqn
642 self.i = 0
643 def __iter__(self):
644 for val in self.seqn:
645 yield val
646
647class X:
648 'Missing __getitem__ and __iter__'
649 def __init__(self, seqn):
650 self.seqn = seqn
651 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000652 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000653 if self.i >= len(self.seqn): raise StopIteration
654 v = self.seqn[self.i]
655 self.i += 1
656 return v
657
658class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000659 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000660 def __init__(self, seqn):
661 self.seqn = seqn
662 self.i = 0
663 def __iter__(self):
664 return self
665
666class E:
667 'Test propagation of exceptions'
668 def __init__(self, seqn):
669 self.seqn = seqn
670 self.i = 0
671 def __iter__(self):
672 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000673 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000674 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000675
676class S:
677 'Test immediate stop'
678 def __init__(self, seqn):
679 pass
680 def __iter__(self):
681 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000682 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000683 raise StopIteration
684
685def L(seqn):
686 'Test multiple tiers of iterators'
687 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
688
689
690class TestVariousIteratorArgs(unittest.TestCase):
691
692 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000693 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000694 for g in (G, I, Ig, S, L, R):
695 self.assertEqual(list(chain(g(s))), list(g(s)))
696 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000697 self.assertRaises(TypeError, list, chain(X(s)))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000698 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000699 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
700
Christian Heimesc3f30c42008-02-22 16:37:40 +0000701 def test_product(self):
702 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
703 self.assertRaises(TypeError, product, X(s))
704 self.assertRaises(TypeError, product, N(s))
705 self.assertRaises(ZeroDivisionError, product, E(s))
706
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000707 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000708 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000709 for g in (G, I, Ig, S, L, R):
710 tgtlen = len(s) * 3
711 expected = list(g(s))*3
712 actual = list(islice(cycle(g(s)), tgtlen))
713 self.assertEqual(actual, expected)
714 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000715 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000716 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
717
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000718 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000719 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000720 for g in (G, I, Ig, S, L, R):
721 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
722 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000723 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000724 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
725
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000726 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000727 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000728 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000729 self.assertEqual(list(ifilter(isEven, g(s))),
730 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000731 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000732 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000733 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
734
735 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000736 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000737 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000738 self.assertEqual(list(ifilterfalse(isEven, g(s))),
739 [x for x in g(s) if isOdd(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000740 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000741 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000742 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
743
744 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000745 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000746 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000747 self.assertEqual(list(izip(g(s))), lzip(g(s)))
748 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000749 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000750 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000751 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
752
Thomas Wouterscf297e42007-02-23 15:07:44 +0000753 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000754 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000755 for g in (G, I, Ig, S, L, R):
756 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
757 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
758 self.assertRaises(TypeError, izip_longest, X(s))
759 self.assertRaises(TypeError, izip_longest, N(s))
760 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
761
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000762 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000763 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000764 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000765 self.assertEqual(list(imap(onearg, g(s))),
766 [onearg(x) for x in g(s)])
767 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
768 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000769 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000770 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000771 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
772
773 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000774 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000775 for g in (G, I, Ig, S, L, R):
776 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
777 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000778 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000779 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
780
781 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000782 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000783 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000784 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000785 self.assertEqual(list(starmap(operator.pow, g(ss))),
786 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000787 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000788 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000789 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
790
791 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000792 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000793 for g in (G, I, Ig, S, L, R):
794 tgt = []
795 for elem in g(s):
796 if not isEven(elem): break
797 tgt.append(elem)
798 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
799 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000800 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000801 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
802
803 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000804 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000805 for g in (G, I, Ig, S, L, R):
806 tgt = []
807 for elem in g(s):
808 if not tgt and isOdd(elem): continue
809 tgt.append(elem)
810 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
811 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000812 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000813 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
814
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000815 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000816 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000817 for g in (G, I, Ig, S, L, R):
818 it1, it2 = tee(g(s))
819 self.assertEqual(list(it1), list(g(s)))
820 self.assertEqual(list(it2), list(g(s)))
821 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000822 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000823 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
824
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000825class LengthTransparency(unittest.TestCase):
826
827 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000828 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000829 self.assertEqual(len(repeat(None, 50)), 50)
830 self.assertRaises(TypeError, len, repeat(None))
831
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000832class RegressionTests(unittest.TestCase):
833
834 def test_sf_793826(self):
835 # Fix Armin Rigo's successful efforts to wreak havoc
836
837 def mutatingtuple(tuple1, f, tuple2):
838 # this builds a tuple t which is a copy of tuple1,
839 # then calls f(t), then mutates t to be equal to tuple2
840 # (needs len(tuple1) == len(tuple2)).
841 def g(value, first=[1]):
842 if first:
843 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000844 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000845 return value
846 items = list(tuple2)
847 items[1:1] = list(tuple1)
848 gen = imap(g, items)
849 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000850 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000851
852 def f(t):
853 global T
854 T = t
855 first[:] = list(T)
856
857 first = []
858 mutatingtuple((1,2,3), f, (4,5,6))
859 second = list(T)
860 self.assertEqual(first, second)
861
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000862
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000863 def test_sf_950057(self):
864 # Make sure that chain() and cycle() catch exceptions immediately
865 # rather than when shifting between input sources
866
867 def gen1():
868 hist.append(0)
869 yield 1
870 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000871 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000872 hist.append(2)
873
874 def gen2(x):
875 hist.append(3)
876 yield 2
877 hist.append(4)
878 if x:
879 raise StopIteration
880
881 hist = []
882 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
883 self.assertEqual(hist, [0,1])
884
885 hist = []
886 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
887 self.assertEqual(hist, [0,1])
888
889 hist = []
890 self.assertRaises(AssertionError, list, cycle(gen1()))
891 self.assertEqual(hist, [0,1])
892
Thomas Woutersb2137042007-02-01 18:02:27 +0000893class SubclassWithKwargsTest(unittest.TestCase):
894 def test_keywords_in_subclass(self):
895 # count is not subclassable...
896 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
897 starmap, islice, takewhile, dropwhile, cycle):
898 class Subclass(cls):
899 def __init__(self, newarg=None, *args):
900 cls.__init__(self, *args)
901 try:
902 Subclass(newarg=1)
903 except TypeError as err:
904 # we expect type errors because of wrong argument count
905 self.failIf("does not take keyword arguments" in err.args[0])
906
907
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000908libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000909
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000910
911>>> amounts = [120.15, 764.05, 823.14]
912>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000913... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000914...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000915Check 1200 is for $120.15
916Check 1201 is for $764.05
917Check 1202 is for $823.14
918
919>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000920>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000921... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000922...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00009231
9248
92527
926
927>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000928>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000929... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000930...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000931Alex
932Laura
933Martin
934Walter
935Samuele
936
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000937>>> from operator import itemgetter
938>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000939>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000940>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000941... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000942...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00009431 ['a', 'c', 'e']
9442 ['b', 'd', 'f']
9453 ['g']
946
Raymond Hettinger734fb572004-01-20 20:04:40 +0000947# Find runs of consecutive numbers using groupby. The key to the solution
948# is differencing with a range so that consecutive numbers all appear in
949# same group.
950>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000951>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000952... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000953...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000954[1]
955[4, 5, 6]
956[10]
957[15, 16, 17, 18]
958[22]
959[25, 26, 27, 28]
960
Raymond Hettingera098b332003-09-08 23:58:40 +0000961>>> def take(n, seq):
962... return list(islice(seq, n))
963
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000964>>> def enumerate(iterable):
965... return izip(count(), iterable)
966
967>>> def tabulate(function):
968... "Return function(0), function(1), ..."
969... return imap(function, count())
970
971>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000972... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000973
974>>> def nth(iterable, n):
975... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000976... return list(islice(iterable, n, n+1))
977
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000978>>> def all(seq, pred=None):
979... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000980... for elem in ifilterfalse(pred, seq):
981... return False
982... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000983
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000984>>> def any(seq, pred=None):
985... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000986... for elem in ifilter(pred, seq):
987... return True
988... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000989
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000990>>> def no(seq, pred=None):
991... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000992... for elem in ifilter(pred, seq):
993... return False
994... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000995
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000996>>> def quantify(seq, pred=None):
997... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000998... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000999
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001000>>> def padnone(seq):
1001... "Returns the sequence elements and then returns None indefinitely"
1002... return chain(seq, repeat(None))
1003
1004>>> def ncycles(seq, n):
1005... "Returns the sequence elements n times"
1006... return chain(*repeat(seq, n))
1007
1008>>> def dotproduct(vec1, vec2):
1009... return sum(imap(operator.mul, vec1, vec2))
1010
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001011>>> def flatten(listOfLists):
1012... return list(chain(*listOfLists))
1013
1014>>> def repeatfunc(func, times=None, *args):
1015... "Repeat calls to func with specified arguments."
1016... " Example: repeatfunc(random.random)"
1017... if times is None:
1018... return starmap(func, repeat(args))
1019... else:
1020... return starmap(func, repeat(args, times))
1021
Raymond Hettingerd591f662003-10-26 15:34:50 +00001022>>> def pairwise(iterable):
1023... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1024... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001025... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001026... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001027... except StopIteration:
1028... pass
1029... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001030
1031This is not part of the examples but it tests to make sure the definitions
1032perform as purported.
1033
Raymond Hettingera098b332003-09-08 23:58:40 +00001034>>> take(10, count())
1035[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1036
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001037>>> list(enumerate('abc'))
1038[(0, 'a'), (1, 'b'), (2, 'c')]
1039
1040>>> list(islice(tabulate(lambda x: 2*x), 4))
1041[0, 2, 4, 6]
1042
1043>>> nth('abcde', 3)
1044['d']
1045
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001046>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001047True
1048
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001049>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001050False
1051
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001052>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001053True
1054
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001055>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001056False
1057
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001058>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001059True
1060
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001061>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001062False
1063
Guido van Rossum805365e2007-05-07 22:24:25 +00001064>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000106550
1066
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001067>>> a = [[1, 2, 3], [4, 5, 6]]
1068>>> flatten(a)
1069[1, 2, 3, 4, 5, 6]
1070
1071>>> list(repeatfunc(pow, 5, 2, 3))
1072[8, 8, 8, 8, 8]
1073
1074>>> import random
1075>>> take(5, imap(int, repeatfunc(random.random)))
1076[0, 0, 0, 0, 0]
1077
Raymond Hettingerd591f662003-10-26 15:34:50 +00001078>>> list(pairwise('abcd'))
1079[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001080
Raymond Hettingerd591f662003-10-26 15:34:50 +00001081>>> list(pairwise([]))
1082[]
1083
1084>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001085[]
1086
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001087>>> list(islice(padnone('abc'), 0, 6))
1088['a', 'b', 'c', None, None, None]
1089
1090>>> list(ncycles('abc', 3))
1091['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1092
1093>>> dotproduct([1,2,3], [4,5,6])
109432
1095
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001096"""
1097
1098__test__ = {'libreftest' : libreftest}
1099
1100def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001101 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001102 RegressionTests, LengthTransparency,
1103 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001104 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001105
1106 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001107 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001108 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001109 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001110 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001111 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001112 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001113 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001114 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001115
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001116 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001117 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001118
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001119if __name__ == "__main__":
1120 test_main(verbose=True)