blob: 765501d44c1a761e3db464603ad1fa2a4a9ce528 [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
Guido van Rossum360e4b82007-05-14 22:51:27 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
Guido van Rossum801f0d72006-08-24 19:48:10 +000011def lzip(*args):
12 return list(zip(*args))
13
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014def onearg(x):
15 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000016 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000017
18def errfunc(*args):
19 'Test function that raises an error'
20 raise ValueError
21
22def gen3():
23 'Non-restartable source sequence'
24 for i in (0, 1, 2):
25 yield i
26
27def isEven(x):
28 'Test predicate'
29 return x%2==0
30
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000031def isOdd(x):
32 'Test predicate'
33 return x%2==1
34
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000035class StopNow:
36 'Class emulating an empty iterable.'
37 def __iter__(self):
38 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000039 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000040 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000041
Raymond Hettinger02420702003-06-29 20:36:23 +000042def take(n, seq):
43 'Convenience function for partially consuming a long of infinite iterable'
44 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000045
Raymond Hettinger96ef8112003-02-01 00:10:11 +000046class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000047 def test_chain(self):
48 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049 self.assertEqual(list(chain('abc')), list('abc'))
50 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000051 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000052 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000053
Raymond Hettinger96ef8112003-02-01 00:10:11 +000054 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +000055 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
56 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
57 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000058 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000059 self.assertRaises(TypeError, count, 'a')
Guido van Rossum360e4b82007-05-14 22:51:27 +000060 self.assertRaises(OverflowError, list, islice(count(maxsize-5), 10))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000061 c = count(3)
62 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +000063 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000064 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000065 c = count(-9)
66 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +000067 next(c)
68 self.assertEqual(next(c), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000069
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000070 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000071 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000072 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000073 self.assertRaises(TypeError, cycle)
74 self.assertRaises(TypeError, cycle, 5)
75 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000076
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000077 def test_groupby(self):
78 # Check whether it accepts arguments correctly
79 self.assertEqual([], list(groupby([])))
80 self.assertEqual([], list(groupby([], key=id)))
81 self.assertRaises(TypeError, list, groupby('abc', []))
82 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000083 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000084
85 # Check normal input
86 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
87 (2,15,22), (3,16,23), (3,17,23)]
88 dup = []
89 for k, g in groupby(s, lambda r:r[0]):
90 for elem in g:
91 self.assertEqual(k, elem[0])
92 dup.append(elem)
93 self.assertEqual(s, dup)
94
95 # Check nested case
96 dup = []
97 for k, g in groupby(s, lambda r:r[0]):
98 for ik, ig in groupby(g, lambda r:r[2]):
99 for elem in ig:
100 self.assertEqual(k, elem[0])
101 self.assertEqual(ik, elem[2])
102 dup.append(elem)
103 self.assertEqual(s, dup)
104
105 # Check case where inner iterator is not used
106 keys = [k for k, g in groupby(s, lambda r:r[0])]
107 expectedkeys = set([r[0] for r in s])
108 self.assertEqual(set(keys), expectedkeys)
109 self.assertEqual(len(keys), len(expectedkeys))
110
111 # Exercise pipes and filters style
112 s = 'abracadabra'
113 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000114 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000115 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
116 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000117 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000118 self.assertEqual(r, ['a', 'b', 'r'])
119 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000120 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000121 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
122 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000123 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000124 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
125
Georg Brandla18af4e2007-04-21 15:47:16 +0000126 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000127 class ExpectedError(Exception):
128 pass
129 def delayed_raise(n=0):
130 for i in range(n):
131 yield 'yo'
132 raise ExpectedError
133 def gulp(iterable, keyp=None, func=list):
134 return [func(g) for k, g in groupby(iterable, keyp)]
135
Georg Brandla18af4e2007-04-21 15:47:16 +0000136 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000137 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000138 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000139 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
140
141 # __cmp__ failure
142 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000143 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000144 raise ExpectedError
145 s = [DummyCmp(), DummyCmp(), None]
146
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000147 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000148 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000149 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000150 self.assertRaises(ExpectedError, gulp, s)
151
152 # keyfunc failure
153 def keyfunc(obj):
154 if keyfunc.skip > 0:
155 keyfunc.skip -= 1
156 return obj
157 else:
158 raise ExpectedError
159
160 # keyfunc failure on outer object
161 keyfunc.skip = 0
162 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
163 keyfunc.skip = 1
164 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
165
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000166 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000167 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000168 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000169 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000170 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000171 self.assertRaises(TypeError, ifilter, lambda x:x)
172 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000173 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000174 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000175
176 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000177 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
178 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000179 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000181 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
182 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000183 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000184 self.assertRaises(TypeError, next, ifilterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000185
186 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000187 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000188 ans = [(x,y) for x, y in izip('abc',count())]
189 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000190 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
191 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
192 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
193 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
194 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000195 self.assertRaises(TypeError, izip, 3)
196 self.assertRaises(TypeError, izip, range(3), 3)
197 # Check tuple re-use (implementation detail)
198 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000199 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000200 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000201 lzip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000202 ids = map(id, izip('abc', 'def'))
203 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000204 ids = map(id, list(izip('abc', 'def')))
205 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000206
Thomas Wouterscf297e42007-02-23 15:07:44 +0000207 def test_iziplongest(self):
208 for args in [
209 ['abc', range(6)],
210 [range(6), 'abc'],
211 [range(1000), range(2000,2100), range(3000,3050)],
212 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
213 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
214 ]:
215 target = map(None, *args)
216 self.assertEqual(list(izip_longest(*args)), target)
217 self.assertEqual(list(izip_longest(*args, **{})), target)
218 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
219 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220
Thomas Wouterscf297e42007-02-23 15:07:44 +0000221 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
222
223 self.assertEqual(list(izip_longest()), list(zip()))
224 self.assertEqual(list(izip_longest([])), list(zip([])))
225 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000226
Thomas Wouterscf297e42007-02-23 15:07:44 +0000227 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
228 self.assertRaises(TypeError, izip_longest, 3)
229 self.assertRaises(TypeError, izip_longest, range(3), 3)
230
231 for stmt in [
232 "izip_longest('abc', fv=1)",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000233 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000234 ]:
235 try:
236 eval(stmt, globals(), locals())
237 except TypeError:
238 pass
239 else:
240 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000241
Thomas Wouterscf297e42007-02-23 15:07:44 +0000242 # Check tuple re-use (implementation detail)
243 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
244 list(zip('abc', 'def')))
245 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
246 list(zip('abc', 'def')))
247 ids = map(id, izip_longest('abc', 'def'))
248 self.assertEqual(min(ids), max(ids))
249 ids = map(id, list(izip_longest('abc', 'def')))
250 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
251
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000252 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000253 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000254 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000255 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000256 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000257 self.assertEqual(list(repeat('a', 0)), [])
258 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000259 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000260 self.assertRaises(TypeError, repeat, None, 3, 4)
261 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000262 r = repeat(1+0j)
263 self.assertEqual(repr(r), 'repeat((1+0j))')
264 r = repeat(1+0j, 5)
265 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
266 list(r)
267 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000268
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000269 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000270 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
271 [0**1, 1**2, 2**3])
272 self.assertEqual(list(imap(None, 'abc', range(5))),
273 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000274 self.assertEqual(list(imap(None, 'abc', count())),
275 [('a',0),('b',1),('c',2)])
276 self.assertEqual(take(2,imap(None, 'abc', count())),
277 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000278 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000279 self.assertRaises(TypeError, imap)
280 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000281 self.assertRaises(TypeError, next, imap(10, range(5)))
282 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
283 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000284
285 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000286 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
287 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000288 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
289 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000290 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000291 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000292 self.assertRaises(TypeError, starmap)
293 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000294 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
295 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
296 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000297
298 def test_islice(self):
299 for args in [ # islice(args) should agree with range(args)
300 (10, 20, 3),
301 (10, 3, 20),
302 (10, 20),
303 (10, 3),
304 (20,)
305 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000306 self.assertEqual(list(islice(range(100), *args)),
307 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000308
309 for args, tgtargs in [ # Stop when seqn is exhausted
310 ((10, 110, 3), ((10, 100, 3))),
311 ((10, 110), ((10, 100))),
312 ((110,), (100,))
313 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000314 self.assertEqual(list(islice(range(100), *args)),
315 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000316
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000317 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000318 self.assertEqual(list(islice(range(10), None)), list(range(10)))
319 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
320 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
321 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
322 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000323
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000324 # Test number of items consumed SF #1171417
325 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000326 self.assertEqual(list(islice(it, 3)), list(range(3)))
327 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000328
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000329 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000330 self.assertRaises(TypeError, islice, range(10))
331 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
332 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
333 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
334 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
335 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
336 self.assertRaises(ValueError, islice, range(10), 'a')
337 self.assertRaises(ValueError, islice, range(10), 'a', 1)
338 self.assertRaises(ValueError, islice, range(10), 1, 'a')
339 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
340 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000341 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000342
343 def test_takewhile(self):
344 data = [1, 3, 5, 20, 2, 4, 6, 8]
345 underten = lambda x: x<10
346 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000347 self.assertEqual(list(takewhile(underten, [])), [])
348 self.assertRaises(TypeError, takewhile)
349 self.assertRaises(TypeError, takewhile, operator.pow)
350 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000351 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
352 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000353 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
354 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000355 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000356
357 def test_dropwhile(self):
358 data = [1, 3, 5, 20, 2, 4, 6, 8]
359 underten = lambda x: x<10
360 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000361 self.assertEqual(list(dropwhile(underten, [])), [])
362 self.assertRaises(TypeError, dropwhile)
363 self.assertRaises(TypeError, dropwhile, operator.pow)
364 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000365 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
366 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000367
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000368 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000369 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000370 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000371 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000372 yield i
373
374 a, b = tee([]) # test empty iterator
375 self.assertEqual(list(a), [])
376 self.assertEqual(list(b), [])
377
378 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000379 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000380
381 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000382 self.assertEqual(list(a), list(range(n)))
383 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000384
385 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000386 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000387 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000388 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000389 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000390
391 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000392 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000393 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000394 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000395 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000396
Guido van Rossum805365e2007-05-07 22:24:25 +0000397 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000398 order = [0]*n + [1]*n
399 random.shuffle(order)
400 lists = ([], [])
401 its = tee(irange(n))
402 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000403 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000404 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000405 self.assertEqual(lists[0], list(range(n)))
406 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000407
Raymond Hettingerad983e72003-11-12 14:32:26 +0000408 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000409 self.assertRaises(TypeError, tee)
410 self.assertRaises(TypeError, tee, 3)
411 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000412 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000413
Raymond Hettingerad983e72003-11-12 14:32:26 +0000414 # tee object should be instantiable
415 a, b = tee('abc')
416 c = type(a)('def')
417 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000418
Raymond Hettingerad983e72003-11-12 14:32:26 +0000419 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000420 a, b, c = tee(range(2000), 3)
421 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000422 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000423 self.assertEqual(list(b), list(range(2000)))
424 self.assertEqual([next(c), next(c)], list(range(2)))
425 self.assertEqual(list(a), list(range(100,2000)))
426 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000427
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000428 # test values of n
429 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000431 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000432 result = tee('abc', n)
433 self.assertEqual(type(result), tuple)
434 self.assertEqual(len(result), n)
435 self.assertEqual(map(list, result), [list('abc')]*n)
436
Raymond Hettingerad983e72003-11-12 14:32:26 +0000437 # tee pass-through to copyable iterator
438 a, b = tee('abc')
439 c, d = tee(a)
440 self.assert_(a is c)
441
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000442 # test tee_new
443 t1, t2 = tee('abc')
444 tnew = type(t1)
445 self.assertRaises(TypeError, tnew)
446 self.assertRaises(TypeError, tnew, 10)
447 t3 = tnew(t1)
448 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000449
Raymond Hettingera9f60922004-10-17 16:40:14 +0000450 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000451 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000452 p = proxy(a)
453 self.assertEqual(getattr(p, '__class__'), type(b))
454 del a
455 self.assertRaises(ReferenceError, getattr, p, '__class__')
456
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000457 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000458 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000459
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000460 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000461 self.assertRaises(StopIteration, next, f([]))
462 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000463
Georg Brandla18af4e2007-04-21 15:47:16 +0000464 self.assertRaises(StopIteration, next, islice([], None))
465 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000466
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000467 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000468 self.assertRaises(StopIteration, next, p)
469 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000470 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000471 self.assertRaises(StopIteration, next, p)
472 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000473
Georg Brandla18af4e2007-04-21 15:47:16 +0000474 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000475
476 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000477 self.assertRaises(StopIteration, next, f(lambda x:x, []))
478 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000479
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000480class TestGC(unittest.TestCase):
481
482 def makecycle(self, iterator, container):
483 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000484 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000485 del container, iterator
486
487 def test_chain(self):
488 a = []
489 self.makecycle(chain(a), a)
490
491 def test_cycle(self):
492 a = []
493 self.makecycle(cycle([a]*2), a)
494
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000495 def test_dropwhile(self):
496 a = []
497 self.makecycle(dropwhile(bool, [0, a, a]), a)
498
499 def test_groupby(self):
500 a = []
501 self.makecycle(groupby([a]*2, lambda x:x), a)
502
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000503 def test_ifilter(self):
504 a = []
505 self.makecycle(ifilter(lambda x:True, [a]*2), a)
506
507 def test_ifilterfalse(self):
508 a = []
509 self.makecycle(ifilterfalse(lambda x:False, a), a)
510
511 def test_izip(self):
512 a = []
513 self.makecycle(izip([a]*2, [a]*3), a)
514
515 def test_imap(self):
516 a = []
517 self.makecycle(imap(lambda x:x, [a]*2), a)
518
519 def test_islice(self):
520 a = []
521 self.makecycle(islice([a]*2, None), a)
522
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000523 def test_repeat(self):
524 a = []
525 self.makecycle(repeat(a), a)
526
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000527 def test_starmap(self):
528 a = []
529 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
530
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000531 def test_takewhile(self):
532 a = []
533 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
534
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000535def R(seqn):
536 'Regular generator'
537 for i in seqn:
538 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000539
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000540class G:
541 'Sequence using __getitem__'
542 def __init__(self, seqn):
543 self.seqn = seqn
544 def __getitem__(self, i):
545 return self.seqn[i]
546
547class I:
548 'Sequence using iterator protocol'
549 def __init__(self, seqn):
550 self.seqn = seqn
551 self.i = 0
552 def __iter__(self):
553 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000554 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000555 if self.i >= len(self.seqn): raise StopIteration
556 v = self.seqn[self.i]
557 self.i += 1
558 return v
559
560class Ig:
561 'Sequence using iterator protocol defined with a generator'
562 def __init__(self, seqn):
563 self.seqn = seqn
564 self.i = 0
565 def __iter__(self):
566 for val in self.seqn:
567 yield val
568
569class X:
570 'Missing __getitem__ and __iter__'
571 def __init__(self, seqn):
572 self.seqn = seqn
573 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000574 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000575 if self.i >= len(self.seqn): raise StopIteration
576 v = self.seqn[self.i]
577 self.i += 1
578 return v
579
580class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000581 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000582 def __init__(self, seqn):
583 self.seqn = seqn
584 self.i = 0
585 def __iter__(self):
586 return self
587
588class E:
589 'Test propagation of exceptions'
590 def __init__(self, seqn):
591 self.seqn = seqn
592 self.i = 0
593 def __iter__(self):
594 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000595 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000596 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000597
598class S:
599 'Test immediate stop'
600 def __init__(self, seqn):
601 pass
602 def __iter__(self):
603 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000604 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000605 raise StopIteration
606
607def L(seqn):
608 'Test multiple tiers of iterators'
609 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
610
611
612class TestVariousIteratorArgs(unittest.TestCase):
613
614 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000615 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000616 for g in (G, I, Ig, S, L, R):
617 self.assertEqual(list(chain(g(s))), list(g(s)))
618 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
619 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000620 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000621 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
622
623 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000624 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000625 for g in (G, I, Ig, S, L, R):
626 tgtlen = len(s) * 3
627 expected = list(g(s))*3
628 actual = list(islice(cycle(g(s)), tgtlen))
629 self.assertEqual(actual, expected)
630 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000631 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000632 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
633
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000634 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000635 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000636 for g in (G, I, Ig, S, L, R):
637 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
638 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000639 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000640 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
641
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000642 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000643 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000644 for g in (G, I, Ig, S, L, R):
645 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
646 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000647 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000648 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
649
650 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000651 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000652 for g in (G, I, Ig, S, L, R):
653 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
654 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000655 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000656 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
657
658 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000659 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000660 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000661 self.assertEqual(list(izip(g(s))), lzip(g(s)))
662 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000663 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000664 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000665 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
666
Thomas Wouterscf297e42007-02-23 15:07:44 +0000667 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000668 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000669 for g in (G, I, Ig, S, L, R):
670 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
671 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
672 self.assertRaises(TypeError, izip_longest, X(s))
673 self.assertRaises(TypeError, izip_longest, N(s))
674 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
675
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000676 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000677 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000678 for g in (G, I, Ig, S, L, R):
679 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
680 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
681 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000682 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000683 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
684
685 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000686 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000687 for g in (G, I, Ig, S, L, R):
688 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
689 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000690 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000691 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
692
693 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000694 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000695 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000696 ss = lzip(s, s)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000697 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
698 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000699 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000700 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
701
702 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000703 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000704 for g in (G, I, Ig, S, L, R):
705 tgt = []
706 for elem in g(s):
707 if not isEven(elem): break
708 tgt.append(elem)
709 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
710 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000711 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000712 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
713
714 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000715 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000716 for g in (G, I, Ig, S, L, R):
717 tgt = []
718 for elem in g(s):
719 if not tgt and isOdd(elem): continue
720 tgt.append(elem)
721 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
722 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000723 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000724 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
725
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000726 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000727 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000728 for g in (G, I, Ig, S, L, R):
729 it1, it2 = tee(g(s))
730 self.assertEqual(list(it1), list(g(s)))
731 self.assertEqual(list(it2), list(g(s)))
732 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000733 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000734 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
735
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000736class LengthTransparency(unittest.TestCase):
737
738 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000739 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000740 self.assertEqual(len(repeat(None, 50)), 50)
741 self.assertRaises(TypeError, len, repeat(None))
742
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000743class RegressionTests(unittest.TestCase):
744
745 def test_sf_793826(self):
746 # Fix Armin Rigo's successful efforts to wreak havoc
747
748 def mutatingtuple(tuple1, f, tuple2):
749 # this builds a tuple t which is a copy of tuple1,
750 # then calls f(t), then mutates t to be equal to tuple2
751 # (needs len(tuple1) == len(tuple2)).
752 def g(value, first=[1]):
753 if first:
754 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000755 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000756 return value
757 items = list(tuple2)
758 items[1:1] = list(tuple1)
759 gen = imap(g, items)
760 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000761 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000762
763 def f(t):
764 global T
765 T = t
766 first[:] = list(T)
767
768 first = []
769 mutatingtuple((1,2,3), f, (4,5,6))
770 second = list(T)
771 self.assertEqual(first, second)
772
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000773
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000774 def test_sf_950057(self):
775 # Make sure that chain() and cycle() catch exceptions immediately
776 # rather than when shifting between input sources
777
778 def gen1():
779 hist.append(0)
780 yield 1
781 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000782 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000783 hist.append(2)
784
785 def gen2(x):
786 hist.append(3)
787 yield 2
788 hist.append(4)
789 if x:
790 raise StopIteration
791
792 hist = []
793 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
794 self.assertEqual(hist, [0,1])
795
796 hist = []
797 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
798 self.assertEqual(hist, [0,1])
799
800 hist = []
801 self.assertRaises(AssertionError, list, cycle(gen1()))
802 self.assertEqual(hist, [0,1])
803
Thomas Woutersb2137042007-02-01 18:02:27 +0000804class SubclassWithKwargsTest(unittest.TestCase):
805 def test_keywords_in_subclass(self):
806 # count is not subclassable...
807 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
808 starmap, islice, takewhile, dropwhile, cycle):
809 class Subclass(cls):
810 def __init__(self, newarg=None, *args):
811 cls.__init__(self, *args)
812 try:
813 Subclass(newarg=1)
814 except TypeError as err:
815 # we expect type errors because of wrong argument count
816 self.failIf("does not take keyword arguments" in err.args[0])
817
818
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000819libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000820
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000821
822>>> amounts = [120.15, 764.05, 823.14]
823>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000824... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000825...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000826Check 1200 is for $120.15
827Check 1201 is for $764.05
828Check 1202 is for $823.14
829
830>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000831>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000832... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000833...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00008341
8358
83627
837
838>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000839>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000840... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000841...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000842Alex
843Laura
844Martin
845Walter
846Samuele
847
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000848>>> from operator import itemgetter
849>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000850>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000851>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000852... print(k, map(itemgetter(0), g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000853...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00008541 ['a', 'c', 'e']
8552 ['b', 'd', 'f']
8563 ['g']
857
Raymond Hettinger734fb572004-01-20 20:04:40 +0000858# Find runs of consecutive numbers using groupby. The key to the solution
859# is differencing with a range so that consecutive numbers all appear in
860# same group.
861>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
862>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
Guido van Rossum7131f842007-02-09 20:13:25 +0000863... print(map(operator.itemgetter(1), g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000864...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000865[1]
866[4, 5, 6]
867[10]
868[15, 16, 17, 18]
869[22]
870[25, 26, 27, 28]
871
Raymond Hettingera098b332003-09-08 23:58:40 +0000872>>> def take(n, seq):
873... return list(islice(seq, n))
874
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000875>>> def enumerate(iterable):
876... return izip(count(), iterable)
877
878>>> def tabulate(function):
879... "Return function(0), function(1), ..."
880... return imap(function, count())
881
882>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000883... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000884
885>>> def nth(iterable, n):
886... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000887... return list(islice(iterable, n, n+1))
888
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000889>>> def all(seq, pred=None):
890... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000891... for elem in ifilterfalse(pred, seq):
892... return False
893... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000894
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000895>>> def any(seq, pred=None):
896... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000897... for elem in ifilter(pred, seq):
898... return True
899... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000900
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000901>>> def no(seq, pred=None):
902... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000903... for elem in ifilter(pred, seq):
904... return False
905... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000906
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000907>>> def quantify(seq, pred=None):
908... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000909... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000910
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000911>>> def padnone(seq):
912... "Returns the sequence elements and then returns None indefinitely"
913... return chain(seq, repeat(None))
914
915>>> def ncycles(seq, n):
916... "Returns the sequence elements n times"
917... return chain(*repeat(seq, n))
918
919>>> def dotproduct(vec1, vec2):
920... return sum(imap(operator.mul, vec1, vec2))
921
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000922>>> def flatten(listOfLists):
923... return list(chain(*listOfLists))
924
925>>> def repeatfunc(func, times=None, *args):
926... "Repeat calls to func with specified arguments."
927... " Example: repeatfunc(random.random)"
928... if times is None:
929... return starmap(func, repeat(args))
930... else:
931... return starmap(func, repeat(args, times))
932
Raymond Hettingerd591f662003-10-26 15:34:50 +0000933>>> def pairwise(iterable):
934... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
935... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000936... try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000937... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000938... except StopIteration:
939... pass
940... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000941
942This is not part of the examples but it tests to make sure the definitions
943perform as purported.
944
Raymond Hettingera098b332003-09-08 23:58:40 +0000945>>> take(10, count())
946[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
947
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000948>>> list(enumerate('abc'))
949[(0, 'a'), (1, 'b'), (2, 'c')]
950
951>>> list(islice(tabulate(lambda x: 2*x), 4))
952[0, 2, 4, 6]
953
954>>> nth('abcde', 3)
955['d']
956
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000957>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000958True
959
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000960>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000961False
962
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000963>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000964True
965
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000966>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000967False
968
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000969>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000970True
971
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000972>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000973False
974
Guido van Rossum805365e2007-05-07 22:24:25 +0000975>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097650
977
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000978>>> a = [[1, 2, 3], [4, 5, 6]]
979>>> flatten(a)
980[1, 2, 3, 4, 5, 6]
981
982>>> list(repeatfunc(pow, 5, 2, 3))
983[8, 8, 8, 8, 8]
984
985>>> import random
986>>> take(5, imap(int, repeatfunc(random.random)))
987[0, 0, 0, 0, 0]
988
Raymond Hettingerd591f662003-10-26 15:34:50 +0000989>>> list(pairwise('abcd'))
990[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000991
Raymond Hettingerd591f662003-10-26 15:34:50 +0000992>>> list(pairwise([]))
993[]
994
995>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000996[]
997
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000998>>> list(islice(padnone('abc'), 0, 6))
999['a', 'b', 'c', None, None, None]
1000
1001>>> list(ncycles('abc', 3))
1002['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1003
1004>>> dotproduct([1,2,3], [4,5,6])
100532
1006
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001007"""
1008
1009__test__ = {'libreftest' : libreftest}
1010
1011def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001012 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001013 RegressionTests, LengthTransparency,
1014 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001015 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001016
1017 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001018 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001019 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001020 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001021 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001022 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001023 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001024 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001025 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001026
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001027 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001028 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001029
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001030if __name__ == "__main__":
1031 test_main(verbose=True)