blob: 68987257d75b7387cac034da261bcc6610ad6a3f [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')
Neal Norwitz69e88972006-09-02 02:58:13 +0000374 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000375 for n in xrange(5):
376 result = tee('abc', n)
377 self.assertEqual(type(result), tuple)
378 self.assertEqual(len(result), n)
379 self.assertEqual(map(list, result), [list('abc')]*n)
380
Raymond Hettingerad983e72003-11-12 14:32:26 +0000381 # tee pass-through to copyable iterator
382 a, b = tee('abc')
383 c, d = tee(a)
384 self.assert_(a is c)
385
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000386 # test tee_new
387 t1, t2 = tee('abc')
388 tnew = type(t1)
389 self.assertRaises(TypeError, tnew)
390 self.assertRaises(TypeError, tnew, 10)
391 t3 = tnew(t1)
392 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000393
Raymond Hettingera9f60922004-10-17 16:40:14 +0000394 # test that tee objects are weak referencable
395 a, b = tee(xrange(10))
396 p = proxy(a)
397 self.assertEqual(getattr(p, '__class__'), type(b))
398 del a
399 self.assertRaises(ReferenceError, getattr, p, '__class__')
400
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000401 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000402 self.assertRaises(StopIteration, izip().next)
403
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000404 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000405 self.assertRaises(StopIteration, f([]).next)
406 self.assertRaises(StopIteration, f(StopNow()).next)
407
408 self.assertRaises(StopIteration, islice([], None).next)
409 self.assertRaises(StopIteration, islice(StopNow(), None).next)
410
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000411 p, q = tee([])
412 self.assertRaises(StopIteration, p.next)
413 self.assertRaises(StopIteration, q.next)
414 p, q = tee(StopNow())
415 self.assertRaises(StopIteration, p.next)
416 self.assertRaises(StopIteration, q.next)
417
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000418 self.assertRaises(StopIteration, repeat(None, 0).next)
419
420 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
421 self.assertRaises(StopIteration, f(lambda x:x, []).next)
422 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
423
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000424class TestGC(unittest.TestCase):
425
426 def makecycle(self, iterator, container):
427 container.append(iterator)
428 iterator.next()
429 del container, iterator
430
431 def test_chain(self):
432 a = []
433 self.makecycle(chain(a), a)
434
435 def test_cycle(self):
436 a = []
437 self.makecycle(cycle([a]*2), a)
438
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000439 def test_dropwhile(self):
440 a = []
441 self.makecycle(dropwhile(bool, [0, a, a]), a)
442
443 def test_groupby(self):
444 a = []
445 self.makecycle(groupby([a]*2, lambda x:x), a)
446
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000447 def test_ifilter(self):
448 a = []
449 self.makecycle(ifilter(lambda x:True, [a]*2), a)
450
451 def test_ifilterfalse(self):
452 a = []
453 self.makecycle(ifilterfalse(lambda x:False, a), a)
454
455 def test_izip(self):
456 a = []
457 self.makecycle(izip([a]*2, [a]*3), a)
458
459 def test_imap(self):
460 a = []
461 self.makecycle(imap(lambda x:x, [a]*2), a)
462
463 def test_islice(self):
464 a = []
465 self.makecycle(islice([a]*2, None), a)
466
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000467 def test_repeat(self):
468 a = []
469 self.makecycle(repeat(a), a)
470
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000471 def test_starmap(self):
472 a = []
473 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
474
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000475 def test_takewhile(self):
476 a = []
477 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
478
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000479def R(seqn):
480 'Regular generator'
481 for i in seqn:
482 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000483
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000484class G:
485 'Sequence using __getitem__'
486 def __init__(self, seqn):
487 self.seqn = seqn
488 def __getitem__(self, i):
489 return self.seqn[i]
490
491class I:
492 'Sequence using iterator protocol'
493 def __init__(self, seqn):
494 self.seqn = seqn
495 self.i = 0
496 def __iter__(self):
497 return self
498 def next(self):
499 if self.i >= len(self.seqn): raise StopIteration
500 v = self.seqn[self.i]
501 self.i += 1
502 return v
503
504class Ig:
505 'Sequence using iterator protocol defined with a generator'
506 def __init__(self, seqn):
507 self.seqn = seqn
508 self.i = 0
509 def __iter__(self):
510 for val in self.seqn:
511 yield val
512
513class X:
514 'Missing __getitem__ and __iter__'
515 def __init__(self, seqn):
516 self.seqn = seqn
517 self.i = 0
518 def next(self):
519 if self.i >= len(self.seqn): raise StopIteration
520 v = self.seqn[self.i]
521 self.i += 1
522 return v
523
524class N:
525 'Iterator missing next()'
526 def __init__(self, seqn):
527 self.seqn = seqn
528 self.i = 0
529 def __iter__(self):
530 return self
531
532class E:
533 'Test propagation of exceptions'
534 def __init__(self, seqn):
535 self.seqn = seqn
536 self.i = 0
537 def __iter__(self):
538 return self
539 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000540 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000541
542class S:
543 'Test immediate stop'
544 def __init__(self, seqn):
545 pass
546 def __iter__(self):
547 return self
548 def next(self):
549 raise StopIteration
550
551def L(seqn):
552 'Test multiple tiers of iterators'
553 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
554
555
556class TestVariousIteratorArgs(unittest.TestCase):
557
558 def test_chain(self):
559 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
560 for g in (G, I, Ig, S, L, R):
561 self.assertEqual(list(chain(g(s))), list(g(s)))
562 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
563 self.assertRaises(TypeError, chain, X(s))
564 self.assertRaises(TypeError, list, chain(N(s)))
565 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
566
567 def test_cycle(self):
568 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
569 for g in (G, I, Ig, S, L, R):
570 tgtlen = len(s) * 3
571 expected = list(g(s))*3
572 actual = list(islice(cycle(g(s)), tgtlen))
573 self.assertEqual(actual, expected)
574 self.assertRaises(TypeError, cycle, X(s))
575 self.assertRaises(TypeError, list, cycle(N(s)))
576 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
577
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000578 def test_groupby(self):
579 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
580 for g in (G, I, Ig, S, L, R):
581 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
582 self.assertRaises(TypeError, groupby, X(s))
583 self.assertRaises(TypeError, list, groupby(N(s)))
584 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
585
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000586 def test_ifilter(self):
587 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
588 for g in (G, I, Ig, S, L, R):
589 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
590 self.assertRaises(TypeError, ifilter, isEven, X(s))
591 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
592 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
593
594 def test_ifilterfalse(self):
595 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
596 for g in (G, I, Ig, S, L, R):
597 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
598 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
599 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
600 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
601
602 def test_izip(self):
603 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
604 for g in (G, I, Ig, S, L, R):
605 self.assertEqual(list(izip(g(s))), zip(g(s)))
606 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
607 self.assertRaises(TypeError, izip, X(s))
608 self.assertRaises(TypeError, list, izip(N(s)))
609 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
610
611 def test_imap(self):
612 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
613 for g in (G, I, Ig, S, L, R):
614 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
615 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
616 self.assertRaises(TypeError, imap, onearg, X(s))
617 self.assertRaises(TypeError, list, imap(onearg, N(s)))
618 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
619
620 def test_islice(self):
621 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
622 for g in (G, I, Ig, S, L, R):
623 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
624 self.assertRaises(TypeError, islice, X(s), 10)
625 self.assertRaises(TypeError, list, islice(N(s), 10))
626 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
627
628 def test_starmap(self):
629 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
630 for g in (G, I, Ig, S, L, R):
631 ss = zip(s, s)
632 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
633 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
634 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
635 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
636
637 def test_takewhile(self):
638 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
639 for g in (G, I, Ig, S, L, R):
640 tgt = []
641 for elem in g(s):
642 if not isEven(elem): break
643 tgt.append(elem)
644 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
645 self.assertRaises(TypeError, takewhile, isEven, X(s))
646 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
647 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
648
649 def test_dropwhile(self):
650 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
651 for g in (G, I, Ig, S, L, R):
652 tgt = []
653 for elem in g(s):
654 if not tgt and isOdd(elem): continue
655 tgt.append(elem)
656 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
657 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
658 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
659 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
660
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000661 def test_tee(self):
662 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
663 for g in (G, I, Ig, S, L, R):
664 it1, it2 = tee(g(s))
665 self.assertEqual(list(it1), list(g(s)))
666 self.assertEqual(list(it2), list(g(s)))
667 self.assertRaises(TypeError, tee, X(s))
668 self.assertRaises(TypeError, list, tee(N(s))[0])
669 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
670
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000671class LengthTransparency(unittest.TestCase):
672
673 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000674 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000675 self.assertEqual(len(repeat(None, 50)), 50)
676 self.assertRaises(TypeError, len, repeat(None))
677
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000678class RegressionTests(unittest.TestCase):
679
680 def test_sf_793826(self):
681 # Fix Armin Rigo's successful efforts to wreak havoc
682
683 def mutatingtuple(tuple1, f, tuple2):
684 # this builds a tuple t which is a copy of tuple1,
685 # then calls f(t), then mutates t to be equal to tuple2
686 # (needs len(tuple1) == len(tuple2)).
687 def g(value, first=[1]):
688 if first:
689 del first[:]
690 f(z.next())
691 return value
692 items = list(tuple2)
693 items[1:1] = list(tuple1)
694 gen = imap(g, items)
695 z = izip(*[gen]*len(tuple1))
696 z.next()
697
698 def f(t):
699 global T
700 T = t
701 first[:] = list(T)
702
703 first = []
704 mutatingtuple((1,2,3), f, (4,5,6))
705 second = list(T)
706 self.assertEqual(first, second)
707
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000708
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000709 def test_sf_950057(self):
710 # Make sure that chain() and cycle() catch exceptions immediately
711 # rather than when shifting between input sources
712
713 def gen1():
714 hist.append(0)
715 yield 1
716 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000717 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000718 hist.append(2)
719
720 def gen2(x):
721 hist.append(3)
722 yield 2
723 hist.append(4)
724 if x:
725 raise StopIteration
726
727 hist = []
728 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
729 self.assertEqual(hist, [0,1])
730
731 hist = []
732 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
733 self.assertEqual(hist, [0,1])
734
735 hist = []
736 self.assertRaises(AssertionError, list, cycle(gen1()))
737 self.assertEqual(hist, [0,1])
738
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000739libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000740
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000741
742>>> amounts = [120.15, 764.05, 823.14]
743>>> for checknum, amount in izip(count(1200), amounts):
744... print 'Check %d is for $%.2f' % (checknum, amount)
745...
746Check 1200 is for $120.15
747Check 1201 is for $764.05
748Check 1202 is for $823.14
749
750>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000751>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
752... print cube
753...
7541
7558
75627
757
758>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000759>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000760... print name.title()
761...
762Alex
763Laura
764Martin
765Walter
766Samuele
767
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000768>>> from operator import itemgetter
769>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000770>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000771>>> for k, g in groupby(di, itemgetter(1)):
772... print k, map(itemgetter(0), g)
773...
7741 ['a', 'c', 'e']
7752 ['b', 'd', 'f']
7763 ['g']
777
Raymond Hettinger734fb572004-01-20 20:04:40 +0000778# Find runs of consecutive numbers using groupby. The key to the solution
779# is differencing with a range so that consecutive numbers all appear in
780# same group.
781>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
782>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
783... print map(operator.itemgetter(1), g)
784...
785[1]
786[4, 5, 6]
787[10]
788[15, 16, 17, 18]
789[22]
790[25, 26, 27, 28]
791
Raymond Hettingera098b332003-09-08 23:58:40 +0000792>>> def take(n, seq):
793... return list(islice(seq, n))
794
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000795>>> def enumerate(iterable):
796... return izip(count(), iterable)
797
798>>> def tabulate(function):
799... "Return function(0), function(1), ..."
800... return imap(function, count())
801
802>>> def iteritems(mapping):
803... return izip(mapping.iterkeys(), mapping.itervalues())
804
805>>> def nth(iterable, n):
806... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000807... return list(islice(iterable, n, n+1))
808
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000809>>> def all(seq, pred=None):
810... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000811... for elem in ifilterfalse(pred, seq):
812... return False
813... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000814
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000815>>> def any(seq, pred=None):
816... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000817... for elem in ifilter(pred, seq):
818... return True
819... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000820
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000821>>> def no(seq, pred=None):
822... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000823... for elem in ifilter(pred, seq):
824... return False
825... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000826
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000827>>> def quantify(seq, pred=None):
828... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000829... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000830
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000831>>> def padnone(seq):
832... "Returns the sequence elements and then returns None indefinitely"
833... return chain(seq, repeat(None))
834
835>>> def ncycles(seq, n):
836... "Returns the sequence elements n times"
837... return chain(*repeat(seq, n))
838
839>>> def dotproduct(vec1, vec2):
840... return sum(imap(operator.mul, vec1, vec2))
841
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000842>>> def flatten(listOfLists):
843... return list(chain(*listOfLists))
844
845>>> def repeatfunc(func, times=None, *args):
846... "Repeat calls to func with specified arguments."
847... " Example: repeatfunc(random.random)"
848... if times is None:
849... return starmap(func, repeat(args))
850... else:
851... return starmap(func, repeat(args, times))
852
Raymond Hettingerd591f662003-10-26 15:34:50 +0000853>>> def pairwise(iterable):
854... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
855... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000856... try:
857... b.next()
858... except StopIteration:
859... pass
860... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000861
862This is not part of the examples but it tests to make sure the definitions
863perform as purported.
864
Raymond Hettingera098b332003-09-08 23:58:40 +0000865>>> take(10, count())
866[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
867
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000868>>> list(enumerate('abc'))
869[(0, 'a'), (1, 'b'), (2, 'c')]
870
871>>> list(islice(tabulate(lambda x: 2*x), 4))
872[0, 2, 4, 6]
873
874>>> nth('abcde', 3)
875['d']
876
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000877>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000878True
879
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000880>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000881False
882
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000883>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000884True
885
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000886>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000887False
888
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000889>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000890True
891
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000892>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000893False
894
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000895>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000089650
897
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000898>>> a = [[1, 2, 3], [4, 5, 6]]
899>>> flatten(a)
900[1, 2, 3, 4, 5, 6]
901
902>>> list(repeatfunc(pow, 5, 2, 3))
903[8, 8, 8, 8, 8]
904
905>>> import random
906>>> take(5, imap(int, repeatfunc(random.random)))
907[0, 0, 0, 0, 0]
908
Raymond Hettingerd591f662003-10-26 15:34:50 +0000909>>> list(pairwise('abcd'))
910[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000911
Raymond Hettingerd591f662003-10-26 15:34:50 +0000912>>> list(pairwise([]))
913[]
914
915>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000916[]
917
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000918>>> list(islice(padnone('abc'), 0, 6))
919['a', 'b', 'c', None, None, None]
920
921>>> list(ncycles('abc', 3))
922['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
923
924>>> dotproduct([1,2,3], [4,5,6])
92532
926
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000927"""
928
929__test__ = {'libreftest' : libreftest}
930
931def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000932 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000933 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000934 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000935
936 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000937 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000938 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000939 counts = [None] * 5
940 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000941 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000942 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000943 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000944 print counts
945
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000946 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000947 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000948
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000949if __name__ == "__main__":
950 test_main(verbose=True)