blob: 2baa50755403c96a39329e477dade7418cc3a658 [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')
55 c = count(sys.maxint-2) # verify that rollover doesn't crash
56 c.next(); c.next(); c.next(); c.next(); c.next()
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000057 c = count(3)
58 self.assertEqual(repr(c), 'count(3)')
59 c.next()
60 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000061 c = count(-9)
62 self.assertEqual(repr(c), 'count(-9)')
63 c.next()
64 self.assertEqual(c.next(), -8)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000065
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000066 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000067 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000068 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000069 self.assertRaises(TypeError, cycle)
70 self.assertRaises(TypeError, cycle, 5)
71 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000072
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000073 def test_groupby(self):
74 # Check whether it accepts arguments correctly
75 self.assertEqual([], list(groupby([])))
76 self.assertEqual([], list(groupby([], key=id)))
77 self.assertRaises(TypeError, list, groupby('abc', []))
78 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000079 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000080
81 # Check normal input
82 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
83 (2,15,22), (3,16,23), (3,17,23)]
84 dup = []
85 for k, g in groupby(s, lambda r:r[0]):
86 for elem in g:
87 self.assertEqual(k, elem[0])
88 dup.append(elem)
89 self.assertEqual(s, dup)
90
91 # Check nested case
92 dup = []
93 for k, g in groupby(s, lambda r:r[0]):
94 for ik, ig in groupby(g, lambda r:r[2]):
95 for elem in ig:
96 self.assertEqual(k, elem[0])
97 self.assertEqual(ik, elem[2])
98 dup.append(elem)
99 self.assertEqual(s, dup)
100
101 # Check case where inner iterator is not used
102 keys = [k for k, g in groupby(s, lambda r:r[0])]
103 expectedkeys = set([r[0] for r in s])
104 self.assertEqual(set(keys), expectedkeys)
105 self.assertEqual(len(keys), len(expectedkeys))
106
107 # Exercise pipes and filters style
108 s = 'abracadabra'
109 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000110 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000111 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
112 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000113 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000114 self.assertEqual(r, ['a', 'b', 'r'])
115 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000116 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000117 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
118 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
121
122 # iter.next failure
123 class ExpectedError(Exception):
124 pass
125 def delayed_raise(n=0):
126 for i in range(n):
127 yield 'yo'
128 raise ExpectedError
129 def gulp(iterable, keyp=None, func=list):
130 return [func(g) for k, g in groupby(iterable, keyp)]
131
132 # iter.next failure on outer object
133 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
134 # iter.next failure on inner object
135 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
136
137 # __cmp__ failure
138 class DummyCmp:
139 def __cmp__(self, dst):
140 raise ExpectedError
141 s = [DummyCmp(), DummyCmp(), None]
142
143 # __cmp__ failure on outer object
144 self.assertRaises(ExpectedError, gulp, s, func=id)
145 # __cmp__ failure on inner object
146 self.assertRaises(ExpectedError, gulp, s)
147
148 # keyfunc failure
149 def keyfunc(obj):
150 if keyfunc.skip > 0:
151 keyfunc.skip -= 1
152 return obj
153 else:
154 raise ExpectedError
155
156 # keyfunc failure on outer object
157 keyfunc.skip = 0
158 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
159 keyfunc.skip = 1
160 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
161
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000162 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000163 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000164 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000165 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000166 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000167 self.assertRaises(TypeError, ifilter, lambda x:x)
168 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000169 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000170 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000171
172 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000173 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
174 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000175 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000176 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000177 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
178 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000179 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000180 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000181
182 def test_izip(self):
183 ans = [(x,y) for x, y in izip('abc',count())]
184 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000185 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
186 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000187 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000188 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000189 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000190 self.assertRaises(TypeError, izip, 3)
191 self.assertRaises(TypeError, izip, range(3), 3)
192 # Check tuple re-use (implementation detail)
193 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
194 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000195 self.assertEqual([pair for pair in izip('abc', 'def')],
196 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000197 ids = map(id, izip('abc', 'def'))
198 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000199 ids = map(id, list(izip('abc', 'def')))
200 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000201
202 def test_repeat(self):
203 self.assertEqual(zip(xrange(3),repeat('a')),
204 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000205 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000206 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000207 self.assertEqual(list(repeat('a', 0)), [])
208 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000209 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000210 self.assertRaises(TypeError, repeat, None, 3, 4)
211 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000212 r = repeat(1+0j)
213 self.assertEqual(repr(r), 'repeat((1+0j))')
214 r = repeat(1+0j, 5)
215 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
216 list(r)
217 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000218
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000219 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000220 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
221 [0**1, 1**2, 2**3])
222 self.assertEqual(list(imap(None, 'abc', range(5))),
223 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000224 self.assertEqual(list(imap(None, 'abc', count())),
225 [('a',0),('b',1),('c',2)])
226 self.assertEqual(take(2,imap(None, 'abc', count())),
227 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000228 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000229 self.assertRaises(TypeError, imap)
230 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000231 self.assertRaises(TypeError, imap(10, range(5)).next)
232 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
233 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000234
235 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000236 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
237 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000238 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
239 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000240 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000241 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000242 self.assertRaises(TypeError, starmap)
243 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
244 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
245 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
246 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000247
248 def test_islice(self):
249 for args in [ # islice(args) should agree with range(args)
250 (10, 20, 3),
251 (10, 3, 20),
252 (10, 20),
253 (10, 3),
254 (20,)
255 ]:
256 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
257
258 for args, tgtargs in [ # Stop when seqn is exhausted
259 ((10, 110, 3), ((10, 100, 3))),
260 ((10, 110), ((10, 100))),
261 ((110,), (100,))
262 ]:
263 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
264
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000265 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000266 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000267 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
268 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000269 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
270 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
271
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000272 # Test number of items consumed SF #1171417
273 it = iter(range(10))
274 self.assertEqual(list(islice(it, 3)), range(3))
275 self.assertEqual(list(it), range(3, 10))
276
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000277 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000278 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000279 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
280 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
281 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
282 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
283 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000284 self.assertRaises(ValueError, islice, xrange(10), 'a')
285 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
286 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
287 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
288 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000289 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000290
291 def test_takewhile(self):
292 data = [1, 3, 5, 20, 2, 4, 6, 8]
293 underten = lambda x: x<10
294 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000295 self.assertEqual(list(takewhile(underten, [])), [])
296 self.assertRaises(TypeError, takewhile)
297 self.assertRaises(TypeError, takewhile, operator.pow)
298 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
299 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
300 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000301 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
302 self.assertEqual(list(t), [1, 1, 1])
303 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000304
305 def test_dropwhile(self):
306 data = [1, 3, 5, 20, 2, 4, 6, 8]
307 underten = lambda x: x<10
308 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000309 self.assertEqual(list(dropwhile(underten, [])), [])
310 self.assertRaises(TypeError, dropwhile)
311 self.assertRaises(TypeError, dropwhile, operator.pow)
312 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
313 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
314 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000315
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000316 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000317 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000318 def irange(n):
319 for i in xrange(n):
320 yield i
321
322 a, b = tee([]) # test empty iterator
323 self.assertEqual(list(a), [])
324 self.assertEqual(list(b), [])
325
326 a, b = tee(irange(n)) # test 100% interleaved
327 self.assertEqual(zip(a,b), zip(range(n),range(n)))
328
329 a, b = tee(irange(n)) # test 0% interleaved
330 self.assertEqual(list(a), range(n))
331 self.assertEqual(list(b), range(n))
332
333 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000334 for i in xrange(100):
335 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000336 del a
337 self.assertEqual(list(b), range(n))
338
339 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000340 for i in xrange(100):
341 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000342 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000343 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000344
345 for j in xrange(5): # test randomly interleaved
346 order = [0]*n + [1]*n
347 random.shuffle(order)
348 lists = ([], [])
349 its = tee(irange(n))
350 for i in order:
351 value = its[i].next()
352 lists[i].append(value)
353 self.assertEqual(lists[0], range(n))
354 self.assertEqual(lists[1], range(n))
355
Raymond Hettingerad983e72003-11-12 14:32:26 +0000356 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000357 self.assertRaises(TypeError, tee)
358 self.assertRaises(TypeError, tee, 3)
359 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000360 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000361
Raymond Hettingerad983e72003-11-12 14:32:26 +0000362 # tee object should be instantiable
363 a, b = tee('abc')
364 c = type(a)('def')
365 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000366
Raymond Hettingerad983e72003-11-12 14:32:26 +0000367 # test long-lagged and multi-way split
368 a, b, c = tee(xrange(2000), 3)
369 for i in xrange(100):
370 self.assertEqual(a.next(), i)
371 self.assertEqual(list(b), range(2000))
372 self.assertEqual([c.next(), c.next()], range(2))
373 self.assertEqual(list(a), range(100,2000))
374 self.assertEqual(list(c), range(2,2000))
375
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000376 # test values of n
377 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000378 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000379 for n in xrange(5):
380 result = tee('abc', n)
381 self.assertEqual(type(result), tuple)
382 self.assertEqual(len(result), n)
383 self.assertEqual(map(list, result), [list('abc')]*n)
384
Raymond Hettingerad983e72003-11-12 14:32:26 +0000385 # tee pass-through to copyable iterator
386 a, b = tee('abc')
387 c, d = tee(a)
388 self.assert_(a is c)
389
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000390 # test tee_new
391 t1, t2 = tee('abc')
392 tnew = type(t1)
393 self.assertRaises(TypeError, tnew)
394 self.assertRaises(TypeError, tnew, 10)
395 t3 = tnew(t1)
396 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000397
Raymond Hettingera9f60922004-10-17 16:40:14 +0000398 # test that tee objects are weak referencable
399 a, b = tee(xrange(10))
400 p = proxy(a)
401 self.assertEqual(getattr(p, '__class__'), type(b))
402 del a
403 self.assertRaises(ReferenceError, getattr, p, '__class__')
404
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000405 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000406 self.assertRaises(StopIteration, izip().next)
407
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000408 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000409 self.assertRaises(StopIteration, f([]).next)
410 self.assertRaises(StopIteration, f(StopNow()).next)
411
412 self.assertRaises(StopIteration, islice([], None).next)
413 self.assertRaises(StopIteration, islice(StopNow(), None).next)
414
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000415 p, q = tee([])
416 self.assertRaises(StopIteration, p.next)
417 self.assertRaises(StopIteration, q.next)
418 p, q = tee(StopNow())
419 self.assertRaises(StopIteration, p.next)
420 self.assertRaises(StopIteration, q.next)
421
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000422 self.assertRaises(StopIteration, repeat(None, 0).next)
423
424 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
425 self.assertRaises(StopIteration, f(lambda x:x, []).next)
426 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
427
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000428class TestGC(unittest.TestCase):
429
430 def makecycle(self, iterator, container):
431 container.append(iterator)
432 iterator.next()
433 del container, iterator
434
435 def test_chain(self):
436 a = []
437 self.makecycle(chain(a), a)
438
439 def test_cycle(self):
440 a = []
441 self.makecycle(cycle([a]*2), a)
442
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000443 def test_dropwhile(self):
444 a = []
445 self.makecycle(dropwhile(bool, [0, a, a]), a)
446
447 def test_groupby(self):
448 a = []
449 self.makecycle(groupby([a]*2, lambda x:x), a)
450
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000451 def test_ifilter(self):
452 a = []
453 self.makecycle(ifilter(lambda x:True, [a]*2), a)
454
455 def test_ifilterfalse(self):
456 a = []
457 self.makecycle(ifilterfalse(lambda x:False, a), a)
458
459 def test_izip(self):
460 a = []
461 self.makecycle(izip([a]*2, [a]*3), a)
462
463 def test_imap(self):
464 a = []
465 self.makecycle(imap(lambda x:x, [a]*2), a)
466
467 def test_islice(self):
468 a = []
469 self.makecycle(islice([a]*2, None), a)
470
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000471 def test_repeat(self):
472 a = []
473 self.makecycle(repeat(a), a)
474
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000475 def test_starmap(self):
476 a = []
477 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
478
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000479 def test_takewhile(self):
480 a = []
481 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
482
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000483def R(seqn):
484 'Regular generator'
485 for i in seqn:
486 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000487
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000488class G:
489 'Sequence using __getitem__'
490 def __init__(self, seqn):
491 self.seqn = seqn
492 def __getitem__(self, i):
493 return self.seqn[i]
494
495class I:
496 'Sequence using iterator protocol'
497 def __init__(self, seqn):
498 self.seqn = seqn
499 self.i = 0
500 def __iter__(self):
501 return self
502 def next(self):
503 if self.i >= len(self.seqn): raise StopIteration
504 v = self.seqn[self.i]
505 self.i += 1
506 return v
507
508class Ig:
509 'Sequence using iterator protocol defined with a generator'
510 def __init__(self, seqn):
511 self.seqn = seqn
512 self.i = 0
513 def __iter__(self):
514 for val in self.seqn:
515 yield val
516
517class X:
518 'Missing __getitem__ and __iter__'
519 def __init__(self, seqn):
520 self.seqn = seqn
521 self.i = 0
522 def next(self):
523 if self.i >= len(self.seqn): raise StopIteration
524 v = self.seqn[self.i]
525 self.i += 1
526 return v
527
528class N:
529 'Iterator missing next()'
530 def __init__(self, seqn):
531 self.seqn = seqn
532 self.i = 0
533 def __iter__(self):
534 return self
535
536class E:
537 'Test propagation of exceptions'
538 def __init__(self, seqn):
539 self.seqn = seqn
540 self.i = 0
541 def __iter__(self):
542 return self
543 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000544 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000545
546class S:
547 'Test immediate stop'
548 def __init__(self, seqn):
549 pass
550 def __iter__(self):
551 return self
552 def next(self):
553 raise StopIteration
554
555def L(seqn):
556 'Test multiple tiers of iterators'
557 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
558
559
560class TestVariousIteratorArgs(unittest.TestCase):
561
562 def test_chain(self):
563 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
564 for g in (G, I, Ig, S, L, R):
565 self.assertEqual(list(chain(g(s))), list(g(s)))
566 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
567 self.assertRaises(TypeError, chain, X(s))
568 self.assertRaises(TypeError, list, chain(N(s)))
569 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
570
571 def test_cycle(self):
572 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
573 for g in (G, I, Ig, S, L, R):
574 tgtlen = len(s) * 3
575 expected = list(g(s))*3
576 actual = list(islice(cycle(g(s)), tgtlen))
577 self.assertEqual(actual, expected)
578 self.assertRaises(TypeError, cycle, X(s))
579 self.assertRaises(TypeError, list, cycle(N(s)))
580 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
581
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000582 def test_groupby(self):
583 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
584 for g in (G, I, Ig, S, L, R):
585 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
586 self.assertRaises(TypeError, groupby, X(s))
587 self.assertRaises(TypeError, list, groupby(N(s)))
588 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
589
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000590 def test_ifilter(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(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
594 self.assertRaises(TypeError, ifilter, isEven, X(s))
595 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
596 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
597
598 def test_ifilterfalse(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(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
602 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
603 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
604 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
605
606 def test_izip(self):
607 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
608 for g in (G, I, Ig, S, L, R):
609 self.assertEqual(list(izip(g(s))), zip(g(s)))
610 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
611 self.assertRaises(TypeError, izip, X(s))
612 self.assertRaises(TypeError, list, izip(N(s)))
613 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
614
615 def test_imap(self):
616 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
617 for g in (G, I, Ig, S, L, R):
618 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
619 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
620 self.assertRaises(TypeError, imap, onearg, X(s))
621 self.assertRaises(TypeError, list, imap(onearg, N(s)))
622 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
623
624 def test_islice(self):
625 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
626 for g in (G, I, Ig, S, L, R):
627 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
628 self.assertRaises(TypeError, islice, X(s), 10)
629 self.assertRaises(TypeError, list, islice(N(s), 10))
630 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
631
632 def test_starmap(self):
633 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
634 for g in (G, I, Ig, S, L, R):
635 ss = zip(s, s)
636 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
637 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
638 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
639 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
640
641 def test_takewhile(self):
642 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
643 for g in (G, I, Ig, S, L, R):
644 tgt = []
645 for elem in g(s):
646 if not isEven(elem): break
647 tgt.append(elem)
648 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
649 self.assertRaises(TypeError, takewhile, isEven, X(s))
650 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
651 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
652
653 def test_dropwhile(self):
654 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
655 for g in (G, I, Ig, S, L, R):
656 tgt = []
657 for elem in g(s):
658 if not tgt and isOdd(elem): continue
659 tgt.append(elem)
660 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
661 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
662 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
663 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
664
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000665 def test_tee(self):
666 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
667 for g in (G, I, Ig, S, L, R):
668 it1, it2 = tee(g(s))
669 self.assertEqual(list(it1), list(g(s)))
670 self.assertEqual(list(it2), list(g(s)))
671 self.assertRaises(TypeError, tee, X(s))
672 self.assertRaises(TypeError, list, tee(N(s))[0])
673 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
674
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000675class LengthTransparency(unittest.TestCase):
676
677 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000678 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000679 self.assertEqual(len(repeat(None, 50)), 50)
680 self.assertRaises(TypeError, len, repeat(None))
681
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000682class RegressionTests(unittest.TestCase):
683
684 def test_sf_793826(self):
685 # Fix Armin Rigo's successful efforts to wreak havoc
686
687 def mutatingtuple(tuple1, f, tuple2):
688 # this builds a tuple t which is a copy of tuple1,
689 # then calls f(t), then mutates t to be equal to tuple2
690 # (needs len(tuple1) == len(tuple2)).
691 def g(value, first=[1]):
692 if first:
693 del first[:]
694 f(z.next())
695 return value
696 items = list(tuple2)
697 items[1:1] = list(tuple1)
698 gen = imap(g, items)
699 z = izip(*[gen]*len(tuple1))
700 z.next()
701
702 def f(t):
703 global T
704 T = t
705 first[:] = list(T)
706
707 first = []
708 mutatingtuple((1,2,3), f, (4,5,6))
709 second = list(T)
710 self.assertEqual(first, second)
711
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000712
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000713 def test_sf_950057(self):
714 # Make sure that chain() and cycle() catch exceptions immediately
715 # rather than when shifting between input sources
716
717 def gen1():
718 hist.append(0)
719 yield 1
720 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000721 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000722 hist.append(2)
723
724 def gen2(x):
725 hist.append(3)
726 yield 2
727 hist.append(4)
728 if x:
729 raise StopIteration
730
731 hist = []
732 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
733 self.assertEqual(hist, [0,1])
734
735 hist = []
736 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
737 self.assertEqual(hist, [0,1])
738
739 hist = []
740 self.assertRaises(AssertionError, list, cycle(gen1()))
741 self.assertEqual(hist, [0,1])
742
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000743libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000744
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000745
746>>> amounts = [120.15, 764.05, 823.14]
747>>> for checknum, amount in izip(count(1200), amounts):
748... print 'Check %d is for $%.2f' % (checknum, amount)
749...
750Check 1200 is for $120.15
751Check 1201 is for $764.05
752Check 1202 is for $823.14
753
754>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000755>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
756... print cube
757...
7581
7598
76027
761
762>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000763>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000764... print name.title()
765...
766Alex
767Laura
768Martin
769Walter
770Samuele
771
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000772>>> from operator import itemgetter
773>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000774>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000775>>> for k, g in groupby(di, itemgetter(1)):
776... print k, map(itemgetter(0), g)
777...
7781 ['a', 'c', 'e']
7792 ['b', 'd', 'f']
7803 ['g']
781
Raymond Hettinger734fb572004-01-20 20:04:40 +0000782# Find runs of consecutive numbers using groupby. The key to the solution
783# is differencing with a range so that consecutive numbers all appear in
784# same group.
785>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
786>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
787... print map(operator.itemgetter(1), g)
788...
789[1]
790[4, 5, 6]
791[10]
792[15, 16, 17, 18]
793[22]
794[25, 26, 27, 28]
795
Raymond Hettingera098b332003-09-08 23:58:40 +0000796>>> def take(n, seq):
797... return list(islice(seq, n))
798
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000799>>> def enumerate(iterable):
800... return izip(count(), iterable)
801
802>>> def tabulate(function):
803... "Return function(0), function(1), ..."
804... return imap(function, count())
805
806>>> def iteritems(mapping):
807... return izip(mapping.iterkeys(), mapping.itervalues())
808
809>>> def nth(iterable, n):
810... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000811... return list(islice(iterable, n, n+1))
812
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000813>>> def all(seq, pred=None):
814... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000815... for elem in ifilterfalse(pred, seq):
816... return False
817... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000818
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000819>>> def any(seq, pred=None):
820... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000821... for elem in ifilter(pred, seq):
822... return True
823... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000824
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000825>>> def no(seq, pred=None):
826... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000827... for elem in ifilter(pred, seq):
828... return False
829... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000830
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000831>>> def quantify(seq, pred=None):
832... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000833... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000834
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000835>>> def padnone(seq):
836... "Returns the sequence elements and then returns None indefinitely"
837... return chain(seq, repeat(None))
838
839>>> def ncycles(seq, n):
840... "Returns the sequence elements n times"
841... return chain(*repeat(seq, n))
842
843>>> def dotproduct(vec1, vec2):
844... return sum(imap(operator.mul, vec1, vec2))
845
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000846>>> def flatten(listOfLists):
847... return list(chain(*listOfLists))
848
849>>> def repeatfunc(func, times=None, *args):
850... "Repeat calls to func with specified arguments."
851... " Example: repeatfunc(random.random)"
852... if times is None:
853... return starmap(func, repeat(args))
854... else:
855... return starmap(func, repeat(args, times))
856
Raymond Hettingerd591f662003-10-26 15:34:50 +0000857>>> def pairwise(iterable):
858... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
859... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000860... try:
861... b.next()
862... except StopIteration:
863... pass
864... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000865
866This is not part of the examples but it tests to make sure the definitions
867perform as purported.
868
Raymond Hettingera098b332003-09-08 23:58:40 +0000869>>> take(10, count())
870[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
871
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000872>>> list(enumerate('abc'))
873[(0, 'a'), (1, 'b'), (2, 'c')]
874
875>>> list(islice(tabulate(lambda x: 2*x), 4))
876[0, 2, 4, 6]
877
878>>> nth('abcde', 3)
879['d']
880
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000881>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000882True
883
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000884>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000885False
886
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000887>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000888True
889
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000890>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000891False
892
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000893>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000894True
895
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000896>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000897False
898
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000899>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000090050
901
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000902>>> a = [[1, 2, 3], [4, 5, 6]]
903>>> flatten(a)
904[1, 2, 3, 4, 5, 6]
905
906>>> list(repeatfunc(pow, 5, 2, 3))
907[8, 8, 8, 8, 8]
908
909>>> import random
910>>> take(5, imap(int, repeatfunc(random.random)))
911[0, 0, 0, 0, 0]
912
Raymond Hettingerd591f662003-10-26 15:34:50 +0000913>>> list(pairwise('abcd'))
914[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000915
Raymond Hettingerd591f662003-10-26 15:34:50 +0000916>>> list(pairwise([]))
917[]
918
919>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000920[]
921
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000922>>> list(islice(padnone('abc'), 0, 6))
923['a', 'b', 'c', None, None, None]
924
925>>> list(ncycles('abc', 3))
926['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
927
928>>> dotproduct([1,2,3], [4,5,6])
92932
930
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000931"""
932
933__test__ = {'libreftest' : libreftest}
934
935def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000936 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000937 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000938 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000939
940 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000941 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000942 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000943 counts = [None] * 5
944 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000945 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000946 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000947 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000948 print counts
949
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000950 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000951 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000952
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000953if __name__ == "__main__":
954 test_main(verbose=True)