blob: 81e2e8eccdc8280eea6d5e9d688bbee466fb65d9 [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)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000074 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
75 # 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, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000303 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000304 self.assertRaises(TypeError, starmap)
305 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000306 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
307 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
308 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000309
310 def test_islice(self):
311 for args in [ # islice(args) should agree with range(args)
312 (10, 20, 3),
313 (10, 3, 20),
314 (10, 20),
315 (10, 3),
316 (20,)
317 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000318 self.assertEqual(list(islice(range(100), *args)),
319 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000320
321 for args, tgtargs in [ # Stop when seqn is exhausted
322 ((10, 110, 3), ((10, 100, 3))),
323 ((10, 110), ((10, 100))),
324 ((110,), (100,))
325 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000326 self.assertEqual(list(islice(range(100), *args)),
327 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000328
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000329 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000330 self.assertEqual(list(islice(range(10), None)), list(range(10)))
331 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
332 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
333 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
334 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000335
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000336 # Test number of items consumed SF #1171417
337 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000338 self.assertEqual(list(islice(it, 3)), list(range(3)))
339 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000340
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000341 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000342 self.assertRaises(TypeError, islice, range(10))
343 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
344 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
345 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
346 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
347 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
348 self.assertRaises(ValueError, islice, range(10), 'a')
349 self.assertRaises(ValueError, islice, range(10), 'a', 1)
350 self.assertRaises(ValueError, islice, range(10), 1, 'a')
351 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
352 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000353 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000354
355 def test_takewhile(self):
356 data = [1, 3, 5, 20, 2, 4, 6, 8]
357 underten = lambda x: x<10
358 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000359 self.assertEqual(list(takewhile(underten, [])), [])
360 self.assertRaises(TypeError, takewhile)
361 self.assertRaises(TypeError, takewhile, operator.pow)
362 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000363 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
364 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000365 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
366 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000367 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000368
369 def test_dropwhile(self):
370 data = [1, 3, 5, 20, 2, 4, 6, 8]
371 underten = lambda x: x<10
372 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000373 self.assertEqual(list(dropwhile(underten, [])), [])
374 self.assertRaises(TypeError, dropwhile)
375 self.assertRaises(TypeError, dropwhile, operator.pow)
376 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000377 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
378 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000379
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000380 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000381 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000382 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000383 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000384 yield i
385
386 a, b = tee([]) # test empty iterator
387 self.assertEqual(list(a), [])
388 self.assertEqual(list(b), [])
389
390 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000391 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000392
393 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000394 self.assertEqual(list(a), list(range(n)))
395 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000396
397 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000398 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000399 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000400 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000401 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000402
403 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000404 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000405 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000406 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000407 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000408
Guido van Rossum805365e2007-05-07 22:24:25 +0000409 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000410 order = [0]*n + [1]*n
411 random.shuffle(order)
412 lists = ([], [])
413 its = tee(irange(n))
414 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000415 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000417 self.assertEqual(lists[0], list(range(n)))
418 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000419
Raymond Hettingerad983e72003-11-12 14:32:26 +0000420 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000421 self.assertRaises(TypeError, tee)
422 self.assertRaises(TypeError, tee, 3)
423 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000424 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000425
Raymond Hettingerad983e72003-11-12 14:32:26 +0000426 # tee object should be instantiable
427 a, b = tee('abc')
428 c = type(a)('def')
429 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000430
Raymond Hettingerad983e72003-11-12 14:32:26 +0000431 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000432 a, b, c = tee(range(2000), 3)
433 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000434 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000435 self.assertEqual(list(b), list(range(2000)))
436 self.assertEqual([next(c), next(c)], list(range(2)))
437 self.assertEqual(list(a), list(range(100,2000)))
438 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000439
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000440 # test values of n
441 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000443 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000444 result = tee('abc', n)
445 self.assertEqual(type(result), tuple)
446 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000447 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000448
Raymond Hettingerad983e72003-11-12 14:32:26 +0000449 # tee pass-through to copyable iterator
450 a, b = tee('abc')
451 c, d = tee(a)
452 self.assert_(a is c)
453
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000454 # test tee_new
455 t1, t2 = tee('abc')
456 tnew = type(t1)
457 self.assertRaises(TypeError, tnew)
458 self.assertRaises(TypeError, tnew, 10)
459 t3 = tnew(t1)
460 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000461
Raymond Hettingera9f60922004-10-17 16:40:14 +0000462 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000463 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000464 p = proxy(a)
465 self.assertEqual(getattr(p, '__class__'), type(b))
466 del a
467 self.assertRaises(ReferenceError, getattr, p, '__class__')
468
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000469 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000470 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000471
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000472 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000473 self.assertRaises(StopIteration, next, f([]))
474 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000475
Georg Brandla18af4e2007-04-21 15:47:16 +0000476 self.assertRaises(StopIteration, next, islice([], None))
477 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000478
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000479 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000480 self.assertRaises(StopIteration, next, p)
481 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000482 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000483 self.assertRaises(StopIteration, next, p)
484 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000485
Georg Brandla18af4e2007-04-21 15:47:16 +0000486 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000487
488 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000489 self.assertRaises(StopIteration, next, f(lambda x:x, []))
490 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000491
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000492class TestGC(unittest.TestCase):
493
494 def makecycle(self, iterator, container):
495 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000496 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000497 del container, iterator
498
499 def test_chain(self):
500 a = []
501 self.makecycle(chain(a), a)
502
503 def test_cycle(self):
504 a = []
505 self.makecycle(cycle([a]*2), a)
506
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000507 def test_dropwhile(self):
508 a = []
509 self.makecycle(dropwhile(bool, [0, a, a]), a)
510
511 def test_groupby(self):
512 a = []
513 self.makecycle(groupby([a]*2, lambda x:x), a)
514
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000515 def test_ifilter(self):
516 a = []
517 self.makecycle(ifilter(lambda x:True, [a]*2), a)
518
519 def test_ifilterfalse(self):
520 a = []
521 self.makecycle(ifilterfalse(lambda x:False, a), a)
522
523 def test_izip(self):
524 a = []
525 self.makecycle(izip([a]*2, [a]*3), a)
526
527 def test_imap(self):
528 a = []
529 self.makecycle(imap(lambda x:x, [a]*2), a)
530
531 def test_islice(self):
532 a = []
533 self.makecycle(islice([a]*2, None), a)
534
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000535 def test_repeat(self):
536 a = []
537 self.makecycle(repeat(a), a)
538
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000539 def test_starmap(self):
540 a = []
541 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
542
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000543 def test_takewhile(self):
544 a = []
545 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
546
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000547def R(seqn):
548 'Regular generator'
549 for i in seqn:
550 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000551
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000552class G:
553 'Sequence using __getitem__'
554 def __init__(self, seqn):
555 self.seqn = seqn
556 def __getitem__(self, i):
557 return self.seqn[i]
558
559class I:
560 'Sequence using iterator protocol'
561 def __init__(self, seqn):
562 self.seqn = seqn
563 self.i = 0
564 def __iter__(self):
565 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000566 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000567 if self.i >= len(self.seqn): raise StopIteration
568 v = self.seqn[self.i]
569 self.i += 1
570 return v
571
572class Ig:
573 'Sequence using iterator protocol defined with a generator'
574 def __init__(self, seqn):
575 self.seqn = seqn
576 self.i = 0
577 def __iter__(self):
578 for val in self.seqn:
579 yield val
580
581class X:
582 'Missing __getitem__ and __iter__'
583 def __init__(self, seqn):
584 self.seqn = seqn
585 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000586 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000587 if self.i >= len(self.seqn): raise StopIteration
588 v = self.seqn[self.i]
589 self.i += 1
590 return v
591
592class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000593 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000594 def __init__(self, seqn):
595 self.seqn = seqn
596 self.i = 0
597 def __iter__(self):
598 return self
599
600class E:
601 'Test propagation of exceptions'
602 def __init__(self, seqn):
603 self.seqn = seqn
604 self.i = 0
605 def __iter__(self):
606 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000607 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000608 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000609
610class S:
611 'Test immediate stop'
612 def __init__(self, seqn):
613 pass
614 def __iter__(self):
615 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000616 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000617 raise StopIteration
618
619def L(seqn):
620 'Test multiple tiers of iterators'
621 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
622
623
624class TestVariousIteratorArgs(unittest.TestCase):
625
626 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000627 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000628 for g in (G, I, Ig, S, L, R):
629 self.assertEqual(list(chain(g(s))), list(g(s)))
630 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
631 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000632 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000633 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
634
635 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000636 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000637 for g in (G, I, Ig, S, L, R):
638 tgtlen = len(s) * 3
639 expected = list(g(s))*3
640 actual = list(islice(cycle(g(s)), tgtlen))
641 self.assertEqual(actual, expected)
642 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000643 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000644 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
645
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000646 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000647 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000648 for g in (G, I, Ig, S, L, R):
649 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
650 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000651 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000652 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
653
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000654 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000655 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000656 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000657 self.assertEqual(list(ifilter(isEven, g(s))),
658 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000659 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000660 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000661 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
662
663 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000664 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000665 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000666 self.assertEqual(list(ifilterfalse(isEven, g(s))),
667 [x for x in g(s) if isOdd(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000668 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000669 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000670 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
671
672 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000673 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000674 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000675 self.assertEqual(list(izip(g(s))), lzip(g(s)))
676 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000677 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000678 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000679 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
680
Thomas Wouterscf297e42007-02-23 15:07:44 +0000681 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000682 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000683 for g in (G, I, Ig, S, L, R):
684 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
685 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
686 self.assertRaises(TypeError, izip_longest, X(s))
687 self.assertRaises(TypeError, izip_longest, N(s))
688 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
689
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000690 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000691 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000692 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000693 self.assertEqual(list(imap(onearg, g(s))),
694 [onearg(x) for x in g(s)])
695 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
696 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000697 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000698 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000699 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
700
701 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000702 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000703 for g in (G, I, Ig, S, L, R):
704 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
705 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000706 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000707 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
708
709 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000710 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000711 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000712 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000713 self.assertEqual(list(starmap(operator.pow, g(ss))),
714 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000715 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000716 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000717 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
718
719 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000720 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000721 for g in (G, I, Ig, S, L, R):
722 tgt = []
723 for elem in g(s):
724 if not isEven(elem): break
725 tgt.append(elem)
726 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
727 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000728 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000729 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
730
731 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000732 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000733 for g in (G, I, Ig, S, L, R):
734 tgt = []
735 for elem in g(s):
736 if not tgt and isOdd(elem): continue
737 tgt.append(elem)
738 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
739 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000740 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000741 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
742
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000743 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000744 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000745 for g in (G, I, Ig, S, L, R):
746 it1, it2 = tee(g(s))
747 self.assertEqual(list(it1), list(g(s)))
748 self.assertEqual(list(it2), list(g(s)))
749 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000750 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000751 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
752
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000753class LengthTransparency(unittest.TestCase):
754
755 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000756 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000757 self.assertEqual(len(repeat(None, 50)), 50)
758 self.assertRaises(TypeError, len, repeat(None))
759
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000760class RegressionTests(unittest.TestCase):
761
762 def test_sf_793826(self):
763 # Fix Armin Rigo's successful efforts to wreak havoc
764
765 def mutatingtuple(tuple1, f, tuple2):
766 # this builds a tuple t which is a copy of tuple1,
767 # then calls f(t), then mutates t to be equal to tuple2
768 # (needs len(tuple1) == len(tuple2)).
769 def g(value, first=[1]):
770 if first:
771 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000772 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000773 return value
774 items = list(tuple2)
775 items[1:1] = list(tuple1)
776 gen = imap(g, items)
777 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000778 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000779
780 def f(t):
781 global T
782 T = t
783 first[:] = list(T)
784
785 first = []
786 mutatingtuple((1,2,3), f, (4,5,6))
787 second = list(T)
788 self.assertEqual(first, second)
789
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000790
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000791 def test_sf_950057(self):
792 # Make sure that chain() and cycle() catch exceptions immediately
793 # rather than when shifting between input sources
794
795 def gen1():
796 hist.append(0)
797 yield 1
798 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000799 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000800 hist.append(2)
801
802 def gen2(x):
803 hist.append(3)
804 yield 2
805 hist.append(4)
806 if x:
807 raise StopIteration
808
809 hist = []
810 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
811 self.assertEqual(hist, [0,1])
812
813 hist = []
814 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
815 self.assertEqual(hist, [0,1])
816
817 hist = []
818 self.assertRaises(AssertionError, list, cycle(gen1()))
819 self.assertEqual(hist, [0,1])
820
Thomas Woutersb2137042007-02-01 18:02:27 +0000821class SubclassWithKwargsTest(unittest.TestCase):
822 def test_keywords_in_subclass(self):
823 # count is not subclassable...
824 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
825 starmap, islice, takewhile, dropwhile, cycle):
826 class Subclass(cls):
827 def __init__(self, newarg=None, *args):
828 cls.__init__(self, *args)
829 try:
830 Subclass(newarg=1)
831 except TypeError as err:
832 # we expect type errors because of wrong argument count
833 self.failIf("does not take keyword arguments" in err.args[0])
834
835
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000836libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000837
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000838
839>>> amounts = [120.15, 764.05, 823.14]
840>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000841... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000842...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000843Check 1200 is for $120.15
844Check 1201 is for $764.05
845Check 1202 is for $823.14
846
847>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000848>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000849... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000850...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00008511
8528
85327
854
855>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000856>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000857... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000858...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000859Alex
860Laura
861Martin
862Walter
863Samuele
864
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000865>>> from operator import itemgetter
866>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000867>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000868>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000869... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000870...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00008711 ['a', 'c', 'e']
8722 ['b', 'd', 'f']
8733 ['g']
874
Raymond Hettinger734fb572004-01-20 20:04:40 +0000875# Find runs of consecutive numbers using groupby. The key to the solution
876# is differencing with a range so that consecutive numbers all appear in
877# same group.
878>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000879>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000880... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000881...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000882[1]
883[4, 5, 6]
884[10]
885[15, 16, 17, 18]
886[22]
887[25, 26, 27, 28]
888
Raymond Hettingera098b332003-09-08 23:58:40 +0000889>>> def take(n, seq):
890... return list(islice(seq, n))
891
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000892>>> def enumerate(iterable):
893... return izip(count(), iterable)
894
895>>> def tabulate(function):
896... "Return function(0), function(1), ..."
897... return imap(function, count())
898
899>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000900... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000901
902>>> def nth(iterable, n):
903... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000904... return list(islice(iterable, n, n+1))
905
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000906>>> def all(seq, pred=None):
907... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000908... for elem in ifilterfalse(pred, seq):
909... return False
910... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000911
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000912>>> def any(seq, pred=None):
913... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000914... for elem in ifilter(pred, seq):
915... return True
916... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000917
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000918>>> def no(seq, pred=None):
919... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000920... for elem in ifilter(pred, seq):
921... return False
922... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000923
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000924>>> def quantify(seq, pred=None):
925... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000926... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000927
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000928>>> def padnone(seq):
929... "Returns the sequence elements and then returns None indefinitely"
930... return chain(seq, repeat(None))
931
932>>> def ncycles(seq, n):
933... "Returns the sequence elements n times"
934... return chain(*repeat(seq, n))
935
936>>> def dotproduct(vec1, vec2):
937... return sum(imap(operator.mul, vec1, vec2))
938
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000939>>> def flatten(listOfLists):
940... return list(chain(*listOfLists))
941
942>>> def repeatfunc(func, times=None, *args):
943... "Repeat calls to func with specified arguments."
944... " Example: repeatfunc(random.random)"
945... if times is None:
946... return starmap(func, repeat(args))
947... else:
948... return starmap(func, repeat(args, times))
949
Raymond Hettingerd591f662003-10-26 15:34:50 +0000950>>> def pairwise(iterable):
951... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
952... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000953... try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000954... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000955... except StopIteration:
956... pass
957... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000958
959This is not part of the examples but it tests to make sure the definitions
960perform as purported.
961
Raymond Hettingera098b332003-09-08 23:58:40 +0000962>>> take(10, count())
963[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
964
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000965>>> list(enumerate('abc'))
966[(0, 'a'), (1, 'b'), (2, 'c')]
967
968>>> list(islice(tabulate(lambda x: 2*x), 4))
969[0, 2, 4, 6]
970
971>>> nth('abcde', 3)
972['d']
973
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000974>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000975True
976
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000977>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000978False
979
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000980>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000981True
982
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000983>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000984False
985
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000986>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000987True
988
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000989>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000990False
991
Guido van Rossum805365e2007-05-07 22:24:25 +0000992>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000099350
994
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000995>>> a = [[1, 2, 3], [4, 5, 6]]
996>>> flatten(a)
997[1, 2, 3, 4, 5, 6]
998
999>>> list(repeatfunc(pow, 5, 2, 3))
1000[8, 8, 8, 8, 8]
1001
1002>>> import random
1003>>> take(5, imap(int, repeatfunc(random.random)))
1004[0, 0, 0, 0, 0]
1005
Raymond Hettingerd591f662003-10-26 15:34:50 +00001006>>> list(pairwise('abcd'))
1007[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001008
Raymond Hettingerd591f662003-10-26 15:34:50 +00001009>>> list(pairwise([]))
1010[]
1011
1012>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001013[]
1014
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001015>>> list(islice(padnone('abc'), 0, 6))
1016['a', 'b', 'c', None, None, None]
1017
1018>>> list(ncycles('abc', 3))
1019['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1020
1021>>> dotproduct([1,2,3], [4,5,6])
102232
1023
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001024"""
1025
1026__test__ = {'libreftest' : libreftest}
1027
1028def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001029 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001030 RegressionTests, LengthTransparency,
1031 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001032 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001033
1034 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001035 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001036 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001037 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001038 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001039 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001040 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001041 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001042 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001043
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001044 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001045 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001046
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001047if __name__ == "__main__":
1048 test_main(verbose=True)