blob: dc9081ec5aacbb23b5514b0e85e947b663c36a42 [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 Hettinger9d638372008-02-25 22:42:32 +0000174 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000175 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000176 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000177 self.assertRaises(TypeError, ifilter, lambda x:x)
178 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000179 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000180 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000181
182 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000183 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
184 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000185 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000186 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000187 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000188 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
189 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000190 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000191 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000192
193 def test_izip(self):
194 ans = [(x,y) for x, y in izip('abc',count())]
195 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000196 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
197 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000198 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000199 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000200 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000201 self.assertRaises(TypeError, izip, 3)
202 self.assertRaises(TypeError, izip, range(3), 3)
203 # Check tuple re-use (implementation detail)
204 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
205 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000206 self.assertEqual([pair for pair in izip('abc', 'def')],
207 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000208 ids = map(id, izip('abc', 'def'))
209 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000210 ids = map(id, list(izip('abc', 'def')))
211 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000212
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000213 def test_iziplongest(self):
214 for args in [
215 ['abc', range(6)],
216 [range(6), 'abc'],
217 [range(1000), range(2000,2100), range(3000,3050)],
218 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
219 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
220 ]:
221 target = map(None, *args)
222 self.assertEqual(list(izip_longest(*args)), target)
223 self.assertEqual(list(izip_longest(*args, **{})), target)
224 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
225 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000226
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000227 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
228
229 self.assertEqual(list(izip_longest()), zip())
230 self.assertEqual(list(izip_longest([])), zip([]))
231 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000232
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000233 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
234 self.assertRaises(TypeError, izip_longest, 3)
235 self.assertRaises(TypeError, izip_longest, range(3), 3)
236
237 for stmt in [
238 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000239 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000240 ]:
241 try:
242 eval(stmt, globals(), locals())
243 except TypeError:
244 pass
245 else:
246 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000247
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000248 # Check tuple re-use (implementation detail)
249 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
250 zip('abc', 'def'))
251 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
252 zip('abc', 'def'))
253 ids = map(id, izip_longest('abc', 'def'))
254 self.assertEqual(min(ids), max(ids))
255 ids = map(id, list(izip_longest('abc', 'def')))
256 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
257
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000258 def test_product(self):
259 for args, result in [
260 ([], []), # zero iterables ??? is this correct
261 (['ab'], [('a',), ('b',)]), # one iterable
262 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
263 ([range(0), range(2), range(3)], []), # first iterable with zero length
264 ([range(2), range(0), range(3)], []), # middle iterable with zero length
265 ([range(2), range(3), range(0)], []), # last iterable with zero length
266 ]:
267 self.assertEqual(list(product(*args)), result)
268 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
269 self.assertRaises(TypeError, product, range(6), None)
270 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
271 set('abcdefg'), range(11), tuple(range(13))]
272 for i in range(100):
273 args = [random.choice(argtypes) for j in range(random.randrange(5))]
274 n = reduce(operator.mul, map(len, args), 1) if args else 0
275 self.assertEqual(len(list(product(*args))), n)
276 args = map(iter, args)
277 self.assertEqual(len(list(product(*args))), n)
278
Raymond Hettinger73d79632008-02-23 02:20:41 +0000279 # Test implementation detail: tuple re-use
280 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
281 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000282
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000283 def test_repeat(self):
284 self.assertEqual(zip(xrange(3),repeat('a')),
285 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000286 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000287 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000288 self.assertEqual(list(repeat('a', 0)), [])
289 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000290 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000291 self.assertRaises(TypeError, repeat, None, 3, 4)
292 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000293 r = repeat(1+0j)
294 self.assertEqual(repr(r), 'repeat((1+0j))')
295 r = repeat(1+0j, 5)
296 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
297 list(r)
298 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000299
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000300 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000301 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
302 [0**1, 1**2, 2**3])
303 self.assertEqual(list(imap(None, 'abc', range(5))),
304 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000305 self.assertEqual(list(imap(None, 'abc', count())),
306 [('a',0),('b',1),('c',2)])
307 self.assertEqual(take(2,imap(None, 'abc', count())),
308 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000309 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000310 self.assertRaises(TypeError, imap)
311 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000312 self.assertRaises(TypeError, imap(10, range(5)).next)
313 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
314 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315
316 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000317 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
318 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000319 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
320 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000321 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000322 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
323 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000324 self.assertRaises(TypeError, starmap)
325 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
326 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
327 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
328 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000329
330 def test_islice(self):
331 for args in [ # islice(args) should agree with range(args)
332 (10, 20, 3),
333 (10, 3, 20),
334 (10, 20),
335 (10, 3),
336 (20,)
337 ]:
338 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
339
340 for args, tgtargs in [ # Stop when seqn is exhausted
341 ((10, 110, 3), ((10, 100, 3))),
342 ((10, 110), ((10, 100))),
343 ((110,), (100,))
344 ]:
345 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
346
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000347 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000348 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000349 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
350 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000351 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
352 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
353
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000354 # Test number of items consumed SF #1171417
355 it = iter(range(10))
356 self.assertEqual(list(islice(it, 3)), range(3))
357 self.assertEqual(list(it), range(3, 10))
358
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000359 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000360 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000361 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
362 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
363 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
364 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
365 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000366 self.assertRaises(ValueError, islice, xrange(10), 'a')
367 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
368 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
369 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
370 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000371 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000372
373 def test_takewhile(self):
374 data = [1, 3, 5, 20, 2, 4, 6, 8]
375 underten = lambda x: x<10
376 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000377 self.assertEqual(list(takewhile(underten, [])), [])
378 self.assertRaises(TypeError, takewhile)
379 self.assertRaises(TypeError, takewhile, operator.pow)
380 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
381 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
382 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000383 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
384 self.assertEqual(list(t), [1, 1, 1])
385 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000386
387 def test_dropwhile(self):
388 data = [1, 3, 5, 20, 2, 4, 6, 8]
389 underten = lambda x: x<10
390 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000391 self.assertEqual(list(dropwhile(underten, [])), [])
392 self.assertRaises(TypeError, dropwhile)
393 self.assertRaises(TypeError, dropwhile, operator.pow)
394 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
395 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
396 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000397
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000398 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000399 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000400 def irange(n):
401 for i in xrange(n):
402 yield i
403
404 a, b = tee([]) # test empty iterator
405 self.assertEqual(list(a), [])
406 self.assertEqual(list(b), [])
407
408 a, b = tee(irange(n)) # test 100% interleaved
409 self.assertEqual(zip(a,b), zip(range(n),range(n)))
410
411 a, b = tee(irange(n)) # test 0% interleaved
412 self.assertEqual(list(a), range(n))
413 self.assertEqual(list(b), range(n))
414
415 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000416 for i in xrange(100):
417 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000418 del a
419 self.assertEqual(list(b), range(n))
420
421 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000422 for i in xrange(100):
423 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000424 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000425 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000426
427 for j in xrange(5): # test randomly interleaved
428 order = [0]*n + [1]*n
429 random.shuffle(order)
430 lists = ([], [])
431 its = tee(irange(n))
432 for i in order:
433 value = its[i].next()
434 lists[i].append(value)
435 self.assertEqual(lists[0], range(n))
436 self.assertEqual(lists[1], range(n))
437
Raymond Hettingerad983e72003-11-12 14:32:26 +0000438 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000439 self.assertRaises(TypeError, tee)
440 self.assertRaises(TypeError, tee, 3)
441 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000442 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000443
Raymond Hettingerad983e72003-11-12 14:32:26 +0000444 # tee object should be instantiable
445 a, b = tee('abc')
446 c = type(a)('def')
447 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000448
Raymond Hettingerad983e72003-11-12 14:32:26 +0000449 # test long-lagged and multi-way split
450 a, b, c = tee(xrange(2000), 3)
451 for i in xrange(100):
452 self.assertEqual(a.next(), i)
453 self.assertEqual(list(b), range(2000))
454 self.assertEqual([c.next(), c.next()], range(2))
455 self.assertEqual(list(a), range(100,2000))
456 self.assertEqual(list(c), range(2,2000))
457
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000458 # test values of n
459 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000460 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000461 for n in xrange(5):
462 result = tee('abc', n)
463 self.assertEqual(type(result), tuple)
464 self.assertEqual(len(result), n)
465 self.assertEqual(map(list, result), [list('abc')]*n)
466
Raymond Hettingerad983e72003-11-12 14:32:26 +0000467 # tee pass-through to copyable iterator
468 a, b = tee('abc')
469 c, d = tee(a)
470 self.assert_(a is c)
471
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000472 # test tee_new
473 t1, t2 = tee('abc')
474 tnew = type(t1)
475 self.assertRaises(TypeError, tnew)
476 self.assertRaises(TypeError, tnew, 10)
477 t3 = tnew(t1)
478 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000479
Raymond Hettingera9f60922004-10-17 16:40:14 +0000480 # test that tee objects are weak referencable
481 a, b = tee(xrange(10))
482 p = proxy(a)
483 self.assertEqual(getattr(p, '__class__'), type(b))
484 del a
485 self.assertRaises(ReferenceError, getattr, p, '__class__')
486
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000487 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000488 self.assertRaises(StopIteration, izip().next)
489
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000490 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000491 self.assertRaises(StopIteration, f([]).next)
492 self.assertRaises(StopIteration, f(StopNow()).next)
493
494 self.assertRaises(StopIteration, islice([], None).next)
495 self.assertRaises(StopIteration, islice(StopNow(), None).next)
496
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000497 p, q = tee([])
498 self.assertRaises(StopIteration, p.next)
499 self.assertRaises(StopIteration, q.next)
500 p, q = tee(StopNow())
501 self.assertRaises(StopIteration, p.next)
502 self.assertRaises(StopIteration, q.next)
503
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000504 self.assertRaises(StopIteration, repeat(None, 0).next)
505
506 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
507 self.assertRaises(StopIteration, f(lambda x:x, []).next)
508 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
509
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000510class TestGC(unittest.TestCase):
511
512 def makecycle(self, iterator, container):
513 container.append(iterator)
514 iterator.next()
515 del container, iterator
516
517 def test_chain(self):
518 a = []
519 self.makecycle(chain(a), a)
520
521 def test_cycle(self):
522 a = []
523 self.makecycle(cycle([a]*2), a)
524
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000525 def test_dropwhile(self):
526 a = []
527 self.makecycle(dropwhile(bool, [0, a, a]), a)
528
529 def test_groupby(self):
530 a = []
531 self.makecycle(groupby([a]*2, lambda x:x), a)
532
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000533 def test_ifilter(self):
534 a = []
535 self.makecycle(ifilter(lambda x:True, [a]*2), a)
536
537 def test_ifilterfalse(self):
538 a = []
539 self.makecycle(ifilterfalse(lambda x:False, a), a)
540
541 def test_izip(self):
542 a = []
543 self.makecycle(izip([a]*2, [a]*3), a)
544
545 def test_imap(self):
546 a = []
547 self.makecycle(imap(lambda x:x, [a]*2), a)
548
549 def test_islice(self):
550 a = []
551 self.makecycle(islice([a]*2, None), a)
552
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000553 def test_repeat(self):
554 a = []
555 self.makecycle(repeat(a), a)
556
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000557 def test_starmap(self):
558 a = []
559 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
560
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000561 def test_takewhile(self):
562 a = []
563 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
564
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000565def R(seqn):
566 'Regular generator'
567 for i in seqn:
568 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000569
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000570class G:
571 'Sequence using __getitem__'
572 def __init__(self, seqn):
573 self.seqn = seqn
574 def __getitem__(self, i):
575 return self.seqn[i]
576
577class I:
578 'Sequence using iterator protocol'
579 def __init__(self, seqn):
580 self.seqn = seqn
581 self.i = 0
582 def __iter__(self):
583 return self
584 def next(self):
585 if self.i >= len(self.seqn): raise StopIteration
586 v = self.seqn[self.i]
587 self.i += 1
588 return v
589
590class Ig:
591 'Sequence using iterator protocol defined with a generator'
592 def __init__(self, seqn):
593 self.seqn = seqn
594 self.i = 0
595 def __iter__(self):
596 for val in self.seqn:
597 yield val
598
599class X:
600 'Missing __getitem__ and __iter__'
601 def __init__(self, seqn):
602 self.seqn = seqn
603 self.i = 0
604 def next(self):
605 if self.i >= len(self.seqn): raise StopIteration
606 v = self.seqn[self.i]
607 self.i += 1
608 return v
609
610class N:
611 'Iterator missing next()'
612 def __init__(self, seqn):
613 self.seqn = seqn
614 self.i = 0
615 def __iter__(self):
616 return self
617
618class E:
619 'Test propagation of exceptions'
620 def __init__(self, seqn):
621 self.seqn = seqn
622 self.i = 0
623 def __iter__(self):
624 return self
625 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000626 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000627
628class S:
629 'Test immediate stop'
630 def __init__(self, seqn):
631 pass
632 def __iter__(self):
633 return self
634 def next(self):
635 raise StopIteration
636
637def L(seqn):
638 'Test multiple tiers of iterators'
639 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
640
641
642class TestVariousIteratorArgs(unittest.TestCase):
643
644 def test_chain(self):
645 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
646 for g in (G, I, Ig, S, L, R):
647 self.assertEqual(list(chain(g(s))), list(g(s)))
648 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
649 self.assertRaises(TypeError, chain, X(s))
650 self.assertRaises(TypeError, list, chain(N(s)))
651 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
652
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000653 def test_product(self):
654 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
655 self.assertRaises(TypeError, product, X(s))
656 self.assertRaises(TypeError, product, N(s))
657 self.assertRaises(ZeroDivisionError, product, E(s))
658
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000659 def test_cycle(self):
660 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
661 for g in (G, I, Ig, S, L, R):
662 tgtlen = len(s) * 3
663 expected = list(g(s))*3
664 actual = list(islice(cycle(g(s)), tgtlen))
665 self.assertEqual(actual, expected)
666 self.assertRaises(TypeError, cycle, X(s))
667 self.assertRaises(TypeError, list, cycle(N(s)))
668 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
669
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000670 def test_groupby(self):
671 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
672 for g in (G, I, Ig, S, L, R):
673 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
674 self.assertRaises(TypeError, groupby, X(s))
675 self.assertRaises(TypeError, list, groupby(N(s)))
676 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
677
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000678 def test_ifilter(self):
679 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
680 for g in (G, I, Ig, S, L, R):
681 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
682 self.assertRaises(TypeError, ifilter, isEven, X(s))
683 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
684 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
685
686 def test_ifilterfalse(self):
687 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
688 for g in (G, I, Ig, S, L, R):
689 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
690 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
691 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
692 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
693
694 def test_izip(self):
695 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
696 for g in (G, I, Ig, S, L, R):
697 self.assertEqual(list(izip(g(s))), zip(g(s)))
698 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
699 self.assertRaises(TypeError, izip, X(s))
700 self.assertRaises(TypeError, list, izip(N(s)))
701 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
702
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000703 def test_iziplongest(self):
704 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
705 for g in (G, I, Ig, S, L, R):
706 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
707 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
708 self.assertRaises(TypeError, izip_longest, X(s))
709 self.assertRaises(TypeError, list, izip_longest(N(s)))
710 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
711
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000712 def test_imap(self):
713 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
714 for g in (G, I, Ig, S, L, R):
715 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
716 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
717 self.assertRaises(TypeError, imap, onearg, X(s))
718 self.assertRaises(TypeError, list, imap(onearg, N(s)))
719 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
720
721 def test_islice(self):
722 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
723 for g in (G, I, Ig, S, L, R):
724 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
725 self.assertRaises(TypeError, islice, X(s), 10)
726 self.assertRaises(TypeError, list, islice(N(s), 10))
727 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
728
729 def test_starmap(self):
730 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
731 for g in (G, I, Ig, S, L, R):
732 ss = zip(s, s)
733 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
734 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
735 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
736 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
737
738 def test_takewhile(self):
739 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
740 for g in (G, I, Ig, S, L, R):
741 tgt = []
742 for elem in g(s):
743 if not isEven(elem): break
744 tgt.append(elem)
745 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
746 self.assertRaises(TypeError, takewhile, isEven, X(s))
747 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
748 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
749
750 def test_dropwhile(self):
751 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
752 for g in (G, I, Ig, S, L, R):
753 tgt = []
754 for elem in g(s):
755 if not tgt and isOdd(elem): continue
756 tgt.append(elem)
757 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
758 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
759 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
760 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
761
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000762 def test_tee(self):
763 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
764 for g in (G, I, Ig, S, L, R):
765 it1, it2 = tee(g(s))
766 self.assertEqual(list(it1), list(g(s)))
767 self.assertEqual(list(it2), list(g(s)))
768 self.assertRaises(TypeError, tee, X(s))
769 self.assertRaises(TypeError, list, tee(N(s))[0])
770 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
771
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000772class LengthTransparency(unittest.TestCase):
773
774 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000775 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000776 self.assertEqual(len(repeat(None, 50)), 50)
777 self.assertRaises(TypeError, len, repeat(None))
778
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000779class RegressionTests(unittest.TestCase):
780
781 def test_sf_793826(self):
782 # Fix Armin Rigo's successful efforts to wreak havoc
783
784 def mutatingtuple(tuple1, f, tuple2):
785 # this builds a tuple t which is a copy of tuple1,
786 # then calls f(t), then mutates t to be equal to tuple2
787 # (needs len(tuple1) == len(tuple2)).
788 def g(value, first=[1]):
789 if first:
790 del first[:]
791 f(z.next())
792 return value
793 items = list(tuple2)
794 items[1:1] = list(tuple1)
795 gen = imap(g, items)
796 z = izip(*[gen]*len(tuple1))
797 z.next()
798
799 def f(t):
800 global T
801 T = t
802 first[:] = list(T)
803
804 first = []
805 mutatingtuple((1,2,3), f, (4,5,6))
806 second = list(T)
807 self.assertEqual(first, second)
808
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000809
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000810 def test_sf_950057(self):
811 # Make sure that chain() and cycle() catch exceptions immediately
812 # rather than when shifting between input sources
813
814 def gen1():
815 hist.append(0)
816 yield 1
817 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000818 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000819 hist.append(2)
820
821 def gen2(x):
822 hist.append(3)
823 yield 2
824 hist.append(4)
825 if x:
826 raise StopIteration
827
828 hist = []
829 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
830 self.assertEqual(hist, [0,1])
831
832 hist = []
833 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
834 self.assertEqual(hist, [0,1])
835
836 hist = []
837 self.assertRaises(AssertionError, list, cycle(gen1()))
838 self.assertEqual(hist, [0,1])
839
Georg Brandlb84c1372007-01-21 10:28:43 +0000840class SubclassWithKwargsTest(unittest.TestCase):
841 def test_keywords_in_subclass(self):
842 # count is not subclassable...
843 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
844 starmap, islice, takewhile, dropwhile, cycle):
845 class Subclass(cls):
846 def __init__(self, newarg=None, *args):
847 cls.__init__(self, *args)
848 try:
849 Subclass(newarg=1)
850 except TypeError, err:
851 # we expect type errors because of wrong argument count
852 self.failIf("does not take keyword arguments" in err.args[0])
853
854
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000855libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000856
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000857
858>>> amounts = [120.15, 764.05, 823.14]
859>>> for checknum, amount in izip(count(1200), amounts):
860... print 'Check %d is for $%.2f' % (checknum, amount)
861...
862Check 1200 is for $120.15
863Check 1201 is for $764.05
864Check 1202 is for $823.14
865
866>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000867>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
868... print cube
869...
8701
8718
87227
873
874>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000875>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000876... print name.title()
877...
878Alex
879Laura
880Martin
881Walter
882Samuele
883
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000884>>> from operator import itemgetter
885>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000886>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000887>>> for k, g in groupby(di, itemgetter(1)):
888... print k, map(itemgetter(0), g)
889...
8901 ['a', 'c', 'e']
8912 ['b', 'd', 'f']
8923 ['g']
893
Raymond Hettinger734fb572004-01-20 20:04:40 +0000894# Find runs of consecutive numbers using groupby. The key to the solution
895# is differencing with a range so that consecutive numbers all appear in
896# same group.
897>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
898>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
899... print map(operator.itemgetter(1), g)
900...
901[1]
902[4, 5, 6]
903[10]
904[15, 16, 17, 18]
905[22]
906[25, 26, 27, 28]
907
Raymond Hettingera098b332003-09-08 23:58:40 +0000908>>> def take(n, seq):
909... return list(islice(seq, n))
910
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000911>>> def enumerate(iterable):
912... return izip(count(), iterable)
913
914>>> def tabulate(function):
915... "Return function(0), function(1), ..."
916... return imap(function, count())
917
918>>> def iteritems(mapping):
919... return izip(mapping.iterkeys(), mapping.itervalues())
920
921>>> def nth(iterable, n):
922... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000923... return list(islice(iterable, n, n+1))
924
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000925>>> def all(seq, pred=None):
926... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000927... for elem in ifilterfalse(pred, seq):
928... return False
929... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000930
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000931>>> def any(seq, pred=None):
932... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000933... for elem in ifilter(pred, seq):
934... return True
935... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000936
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000937>>> def no(seq, pred=None):
938... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000939... for elem in ifilter(pred, seq):
940... return False
941... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000942
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000943>>> def quantify(seq, pred=None):
944... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000945... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000946
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000947>>> def padnone(seq):
948... "Returns the sequence elements and then returns None indefinitely"
949... return chain(seq, repeat(None))
950
951>>> def ncycles(seq, n):
952... "Returns the sequence elements n times"
953... return chain(*repeat(seq, n))
954
955>>> def dotproduct(vec1, vec2):
956... return sum(imap(operator.mul, vec1, vec2))
957
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000958>>> def flatten(listOfLists):
959... return list(chain(*listOfLists))
960
961>>> def repeatfunc(func, times=None, *args):
962... "Repeat calls to func with specified arguments."
963... " Example: repeatfunc(random.random)"
964... if times is None:
965... return starmap(func, repeat(args))
966... else:
967... return starmap(func, repeat(args, times))
968
Raymond Hettingerd591f662003-10-26 15:34:50 +0000969>>> def pairwise(iterable):
970... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
971... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000972... try:
973... b.next()
974... except StopIteration:
975... pass
976... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000977
978This is not part of the examples but it tests to make sure the definitions
979perform as purported.
980
Raymond Hettingera098b332003-09-08 23:58:40 +0000981>>> take(10, count())
982[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
983
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000984>>> list(enumerate('abc'))
985[(0, 'a'), (1, 'b'), (2, 'c')]
986
987>>> list(islice(tabulate(lambda x: 2*x), 4))
988[0, 2, 4, 6]
989
990>>> nth('abcde', 3)
991['d']
992
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000993>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000994True
995
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000996>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000997False
998
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000999>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001000True
1001
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001002>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001003False
1004
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001005>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001006True
1007
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001008>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001009False
1010
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001011>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000101250
1013
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001014>>> a = [[1, 2, 3], [4, 5, 6]]
1015>>> flatten(a)
1016[1, 2, 3, 4, 5, 6]
1017
1018>>> list(repeatfunc(pow, 5, 2, 3))
1019[8, 8, 8, 8, 8]
1020
1021>>> import random
1022>>> take(5, imap(int, repeatfunc(random.random)))
1023[0, 0, 0, 0, 0]
1024
Raymond Hettingerd591f662003-10-26 15:34:50 +00001025>>> list(pairwise('abcd'))
1026[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001027
Raymond Hettingerd591f662003-10-26 15:34:50 +00001028>>> list(pairwise([]))
1029[]
1030
1031>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001032[]
1033
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001034>>> list(islice(padnone('abc'), 0, 6))
1035['a', 'b', 'c', None, None, None]
1036
1037>>> list(ncycles('abc', 3))
1038['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1039
1040>>> dotproduct([1,2,3], [4,5,6])
104132
1042
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001043"""
1044
1045__test__ = {'libreftest' : libreftest}
1046
1047def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001048 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001049 RegressionTests, LengthTransparency,
1050 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001051 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001052
1053 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001054 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001055 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001056 counts = [None] * 5
1057 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001058 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001059 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001060 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001061 print counts
1062
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001063 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001064 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001065
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001066if __name__ == "__main__":
1067 test_main(verbose=True)