blob: e949cf6ce76ceec1a09768a7dc98b5a5816e3f72 [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ónsson7bca0272007-05-07 13:33:39 +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 Hettinger96ef8112003-02-01 00:10:11 +000055 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000056 self.assertRaises(TypeError, count, 'a')
Kristján Valur Jónsson7bca0272007-05-07 13:33:39 +000057 self.assertRaises(OverflowError, list, islice(count(maxsize-5), 10))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000058 c = count(3)
59 self.assertEqual(repr(c), 'count(3)')
60 c.next()
61 self.assertEqual(repr(c), 'count(4)')
Jack Diederich187e6482006-09-21 18:32:11 +000062 c = count(-9)
63 self.assertEqual(repr(c), 'count(-9)')
64 c.next()
65 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000066
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000067 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000068 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000069 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000070 self.assertRaises(TypeError, cycle)
71 self.assertRaises(TypeError, cycle, 5)
72 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000073
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000074 def test_groupby(self):
75 # Check whether it accepts arguments correctly
76 self.assertEqual([], list(groupby([])))
77 self.assertEqual([], list(groupby([], key=id)))
78 self.assertRaises(TypeError, list, groupby('abc', []))
79 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000080 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000081
82 # Check normal input
83 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
84 (2,15,22), (3,16,23), (3,17,23)]
85 dup = []
86 for k, g in groupby(s, lambda r:r[0]):
87 for elem in g:
88 self.assertEqual(k, elem[0])
89 dup.append(elem)
90 self.assertEqual(s, dup)
91
92 # Check nested case
93 dup = []
94 for k, g in groupby(s, lambda r:r[0]):
95 for ik, ig in groupby(g, lambda r:r[2]):
96 for elem in ig:
97 self.assertEqual(k, elem[0])
98 self.assertEqual(ik, elem[2])
99 dup.append(elem)
100 self.assertEqual(s, dup)
101
102 # Check case where inner iterator is not used
103 keys = [k for k, g in groupby(s, lambda r:r[0])]
104 expectedkeys = set([r[0] for r in s])
105 self.assertEqual(set(keys), expectedkeys)
106 self.assertEqual(len(keys), len(expectedkeys))
107
108 # Exercise pipes and filters style
109 s = 'abracadabra'
110 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000111 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000112 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
113 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000114 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000115 self.assertEqual(r, ['a', 'b', 'r'])
116 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000117 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000118 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
119 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000120 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000121 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
122
123 # iter.next failure
124 class ExpectedError(Exception):
125 pass
126 def delayed_raise(n=0):
127 for i in range(n):
128 yield 'yo'
129 raise ExpectedError
130 def gulp(iterable, keyp=None, func=list):
131 return [func(g) for k, g in groupby(iterable, keyp)]
132
133 # iter.next failure on outer object
134 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
135 # iter.next failure on inner object
136 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
137
138 # __cmp__ failure
139 class DummyCmp:
140 def __cmp__(self, dst):
141 raise ExpectedError
142 s = [DummyCmp(), DummyCmp(), None]
143
144 # __cmp__ failure on outer object
145 self.assertRaises(ExpectedError, gulp, s, func=id)
146 # __cmp__ failure on inner object
147 self.assertRaises(ExpectedError, gulp, s)
148
149 # keyfunc failure
150 def keyfunc(obj):
151 if keyfunc.skip > 0:
152 keyfunc.skip -= 1
153 return obj
154 else:
155 raise ExpectedError
156
157 # keyfunc failure on outer object
158 keyfunc.skip = 0
159 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
160 keyfunc.skip = 1
161 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
162
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000163 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000164 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000166 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000167 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000168 self.assertRaises(TypeError, ifilter, lambda x:x)
169 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000170 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000171 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000172
173 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000174 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
175 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000176 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000177 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000178 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
179 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000181 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000182
183 def test_izip(self):
184 ans = [(x,y) for x, y in izip('abc',count())]
185 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
187 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000188 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000190 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000191 self.assertRaises(TypeError, izip, 3)
192 self.assertRaises(TypeError, izip, range(3), 3)
193 # Check tuple re-use (implementation detail)
194 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
195 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000196 self.assertEqual([pair for pair in izip('abc', 'def')],
197 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000198 ids = map(id, izip('abc', 'def'))
199 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000200 ids = map(id, list(izip('abc', 'def')))
201 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000202
203 def test_repeat(self):
204 self.assertEqual(zip(xrange(3),repeat('a')),
205 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000206 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000207 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000208 self.assertEqual(list(repeat('a', 0)), [])
209 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000211 self.assertRaises(TypeError, repeat, None, 3, 4)
212 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000213 r = repeat(1+0j)
214 self.assertEqual(repr(r), 'repeat((1+0j))')
215 r = repeat(1+0j, 5)
216 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
217 list(r)
218 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000219
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000220 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000221 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
222 [0**1, 1**2, 2**3])
223 self.assertEqual(list(imap(None, 'abc', range(5))),
224 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000225 self.assertEqual(list(imap(None, 'abc', count())),
226 [('a',0),('b',1),('c',2)])
227 self.assertEqual(take(2,imap(None, 'abc', count())),
228 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000229 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000230 self.assertRaises(TypeError, imap)
231 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000232 self.assertRaises(TypeError, imap(10, range(5)).next)
233 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
234 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000235
236 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000237 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
238 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000239 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
240 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000241 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000242 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000243 self.assertRaises(TypeError, starmap)
244 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
245 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
246 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
247 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000248
249 def test_islice(self):
250 for args in [ # islice(args) should agree with range(args)
251 (10, 20, 3),
252 (10, 3, 20),
253 (10, 20),
254 (10, 3),
255 (20,)
256 ]:
257 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
258
259 for args, tgtargs in [ # Stop when seqn is exhausted
260 ((10, 110, 3), ((10, 100, 3))),
261 ((10, 110), ((10, 100))),
262 ((110,), (100,))
263 ]:
264 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
265
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000266 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000267 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000268 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
269 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000270 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
271 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
272
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000273 # Test number of items consumed SF #1171417
274 it = iter(range(10))
275 self.assertEqual(list(islice(it, 3)), range(3))
276 self.assertEqual(list(it), range(3, 10))
277
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000278 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000279 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000280 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
281 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
282 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
283 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
284 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000285 self.assertRaises(ValueError, islice, xrange(10), 'a')
286 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
287 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
288 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
289 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson7bca0272007-05-07 13:33:39 +0000290 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000291
292 def test_takewhile(self):
293 data = [1, 3, 5, 20, 2, 4, 6, 8]
294 underten = lambda x: x<10
295 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000296 self.assertEqual(list(takewhile(underten, [])), [])
297 self.assertRaises(TypeError, takewhile)
298 self.assertRaises(TypeError, takewhile, operator.pow)
299 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
300 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
301 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000302 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
303 self.assertEqual(list(t), [1, 1, 1])
304 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000305
306 def test_dropwhile(self):
307 data = [1, 3, 5, 20, 2, 4, 6, 8]
308 underten = lambda x: x<10
309 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000310 self.assertEqual(list(dropwhile(underten, [])), [])
311 self.assertRaises(TypeError, dropwhile)
312 self.assertRaises(TypeError, dropwhile, operator.pow)
313 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
314 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
315 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000316
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000317 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000318 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000319 def irange(n):
320 for i in xrange(n):
321 yield i
322
323 a, b = tee([]) # test empty iterator
324 self.assertEqual(list(a), [])
325 self.assertEqual(list(b), [])
326
327 a, b = tee(irange(n)) # test 100% interleaved
328 self.assertEqual(zip(a,b), zip(range(n),range(n)))
329
330 a, b = tee(irange(n)) # test 0% interleaved
331 self.assertEqual(list(a), range(n))
332 self.assertEqual(list(b), range(n))
333
334 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000335 for i in xrange(100):
336 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000337 del a
338 self.assertEqual(list(b), range(n))
339
340 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000341 for i in xrange(100):
342 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000343 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000344 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000345
346 for j in xrange(5): # test randomly interleaved
347 order = [0]*n + [1]*n
348 random.shuffle(order)
349 lists = ([], [])
350 its = tee(irange(n))
351 for i in order:
352 value = its[i].next()
353 lists[i].append(value)
354 self.assertEqual(lists[0], range(n))
355 self.assertEqual(lists[1], range(n))
356
Raymond Hettingerad983e72003-11-12 14:32:26 +0000357 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000358 self.assertRaises(TypeError, tee)
359 self.assertRaises(TypeError, tee, 3)
360 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000361 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000362
Raymond Hettingerad983e72003-11-12 14:32:26 +0000363 # tee object should be instantiable
364 a, b = tee('abc')
365 c = type(a)('def')
366 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000367
Raymond Hettingerad983e72003-11-12 14:32:26 +0000368 # test long-lagged and multi-way split
369 a, b, c = tee(xrange(2000), 3)
370 for i in xrange(100):
371 self.assertEqual(a.next(), i)
372 self.assertEqual(list(b), range(2000))
373 self.assertEqual([c.next(), c.next()], range(2))
374 self.assertEqual(list(a), range(100,2000))
375 self.assertEqual(list(c), range(2,2000))
376
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000377 # test values of n
378 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz7ae5f292006-09-05 02:30:10 +0000379 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000380 for n in xrange(5):
381 result = tee('abc', n)
382 self.assertEqual(type(result), tuple)
383 self.assertEqual(len(result), n)
384 self.assertEqual(map(list, result), [list('abc')]*n)
385
Raymond Hettingerad983e72003-11-12 14:32:26 +0000386 # tee pass-through to copyable iterator
387 a, b = tee('abc')
388 c, d = tee(a)
389 self.assert_(a is c)
390
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000391 # test tee_new
392 t1, t2 = tee('abc')
393 tnew = type(t1)
394 self.assertRaises(TypeError, tnew)
395 self.assertRaises(TypeError, tnew, 10)
396 t3 = tnew(t1)
397 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000398
Raymond Hettingera9f60922004-10-17 16:40:14 +0000399 # test that tee objects are weak referencable
400 a, b = tee(xrange(10))
401 p = proxy(a)
402 self.assertEqual(getattr(p, '__class__'), type(b))
403 del a
404 self.assertRaises(ReferenceError, getattr, p, '__class__')
405
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000406 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000407 self.assertRaises(StopIteration, izip().next)
408
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000409 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000410 self.assertRaises(StopIteration, f([]).next)
411 self.assertRaises(StopIteration, f(StopNow()).next)
412
413 self.assertRaises(StopIteration, islice([], None).next)
414 self.assertRaises(StopIteration, islice(StopNow(), None).next)
415
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416 p, q = tee([])
417 self.assertRaises(StopIteration, p.next)
418 self.assertRaises(StopIteration, q.next)
419 p, q = tee(StopNow())
420 self.assertRaises(StopIteration, p.next)
421 self.assertRaises(StopIteration, q.next)
422
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000423 self.assertRaises(StopIteration, repeat(None, 0).next)
424
425 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
426 self.assertRaises(StopIteration, f(lambda x:x, []).next)
427 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
428
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000429class TestGC(unittest.TestCase):
430
431 def makecycle(self, iterator, container):
432 container.append(iterator)
433 iterator.next()
434 del container, iterator
435
436 def test_chain(self):
437 a = []
438 self.makecycle(chain(a), a)
439
440 def test_cycle(self):
441 a = []
442 self.makecycle(cycle([a]*2), a)
443
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000444 def test_dropwhile(self):
445 a = []
446 self.makecycle(dropwhile(bool, [0, a, a]), a)
447
448 def test_groupby(self):
449 a = []
450 self.makecycle(groupby([a]*2, lambda x:x), a)
451
Raymond Hettinger3662c902008-03-06 22:58:42 +0000452 def test_issue2246(self):
453 # Issue 2246 -- the _grouper iterator was not included in GC
454 n = 10
455 keyfunc = lambda x: x
456 for i, j in groupby(xrange(n), key=keyfunc):
457 keyfunc.__dict__.setdefault('x',[]).append(j)
458
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000459 def test_ifilter(self):
460 a = []
461 self.makecycle(ifilter(lambda x:True, [a]*2), a)
462
463 def test_ifilterfalse(self):
464 a = []
465 self.makecycle(ifilterfalse(lambda x:False, a), a)
466
467 def test_izip(self):
468 a = []
469 self.makecycle(izip([a]*2, [a]*3), a)
470
471 def test_imap(self):
472 a = []
473 self.makecycle(imap(lambda x:x, [a]*2), a)
474
475 def test_islice(self):
476 a = []
477 self.makecycle(islice([a]*2, None), a)
478
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000479 def test_repeat(self):
480 a = []
481 self.makecycle(repeat(a), a)
482
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000483 def test_starmap(self):
484 a = []
485 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
486
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000487 def test_takewhile(self):
488 a = []
489 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
490
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000491def R(seqn):
492 'Regular generator'
493 for i in seqn:
494 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000495
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000496class G:
497 'Sequence using __getitem__'
498 def __init__(self, seqn):
499 self.seqn = seqn
500 def __getitem__(self, i):
501 return self.seqn[i]
502
503class I:
504 'Sequence using iterator protocol'
505 def __init__(self, seqn):
506 self.seqn = seqn
507 self.i = 0
508 def __iter__(self):
509 return self
510 def next(self):
511 if self.i >= len(self.seqn): raise StopIteration
512 v = self.seqn[self.i]
513 self.i += 1
514 return v
515
516class Ig:
517 'Sequence using iterator protocol defined with a generator'
518 def __init__(self, seqn):
519 self.seqn = seqn
520 self.i = 0
521 def __iter__(self):
522 for val in self.seqn:
523 yield val
524
525class X:
526 'Missing __getitem__ and __iter__'
527 def __init__(self, seqn):
528 self.seqn = seqn
529 self.i = 0
530 def next(self):
531 if self.i >= len(self.seqn): raise StopIteration
532 v = self.seqn[self.i]
533 self.i += 1
534 return v
535
536class N:
537 'Iterator missing next()'
538 def __init__(self, seqn):
539 self.seqn = seqn
540 self.i = 0
541 def __iter__(self):
542 return self
543
544class E:
545 'Test propagation of exceptions'
546 def __init__(self, seqn):
547 self.seqn = seqn
548 self.i = 0
549 def __iter__(self):
550 return self
551 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000552 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000553
554class S:
555 'Test immediate stop'
556 def __init__(self, seqn):
557 pass
558 def __iter__(self):
559 return self
560 def next(self):
561 raise StopIteration
562
563def L(seqn):
564 'Test multiple tiers of iterators'
565 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
566
567
568class TestVariousIteratorArgs(unittest.TestCase):
569
570 def test_chain(self):
571 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
572 for g in (G, I, Ig, S, L, R):
573 self.assertEqual(list(chain(g(s))), list(g(s)))
574 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
575 self.assertRaises(TypeError, chain, X(s))
576 self.assertRaises(TypeError, list, chain(N(s)))
577 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
578
579 def test_cycle(self):
580 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
581 for g in (G, I, Ig, S, L, R):
582 tgtlen = len(s) * 3
583 expected = list(g(s))*3
584 actual = list(islice(cycle(g(s)), tgtlen))
585 self.assertEqual(actual, expected)
586 self.assertRaises(TypeError, cycle, X(s))
587 self.assertRaises(TypeError, list, cycle(N(s)))
588 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
589
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000590 def test_groupby(self):
591 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
592 for g in (G, I, Ig, S, L, R):
593 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
594 self.assertRaises(TypeError, groupby, X(s))
595 self.assertRaises(TypeError, list, groupby(N(s)))
596 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
597
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000598 def test_ifilter(self):
599 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
600 for g in (G, I, Ig, S, L, R):
601 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
602 self.assertRaises(TypeError, ifilter, isEven, X(s))
603 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
604 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
605
606 def test_ifilterfalse(self):
607 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
608 for g in (G, I, Ig, S, L, R):
609 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
610 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
611 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
612 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
613
614 def test_izip(self):
615 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
616 for g in (G, I, Ig, S, L, R):
617 self.assertEqual(list(izip(g(s))), zip(g(s)))
618 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
619 self.assertRaises(TypeError, izip, X(s))
620 self.assertRaises(TypeError, list, izip(N(s)))
621 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
622
623 def test_imap(self):
624 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
625 for g in (G, I, Ig, S, L, R):
626 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
627 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
628 self.assertRaises(TypeError, imap, onearg, X(s))
629 self.assertRaises(TypeError, list, imap(onearg, N(s)))
630 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
631
632 def test_islice(self):
633 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
634 for g in (G, I, Ig, S, L, R):
635 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
636 self.assertRaises(TypeError, islice, X(s), 10)
637 self.assertRaises(TypeError, list, islice(N(s), 10))
638 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
639
640 def test_starmap(self):
641 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
642 for g in (G, I, Ig, S, L, R):
643 ss = zip(s, s)
644 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
645 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
646 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
647 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
648
649 def test_takewhile(self):
650 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
651 for g in (G, I, Ig, S, L, R):
652 tgt = []
653 for elem in g(s):
654 if not isEven(elem): break
655 tgt.append(elem)
656 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
657 self.assertRaises(TypeError, takewhile, isEven, X(s))
658 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
659 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
660
661 def test_dropwhile(self):
662 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
663 for g in (G, I, Ig, S, L, R):
664 tgt = []
665 for elem in g(s):
666 if not tgt and isOdd(elem): continue
667 tgt.append(elem)
668 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
669 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
670 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
671 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
672
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000673 def test_tee(self):
674 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
675 for g in (G, I, Ig, S, L, R):
676 it1, it2 = tee(g(s))
677 self.assertEqual(list(it1), list(g(s)))
678 self.assertEqual(list(it2), list(g(s)))
679 self.assertRaises(TypeError, tee, X(s))
680 self.assertRaises(TypeError, list, tee(N(s))[0])
681 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
682
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000683class LengthTransparency(unittest.TestCase):
684
685 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000686 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000687 self.assertEqual(len(repeat(None, 50)), 50)
688 self.assertRaises(TypeError, len, repeat(None))
689
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000690class RegressionTests(unittest.TestCase):
691
692 def test_sf_793826(self):
693 # Fix Armin Rigo's successful efforts to wreak havoc
694
695 def mutatingtuple(tuple1, f, tuple2):
696 # this builds a tuple t which is a copy of tuple1,
697 # then calls f(t), then mutates t to be equal to tuple2
698 # (needs len(tuple1) == len(tuple2)).
699 def g(value, first=[1]):
700 if first:
701 del first[:]
702 f(z.next())
703 return value
704 items = list(tuple2)
705 items[1:1] = list(tuple1)
706 gen = imap(g, items)
707 z = izip(*[gen]*len(tuple1))
708 z.next()
709
710 def f(t):
711 global T
712 T = t
713 first[:] = list(T)
714
715 first = []
716 mutatingtuple((1,2,3), f, (4,5,6))
717 second = list(T)
718 self.assertEqual(first, second)
719
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000720
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000721 def test_sf_950057(self):
722 # Make sure that chain() and cycle() catch exceptions immediately
723 # rather than when shifting between input sources
724
725 def gen1():
726 hist.append(0)
727 yield 1
728 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000729 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000730 hist.append(2)
731
732 def gen2(x):
733 hist.append(3)
734 yield 2
735 hist.append(4)
736 if x:
737 raise StopIteration
738
739 hist = []
740 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
741 self.assertEqual(hist, [0,1])
742
743 hist = []
744 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
745 self.assertEqual(hist, [0,1])
746
747 hist = []
748 self.assertRaises(AssertionError, list, cycle(gen1()))
749 self.assertEqual(hist, [0,1])
750
Georg Brandl8e932e72007-01-21 10:28:56 +0000751class SubclassWithKwargsTest(unittest.TestCase):
752 def test_keywords_in_subclass(self):
753 # count is not subclassable...
754 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
755 starmap, islice, takewhile, dropwhile, cycle):
756 class Subclass(cls):
757 def __init__(self, newarg=None, *args):
758 cls.__init__(self, *args)
759 try:
760 Subclass(newarg=1)
761 except TypeError, err:
762 # we expect type errors because of wrong argument count
763 self.failIf("does not take keyword arguments" in err.args[0])
764
765
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000766libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000767
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000768
769>>> amounts = [120.15, 764.05, 823.14]
770>>> for checknum, amount in izip(count(1200), amounts):
771... print 'Check %d is for $%.2f' % (checknum, amount)
772...
773Check 1200 is for $120.15
774Check 1201 is for $764.05
775Check 1202 is for $823.14
776
777>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000778>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
779... print cube
780...
7811
7828
78327
784
785>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000786>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000787... print name.title()
788...
789Alex
790Laura
791Martin
792Walter
793Samuele
794
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000795>>> from operator import itemgetter
796>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000797>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000798>>> for k, g in groupby(di, itemgetter(1)):
799... print k, map(itemgetter(0), g)
800...
8011 ['a', 'c', 'e']
8022 ['b', 'd', 'f']
8033 ['g']
804
Raymond Hettinger734fb572004-01-20 20:04:40 +0000805# Find runs of consecutive numbers using groupby. The key to the solution
806# is differencing with a range so that consecutive numbers all appear in
807# same group.
808>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
809>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
810... print map(operator.itemgetter(1), g)
811...
812[1]
813[4, 5, 6]
814[10]
815[15, 16, 17, 18]
816[22]
817[25, 26, 27, 28]
818
Raymond Hettingera098b332003-09-08 23:58:40 +0000819>>> def take(n, seq):
820... return list(islice(seq, n))
821
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000822>>> def enumerate(iterable):
823... return izip(count(), iterable)
824
825>>> def tabulate(function):
826... "Return function(0), function(1), ..."
827... return imap(function, count())
828
829>>> def iteritems(mapping):
830... return izip(mapping.iterkeys(), mapping.itervalues())
831
832>>> def nth(iterable, n):
833... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000834... return list(islice(iterable, n, n+1))
835
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000836>>> def all(seq, pred=None):
837... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000838... for elem in ifilterfalse(pred, seq):
839... return False
840... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000841
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000842>>> def any(seq, pred=None):
843... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000844... for elem in ifilter(pred, seq):
845... return True
846... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000847
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000848>>> def no(seq, pred=None):
849... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000850... for elem in ifilter(pred, seq):
851... return False
852... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000853
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000854>>> def quantify(seq, pred=None):
855... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000856... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000857
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000858>>> def padnone(seq):
859... "Returns the sequence elements and then returns None indefinitely"
860... return chain(seq, repeat(None))
861
862>>> def ncycles(seq, n):
863... "Returns the sequence elements n times"
864... return chain(*repeat(seq, n))
865
866>>> def dotproduct(vec1, vec2):
867... return sum(imap(operator.mul, vec1, vec2))
868
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000869>>> def flatten(listOfLists):
870... return list(chain(*listOfLists))
871
872>>> def repeatfunc(func, times=None, *args):
873... "Repeat calls to func with specified arguments."
874... " Example: repeatfunc(random.random)"
875... if times is None:
876... return starmap(func, repeat(args))
877... else:
878... return starmap(func, repeat(args, times))
879
Raymond Hettingerd591f662003-10-26 15:34:50 +0000880>>> def pairwise(iterable):
881... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
882... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000883... try:
884... b.next()
885... except StopIteration:
886... pass
887... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000888
889This is not part of the examples but it tests to make sure the definitions
890perform as purported.
891
Raymond Hettingera098b332003-09-08 23:58:40 +0000892>>> take(10, count())
893[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
894
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000895>>> list(enumerate('abc'))
896[(0, 'a'), (1, 'b'), (2, 'c')]
897
898>>> list(islice(tabulate(lambda x: 2*x), 4))
899[0, 2, 4, 6]
900
901>>> nth('abcde', 3)
902['d']
903
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000904>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000905True
906
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000907>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000908False
909
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000910>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000911True
912
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000913>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000914False
915
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000916>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000917True
918
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000919>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000920False
921
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000922>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000092350
924
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000925>>> a = [[1, 2, 3], [4, 5, 6]]
926>>> flatten(a)
927[1, 2, 3, 4, 5, 6]
928
929>>> list(repeatfunc(pow, 5, 2, 3))
930[8, 8, 8, 8, 8]
931
932>>> import random
933>>> take(5, imap(int, repeatfunc(random.random)))
934[0, 0, 0, 0, 0]
935
Raymond Hettingerd591f662003-10-26 15:34:50 +0000936>>> list(pairwise('abcd'))
937[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000938
Raymond Hettingerd591f662003-10-26 15:34:50 +0000939>>> list(pairwise([]))
940[]
941
942>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000943[]
944
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000945>>> list(islice(padnone('abc'), 0, 6))
946['a', 'b', 'c', None, None, None]
947
948>>> list(ncycles('abc', 3))
949['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
950
951>>> dotproduct([1,2,3], [4,5,6])
95232
953
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000954"""
955
956__test__ = {'libreftest' : libreftest}
957
958def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000959 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandl8e932e72007-01-21 10:28:56 +0000960 RegressionTests, LengthTransparency,
961 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000962 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000963
964 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000965 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000966 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000967 counts = [None] * 5
968 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000969 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000970 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000971 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000972 print counts
973
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000974 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000975 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000976
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000977if __name__ == "__main__":
978 test_main(verbose=True)