blob: 635d1563760d6697cd12e90f1197cfa14ad28162 [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)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +000061
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000062 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000063 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000064 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000065 self.assertRaises(TypeError, cycle)
66 self.assertRaises(TypeError, cycle, 5)
67 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000068
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000069 def test_groupby(self):
70 # Check whether it accepts arguments correctly
71 self.assertEqual([], list(groupby([])))
72 self.assertEqual([], list(groupby([], key=id)))
73 self.assertRaises(TypeError, list, groupby('abc', []))
74 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000075 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000076
77 # Check normal input
78 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
79 (2,15,22), (3,16,23), (3,17,23)]
80 dup = []
81 for k, g in groupby(s, lambda r:r[0]):
82 for elem in g:
83 self.assertEqual(k, elem[0])
84 dup.append(elem)
85 self.assertEqual(s, dup)
86
87 # Check nested case
88 dup = []
89 for k, g in groupby(s, lambda r:r[0]):
90 for ik, ig in groupby(g, lambda r:r[2]):
91 for elem in ig:
92 self.assertEqual(k, elem[0])
93 self.assertEqual(ik, elem[2])
94 dup.append(elem)
95 self.assertEqual(s, dup)
96
97 # Check case where inner iterator is not used
98 keys = [k for k, g in groupby(s, lambda r:r[0])]
99 expectedkeys = set([r[0] for r in s])
100 self.assertEqual(set(keys), expectedkeys)
101 self.assertEqual(len(keys), len(expectedkeys))
102
103 # Exercise pipes and filters style
104 s = 'abracadabra'
105 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000106 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000107 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
108 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000109 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000110 self.assertEqual(r, ['a', 'b', 'r'])
111 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000112 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000113 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
114 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000115 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000116 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
117
118 # iter.next failure
119 class ExpectedError(Exception):
120 pass
121 def delayed_raise(n=0):
122 for i in range(n):
123 yield 'yo'
124 raise ExpectedError
125 def gulp(iterable, keyp=None, func=list):
126 return [func(g) for k, g in groupby(iterable, keyp)]
127
128 # iter.next failure on outer object
129 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
130 # iter.next failure on inner object
131 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
132
133 # __cmp__ failure
134 class DummyCmp:
135 def __cmp__(self, dst):
136 raise ExpectedError
137 s = [DummyCmp(), DummyCmp(), None]
138
139 # __cmp__ failure on outer object
140 self.assertRaises(ExpectedError, gulp, s, func=id)
141 # __cmp__ failure on inner object
142 self.assertRaises(ExpectedError, gulp, s)
143
144 # keyfunc failure
145 def keyfunc(obj):
146 if keyfunc.skip > 0:
147 keyfunc.skip -= 1
148 return obj
149 else:
150 raise ExpectedError
151
152 # keyfunc failure on outer object
153 keyfunc.skip = 0
154 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
155 keyfunc.skip = 1
156 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
157
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000158 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000159 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000160 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000161 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000162 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000163 self.assertRaises(TypeError, ifilter, lambda x:x)
164 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000165 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000166 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000167
168 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000169 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
170 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000171 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000172 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000173 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
174 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000175 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000177
178 def test_izip(self):
179 ans = [(x,y) for x, y in izip('abc',count())]
180 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000181 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
182 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000183 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000184 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000185 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertRaises(TypeError, izip, 3)
187 self.assertRaises(TypeError, izip, range(3), 3)
188 # Check tuple re-use (implementation detail)
189 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
190 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000191 self.assertEqual([pair for pair in izip('abc', 'def')],
192 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000193 ids = map(id, izip('abc', 'def'))
194 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000195 ids = map(id, list(izip('abc', 'def')))
196 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000197
198 def test_repeat(self):
199 self.assertEqual(zip(xrange(3),repeat('a')),
200 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000201 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000202 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000203 self.assertEqual(list(repeat('a', 0)), [])
204 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000205 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000206 self.assertRaises(TypeError, repeat, None, 3, 4)
207 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000208 r = repeat(1+0j)
209 self.assertEqual(repr(r), 'repeat((1+0j))')
210 r = repeat(1+0j, 5)
211 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
212 list(r)
213 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000214
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000215 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000216 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
217 [0**1, 1**2, 2**3])
218 self.assertEqual(list(imap(None, 'abc', range(5))),
219 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000220 self.assertEqual(list(imap(None, 'abc', count())),
221 [('a',0),('b',1),('c',2)])
222 self.assertEqual(take(2,imap(None, 'abc', count())),
223 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000224 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000225 self.assertRaises(TypeError, imap)
226 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000227 self.assertRaises(TypeError, imap(10, range(5)).next)
228 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
229 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000230
231 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000232 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
233 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000234 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
235 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000236 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000237 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000238 self.assertRaises(TypeError, starmap)
239 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
240 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
241 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
242 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000243
244 def test_islice(self):
245 for args in [ # islice(args) should agree with range(args)
246 (10, 20, 3),
247 (10, 3, 20),
248 (10, 20),
249 (10, 3),
250 (20,)
251 ]:
252 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
253
254 for args, tgtargs in [ # Stop when seqn is exhausted
255 ((10, 110, 3), ((10, 100, 3))),
256 ((10, 110), ((10, 100))),
257 ((110,), (100,))
258 ]:
259 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
260
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000261 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000262 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000263 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
264 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000265 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
266 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
267
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000268 # Test number of items consumed SF #1171417
269 it = iter(range(10))
270 self.assertEqual(list(islice(it, 3)), range(3))
271 self.assertEqual(list(it), range(3, 10))
272
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000273 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000274 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000275 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
276 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
277 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
278 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
279 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000280 self.assertRaises(ValueError, islice, xrange(10), 'a')
281 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
282 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
283 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
284 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000285 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000286
287 def test_takewhile(self):
288 data = [1, 3, 5, 20, 2, 4, 6, 8]
289 underten = lambda x: x<10
290 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000291 self.assertEqual(list(takewhile(underten, [])), [])
292 self.assertRaises(TypeError, takewhile)
293 self.assertRaises(TypeError, takewhile, operator.pow)
294 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
295 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
296 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000297 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
298 self.assertEqual(list(t), [1, 1, 1])
299 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000300
301 def test_dropwhile(self):
302 data = [1, 3, 5, 20, 2, 4, 6, 8]
303 underten = lambda x: x<10
304 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000305 self.assertEqual(list(dropwhile(underten, [])), [])
306 self.assertRaises(TypeError, dropwhile)
307 self.assertRaises(TypeError, dropwhile, operator.pow)
308 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
309 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
310 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000311
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000312 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000313 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000314 def irange(n):
315 for i in xrange(n):
316 yield i
317
318 a, b = tee([]) # test empty iterator
319 self.assertEqual(list(a), [])
320 self.assertEqual(list(b), [])
321
322 a, b = tee(irange(n)) # test 100% interleaved
323 self.assertEqual(zip(a,b), zip(range(n),range(n)))
324
325 a, b = tee(irange(n)) # test 0% interleaved
326 self.assertEqual(list(a), range(n))
327 self.assertEqual(list(b), range(n))
328
329 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000330 for i in xrange(100):
331 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000332 del a
333 self.assertEqual(list(b), range(n))
334
335 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000336 for i in xrange(100):
337 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000338 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000339 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000340
341 for j in xrange(5): # test randomly interleaved
342 order = [0]*n + [1]*n
343 random.shuffle(order)
344 lists = ([], [])
345 its = tee(irange(n))
346 for i in order:
347 value = its[i].next()
348 lists[i].append(value)
349 self.assertEqual(lists[0], range(n))
350 self.assertEqual(lists[1], range(n))
351
Raymond Hettingerad983e72003-11-12 14:32:26 +0000352 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000353 self.assertRaises(TypeError, tee)
354 self.assertRaises(TypeError, tee, 3)
355 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000356 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000357
Raymond Hettingerad983e72003-11-12 14:32:26 +0000358 # tee object should be instantiable
359 a, b = tee('abc')
360 c = type(a)('def')
361 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000362
Raymond Hettingerad983e72003-11-12 14:32:26 +0000363 # test long-lagged and multi-way split
364 a, b, c = tee(xrange(2000), 3)
365 for i in xrange(100):
366 self.assertEqual(a.next(), i)
367 self.assertEqual(list(b), range(2000))
368 self.assertEqual([c.next(), c.next()], range(2))
369 self.assertEqual(list(a), range(100,2000))
370 self.assertEqual(list(c), range(2,2000))
371
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000372 # test values of n
373 self.assertRaises(TypeError, tee, 'abc', 'invalid')
374 for n in xrange(5):
375 result = tee('abc', n)
376 self.assertEqual(type(result), tuple)
377 self.assertEqual(len(result), n)
378 self.assertEqual(map(list, result), [list('abc')]*n)
379
Raymond Hettingerad983e72003-11-12 14:32:26 +0000380 # tee pass-through to copyable iterator
381 a, b = tee('abc')
382 c, d = tee(a)
383 self.assert_(a is c)
384
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000385 # test tee_new
386 t1, t2 = tee('abc')
387 tnew = type(t1)
388 self.assertRaises(TypeError, tnew)
389 self.assertRaises(TypeError, tnew, 10)
390 t3 = tnew(t1)
391 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000392
Raymond Hettingera9f60922004-10-17 16:40:14 +0000393 # test that tee objects are weak referencable
394 a, b = tee(xrange(10))
395 p = proxy(a)
396 self.assertEqual(getattr(p, '__class__'), type(b))
397 del a
398 self.assertRaises(ReferenceError, getattr, p, '__class__')
399
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000400 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000401 self.assertRaises(StopIteration, izip().next)
402
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000403 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000404 self.assertRaises(StopIteration, f([]).next)
405 self.assertRaises(StopIteration, f(StopNow()).next)
406
407 self.assertRaises(StopIteration, islice([], None).next)
408 self.assertRaises(StopIteration, islice(StopNow(), None).next)
409
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000410 p, q = tee([])
411 self.assertRaises(StopIteration, p.next)
412 self.assertRaises(StopIteration, q.next)
413 p, q = tee(StopNow())
414 self.assertRaises(StopIteration, p.next)
415 self.assertRaises(StopIteration, q.next)
416
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000417 self.assertRaises(StopIteration, repeat(None, 0).next)
418
419 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
420 self.assertRaises(StopIteration, f(lambda x:x, []).next)
421 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
422
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000423class TestGC(unittest.TestCase):
424
425 def makecycle(self, iterator, container):
426 container.append(iterator)
427 iterator.next()
428 del container, iterator
429
430 def test_chain(self):
431 a = []
432 self.makecycle(chain(a), a)
433
434 def test_cycle(self):
435 a = []
436 self.makecycle(cycle([a]*2), a)
437
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000438 def test_dropwhile(self):
439 a = []
440 self.makecycle(dropwhile(bool, [0, a, a]), a)
441
442 def test_groupby(self):
443 a = []
444 self.makecycle(groupby([a]*2, lambda x:x), a)
445
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000446 def test_ifilter(self):
447 a = []
448 self.makecycle(ifilter(lambda x:True, [a]*2), a)
449
450 def test_ifilterfalse(self):
451 a = []
452 self.makecycle(ifilterfalse(lambda x:False, a), a)
453
454 def test_izip(self):
455 a = []
456 self.makecycle(izip([a]*2, [a]*3), a)
457
458 def test_imap(self):
459 a = []
460 self.makecycle(imap(lambda x:x, [a]*2), a)
461
462 def test_islice(self):
463 a = []
464 self.makecycle(islice([a]*2, None), a)
465
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000466 def test_repeat(self):
467 a = []
468 self.makecycle(repeat(a), a)
469
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000470 def test_starmap(self):
471 a = []
472 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
473
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000474 def test_takewhile(self):
475 a = []
476 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
477
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000478def R(seqn):
479 'Regular generator'
480 for i in seqn:
481 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000482
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000483class G:
484 'Sequence using __getitem__'
485 def __init__(self, seqn):
486 self.seqn = seqn
487 def __getitem__(self, i):
488 return self.seqn[i]
489
490class I:
491 'Sequence using iterator protocol'
492 def __init__(self, seqn):
493 self.seqn = seqn
494 self.i = 0
495 def __iter__(self):
496 return self
497 def next(self):
498 if self.i >= len(self.seqn): raise StopIteration
499 v = self.seqn[self.i]
500 self.i += 1
501 return v
502
503class Ig:
504 'Sequence using iterator protocol defined with a generator'
505 def __init__(self, seqn):
506 self.seqn = seqn
507 self.i = 0
508 def __iter__(self):
509 for val in self.seqn:
510 yield val
511
512class X:
513 'Missing __getitem__ and __iter__'
514 def __init__(self, seqn):
515 self.seqn = seqn
516 self.i = 0
517 def next(self):
518 if self.i >= len(self.seqn): raise StopIteration
519 v = self.seqn[self.i]
520 self.i += 1
521 return v
522
523class N:
524 'Iterator missing next()'
525 def __init__(self, seqn):
526 self.seqn = seqn
527 self.i = 0
528 def __iter__(self):
529 return self
530
531class E:
532 'Test propagation of exceptions'
533 def __init__(self, seqn):
534 self.seqn = seqn
535 self.i = 0
536 def __iter__(self):
537 return self
538 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000539 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000540
541class S:
542 'Test immediate stop'
543 def __init__(self, seqn):
544 pass
545 def __iter__(self):
546 return self
547 def next(self):
548 raise StopIteration
549
550def L(seqn):
551 'Test multiple tiers of iterators'
552 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
553
554
555class TestVariousIteratorArgs(unittest.TestCase):
556
557 def test_chain(self):
558 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
559 for g in (G, I, Ig, S, L, R):
560 self.assertEqual(list(chain(g(s))), list(g(s)))
561 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
562 self.assertRaises(TypeError, chain, X(s))
563 self.assertRaises(TypeError, list, chain(N(s)))
564 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
565
566 def test_cycle(self):
567 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
568 for g in (G, I, Ig, S, L, R):
569 tgtlen = len(s) * 3
570 expected = list(g(s))*3
571 actual = list(islice(cycle(g(s)), tgtlen))
572 self.assertEqual(actual, expected)
573 self.assertRaises(TypeError, cycle, X(s))
574 self.assertRaises(TypeError, list, cycle(N(s)))
575 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
576
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000577 def test_groupby(self):
578 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
579 for g in (G, I, Ig, S, L, R):
580 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
581 self.assertRaises(TypeError, groupby, X(s))
582 self.assertRaises(TypeError, list, groupby(N(s)))
583 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
584
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000585 def test_ifilter(self):
586 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
587 for g in (G, I, Ig, S, L, R):
588 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
589 self.assertRaises(TypeError, ifilter, isEven, X(s))
590 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
591 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
592
593 def test_ifilterfalse(self):
594 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
595 for g in (G, I, Ig, S, L, R):
596 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
597 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
598 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
599 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
600
601 def test_izip(self):
602 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
603 for g in (G, I, Ig, S, L, R):
604 self.assertEqual(list(izip(g(s))), zip(g(s)))
605 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
606 self.assertRaises(TypeError, izip, X(s))
607 self.assertRaises(TypeError, list, izip(N(s)))
608 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
609
610 def test_imap(self):
611 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
612 for g in (G, I, Ig, S, L, R):
613 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
614 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
615 self.assertRaises(TypeError, imap, onearg, X(s))
616 self.assertRaises(TypeError, list, imap(onearg, N(s)))
617 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
618
619 def test_islice(self):
620 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
621 for g in (G, I, Ig, S, L, R):
622 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
623 self.assertRaises(TypeError, islice, X(s), 10)
624 self.assertRaises(TypeError, list, islice(N(s), 10))
625 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
626
627 def test_starmap(self):
628 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
629 for g in (G, I, Ig, S, L, R):
630 ss = zip(s, s)
631 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
632 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
633 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
634 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
635
636 def test_takewhile(self):
637 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
638 for g in (G, I, Ig, S, L, R):
639 tgt = []
640 for elem in g(s):
641 if not isEven(elem): break
642 tgt.append(elem)
643 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
644 self.assertRaises(TypeError, takewhile, isEven, X(s))
645 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
646 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
647
648 def test_dropwhile(self):
649 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
650 for g in (G, I, Ig, S, L, R):
651 tgt = []
652 for elem in g(s):
653 if not tgt and isOdd(elem): continue
654 tgt.append(elem)
655 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
656 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
657 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
658 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
659
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000660 def test_tee(self):
661 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
662 for g in (G, I, Ig, S, L, R):
663 it1, it2 = tee(g(s))
664 self.assertEqual(list(it1), list(g(s)))
665 self.assertEqual(list(it2), list(g(s)))
666 self.assertRaises(TypeError, tee, X(s))
667 self.assertRaises(TypeError, list, tee(N(s))[0])
668 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
669
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000670class LengthTransparency(unittest.TestCase):
671
672 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000673 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000674 self.assertEqual(len(repeat(None, 50)), 50)
675 self.assertRaises(TypeError, len, repeat(None))
676
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000677class RegressionTests(unittest.TestCase):
678
679 def test_sf_793826(self):
680 # Fix Armin Rigo's successful efforts to wreak havoc
681
682 def mutatingtuple(tuple1, f, tuple2):
683 # this builds a tuple t which is a copy of tuple1,
684 # then calls f(t), then mutates t to be equal to tuple2
685 # (needs len(tuple1) == len(tuple2)).
686 def g(value, first=[1]):
687 if first:
688 del first[:]
689 f(z.next())
690 return value
691 items = list(tuple2)
692 items[1:1] = list(tuple1)
693 gen = imap(g, items)
694 z = izip(*[gen]*len(tuple1))
695 z.next()
696
697 def f(t):
698 global T
699 T = t
700 first[:] = list(T)
701
702 first = []
703 mutatingtuple((1,2,3), f, (4,5,6))
704 second = list(T)
705 self.assertEqual(first, second)
706
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000707
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000708 def test_sf_950057(self):
709 # Make sure that chain() and cycle() catch exceptions immediately
710 # rather than when shifting between input sources
711
712 def gen1():
713 hist.append(0)
714 yield 1
715 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000716 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000717 hist.append(2)
718
719 def gen2(x):
720 hist.append(3)
721 yield 2
722 hist.append(4)
723 if x:
724 raise StopIteration
725
726 hist = []
727 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
728 self.assertEqual(hist, [0,1])
729
730 hist = []
731 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
732 self.assertEqual(hist, [0,1])
733
734 hist = []
735 self.assertRaises(AssertionError, list, cycle(gen1()))
736 self.assertEqual(hist, [0,1])
737
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000738libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000739
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000740
741>>> amounts = [120.15, 764.05, 823.14]
742>>> for checknum, amount in izip(count(1200), amounts):
743... print 'Check %d is for $%.2f' % (checknum, amount)
744...
745Check 1200 is for $120.15
746Check 1201 is for $764.05
747Check 1202 is for $823.14
748
749>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000750>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
751... print cube
752...
7531
7548
75527
756
757>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000758>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000759... print name.title()
760...
761Alex
762Laura
763Martin
764Walter
765Samuele
766
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000767>>> from operator import itemgetter
768>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Raymond Hettinger64958a12003-12-17 20:43:33 +0000769>>> di = sorted(d.iteritems(), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000770>>> for k, g in groupby(di, itemgetter(1)):
771... print k, map(itemgetter(0), g)
772...
7731 ['a', 'c', 'e']
7742 ['b', 'd', 'f']
7753 ['g']
776
Raymond Hettinger734fb572004-01-20 20:04:40 +0000777# Find runs of consecutive numbers using groupby. The key to the solution
778# is differencing with a range so that consecutive numbers all appear in
779# same group.
780>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
781>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
782... print map(operator.itemgetter(1), g)
783...
784[1]
785[4, 5, 6]
786[10]
787[15, 16, 17, 18]
788[22]
789[25, 26, 27, 28]
790
Raymond Hettingera098b332003-09-08 23:58:40 +0000791>>> def take(n, seq):
792... return list(islice(seq, n))
793
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000794>>> def enumerate(iterable):
795... return izip(count(), iterable)
796
797>>> def tabulate(function):
798... "Return function(0), function(1), ..."
799... return imap(function, count())
800
801>>> def iteritems(mapping):
802... return izip(mapping.iterkeys(), mapping.itervalues())
803
804>>> def nth(iterable, n):
805... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000806... return list(islice(iterable, n, n+1))
807
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000808>>> def all(seq, pred=None):
809... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000810... for elem in ifilterfalse(pred, seq):
811... return False
812... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000813
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000814>>> def any(seq, pred=None):
815... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000816... for elem in ifilter(pred, seq):
817... return True
818... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000819
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000820>>> def no(seq, pred=None):
821... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000822... for elem in ifilter(pred, seq):
823... return False
824... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000825
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000826>>> def quantify(seq, pred=None):
827... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000828... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000829
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000830>>> def padnone(seq):
831... "Returns the sequence elements and then returns None indefinitely"
832... return chain(seq, repeat(None))
833
834>>> def ncycles(seq, n):
835... "Returns the sequence elements n times"
836... return chain(*repeat(seq, n))
837
838>>> def dotproduct(vec1, vec2):
839... return sum(imap(operator.mul, vec1, vec2))
840
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000841>>> def flatten(listOfLists):
842... return list(chain(*listOfLists))
843
844>>> def repeatfunc(func, times=None, *args):
845... "Repeat calls to func with specified arguments."
846... " Example: repeatfunc(random.random)"
847... if times is None:
848... return starmap(func, repeat(args))
849... else:
850... return starmap(func, repeat(args, times))
851
Raymond Hettingerd591f662003-10-26 15:34:50 +0000852>>> def pairwise(iterable):
853... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
854... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000855... try:
856... b.next()
857... except StopIteration:
858... pass
859... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000860
861This is not part of the examples but it tests to make sure the definitions
862perform as purported.
863
Raymond Hettingera098b332003-09-08 23:58:40 +0000864>>> take(10, count())
865[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
866
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000867>>> list(enumerate('abc'))
868[(0, 'a'), (1, 'b'), (2, 'c')]
869
870>>> list(islice(tabulate(lambda x: 2*x), 4))
871[0, 2, 4, 6]
872
873>>> nth('abcde', 3)
874['d']
875
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000876>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000877True
878
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000879>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000880False
881
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000882>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000883True
884
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000885>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000886False
887
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000888>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000889True
890
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000891>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000892False
893
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000894>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000089550
896
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000897>>> a = [[1, 2, 3], [4, 5, 6]]
898>>> flatten(a)
899[1, 2, 3, 4, 5, 6]
900
901>>> list(repeatfunc(pow, 5, 2, 3))
902[8, 8, 8, 8, 8]
903
904>>> import random
905>>> take(5, imap(int, repeatfunc(random.random)))
906[0, 0, 0, 0, 0]
907
Raymond Hettingerd591f662003-10-26 15:34:50 +0000908>>> list(pairwise('abcd'))
909[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000910
Raymond Hettingerd591f662003-10-26 15:34:50 +0000911>>> list(pairwise([]))
912[]
913
914>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000915[]
916
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000917>>> list(islice(padnone('abc'), 0, 6))
918['a', 'b', 'c', None, None, None]
919
920>>> list(ncycles('abc', 3))
921['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
922
923>>> dotproduct([1,2,3], [4,5,6])
92432
925
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000926"""
927
928__test__ = {'libreftest' : libreftest}
929
930def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000931 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000932 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000933 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000934
935 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000936 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000937 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000938 counts = [None] * 5
939 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000940 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000941 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000942 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000943 print counts
944
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000945 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000946 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000947
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000948if __name__ == "__main__":
949 test_main(verbose=True)