blob: f5dd0691c803e0baf9274f65aa69351ea1e472da [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000044 def test_chain(self):
45 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertEqual(list(chain('abc')), list('abc'))
47 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000048 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000050
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051 def test_count(self):
52 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
53 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000054 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000055 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
56 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000057 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000058 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000059 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
60 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000061 c = count(3)
62 self.assertEqual(repr(c), 'count(3)')
63 c.next()
64 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000065 c = count(-9)
66 self.assertEqual(repr(c), 'count(-9)')
67 c.next()
68 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +000069 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
Raymond Hettinger3a0de082007-10-12 17:53:11 +000070 # Test repr (ignoring the L in longs)
71 r1 = repr(count(i)).replace('L', '')
72 r2 = 'count(%r)'.__mod__(i).replace('L', '')
73 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000074
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000075 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000076 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000077 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000078 self.assertRaises(TypeError, cycle)
79 self.assertRaises(TypeError, cycle, 5)
80 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000081
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000082 def test_groupby(self):
83 # Check whether it accepts arguments correctly
84 self.assertEqual([], list(groupby([])))
85 self.assertEqual([], list(groupby([], key=id)))
86 self.assertRaises(TypeError, list, groupby('abc', []))
87 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000088 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000089
90 # Check normal input
91 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
92 (2,15,22), (3,16,23), (3,17,23)]
93 dup = []
94 for k, g in groupby(s, lambda r:r[0]):
95 for elem in g:
96 self.assertEqual(k, elem[0])
97 dup.append(elem)
98 self.assertEqual(s, dup)
99
100 # Check nested case
101 dup = []
102 for k, g in groupby(s, lambda r:r[0]):
103 for ik, ig in groupby(g, lambda r:r[2]):
104 for elem in ig:
105 self.assertEqual(k, elem[0])
106 self.assertEqual(ik, elem[2])
107 dup.append(elem)
108 self.assertEqual(s, dup)
109
110 # Check case where inner iterator is not used
111 keys = [k for k, g in groupby(s, lambda r:r[0])]
112 expectedkeys = set([r[0] for r in s])
113 self.assertEqual(set(keys), expectedkeys)
114 self.assertEqual(len(keys), len(expectedkeys))
115
116 # Exercise pipes and filters style
117 s = 'abracadabra'
118 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
121 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000122 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000123 self.assertEqual(r, ['a', 'b', 'r'])
124 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000125 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
127 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000128 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000129 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
130
131 # iter.next failure
132 class ExpectedError(Exception):
133 pass
134 def delayed_raise(n=0):
135 for i in range(n):
136 yield 'yo'
137 raise ExpectedError
138 def gulp(iterable, keyp=None, func=list):
139 return [func(g) for k, g in groupby(iterable, keyp)]
140
141 # iter.next failure on outer object
142 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
143 # iter.next failure on inner object
144 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
145
146 # __cmp__ failure
147 class DummyCmp:
148 def __cmp__(self, dst):
149 raise ExpectedError
150 s = [DummyCmp(), DummyCmp(), None]
151
152 # __cmp__ failure on outer object
153 self.assertRaises(ExpectedError, gulp, s, func=id)
154 # __cmp__ failure on inner object
155 self.assertRaises(ExpectedError, gulp, s)
156
157 # keyfunc failure
158 def keyfunc(obj):
159 if keyfunc.skip > 0:
160 keyfunc.skip -= 1
161 return obj
162 else:
163 raise ExpectedError
164
165 # keyfunc failure on outer object
166 keyfunc.skip = 0
167 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
168 keyfunc.skip = 1
169 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
170
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000171 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000172 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000173 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000174 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000175 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilter, lambda x:x)
177 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000179 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180
181 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000182 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
183 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000184 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000185 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
187 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000188 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000190
191 def test_izip(self):
192 ans = [(x,y) for x, y in izip('abc',count())]
193 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
195 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000196 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000197 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000198 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000199 self.assertRaises(TypeError, izip, 3)
200 self.assertRaises(TypeError, izip, range(3), 3)
201 # Check tuple re-use (implementation detail)
202 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
203 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000204 self.assertEqual([pair for pair in izip('abc', 'def')],
205 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000206 ids = map(id, izip('abc', 'def'))
207 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000208 ids = map(id, list(izip('abc', 'def')))
209 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000211 def test_iziplongest(self):
212 for args in [
213 ['abc', range(6)],
214 [range(6), 'abc'],
215 [range(1000), range(2000,2100), range(3000,3050)],
216 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
217 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
218 ]:
219 target = map(None, *args)
220 self.assertEqual(list(izip_longest(*args)), target)
221 self.assertEqual(list(izip_longest(*args, **{})), target)
222 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
223 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000224
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000225 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
226
227 self.assertEqual(list(izip_longest()), zip())
228 self.assertEqual(list(izip_longest([])), zip([]))
229 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000230
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000231 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
232 self.assertRaises(TypeError, izip_longest, 3)
233 self.assertRaises(TypeError, izip_longest, range(3), 3)
234
235 for stmt in [
236 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000237 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000238 ]:
239 try:
240 eval(stmt, globals(), locals())
241 except TypeError:
242 pass
243 else:
244 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000245
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000246 # Check tuple re-use (implementation detail)
247 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
248 zip('abc', 'def'))
249 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
250 zip('abc', 'def'))
251 ids = map(id, izip_longest('abc', 'def'))
252 self.assertEqual(min(ids), max(ids))
253 ids = map(id, list(izip_longest('abc', 'def')))
254 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
255
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000256 def test_product(self):
257 for args, result in [
258 ([], []), # zero iterables ??? is this correct
259 (['ab'], [('a',), ('b',)]), # one iterable
260 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
261 ([range(0), range(2), range(3)], []), # first iterable with zero length
262 ([range(2), range(0), range(3)], []), # middle iterable with zero length
263 ([range(2), range(3), range(0)], []), # last iterable with zero length
264 ]:
265 self.assertEqual(list(product(*args)), result)
266 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
267 self.assertRaises(TypeError, product, range(6), None)
268 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
269 set('abcdefg'), range(11), tuple(range(13))]
270 for i in range(100):
271 args = [random.choice(argtypes) for j in range(random.randrange(5))]
272 n = reduce(operator.mul, map(len, args), 1) if args else 0
273 self.assertEqual(len(list(product(*args))), n)
274 args = map(iter, args)
275 self.assertEqual(len(list(product(*args))), n)
276
Raymond Hettinger73d79632008-02-23 02:20:41 +0000277 # Test implementation detail: tuple re-use
278 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
279 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000280
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000281 def test_repeat(self):
282 self.assertEqual(zip(xrange(3),repeat('a')),
283 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000284 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000285 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000286 self.assertEqual(list(repeat('a', 0)), [])
287 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000288 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000289 self.assertRaises(TypeError, repeat, None, 3, 4)
290 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000291 r = repeat(1+0j)
292 self.assertEqual(repr(r), 'repeat((1+0j))')
293 r = repeat(1+0j, 5)
294 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
295 list(r)
296 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000297
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000298 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000299 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
300 [0**1, 1**2, 2**3])
301 self.assertEqual(list(imap(None, 'abc', range(5))),
302 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000303 self.assertEqual(list(imap(None, 'abc', count())),
304 [('a',0),('b',1),('c',2)])
305 self.assertEqual(take(2,imap(None, 'abc', count())),
306 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000307 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000308 self.assertRaises(TypeError, imap)
309 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000310 self.assertRaises(TypeError, imap(10, range(5)).next)
311 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
312 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000313
314 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
316 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000317 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
318 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000319 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000320 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
321 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000322 self.assertRaises(TypeError, starmap)
323 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
324 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
325 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
326 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000327
328 def test_islice(self):
329 for args in [ # islice(args) should agree with range(args)
330 (10, 20, 3),
331 (10, 3, 20),
332 (10, 20),
333 (10, 3),
334 (20,)
335 ]:
336 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
337
338 for args, tgtargs in [ # Stop when seqn is exhausted
339 ((10, 110, 3), ((10, 100, 3))),
340 ((10, 110), ((10, 100))),
341 ((110,), (100,))
342 ]:
343 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
344
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000345 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000346 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000347 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
348 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000349 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
350 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
351
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000352 # Test number of items consumed SF #1171417
353 it = iter(range(10))
354 self.assertEqual(list(islice(it, 3)), range(3))
355 self.assertEqual(list(it), range(3, 10))
356
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000357 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000358 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000359 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
360 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
361 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
362 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
363 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000364 self.assertRaises(ValueError, islice, xrange(10), 'a')
365 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
366 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
367 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
368 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000369 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000370
371 def test_takewhile(self):
372 data = [1, 3, 5, 20, 2, 4, 6, 8]
373 underten = lambda x: x<10
374 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000375 self.assertEqual(list(takewhile(underten, [])), [])
376 self.assertRaises(TypeError, takewhile)
377 self.assertRaises(TypeError, takewhile, operator.pow)
378 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
379 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
380 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000381 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
382 self.assertEqual(list(t), [1, 1, 1])
383 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000384
385 def test_dropwhile(self):
386 data = [1, 3, 5, 20, 2, 4, 6, 8]
387 underten = lambda x: x<10
388 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000389 self.assertEqual(list(dropwhile(underten, [])), [])
390 self.assertRaises(TypeError, dropwhile)
391 self.assertRaises(TypeError, dropwhile, operator.pow)
392 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
393 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
394 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000395
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000396 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000397 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000398 def irange(n):
399 for i in xrange(n):
400 yield i
401
402 a, b = tee([]) # test empty iterator
403 self.assertEqual(list(a), [])
404 self.assertEqual(list(b), [])
405
406 a, b = tee(irange(n)) # test 100% interleaved
407 self.assertEqual(zip(a,b), zip(range(n),range(n)))
408
409 a, b = tee(irange(n)) # test 0% interleaved
410 self.assertEqual(list(a), range(n))
411 self.assertEqual(list(b), range(n))
412
413 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000414 for i in xrange(100):
415 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416 del a
417 self.assertEqual(list(b), range(n))
418
419 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000420 for i in xrange(100):
421 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000422 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000423 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000424
425 for j in xrange(5): # test randomly interleaved
426 order = [0]*n + [1]*n
427 random.shuffle(order)
428 lists = ([], [])
429 its = tee(irange(n))
430 for i in order:
431 value = its[i].next()
432 lists[i].append(value)
433 self.assertEqual(lists[0], range(n))
434 self.assertEqual(lists[1], range(n))
435
Raymond Hettingerad983e72003-11-12 14:32:26 +0000436 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000437 self.assertRaises(TypeError, tee)
438 self.assertRaises(TypeError, tee, 3)
439 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000440 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000441
Raymond Hettingerad983e72003-11-12 14:32:26 +0000442 # tee object should be instantiable
443 a, b = tee('abc')
444 c = type(a)('def')
445 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000446
Raymond Hettingerad983e72003-11-12 14:32:26 +0000447 # test long-lagged and multi-way split
448 a, b, c = tee(xrange(2000), 3)
449 for i in xrange(100):
450 self.assertEqual(a.next(), i)
451 self.assertEqual(list(b), range(2000))
452 self.assertEqual([c.next(), c.next()], range(2))
453 self.assertEqual(list(a), range(100,2000))
454 self.assertEqual(list(c), range(2,2000))
455
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000456 # test values of n
457 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000458 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000459 for n in xrange(5):
460 result = tee('abc', n)
461 self.assertEqual(type(result), tuple)
462 self.assertEqual(len(result), n)
463 self.assertEqual(map(list, result), [list('abc')]*n)
464
Raymond Hettingerad983e72003-11-12 14:32:26 +0000465 # tee pass-through to copyable iterator
466 a, b = tee('abc')
467 c, d = tee(a)
468 self.assert_(a is c)
469
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000470 # test tee_new
471 t1, t2 = tee('abc')
472 tnew = type(t1)
473 self.assertRaises(TypeError, tnew)
474 self.assertRaises(TypeError, tnew, 10)
475 t3 = tnew(t1)
476 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000477
Raymond Hettingera9f60922004-10-17 16:40:14 +0000478 # test that tee objects are weak referencable
479 a, b = tee(xrange(10))
480 p = proxy(a)
481 self.assertEqual(getattr(p, '__class__'), type(b))
482 del a
483 self.assertRaises(ReferenceError, getattr, p, '__class__')
484
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000485 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000486 self.assertRaises(StopIteration, izip().next)
487
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000488 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000489 self.assertRaises(StopIteration, f([]).next)
490 self.assertRaises(StopIteration, f(StopNow()).next)
491
492 self.assertRaises(StopIteration, islice([], None).next)
493 self.assertRaises(StopIteration, islice(StopNow(), None).next)
494
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000495 p, q = tee([])
496 self.assertRaises(StopIteration, p.next)
497 self.assertRaises(StopIteration, q.next)
498 p, q = tee(StopNow())
499 self.assertRaises(StopIteration, p.next)
500 self.assertRaises(StopIteration, q.next)
501
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000502 self.assertRaises(StopIteration, repeat(None, 0).next)
503
504 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
505 self.assertRaises(StopIteration, f(lambda x:x, []).next)
506 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
507
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000508class TestGC(unittest.TestCase):
509
510 def makecycle(self, iterator, container):
511 container.append(iterator)
512 iterator.next()
513 del container, iterator
514
515 def test_chain(self):
516 a = []
517 self.makecycle(chain(a), a)
518
519 def test_cycle(self):
520 a = []
521 self.makecycle(cycle([a]*2), a)
522
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000523 def test_dropwhile(self):
524 a = []
525 self.makecycle(dropwhile(bool, [0, a, a]), a)
526
527 def test_groupby(self):
528 a = []
529 self.makecycle(groupby([a]*2, lambda x:x), a)
530
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000531 def test_ifilter(self):
532 a = []
533 self.makecycle(ifilter(lambda x:True, [a]*2), a)
534
535 def test_ifilterfalse(self):
536 a = []
537 self.makecycle(ifilterfalse(lambda x:False, a), a)
538
539 def test_izip(self):
540 a = []
541 self.makecycle(izip([a]*2, [a]*3), a)
542
543 def test_imap(self):
544 a = []
545 self.makecycle(imap(lambda x:x, [a]*2), a)
546
547 def test_islice(self):
548 a = []
549 self.makecycle(islice([a]*2, None), a)
550
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000551 def test_repeat(self):
552 a = []
553 self.makecycle(repeat(a), a)
554
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000555 def test_starmap(self):
556 a = []
557 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
558
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000559 def test_takewhile(self):
560 a = []
561 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
562
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000563def R(seqn):
564 'Regular generator'
565 for i in seqn:
566 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000567
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000568class G:
569 'Sequence using __getitem__'
570 def __init__(self, seqn):
571 self.seqn = seqn
572 def __getitem__(self, i):
573 return self.seqn[i]
574
575class I:
576 'Sequence using iterator protocol'
577 def __init__(self, seqn):
578 self.seqn = seqn
579 self.i = 0
580 def __iter__(self):
581 return self
582 def next(self):
583 if self.i >= len(self.seqn): raise StopIteration
584 v = self.seqn[self.i]
585 self.i += 1
586 return v
587
588class Ig:
589 'Sequence using iterator protocol defined with a generator'
590 def __init__(self, seqn):
591 self.seqn = seqn
592 self.i = 0
593 def __iter__(self):
594 for val in self.seqn:
595 yield val
596
597class X:
598 'Missing __getitem__ and __iter__'
599 def __init__(self, seqn):
600 self.seqn = seqn
601 self.i = 0
602 def next(self):
603 if self.i >= len(self.seqn): raise StopIteration
604 v = self.seqn[self.i]
605 self.i += 1
606 return v
607
608class N:
609 'Iterator missing next()'
610 def __init__(self, seqn):
611 self.seqn = seqn
612 self.i = 0
613 def __iter__(self):
614 return self
615
616class E:
617 'Test propagation of exceptions'
618 def __init__(self, seqn):
619 self.seqn = seqn
620 self.i = 0
621 def __iter__(self):
622 return self
623 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000624 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000625
626class S:
627 'Test immediate stop'
628 def __init__(self, seqn):
629 pass
630 def __iter__(self):
631 return self
632 def next(self):
633 raise StopIteration
634
635def L(seqn):
636 'Test multiple tiers of iterators'
637 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
638
639
640class TestVariousIteratorArgs(unittest.TestCase):
641
642 def test_chain(self):
643 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
644 for g in (G, I, Ig, S, L, R):
645 self.assertEqual(list(chain(g(s))), list(g(s)))
646 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
647 self.assertRaises(TypeError, chain, X(s))
648 self.assertRaises(TypeError, list, chain(N(s)))
649 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
650
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000651 def test_product(self):
652 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
653 self.assertRaises(TypeError, product, X(s))
654 self.assertRaises(TypeError, product, N(s))
655 self.assertRaises(ZeroDivisionError, product, E(s))
656
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000657 def test_cycle(self):
658 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
659 for g in (G, I, Ig, S, L, R):
660 tgtlen = len(s) * 3
661 expected = list(g(s))*3
662 actual = list(islice(cycle(g(s)), tgtlen))
663 self.assertEqual(actual, expected)
664 self.assertRaises(TypeError, cycle, X(s))
665 self.assertRaises(TypeError, list, cycle(N(s)))
666 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
667
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000668 def test_groupby(self):
669 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
670 for g in (G, I, Ig, S, L, R):
671 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
672 self.assertRaises(TypeError, groupby, X(s))
673 self.assertRaises(TypeError, list, groupby(N(s)))
674 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
675
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000676 def test_ifilter(self):
677 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
678 for g in (G, I, Ig, S, L, R):
679 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
680 self.assertRaises(TypeError, ifilter, isEven, X(s))
681 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
682 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
683
684 def test_ifilterfalse(self):
685 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
686 for g in (G, I, Ig, S, L, R):
687 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
688 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
689 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
690 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
691
692 def test_izip(self):
693 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
694 for g in (G, I, Ig, S, L, R):
695 self.assertEqual(list(izip(g(s))), zip(g(s)))
696 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
697 self.assertRaises(TypeError, izip, X(s))
698 self.assertRaises(TypeError, list, izip(N(s)))
699 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
700
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000701 def test_iziplongest(self):
702 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
703 for g in (G, I, Ig, S, L, R):
704 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
705 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
706 self.assertRaises(TypeError, izip_longest, X(s))
707 self.assertRaises(TypeError, list, izip_longest(N(s)))
708 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
709
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000710 def test_imap(self):
711 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
712 for g in (G, I, Ig, S, L, R):
713 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
714 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
715 self.assertRaises(TypeError, imap, onearg, X(s))
716 self.assertRaises(TypeError, list, imap(onearg, N(s)))
717 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
718
719 def test_islice(self):
720 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
721 for g in (G, I, Ig, S, L, R):
722 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
723 self.assertRaises(TypeError, islice, X(s), 10)
724 self.assertRaises(TypeError, list, islice(N(s), 10))
725 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
726
727 def test_starmap(self):
728 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
729 for g in (G, I, Ig, S, L, R):
730 ss = zip(s, s)
731 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
732 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
733 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
734 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
735
736 def test_takewhile(self):
737 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
738 for g in (G, I, Ig, S, L, R):
739 tgt = []
740 for elem in g(s):
741 if not isEven(elem): break
742 tgt.append(elem)
743 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
744 self.assertRaises(TypeError, takewhile, isEven, X(s))
745 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
746 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
747
748 def test_dropwhile(self):
749 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
750 for g in (G, I, Ig, S, L, R):
751 tgt = []
752 for elem in g(s):
753 if not tgt and isOdd(elem): continue
754 tgt.append(elem)
755 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
756 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
757 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
758 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
759
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000760 def test_tee(self):
761 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
762 for g in (G, I, Ig, S, L, R):
763 it1, it2 = tee(g(s))
764 self.assertEqual(list(it1), list(g(s)))
765 self.assertEqual(list(it2), list(g(s)))
766 self.assertRaises(TypeError, tee, X(s))
767 self.assertRaises(TypeError, list, tee(N(s))[0])
768 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
769
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000770class LengthTransparency(unittest.TestCase):
771
772 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000773 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000774 self.assertEqual(len(repeat(None, 50)), 50)
775 self.assertRaises(TypeError, len, repeat(None))
776
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000777class RegressionTests(unittest.TestCase):
778
779 def test_sf_793826(self):
780 # Fix Armin Rigo's successful efforts to wreak havoc
781
782 def mutatingtuple(tuple1, f, tuple2):
783 # this builds a tuple t which is a copy of tuple1,
784 # then calls f(t), then mutates t to be equal to tuple2
785 # (needs len(tuple1) == len(tuple2)).
786 def g(value, first=[1]):
787 if first:
788 del first[:]
789 f(z.next())
790 return value
791 items = list(tuple2)
792 items[1:1] = list(tuple1)
793 gen = imap(g, items)
794 z = izip(*[gen]*len(tuple1))
795 z.next()
796
797 def f(t):
798 global T
799 T = t
800 first[:] = list(T)
801
802 first = []
803 mutatingtuple((1,2,3), f, (4,5,6))
804 second = list(T)
805 self.assertEqual(first, second)
806
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000807
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000808 def test_sf_950057(self):
809 # Make sure that chain() and cycle() catch exceptions immediately
810 # rather than when shifting between input sources
811
812 def gen1():
813 hist.append(0)
814 yield 1
815 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000816 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000817 hist.append(2)
818
819 def gen2(x):
820 hist.append(3)
821 yield 2
822 hist.append(4)
823 if x:
824 raise StopIteration
825
826 hist = []
827 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
828 self.assertEqual(hist, [0,1])
829
830 hist = []
831 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
832 self.assertEqual(hist, [0,1])
833
834 hist = []
835 self.assertRaises(AssertionError, list, cycle(gen1()))
836 self.assertEqual(hist, [0,1])
837
Georg Brandlb84c1372007-01-21 10:28:43 +0000838class SubclassWithKwargsTest(unittest.TestCase):
839 def test_keywords_in_subclass(self):
840 # count is not subclassable...
841 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
842 starmap, islice, takewhile, dropwhile, cycle):
843 class Subclass(cls):
844 def __init__(self, newarg=None, *args):
845 cls.__init__(self, *args)
846 try:
847 Subclass(newarg=1)
848 except TypeError, err:
849 # we expect type errors because of wrong argument count
850 self.failIf("does not take keyword arguments" in err.args[0])
851
852
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000853libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000854
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000855
856>>> amounts = [120.15, 764.05, 823.14]
857>>> for checknum, amount in izip(count(1200), amounts):
858... print 'Check %d is for $%.2f' % (checknum, amount)
859...
860Check 1200 is for $120.15
861Check 1201 is for $764.05
862Check 1202 is for $823.14
863
864>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000865>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
866... print cube
867...
8681
8698
87027
871
872>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000873>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000874... print name.title()
875...
876Alex
877Laura
878Martin
879Walter
880Samuele
881
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000882>>> from operator import itemgetter
883>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000884>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000885>>> for k, g in groupby(di, itemgetter(1)):
886... print k, map(itemgetter(0), g)
887...
8881 ['a', 'c', 'e']
8892 ['b', 'd', 'f']
8903 ['g']
891
Raymond Hettinger734fb572004-01-20 20:04:40 +0000892# Find runs of consecutive numbers using groupby. The key to the solution
893# is differencing with a range so that consecutive numbers all appear in
894# same group.
895>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
896>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
897... print map(operator.itemgetter(1), g)
898...
899[1]
900[4, 5, 6]
901[10]
902[15, 16, 17, 18]
903[22]
904[25, 26, 27, 28]
905
Raymond Hettingera098b332003-09-08 23:58:40 +0000906>>> def take(n, seq):
907... return list(islice(seq, n))
908
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000909>>> def enumerate(iterable):
910... return izip(count(), iterable)
911
912>>> def tabulate(function):
913... "Return function(0), function(1), ..."
914... return imap(function, count())
915
916>>> def iteritems(mapping):
917... return izip(mapping.iterkeys(), mapping.itervalues())
918
919>>> def nth(iterable, n):
920... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000921... return list(islice(iterable, n, n+1))
922
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000923>>> def all(seq, pred=None):
924... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000925... for elem in ifilterfalse(pred, seq):
926... return False
927... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000928
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000929>>> def any(seq, pred=None):
930... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000931... for elem in ifilter(pred, seq):
932... return True
933... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000934
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000935>>> def no(seq, pred=None):
936... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000937... for elem in ifilter(pred, seq):
938... return False
939... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000940
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000941>>> def quantify(seq, pred=None):
942... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000943... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000944
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000945>>> def padnone(seq):
946... "Returns the sequence elements and then returns None indefinitely"
947... return chain(seq, repeat(None))
948
949>>> def ncycles(seq, n):
950... "Returns the sequence elements n times"
951... return chain(*repeat(seq, n))
952
953>>> def dotproduct(vec1, vec2):
954... return sum(imap(operator.mul, vec1, vec2))
955
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000956>>> def flatten(listOfLists):
957... return list(chain(*listOfLists))
958
959>>> def repeatfunc(func, times=None, *args):
960... "Repeat calls to func with specified arguments."
961... " Example: repeatfunc(random.random)"
962... if times is None:
963... return starmap(func, repeat(args))
964... else:
965... return starmap(func, repeat(args, times))
966
Raymond Hettingerd591f662003-10-26 15:34:50 +0000967>>> def pairwise(iterable):
968... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
969... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000970... try:
971... b.next()
972... except StopIteration:
973... pass
974... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000975
976This is not part of the examples but it tests to make sure the definitions
977perform as purported.
978
Raymond Hettingera098b332003-09-08 23:58:40 +0000979>>> take(10, count())
980[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
981
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000982>>> list(enumerate('abc'))
983[(0, 'a'), (1, 'b'), (2, 'c')]
984
985>>> list(islice(tabulate(lambda x: 2*x), 4))
986[0, 2, 4, 6]
987
988>>> nth('abcde', 3)
989['d']
990
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000991>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000992True
993
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000994>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000995False
996
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000997>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000998True
999
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001000>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001001False
1002
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001003>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001004True
1005
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001006>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001007False
1008
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001009>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000101050
1011
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001012>>> a = [[1, 2, 3], [4, 5, 6]]
1013>>> flatten(a)
1014[1, 2, 3, 4, 5, 6]
1015
1016>>> list(repeatfunc(pow, 5, 2, 3))
1017[8, 8, 8, 8, 8]
1018
1019>>> import random
1020>>> take(5, imap(int, repeatfunc(random.random)))
1021[0, 0, 0, 0, 0]
1022
Raymond Hettingerd591f662003-10-26 15:34:50 +00001023>>> list(pairwise('abcd'))
1024[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001025
Raymond Hettingerd591f662003-10-26 15:34:50 +00001026>>> list(pairwise([]))
1027[]
1028
1029>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001030[]
1031
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001032>>> list(islice(padnone('abc'), 0, 6))
1033['a', 'b', 'c', None, None, None]
1034
1035>>> list(ncycles('abc', 3))
1036['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1037
1038>>> dotproduct([1,2,3], [4,5,6])
103932
1040
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001041"""
1042
1043__test__ = {'libreftest' : libreftest}
1044
1045def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001046 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001047 RegressionTests, LengthTransparency,
1048 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001049 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001050
1051 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001052 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001053 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001054 counts = [None] * 5
1055 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001056 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001057 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001058 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001059 print counts
1060
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001061 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001062 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001063
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001064if __name__ == "__main__":
1065 test_main(verbose=True)