blob: c965d4c14efc3c126dbc71008069fa1bf7f49345 [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
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008
9def onearg(x):
10 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000011 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000012
13def errfunc(*args):
14 'Test function that raises an error'
15 raise ValueError
16
17def gen3():
18 'Non-restartable source sequence'
19 for i in (0, 1, 2):
20 yield i
21
22def isEven(x):
23 'Test predicate'
24 return x%2==0
25
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000026def isOdd(x):
27 'Test predicate'
28 return x%2==1
29
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000030class StopNow:
31 'Class emulating an empty iterable.'
32 def __iter__(self):
33 return self
34 def next(self):
35 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000036
Raymond Hettinger02420702003-06-29 20:36:23 +000037def take(n, seq):
38 'Convenience function for partially consuming a long of infinite iterable'
39 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000040
Raymond Hettinger96ef8112003-02-01 00:10:11 +000041class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000042 def test_chain(self):
43 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000044 self.assertEqual(list(chain('abc')), list('abc'))
45 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000046 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000047 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000048
Raymond Hettinger96ef8112003-02-01 00:10:11 +000049 def test_count(self):
50 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
51 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000052 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000053 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger6d121f12007-02-08 00:07:32 +000055 self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000056 c = count(3)
57 self.assertEqual(repr(c), 'count(3)')
58 c.next()
59 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000060 c = count(-9)
61 self.assertEqual(repr(c), 'count(-9)')
62 c.next()
63 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000064
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000065 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000066 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000067 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000068 self.assertRaises(TypeError, cycle)
69 self.assertRaises(TypeError, cycle, 5)
70 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000071
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000072 def test_groupby(self):
73 # Check whether it accepts arguments correctly
74 self.assertEqual([], list(groupby([])))
75 self.assertEqual([], list(groupby([], key=id)))
76 self.assertRaises(TypeError, list, groupby('abc', []))
77 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000078 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000079
80 # Check normal input
81 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
82 (2,15,22), (3,16,23), (3,17,23)]
83 dup = []
84 for k, g in groupby(s, lambda r:r[0]):
85 for elem in g:
86 self.assertEqual(k, elem[0])
87 dup.append(elem)
88 self.assertEqual(s, dup)
89
90 # Check nested case
91 dup = []
92 for k, g in groupby(s, lambda r:r[0]):
93 for ik, ig in groupby(g, lambda r:r[2]):
94 for elem in ig:
95 self.assertEqual(k, elem[0])
96 self.assertEqual(ik, elem[2])
97 dup.append(elem)
98 self.assertEqual(s, dup)
99
100 # Check case where inner iterator is not used
101 keys = [k for k, g in groupby(s, lambda r:r[0])]
102 expectedkeys = set([r[0] for r in s])
103 self.assertEqual(set(keys), expectedkeys)
104 self.assertEqual(len(keys), len(expectedkeys))
105
106 # Exercise pipes and filters style
107 s = 'abracadabra'
108 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000109 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000110 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
111 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000112 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000113 self.assertEqual(r, ['a', 'b', 'r'])
114 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000115 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000116 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
117 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000118 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000119 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
120
121 # iter.next failure
122 class ExpectedError(Exception):
123 pass
124 def delayed_raise(n=0):
125 for i in range(n):
126 yield 'yo'
127 raise ExpectedError
128 def gulp(iterable, keyp=None, func=list):
129 return [func(g) for k, g in groupby(iterable, keyp)]
130
131 # iter.next failure on outer object
132 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
133 # iter.next failure on inner object
134 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
135
136 # __cmp__ failure
137 class DummyCmp:
138 def __cmp__(self, dst):
139 raise ExpectedError
140 s = [DummyCmp(), DummyCmp(), None]
141
142 # __cmp__ failure on outer object
143 self.assertRaises(ExpectedError, gulp, s, func=id)
144 # __cmp__ failure on inner object
145 self.assertRaises(ExpectedError, gulp, s)
146
147 # keyfunc failure
148 def keyfunc(obj):
149 if keyfunc.skip > 0:
150 keyfunc.skip -= 1
151 return obj
152 else:
153 raise ExpectedError
154
155 # keyfunc failure on outer object
156 keyfunc.skip = 0
157 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
158 keyfunc.skip = 1
159 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
160
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000161 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000162 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000163 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000164 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000166 self.assertRaises(TypeError, ifilter, lambda x:x)
167 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000168 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000169 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000170
171 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000172 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
173 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000174 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000175 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
177 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000178 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000179 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000180
181 def test_izip(self):
182 ans = [(x,y) for x, y in izip('abc',count())]
183 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000184 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
185 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000186 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000187 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000188 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertRaises(TypeError, izip, 3)
190 self.assertRaises(TypeError, izip, range(3), 3)
191 # Check tuple re-use (implementation detail)
192 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
193 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000194 self.assertEqual([pair for pair in izip('abc', 'def')],
195 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000196 ids = map(id, izip('abc', 'def'))
197 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000198 ids = map(id, list(izip('abc', 'def')))
199 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000200
201 def test_repeat(self):
202 self.assertEqual(zip(xrange(3),repeat('a')),
203 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000204 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000205 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000206 self.assertEqual(list(repeat('a', 0)), [])
207 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000208 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000209 self.assertRaises(TypeError, repeat, None, 3, 4)
210 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000211 r = repeat(1+0j)
212 self.assertEqual(repr(r), 'repeat((1+0j))')
213 r = repeat(1+0j, 5)
214 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
215 list(r)
216 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000217
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000218 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000219 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
220 [0**1, 1**2, 2**3])
221 self.assertEqual(list(imap(None, 'abc', range(5))),
222 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000223 self.assertEqual(list(imap(None, 'abc', count())),
224 [('a',0),('b',1),('c',2)])
225 self.assertEqual(take(2,imap(None, 'abc', count())),
226 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000227 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000228 self.assertRaises(TypeError, imap)
229 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000230 self.assertRaises(TypeError, imap(10, range(5)).next)
231 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
232 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000233
234 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000235 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
236 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000237 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
238 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000239 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000240 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000241 self.assertRaises(TypeError, starmap)
242 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
243 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
244 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
245 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000246
247 def test_islice(self):
248 for args in [ # islice(args) should agree with range(args)
249 (10, 20, 3),
250 (10, 3, 20),
251 (10, 20),
252 (10, 3),
253 (20,)
254 ]:
255 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
256
257 for args, tgtargs in [ # Stop when seqn is exhausted
258 ((10, 110, 3), ((10, 100, 3))),
259 ((10, 110), ((10, 100))),
260 ((110,), (100,))
261 ]:
262 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
263
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000264 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000265 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000266 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
267 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000268 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
269 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
270
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000271 # Test number of items consumed SF #1171417
272 it = iter(range(10))
273 self.assertEqual(list(islice(it, 3)), range(3))
274 self.assertEqual(list(it), range(3, 10))
275
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000276 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000277 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000278 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
279 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
280 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
281 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
282 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000283 self.assertRaises(ValueError, islice, xrange(10), 'a')
284 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
285 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
286 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
287 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000288 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000289
290 def test_takewhile(self):
291 data = [1, 3, 5, 20, 2, 4, 6, 8]
292 underten = lambda x: x<10
293 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000294 self.assertEqual(list(takewhile(underten, [])), [])
295 self.assertRaises(TypeError, takewhile)
296 self.assertRaises(TypeError, takewhile, operator.pow)
297 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
298 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
299 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000300 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
301 self.assertEqual(list(t), [1, 1, 1])
302 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000303
304 def test_dropwhile(self):
305 data = [1, 3, 5, 20, 2, 4, 6, 8]
306 underten = lambda x: x<10
307 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000308 self.assertEqual(list(dropwhile(underten, [])), [])
309 self.assertRaises(TypeError, dropwhile)
310 self.assertRaises(TypeError, dropwhile, operator.pow)
311 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
312 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
313 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000314
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000315 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000316 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000317 def irange(n):
318 for i in xrange(n):
319 yield i
320
321 a, b = tee([]) # test empty iterator
322 self.assertEqual(list(a), [])
323 self.assertEqual(list(b), [])
324
325 a, b = tee(irange(n)) # test 100% interleaved
326 self.assertEqual(zip(a,b), zip(range(n),range(n)))
327
328 a, b = tee(irange(n)) # test 0% interleaved
329 self.assertEqual(list(a), range(n))
330 self.assertEqual(list(b), range(n))
331
332 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000333 for i in xrange(100):
334 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000335 del a
336 self.assertEqual(list(b), range(n))
337
338 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000339 for i in xrange(100):
340 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000341 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000342 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000343
344 for j in xrange(5): # test randomly interleaved
345 order = [0]*n + [1]*n
346 random.shuffle(order)
347 lists = ([], [])
348 its = tee(irange(n))
349 for i in order:
350 value = its[i].next()
351 lists[i].append(value)
352 self.assertEqual(lists[0], range(n))
353 self.assertEqual(lists[1], range(n))
354
Raymond Hettingerad983e72003-11-12 14:32:26 +0000355 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000356 self.assertRaises(TypeError, tee)
357 self.assertRaises(TypeError, tee, 3)
358 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000359 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000360
Raymond Hettingerad983e72003-11-12 14:32:26 +0000361 # tee object should be instantiable
362 a, b = tee('abc')
363 c = type(a)('def')
364 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000365
Raymond Hettingerad983e72003-11-12 14:32:26 +0000366 # test long-lagged and multi-way split
367 a, b, c = tee(xrange(2000), 3)
368 for i in xrange(100):
369 self.assertEqual(a.next(), i)
370 self.assertEqual(list(b), range(2000))
371 self.assertEqual([c.next(), c.next()], range(2))
372 self.assertEqual(list(a), range(100,2000))
373 self.assertEqual(list(c), range(2,2000))
374
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000375 # test values of n
376 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000377 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000378 for n in xrange(5):
379 result = tee('abc', n)
380 self.assertEqual(type(result), tuple)
381 self.assertEqual(len(result), n)
382 self.assertEqual(map(list, result), [list('abc')]*n)
383
Raymond Hettingerad983e72003-11-12 14:32:26 +0000384 # tee pass-through to copyable iterator
385 a, b = tee('abc')
386 c, d = tee(a)
387 self.assert_(a is c)
388
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000389 # test tee_new
390 t1, t2 = tee('abc')
391 tnew = type(t1)
392 self.assertRaises(TypeError, tnew)
393 self.assertRaises(TypeError, tnew, 10)
394 t3 = tnew(t1)
395 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000396
Raymond Hettingera9f60922004-10-17 16:40:14 +0000397 # test that tee objects are weak referencable
398 a, b = tee(xrange(10))
399 p = proxy(a)
400 self.assertEqual(getattr(p, '__class__'), type(b))
401 del a
402 self.assertRaises(ReferenceError, getattr, p, '__class__')
403
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000404 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000405 self.assertRaises(StopIteration, izip().next)
406
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000407 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000408 self.assertRaises(StopIteration, f([]).next)
409 self.assertRaises(StopIteration, f(StopNow()).next)
410
411 self.assertRaises(StopIteration, islice([], None).next)
412 self.assertRaises(StopIteration, islice(StopNow(), None).next)
413
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000414 p, q = tee([])
415 self.assertRaises(StopIteration, p.next)
416 self.assertRaises(StopIteration, q.next)
417 p, q = tee(StopNow())
418 self.assertRaises(StopIteration, p.next)
419 self.assertRaises(StopIteration, q.next)
420
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000421 self.assertRaises(StopIteration, repeat(None, 0).next)
422
423 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
424 self.assertRaises(StopIteration, f(lambda x:x, []).next)
425 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
426
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000427class TestGC(unittest.TestCase):
428
429 def makecycle(self, iterator, container):
430 container.append(iterator)
431 iterator.next()
432 del container, iterator
433
434 def test_chain(self):
435 a = []
436 self.makecycle(chain(a), a)
437
438 def test_cycle(self):
439 a = []
440 self.makecycle(cycle([a]*2), a)
441
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000442 def test_dropwhile(self):
443 a = []
444 self.makecycle(dropwhile(bool, [0, a, a]), a)
445
446 def test_groupby(self):
447 a = []
448 self.makecycle(groupby([a]*2, lambda x:x), a)
449
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000450 def test_ifilter(self):
451 a = []
452 self.makecycle(ifilter(lambda x:True, [a]*2), a)
453
454 def test_ifilterfalse(self):
455 a = []
456 self.makecycle(ifilterfalse(lambda x:False, a), a)
457
458 def test_izip(self):
459 a = []
460 self.makecycle(izip([a]*2, [a]*3), a)
461
462 def test_imap(self):
463 a = []
464 self.makecycle(imap(lambda x:x, [a]*2), a)
465
466 def test_islice(self):
467 a = []
468 self.makecycle(islice([a]*2, None), a)
469
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000470 def test_repeat(self):
471 a = []
472 self.makecycle(repeat(a), a)
473
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000474 def test_starmap(self):
475 a = []
476 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
477
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000478 def test_takewhile(self):
479 a = []
480 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
481
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000482def R(seqn):
483 'Regular generator'
484 for i in seqn:
485 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000486
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000487class G:
488 'Sequence using __getitem__'
489 def __init__(self, seqn):
490 self.seqn = seqn
491 def __getitem__(self, i):
492 return self.seqn[i]
493
494class I:
495 'Sequence using iterator protocol'
496 def __init__(self, seqn):
497 self.seqn = seqn
498 self.i = 0
499 def __iter__(self):
500 return self
501 def next(self):
502 if self.i >= len(self.seqn): raise StopIteration
503 v = self.seqn[self.i]
504 self.i += 1
505 return v
506
507class Ig:
508 'Sequence using iterator protocol defined with a generator'
509 def __init__(self, seqn):
510 self.seqn = seqn
511 self.i = 0
512 def __iter__(self):
513 for val in self.seqn:
514 yield val
515
516class X:
517 'Missing __getitem__ and __iter__'
518 def __init__(self, seqn):
519 self.seqn = seqn
520 self.i = 0
521 def next(self):
522 if self.i >= len(self.seqn): raise StopIteration
523 v = self.seqn[self.i]
524 self.i += 1
525 return v
526
527class N:
528 'Iterator missing next()'
529 def __init__(self, seqn):
530 self.seqn = seqn
531 self.i = 0
532 def __iter__(self):
533 return self
534
535class E:
536 'Test propagation of exceptions'
537 def __init__(self, seqn):
538 self.seqn = seqn
539 self.i = 0
540 def __iter__(self):
541 return self
542 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000543 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000544
545class S:
546 'Test immediate stop'
547 def __init__(self, seqn):
548 pass
549 def __iter__(self):
550 return self
551 def next(self):
552 raise StopIteration
553
554def L(seqn):
555 'Test multiple tiers of iterators'
556 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
557
558
559class TestVariousIteratorArgs(unittest.TestCase):
560
561 def test_chain(self):
562 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
563 for g in (G, I, Ig, S, L, R):
564 self.assertEqual(list(chain(g(s))), list(g(s)))
565 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
566 self.assertRaises(TypeError, chain, X(s))
567 self.assertRaises(TypeError, list, chain(N(s)))
568 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
569
570 def test_cycle(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 tgtlen = len(s) * 3
574 expected = list(g(s))*3
575 actual = list(islice(cycle(g(s)), tgtlen))
576 self.assertEqual(actual, expected)
577 self.assertRaises(TypeError, cycle, X(s))
578 self.assertRaises(TypeError, list, cycle(N(s)))
579 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
580
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000581 def test_groupby(self):
582 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
583 for g in (G, I, Ig, S, L, R):
584 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
585 self.assertRaises(TypeError, groupby, X(s))
586 self.assertRaises(TypeError, list, groupby(N(s)))
587 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
588
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000589 def test_ifilter(self):
590 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
591 for g in (G, I, Ig, S, L, R):
592 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
593 self.assertRaises(TypeError, ifilter, isEven, X(s))
594 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
595 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
596
597 def test_ifilterfalse(self):
598 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
599 for g in (G, I, Ig, S, L, R):
600 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
601 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
602 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
603 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
604
605 def test_izip(self):
606 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
607 for g in (G, I, Ig, S, L, R):
608 self.assertEqual(list(izip(g(s))), zip(g(s)))
609 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
610 self.assertRaises(TypeError, izip, X(s))
611 self.assertRaises(TypeError, list, izip(N(s)))
612 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
613
614 def test_imap(self):
615 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
616 for g in (G, I, Ig, S, L, R):
617 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
618 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
619 self.assertRaises(TypeError, imap, onearg, X(s))
620 self.assertRaises(TypeError, list, imap(onearg, N(s)))
621 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
622
623 def test_islice(self):
624 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
625 for g in (G, I, Ig, S, L, R):
626 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
627 self.assertRaises(TypeError, islice, X(s), 10)
628 self.assertRaises(TypeError, list, islice(N(s), 10))
629 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
630
631 def test_starmap(self):
632 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
633 for g in (G, I, Ig, S, L, R):
634 ss = zip(s, s)
635 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
636 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
637 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
638 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
639
640 def test_takewhile(self):
641 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
642 for g in (G, I, Ig, S, L, R):
643 tgt = []
644 for elem in g(s):
645 if not isEven(elem): break
646 tgt.append(elem)
647 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
648 self.assertRaises(TypeError, takewhile, isEven, X(s))
649 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
650 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
651
652 def test_dropwhile(self):
653 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
654 for g in (G, I, Ig, S, L, R):
655 tgt = []
656 for elem in g(s):
657 if not tgt and isOdd(elem): continue
658 tgt.append(elem)
659 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
660 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
661 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
662 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
663
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000664 def test_tee(self):
665 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
666 for g in (G, I, Ig, S, L, R):
667 it1, it2 = tee(g(s))
668 self.assertEqual(list(it1), list(g(s)))
669 self.assertEqual(list(it2), list(g(s)))
670 self.assertRaises(TypeError, tee, X(s))
671 self.assertRaises(TypeError, list, tee(N(s))[0])
672 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
673
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000674class LengthTransparency(unittest.TestCase):
675
676 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000677 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000678 self.assertEqual(len(repeat(None, 50)), 50)
679 self.assertRaises(TypeError, len, repeat(None))
680
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000681class RegressionTests(unittest.TestCase):
682
683 def test_sf_793826(self):
684 # Fix Armin Rigo's successful efforts to wreak havoc
685
686 def mutatingtuple(tuple1, f, tuple2):
687 # this builds a tuple t which is a copy of tuple1,
688 # then calls f(t), then mutates t to be equal to tuple2
689 # (needs len(tuple1) == len(tuple2)).
690 def g(value, first=[1]):
691 if first:
692 del first[:]
693 f(z.next())
694 return value
695 items = list(tuple2)
696 items[1:1] = list(tuple1)
697 gen = imap(g, items)
698 z = izip(*[gen]*len(tuple1))
699 z.next()
700
701 def f(t):
702 global T
703 T = t
704 first[:] = list(T)
705
706 first = []
707 mutatingtuple((1,2,3), f, (4,5,6))
708 second = list(T)
709 self.assertEqual(first, second)
710
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000711
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000712 def test_sf_950057(self):
713 # Make sure that chain() and cycle() catch exceptions immediately
714 # rather than when shifting between input sources
715
716 def gen1():
717 hist.append(0)
718 yield 1
719 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000720 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000721 hist.append(2)
722
723 def gen2(x):
724 hist.append(3)
725 yield 2
726 hist.append(4)
727 if x:
728 raise StopIteration
729
730 hist = []
731 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
732 self.assertEqual(hist, [0,1])
733
734 hist = []
735 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
736 self.assertEqual(hist, [0,1])
737
738 hist = []
739 self.assertRaises(AssertionError, list, cycle(gen1()))
740 self.assertEqual(hist, [0,1])
741
Georg Brandlb84c1372007-01-21 10:28:43 +0000742class SubclassWithKwargsTest(unittest.TestCase):
743 def test_keywords_in_subclass(self):
744 # count is not subclassable...
745 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
746 starmap, islice, takewhile, dropwhile, cycle):
747 class Subclass(cls):
748 def __init__(self, newarg=None, *args):
749 cls.__init__(self, *args)
750 try:
751 Subclass(newarg=1)
752 except TypeError, err:
753 # we expect type errors because of wrong argument count
754 self.failIf("does not take keyword arguments" in err.args[0])
755
756
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000757libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000758
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000759
760>>> amounts = [120.15, 764.05, 823.14]
761>>> for checknum, amount in izip(count(1200), amounts):
762... print 'Check %d is for $%.2f' % (checknum, amount)
763...
764Check 1200 is for $120.15
765Check 1201 is for $764.05
766Check 1202 is for $823.14
767
768>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000769>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
770... print cube
771...
7721
7738
77427
775
776>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000777>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000778... print name.title()
779...
780Alex
781Laura
782Martin
783Walter
784Samuele
785
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000786>>> from operator import itemgetter
787>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000788>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000789>>> for k, g in groupby(di, itemgetter(1)):
790... print k, map(itemgetter(0), g)
791...
7921 ['a', 'c', 'e']
7932 ['b', 'd', 'f']
7943 ['g']
795
Raymond Hettinger734fb572004-01-20 20:04:40 +0000796# Find runs of consecutive numbers using groupby. The key to the solution
797# is differencing with a range so that consecutive numbers all appear in
798# same group.
799>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
800>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
801... print map(operator.itemgetter(1), g)
802...
803[1]
804[4, 5, 6]
805[10]
806[15, 16, 17, 18]
807[22]
808[25, 26, 27, 28]
809
Raymond Hettingera098b332003-09-08 23:58:40 +0000810>>> def take(n, seq):
811... return list(islice(seq, n))
812
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000813>>> def enumerate(iterable):
814... return izip(count(), iterable)
815
816>>> def tabulate(function):
817... "Return function(0), function(1), ..."
818... return imap(function, count())
819
820>>> def iteritems(mapping):
821... return izip(mapping.iterkeys(), mapping.itervalues())
822
823>>> def nth(iterable, n):
824... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000825... return list(islice(iterable, n, n+1))
826
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000827>>> def all(seq, pred=None):
828... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000829... for elem in ifilterfalse(pred, seq):
830... return False
831... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000832
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000833>>> def any(seq, pred=None):
834... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000835... for elem in ifilter(pred, seq):
836... return True
837... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000838
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000839>>> def no(seq, pred=None):
840... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000841... for elem in ifilter(pred, seq):
842... return False
843... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000844
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000845>>> def quantify(seq, pred=None):
846... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000847... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000848
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000849>>> def padnone(seq):
850... "Returns the sequence elements and then returns None indefinitely"
851... return chain(seq, repeat(None))
852
853>>> def ncycles(seq, n):
854... "Returns the sequence elements n times"
855... return chain(*repeat(seq, n))
856
857>>> def dotproduct(vec1, vec2):
858... return sum(imap(operator.mul, vec1, vec2))
859
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000860>>> def flatten(listOfLists):
861... return list(chain(*listOfLists))
862
863>>> def repeatfunc(func, times=None, *args):
864... "Repeat calls to func with specified arguments."
865... " Example: repeatfunc(random.random)"
866... if times is None:
867... return starmap(func, repeat(args))
868... else:
869... return starmap(func, repeat(args, times))
870
Raymond Hettingerd591f662003-10-26 15:34:50 +0000871>>> def pairwise(iterable):
872... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
873... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000874... try:
875... b.next()
876... except StopIteration:
877... pass
878... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000879
880This is not part of the examples but it tests to make sure the definitions
881perform as purported.
882
Raymond Hettingera098b332003-09-08 23:58:40 +0000883>>> take(10, count())
884[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
885
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000886>>> list(enumerate('abc'))
887[(0, 'a'), (1, 'b'), (2, 'c')]
888
889>>> list(islice(tabulate(lambda x: 2*x), 4))
890[0, 2, 4, 6]
891
892>>> nth('abcde', 3)
893['d']
894
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000895>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000896True
897
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000898>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000899False
900
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000901>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000902True
903
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000904>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000905False
906
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000907>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000908True
909
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000910>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000911False
912
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000913>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000091450
915
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000916>>> a = [[1, 2, 3], [4, 5, 6]]
917>>> flatten(a)
918[1, 2, 3, 4, 5, 6]
919
920>>> list(repeatfunc(pow, 5, 2, 3))
921[8, 8, 8, 8, 8]
922
923>>> import random
924>>> take(5, imap(int, repeatfunc(random.random)))
925[0, 0, 0, 0, 0]
926
Raymond Hettingerd591f662003-10-26 15:34:50 +0000927>>> list(pairwise('abcd'))
928[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000929
Raymond Hettingerd591f662003-10-26 15:34:50 +0000930>>> list(pairwise([]))
931[]
932
933>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000934[]
935
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000936>>> list(islice(padnone('abc'), 0, 6))
937['a', 'b', 'c', None, None, None]
938
939>>> list(ncycles('abc', 3))
940['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
941
942>>> dotproduct([1,2,3], [4,5,6])
94332
944
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000945"""
946
947__test__ = {'libreftest' : libreftest}
948
949def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000950 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +0000951 RegressionTests, LengthTransparency,
952 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000953 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000954
955 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000956 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000957 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000958 counts = [None] * 5
959 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000960 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000961 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000962 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000963 print counts
964
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000965 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000966 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000967
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000968if __name__ == "__main__":
969 test_main(verbose=True)