blob: 4c0af076654945f575aba5217777ff552054895d [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)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +000058 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
59 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000060 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000061 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +000062 self.assertEqual(list(islice(count(maxsize-5), 10)),
63 list(range(maxsize-5, maxsize+5)))
64 self.assertEqual(list(islice(count(-maxsize-5), 10)),
65 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000066 c = count(3)
67 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +000068 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000069 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000070 c = count(-9)
71 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +000072 next(c)
73 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +000074 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 +000075 # Test repr (ignoring the L in longs)
76 r1 = repr(count(i)).replace('L', '')
77 r2 = 'count(%r)'.__mod__(i).replace('L', '')
78 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000079
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000080 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000081 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000082 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000083 self.assertRaises(TypeError, cycle)
84 self.assertRaises(TypeError, cycle, 5)
85 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000086
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000087 def test_groupby(self):
88 # Check whether it accepts arguments correctly
89 self.assertEqual([], list(groupby([])))
90 self.assertEqual([], list(groupby([], key=id)))
91 self.assertRaises(TypeError, list, groupby('abc', []))
92 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000093 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000094
95 # Check normal input
96 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
97 (2,15,22), (3,16,23), (3,17,23)]
98 dup = []
99 for k, g in groupby(s, lambda r:r[0]):
100 for elem in g:
101 self.assertEqual(k, elem[0])
102 dup.append(elem)
103 self.assertEqual(s, dup)
104
105 # Check nested case
106 dup = []
107 for k, g in groupby(s, lambda r:r[0]):
108 for ik, ig in groupby(g, lambda r:r[2]):
109 for elem in ig:
110 self.assertEqual(k, elem[0])
111 self.assertEqual(ik, elem[2])
112 dup.append(elem)
113 self.assertEqual(s, dup)
114
115 # Check case where inner iterator is not used
116 keys = [k for k, g in groupby(s, lambda r:r[0])]
117 expectedkeys = set([r[0] for r in s])
118 self.assertEqual(set(keys), expectedkeys)
119 self.assertEqual(len(keys), len(expectedkeys))
120
121 # Exercise pipes and filters style
122 s = 'abracadabra'
123 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000124 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000125 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
126 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000127 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000128 self.assertEqual(r, ['a', 'b', 'r'])
129 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000130 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000131 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
132 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000133 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000134 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
135
Georg Brandla18af4e2007-04-21 15:47:16 +0000136 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000137 class ExpectedError(Exception):
138 pass
139 def delayed_raise(n=0):
140 for i in range(n):
141 yield 'yo'
142 raise ExpectedError
143 def gulp(iterable, keyp=None, func=list):
144 return [func(g) for k, g in groupby(iterable, keyp)]
145
Georg Brandla18af4e2007-04-21 15:47:16 +0000146 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000147 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000148 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000149 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
150
151 # __cmp__ failure
152 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000153 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000154 raise ExpectedError
155 s = [DummyCmp(), DummyCmp(), None]
156
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000157 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000158 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000159 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000160 self.assertRaises(ExpectedError, gulp, s)
161
162 # keyfunc failure
163 def keyfunc(obj):
164 if keyfunc.skip > 0:
165 keyfunc.skip -= 1
166 return obj
167 else:
168 raise ExpectedError
169
170 # keyfunc failure on outer object
171 keyfunc.skip = 0
172 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
173 keyfunc.skip = 1
174 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
175
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000176 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000177 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000179 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000180 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000181 self.assertRaises(TypeError, ifilter, lambda x:x)
182 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000183 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000184 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000185
186 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000187 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
188 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000189 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000190 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000191 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
192 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000193 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000194 self.assertRaises(TypeError, next, ifilterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000195
196 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000197 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000198 ans = [(x,y) for x, y in izip('abc',count())]
199 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000200 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
201 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
202 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
203 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
204 self.assertEqual(list(izip()), lzip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000205 self.assertRaises(TypeError, izip, 3)
206 self.assertRaises(TypeError, izip, range(3), 3)
207 # Check tuple re-use (implementation detail)
208 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000209 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000210 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000211 lzip('abc', 'def'))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000212 ids = list(map(id, izip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000213 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000214 ids = list(map(id, list(izip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000215 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000216
Thomas Wouterscf297e42007-02-23 15:07:44 +0000217 def test_iziplongest(self):
218 for args in [
219 ['abc', range(6)],
220 [range(6), 'abc'],
221 [range(1000), range(2000,2100), range(3000,3050)],
222 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
223 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
224 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000225 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
226 for i in range(max(map(len, args)))]
Thomas Wouterscf297e42007-02-23 15:07:44 +0000227 self.assertEqual(list(izip_longest(*args)), target)
228 self.assertEqual(list(izip_longest(*args, **{})), target)
229 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
230 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000231
Thomas Wouterscf297e42007-02-23 15:07:44 +0000232 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
233
234 self.assertEqual(list(izip_longest()), list(zip()))
235 self.assertEqual(list(izip_longest([])), list(zip([])))
236 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000238 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
239 list(map(None, list('abc')+[None], 'defg'))) # empty keyword dict
Thomas Wouterscf297e42007-02-23 15:07:44 +0000240 self.assertRaises(TypeError, izip_longest, 3)
241 self.assertRaises(TypeError, izip_longest, range(3), 3)
242
243 for stmt in [
244 "izip_longest('abc', fv=1)",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000245 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000246 ]:
247 try:
248 eval(stmt, globals(), locals())
249 except TypeError:
250 pass
251 else:
252 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253
Thomas Wouterscf297e42007-02-23 15:07:44 +0000254 # Check tuple re-use (implementation detail)
255 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
256 list(zip('abc', 'def')))
257 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
258 list(zip('abc', 'def')))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000259 ids = list(map(id, izip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000260 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000261 ids = list(map(id, list(izip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000262 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
263
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000264 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000265 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000266 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000267 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000268 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000269 self.assertEqual(list(repeat('a', 0)), [])
270 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000271 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000272 self.assertRaises(TypeError, repeat, None, 3, 4)
273 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000274 r = repeat(1+0j)
275 self.assertEqual(repr(r), 'repeat((1+0j))')
276 r = repeat(1+0j, 5)
277 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
278 list(r)
279 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000280
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000281 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000282 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
283 [0**1, 1**2, 2**3])
284 self.assertEqual(list(imap(None, 'abc', range(5))),
285 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000286 self.assertEqual(list(imap(None, 'abc', count())),
287 [('a',0),('b',1),('c',2)])
288 self.assertEqual(take(2,imap(None, 'abc', count())),
289 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000290 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000291 self.assertRaises(TypeError, imap)
292 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000293 self.assertRaises(TypeError, next, imap(10, range(5)))
294 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
295 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000296
297 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000298 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
299 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000300 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
301 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000302 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000303 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
304 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000305 self.assertRaises(TypeError, starmap)
306 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000307 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
308 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
309 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000310
311 def test_islice(self):
312 for args in [ # islice(args) should agree with range(args)
313 (10, 20, 3),
314 (10, 3, 20),
315 (10, 20),
316 (10, 3),
317 (20,)
318 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000319 self.assertEqual(list(islice(range(100), *args)),
320 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000321
322 for args, tgtargs in [ # Stop when seqn is exhausted
323 ((10, 110, 3), ((10, 100, 3))),
324 ((10, 110), ((10, 100))),
325 ((110,), (100,))
326 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000327 self.assertEqual(list(islice(range(100), *args)),
328 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000329
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000330 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000331 self.assertEqual(list(islice(range(10), None)), list(range(10)))
332 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
333 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
334 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
335 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000336
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000337 # Test number of items consumed SF #1171417
338 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000339 self.assertEqual(list(islice(it, 3)), list(range(3)))
340 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000341
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000342 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000343 self.assertRaises(TypeError, islice, range(10))
344 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
345 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
346 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
347 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
348 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
349 self.assertRaises(ValueError, islice, range(10), 'a')
350 self.assertRaises(ValueError, islice, range(10), 'a', 1)
351 self.assertRaises(ValueError, islice, range(10), 1, 'a')
352 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
353 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000354 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000355
356 def test_takewhile(self):
357 data = [1, 3, 5, 20, 2, 4, 6, 8]
358 underten = lambda x: x<10
359 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000360 self.assertEqual(list(takewhile(underten, [])), [])
361 self.assertRaises(TypeError, takewhile)
362 self.assertRaises(TypeError, takewhile, operator.pow)
363 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000364 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
365 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000366 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
367 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000368 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000369
370 def test_dropwhile(self):
371 data = [1, 3, 5, 20, 2, 4, 6, 8]
372 underten = lambda x: x<10
373 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000374 self.assertEqual(list(dropwhile(underten, [])), [])
375 self.assertRaises(TypeError, dropwhile)
376 self.assertRaises(TypeError, dropwhile, operator.pow)
377 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000378 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
379 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000380
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000381 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000382 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000383 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000384 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000385 yield i
386
387 a, b = tee([]) # test empty iterator
388 self.assertEqual(list(a), [])
389 self.assertEqual(list(b), [])
390
391 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000392 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000393
394 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000395 self.assertEqual(list(a), list(range(n)))
396 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000397
398 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000399 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000400 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000401 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000402 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000403
404 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000405 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000406 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000407 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000408 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000409
Guido van Rossum805365e2007-05-07 22:24:25 +0000410 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000411 order = [0]*n + [1]*n
412 random.shuffle(order)
413 lists = ([], [])
414 its = tee(irange(n))
415 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000416 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000417 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000418 self.assertEqual(lists[0], list(range(n)))
419 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000420
Raymond Hettingerad983e72003-11-12 14:32:26 +0000421 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000422 self.assertRaises(TypeError, tee)
423 self.assertRaises(TypeError, tee, 3)
424 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000425 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000426
Raymond Hettingerad983e72003-11-12 14:32:26 +0000427 # tee object should be instantiable
428 a, b = tee('abc')
429 c = type(a)('def')
430 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000431
Raymond Hettingerad983e72003-11-12 14:32:26 +0000432 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000433 a, b, c = tee(range(2000), 3)
434 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000435 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000436 self.assertEqual(list(b), list(range(2000)))
437 self.assertEqual([next(c), next(c)], list(range(2)))
438 self.assertEqual(list(a), list(range(100,2000)))
439 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000440
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000441 # test values of n
442 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000443 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000444 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000445 result = tee('abc', n)
446 self.assertEqual(type(result), tuple)
447 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000448 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000449
Raymond Hettingerad983e72003-11-12 14:32:26 +0000450 # tee pass-through to copyable iterator
451 a, b = tee('abc')
452 c, d = tee(a)
453 self.assert_(a is c)
454
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000455 # test tee_new
456 t1, t2 = tee('abc')
457 tnew = type(t1)
458 self.assertRaises(TypeError, tnew)
459 self.assertRaises(TypeError, tnew, 10)
460 t3 = tnew(t1)
461 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000462
Raymond Hettingera9f60922004-10-17 16:40:14 +0000463 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000464 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000465 p = proxy(a)
466 self.assertEqual(getattr(p, '__class__'), type(b))
467 del a
468 self.assertRaises(ReferenceError, getattr, p, '__class__')
469
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000470 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000471 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000472
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000473 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000474 self.assertRaises(StopIteration, next, f([]))
475 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000476
Georg Brandla18af4e2007-04-21 15:47:16 +0000477 self.assertRaises(StopIteration, next, islice([], None))
478 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000479
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000480 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000481 self.assertRaises(StopIteration, next, p)
482 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000483 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000484 self.assertRaises(StopIteration, next, p)
485 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000486
Georg Brandla18af4e2007-04-21 15:47:16 +0000487 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000488
489 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000490 self.assertRaises(StopIteration, next, f(lambda x:x, []))
491 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000492
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000493class TestGC(unittest.TestCase):
494
495 def makecycle(self, iterator, container):
496 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000497 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000498 del container, iterator
499
500 def test_chain(self):
501 a = []
502 self.makecycle(chain(a), a)
503
504 def test_cycle(self):
505 a = []
506 self.makecycle(cycle([a]*2), a)
507
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000508 def test_dropwhile(self):
509 a = []
510 self.makecycle(dropwhile(bool, [0, a, a]), a)
511
512 def test_groupby(self):
513 a = []
514 self.makecycle(groupby([a]*2, lambda x:x), a)
515
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000516 def test_ifilter(self):
517 a = []
518 self.makecycle(ifilter(lambda x:True, [a]*2), a)
519
520 def test_ifilterfalse(self):
521 a = []
522 self.makecycle(ifilterfalse(lambda x:False, a), a)
523
524 def test_izip(self):
525 a = []
526 self.makecycle(izip([a]*2, [a]*3), a)
527
528 def test_imap(self):
529 a = []
530 self.makecycle(imap(lambda x:x, [a]*2), a)
531
532 def test_islice(self):
533 a = []
534 self.makecycle(islice([a]*2, None), a)
535
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000536 def test_repeat(self):
537 a = []
538 self.makecycle(repeat(a), a)
539
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000540 def test_starmap(self):
541 a = []
542 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
543
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000544 def test_takewhile(self):
545 a = []
546 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
547
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000548def R(seqn):
549 'Regular generator'
550 for i in seqn:
551 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000552
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000553class G:
554 'Sequence using __getitem__'
555 def __init__(self, seqn):
556 self.seqn = seqn
557 def __getitem__(self, i):
558 return self.seqn[i]
559
560class I:
561 'Sequence using iterator protocol'
562 def __init__(self, seqn):
563 self.seqn = seqn
564 self.i = 0
565 def __iter__(self):
566 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000567 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000568 if self.i >= len(self.seqn): raise StopIteration
569 v = self.seqn[self.i]
570 self.i += 1
571 return v
572
573class Ig:
574 'Sequence using iterator protocol defined with a generator'
575 def __init__(self, seqn):
576 self.seqn = seqn
577 self.i = 0
578 def __iter__(self):
579 for val in self.seqn:
580 yield val
581
582class X:
583 'Missing __getitem__ and __iter__'
584 def __init__(self, seqn):
585 self.seqn = seqn
586 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000587 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000588 if self.i >= len(self.seqn): raise StopIteration
589 v = self.seqn[self.i]
590 self.i += 1
591 return v
592
593class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000594 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000595 def __init__(self, seqn):
596 self.seqn = seqn
597 self.i = 0
598 def __iter__(self):
599 return self
600
601class E:
602 'Test propagation of exceptions'
603 def __init__(self, seqn):
604 self.seqn = seqn
605 self.i = 0
606 def __iter__(self):
607 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000608 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000609 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000610
611class S:
612 'Test immediate stop'
613 def __init__(self, seqn):
614 pass
615 def __iter__(self):
616 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000617 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000618 raise StopIteration
619
620def L(seqn):
621 'Test multiple tiers of iterators'
622 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
623
624
625class TestVariousIteratorArgs(unittest.TestCase):
626
627 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000628 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000629 for g in (G, I, Ig, S, L, R):
630 self.assertEqual(list(chain(g(s))), list(g(s)))
631 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
632 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000633 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000634 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
635
636 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000637 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000638 for g in (G, I, Ig, S, L, R):
639 tgtlen = len(s) * 3
640 expected = list(g(s))*3
641 actual = list(islice(cycle(g(s)), tgtlen))
642 self.assertEqual(actual, expected)
643 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000644 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000645 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
646
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000647 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000648 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000649 for g in (G, I, Ig, S, L, R):
650 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
651 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000652 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000653 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
654
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000655 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000656 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000657 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000658 self.assertEqual(list(ifilter(isEven, g(s))),
659 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000660 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000661 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000662 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
663
664 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000665 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000666 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000667 self.assertEqual(list(ifilterfalse(isEven, g(s))),
668 [x for x in g(s) if isOdd(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000669 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000670 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000671 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
672
673 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000674 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000675 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000676 self.assertEqual(list(izip(g(s))), lzip(g(s)))
677 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000678 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000679 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000680 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
681
Thomas Wouterscf297e42007-02-23 15:07:44 +0000682 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000683 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000684 for g in (G, I, Ig, S, L, R):
685 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
686 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
687 self.assertRaises(TypeError, izip_longest, X(s))
688 self.assertRaises(TypeError, izip_longest, N(s))
689 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
690
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000691 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000692 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000693 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000694 self.assertEqual(list(imap(onearg, g(s))),
695 [onearg(x) for x in g(s)])
696 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
697 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000698 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000699 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000700 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
701
702 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000703 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000704 for g in (G, I, Ig, S, L, R):
705 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
706 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000707 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000708 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
709
710 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000711 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000712 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000713 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000714 self.assertEqual(list(starmap(operator.pow, g(ss))),
715 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000716 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000717 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000718 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
719
720 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000721 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000722 for g in (G, I, Ig, S, L, R):
723 tgt = []
724 for elem in g(s):
725 if not isEven(elem): break
726 tgt.append(elem)
727 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
728 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000729 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000730 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
731
732 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000733 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000734 for g in (G, I, Ig, S, L, R):
735 tgt = []
736 for elem in g(s):
737 if not tgt and isOdd(elem): continue
738 tgt.append(elem)
739 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
740 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000741 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000742 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
743
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000744 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000745 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000746 for g in (G, I, Ig, S, L, R):
747 it1, it2 = tee(g(s))
748 self.assertEqual(list(it1), list(g(s)))
749 self.assertEqual(list(it2), list(g(s)))
750 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000751 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000752 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
753
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000754class LengthTransparency(unittest.TestCase):
755
756 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000757 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000758 self.assertEqual(len(repeat(None, 50)), 50)
759 self.assertRaises(TypeError, len, repeat(None))
760
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000761class RegressionTests(unittest.TestCase):
762
763 def test_sf_793826(self):
764 # Fix Armin Rigo's successful efforts to wreak havoc
765
766 def mutatingtuple(tuple1, f, tuple2):
767 # this builds a tuple t which is a copy of tuple1,
768 # then calls f(t), then mutates t to be equal to tuple2
769 # (needs len(tuple1) == len(tuple2)).
770 def g(value, first=[1]):
771 if first:
772 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000773 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000774 return value
775 items = list(tuple2)
776 items[1:1] = list(tuple1)
777 gen = imap(g, items)
778 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000779 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000780
781 def f(t):
782 global T
783 T = t
784 first[:] = list(T)
785
786 first = []
787 mutatingtuple((1,2,3), f, (4,5,6))
788 second = list(T)
789 self.assertEqual(first, second)
790
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000791
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000792 def test_sf_950057(self):
793 # Make sure that chain() and cycle() catch exceptions immediately
794 # rather than when shifting between input sources
795
796 def gen1():
797 hist.append(0)
798 yield 1
799 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000800 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000801 hist.append(2)
802
803 def gen2(x):
804 hist.append(3)
805 yield 2
806 hist.append(4)
807 if x:
808 raise StopIteration
809
810 hist = []
811 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
812 self.assertEqual(hist, [0,1])
813
814 hist = []
815 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
816 self.assertEqual(hist, [0,1])
817
818 hist = []
819 self.assertRaises(AssertionError, list, cycle(gen1()))
820 self.assertEqual(hist, [0,1])
821
Thomas Woutersb2137042007-02-01 18:02:27 +0000822class SubclassWithKwargsTest(unittest.TestCase):
823 def test_keywords_in_subclass(self):
824 # count is not subclassable...
825 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
826 starmap, islice, takewhile, dropwhile, cycle):
827 class Subclass(cls):
828 def __init__(self, newarg=None, *args):
829 cls.__init__(self, *args)
830 try:
831 Subclass(newarg=1)
832 except TypeError as err:
833 # we expect type errors because of wrong argument count
834 self.failIf("does not take keyword arguments" in err.args[0])
835
836
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000837libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000839
840>>> amounts = [120.15, 764.05, 823.14]
841>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000842... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000843...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000844Check 1200 is for $120.15
845Check 1201 is for $764.05
846Check 1202 is for $823.14
847
848>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000849>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000850... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000851...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00008521
8538
85427
855
856>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000857>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000858... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000859...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000860Alex
861Laura
862Martin
863Walter
864Samuele
865
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000866>>> from operator import itemgetter
867>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000868>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000869>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000870... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000871...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00008721 ['a', 'c', 'e']
8732 ['b', 'd', 'f']
8743 ['g']
875
Raymond Hettinger734fb572004-01-20 20:04:40 +0000876# Find runs of consecutive numbers using groupby. The key to the solution
877# is differencing with a range so that consecutive numbers all appear in
878# same group.
879>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000880>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000881... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000882...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000883[1]
884[4, 5, 6]
885[10]
886[15, 16, 17, 18]
887[22]
888[25, 26, 27, 28]
889
Raymond Hettingera098b332003-09-08 23:58:40 +0000890>>> def take(n, seq):
891... return list(islice(seq, n))
892
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000893>>> def enumerate(iterable):
894... return izip(count(), iterable)
895
896>>> def tabulate(function):
897... "Return function(0), function(1), ..."
898... return imap(function, count())
899
900>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000901... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000902
903>>> def nth(iterable, n):
904... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000905... return list(islice(iterable, n, n+1))
906
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000907>>> def all(seq, pred=None):
908... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000909... for elem in ifilterfalse(pred, seq):
910... return False
911... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000912
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000913>>> def any(seq, pred=None):
914... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000915... for elem in ifilter(pred, seq):
916... return True
917... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000918
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000919>>> def no(seq, pred=None):
920... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000921... for elem in ifilter(pred, seq):
922... return False
923... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000924
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000925>>> def quantify(seq, pred=None):
926... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000927... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000928
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000929>>> def padnone(seq):
930... "Returns the sequence elements and then returns None indefinitely"
931... return chain(seq, repeat(None))
932
933>>> def ncycles(seq, n):
934... "Returns the sequence elements n times"
935... return chain(*repeat(seq, n))
936
937>>> def dotproduct(vec1, vec2):
938... return sum(imap(operator.mul, vec1, vec2))
939
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000940>>> def flatten(listOfLists):
941... return list(chain(*listOfLists))
942
943>>> def repeatfunc(func, times=None, *args):
944... "Repeat calls to func with specified arguments."
945... " Example: repeatfunc(random.random)"
946... if times is None:
947... return starmap(func, repeat(args))
948... else:
949... return starmap(func, repeat(args, times))
950
Raymond Hettingerd591f662003-10-26 15:34:50 +0000951>>> def pairwise(iterable):
952... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
953... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000954... try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000955... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000956... except StopIteration:
957... pass
958... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000959
960This is not part of the examples but it tests to make sure the definitions
961perform as purported.
962
Raymond Hettingera098b332003-09-08 23:58:40 +0000963>>> take(10, count())
964[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
965
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000966>>> list(enumerate('abc'))
967[(0, 'a'), (1, 'b'), (2, 'c')]
968
969>>> list(islice(tabulate(lambda x: 2*x), 4))
970[0, 2, 4, 6]
971
972>>> nth('abcde', 3)
973['d']
974
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000975>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000976True
977
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000978>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000979False
980
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000981>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000982True
983
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000984>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000985False
986
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000987>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000988True
989
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000990>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000991False
992
Guido van Rossum805365e2007-05-07 22:24:25 +0000993>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000099450
995
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000996>>> a = [[1, 2, 3], [4, 5, 6]]
997>>> flatten(a)
998[1, 2, 3, 4, 5, 6]
999
1000>>> list(repeatfunc(pow, 5, 2, 3))
1001[8, 8, 8, 8, 8]
1002
1003>>> import random
1004>>> take(5, imap(int, repeatfunc(random.random)))
1005[0, 0, 0, 0, 0]
1006
Raymond Hettingerd591f662003-10-26 15:34:50 +00001007>>> list(pairwise('abcd'))
1008[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001009
Raymond Hettingerd591f662003-10-26 15:34:50 +00001010>>> list(pairwise([]))
1011[]
1012
1013>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001014[]
1015
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001016>>> list(islice(padnone('abc'), 0, 6))
1017['a', 'b', 'c', None, None, None]
1018
1019>>> list(ncycles('abc', 3))
1020['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1021
1022>>> dotproduct([1,2,3], [4,5,6])
102332
1024
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001025"""
1026
1027__test__ = {'libreftest' : libreftest}
1028
1029def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001030 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001031 RegressionTests, LengthTransparency,
1032 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001033 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001034
1035 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001036 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001037 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001038 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001039 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001040 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001041 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001042 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001043 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001044
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001045 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001046 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001047
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001048if __name__ == "__main__":
1049 test_main(verbose=True)