blob: becb3b2088e610f55ea3b6a787489d1429d47c20 [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
268 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000269 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000270 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
271 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
272 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
273 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
274 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000275 self.assertRaises(ValueError, islice, xrange(10), 'a')
276 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
277 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
278 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
279 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000280 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000281
282 def test_takewhile(self):
283 data = [1, 3, 5, 20, 2, 4, 6, 8]
284 underten = lambda x: x<10
285 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000286 self.assertEqual(list(takewhile(underten, [])), [])
287 self.assertRaises(TypeError, takewhile)
288 self.assertRaises(TypeError, takewhile, operator.pow)
289 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
290 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
291 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000292 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
293 self.assertEqual(list(t), [1, 1, 1])
294 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000295
296 def test_dropwhile(self):
297 data = [1, 3, 5, 20, 2, 4, 6, 8]
298 underten = lambda x: x<10
299 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000300 self.assertEqual(list(dropwhile(underten, [])), [])
301 self.assertRaises(TypeError, dropwhile)
302 self.assertRaises(TypeError, dropwhile, operator.pow)
303 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
304 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
305 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000306
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000307 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000308 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000309 def irange(n):
310 for i in xrange(n):
311 yield i
312
313 a, b = tee([]) # test empty iterator
314 self.assertEqual(list(a), [])
315 self.assertEqual(list(b), [])
316
317 a, b = tee(irange(n)) # test 100% interleaved
318 self.assertEqual(zip(a,b), zip(range(n),range(n)))
319
320 a, b = tee(irange(n)) # test 0% interleaved
321 self.assertEqual(list(a), range(n))
322 self.assertEqual(list(b), range(n))
323
324 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000325 for i in xrange(100):
326 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000327 del a
328 self.assertEqual(list(b), range(n))
329
330 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000331 for i in xrange(100):
332 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000333 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000334 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000335
336 for j in xrange(5): # test randomly interleaved
337 order = [0]*n + [1]*n
338 random.shuffle(order)
339 lists = ([], [])
340 its = tee(irange(n))
341 for i in order:
342 value = its[i].next()
343 lists[i].append(value)
344 self.assertEqual(lists[0], range(n))
345 self.assertEqual(lists[1], range(n))
346
Raymond Hettingerad983e72003-11-12 14:32:26 +0000347 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000348 self.assertRaises(TypeError, tee)
349 self.assertRaises(TypeError, tee, 3)
350 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000351 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000352
Raymond Hettingerad983e72003-11-12 14:32:26 +0000353 # tee object should be instantiable
354 a, b = tee('abc')
355 c = type(a)('def')
356 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000357
Raymond Hettingerad983e72003-11-12 14:32:26 +0000358 # test long-lagged and multi-way split
359 a, b, c = tee(xrange(2000), 3)
360 for i in xrange(100):
361 self.assertEqual(a.next(), i)
362 self.assertEqual(list(b), range(2000))
363 self.assertEqual([c.next(), c.next()], range(2))
364 self.assertEqual(list(a), range(100,2000))
365 self.assertEqual(list(c), range(2,2000))
366
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000367 # test values of n
368 self.assertRaises(TypeError, tee, 'abc', 'invalid')
369 for n in xrange(5):
370 result = tee('abc', n)
371 self.assertEqual(type(result), tuple)
372 self.assertEqual(len(result), n)
373 self.assertEqual(map(list, result), [list('abc')]*n)
374
Raymond Hettingerad983e72003-11-12 14:32:26 +0000375 # tee pass-through to copyable iterator
376 a, b = tee('abc')
377 c, d = tee(a)
378 self.assert_(a is c)
379
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000380 # test tee_new
381 t1, t2 = tee('abc')
382 tnew = type(t1)
383 self.assertRaises(TypeError, tnew)
384 self.assertRaises(TypeError, tnew, 10)
385 t3 = tnew(t1)
386 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000387
Raymond Hettingera9f60922004-10-17 16:40:14 +0000388 # test that tee objects are weak referencable
389 a, b = tee(xrange(10))
390 p = proxy(a)
391 self.assertEqual(getattr(p, '__class__'), type(b))
392 del a
393 self.assertRaises(ReferenceError, getattr, p, '__class__')
394
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000395 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000396 self.assertRaises(StopIteration, izip().next)
397
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000398 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000399 self.assertRaises(StopIteration, f([]).next)
400 self.assertRaises(StopIteration, f(StopNow()).next)
401
402 self.assertRaises(StopIteration, islice([], None).next)
403 self.assertRaises(StopIteration, islice(StopNow(), None).next)
404
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000405 p, q = tee([])
406 self.assertRaises(StopIteration, p.next)
407 self.assertRaises(StopIteration, q.next)
408 p, q = tee(StopNow())
409 self.assertRaises(StopIteration, p.next)
410 self.assertRaises(StopIteration, q.next)
411
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000412 self.assertRaises(StopIteration, repeat(None, 0).next)
413
414 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
415 self.assertRaises(StopIteration, f(lambda x:x, []).next)
416 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
417
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000418class TestGC(unittest.TestCase):
419
420 def makecycle(self, iterator, container):
421 container.append(iterator)
422 iterator.next()
423 del container, iterator
424
425 def test_chain(self):
426 a = []
427 self.makecycle(chain(a), a)
428
429 def test_cycle(self):
430 a = []
431 self.makecycle(cycle([a]*2), a)
432
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000433 def test_dropwhile(self):
434 a = []
435 self.makecycle(dropwhile(bool, [0, a, a]), a)
436
437 def test_groupby(self):
438 a = []
439 self.makecycle(groupby([a]*2, lambda x:x), a)
440
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000441 def test_ifilter(self):
442 a = []
443 self.makecycle(ifilter(lambda x:True, [a]*2), a)
444
445 def test_ifilterfalse(self):
446 a = []
447 self.makecycle(ifilterfalse(lambda x:False, a), a)
448
449 def test_izip(self):
450 a = []
451 self.makecycle(izip([a]*2, [a]*3), a)
452
453 def test_imap(self):
454 a = []
455 self.makecycle(imap(lambda x:x, [a]*2), a)
456
457 def test_islice(self):
458 a = []
459 self.makecycle(islice([a]*2, None), a)
460
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000461 def test_repeat(self):
462 a = []
463 self.makecycle(repeat(a), a)
464
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000465 def test_starmap(self):
466 a = []
467 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
468
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000469 def test_takewhile(self):
470 a = []
471 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
472
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000473def R(seqn):
474 'Regular generator'
475 for i in seqn:
476 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000477
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000478class G:
479 'Sequence using __getitem__'
480 def __init__(self, seqn):
481 self.seqn = seqn
482 def __getitem__(self, i):
483 return self.seqn[i]
484
485class I:
486 'Sequence using iterator protocol'
487 def __init__(self, seqn):
488 self.seqn = seqn
489 self.i = 0
490 def __iter__(self):
491 return self
492 def next(self):
493 if self.i >= len(self.seqn): raise StopIteration
494 v = self.seqn[self.i]
495 self.i += 1
496 return v
497
498class Ig:
499 'Sequence using iterator protocol defined with a generator'
500 def __init__(self, seqn):
501 self.seqn = seqn
502 self.i = 0
503 def __iter__(self):
504 for val in self.seqn:
505 yield val
506
507class X:
508 'Missing __getitem__ and __iter__'
509 def __init__(self, seqn):
510 self.seqn = seqn
511 self.i = 0
512 def next(self):
513 if self.i >= len(self.seqn): raise StopIteration
514 v = self.seqn[self.i]
515 self.i += 1
516 return v
517
518class N:
519 'Iterator missing next()'
520 def __init__(self, seqn):
521 self.seqn = seqn
522 self.i = 0
523 def __iter__(self):
524 return self
525
526class E:
527 'Test propagation of exceptions'
528 def __init__(self, seqn):
529 self.seqn = seqn
530 self.i = 0
531 def __iter__(self):
532 return self
533 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000534 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000535
536class S:
537 'Test immediate stop'
538 def __init__(self, seqn):
539 pass
540 def __iter__(self):
541 return self
542 def next(self):
543 raise StopIteration
544
545def L(seqn):
546 'Test multiple tiers of iterators'
547 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
548
549
550class TestVariousIteratorArgs(unittest.TestCase):
551
552 def test_chain(self):
553 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
554 for g in (G, I, Ig, S, L, R):
555 self.assertEqual(list(chain(g(s))), list(g(s)))
556 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
557 self.assertRaises(TypeError, chain, X(s))
558 self.assertRaises(TypeError, list, chain(N(s)))
559 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
560
561 def test_cycle(self):
562 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
563 for g in (G, I, Ig, S, L, R):
564 tgtlen = len(s) * 3
565 expected = list(g(s))*3
566 actual = list(islice(cycle(g(s)), tgtlen))
567 self.assertEqual(actual, expected)
568 self.assertRaises(TypeError, cycle, X(s))
569 self.assertRaises(TypeError, list, cycle(N(s)))
570 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
571
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000572 def test_groupby(self):
573 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
574 for g in (G, I, Ig, S, L, R):
575 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
576 self.assertRaises(TypeError, groupby, X(s))
577 self.assertRaises(TypeError, list, groupby(N(s)))
578 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
579
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000580 def test_ifilter(self):
581 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
582 for g in (G, I, Ig, S, L, R):
583 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
584 self.assertRaises(TypeError, ifilter, isEven, X(s))
585 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
586 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
587
588 def test_ifilterfalse(self):
589 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
590 for g in (G, I, Ig, S, L, R):
591 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
592 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
593 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
594 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
595
596 def test_izip(self):
597 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
598 for g in (G, I, Ig, S, L, R):
599 self.assertEqual(list(izip(g(s))), zip(g(s)))
600 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
601 self.assertRaises(TypeError, izip, X(s))
602 self.assertRaises(TypeError, list, izip(N(s)))
603 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
604
605 def test_imap(self):
606 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
607 for g in (G, I, Ig, S, L, R):
608 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
609 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
610 self.assertRaises(TypeError, imap, onearg, X(s))
611 self.assertRaises(TypeError, list, imap(onearg, N(s)))
612 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
613
614 def test_islice(self):
615 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
616 for g in (G, I, Ig, S, L, R):
617 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
618 self.assertRaises(TypeError, islice, X(s), 10)
619 self.assertRaises(TypeError, list, islice(N(s), 10))
620 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
621
622 def test_starmap(self):
623 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
624 for g in (G, I, Ig, S, L, R):
625 ss = zip(s, s)
626 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
627 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
628 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
629 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
630
631 def test_takewhile(self):
632 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
633 for g in (G, I, Ig, S, L, R):
634 tgt = []
635 for elem in g(s):
636 if not isEven(elem): break
637 tgt.append(elem)
638 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
639 self.assertRaises(TypeError, takewhile, isEven, X(s))
640 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
641 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
642
643 def test_dropwhile(self):
644 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
645 for g in (G, I, Ig, S, L, R):
646 tgt = []
647 for elem in g(s):
648 if not tgt and isOdd(elem): continue
649 tgt.append(elem)
650 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
651 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
652 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
653 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
654
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000655 def test_tee(self):
656 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
657 for g in (G, I, Ig, S, L, R):
658 it1, it2 = tee(g(s))
659 self.assertEqual(list(it1), list(g(s)))
660 self.assertEqual(list(it2), list(g(s)))
661 self.assertRaises(TypeError, tee, X(s))
662 self.assertRaises(TypeError, list, tee(N(s))[0])
663 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
664
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000665class LengthTransparency(unittest.TestCase):
666
667 def test_repeat(self):
668 self.assertEqual(len(repeat(None, 50)), 50)
669 self.assertRaises(TypeError, len, repeat(None))
670
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000671class RegressionTests(unittest.TestCase):
672
673 def test_sf_793826(self):
674 # Fix Armin Rigo's successful efforts to wreak havoc
675
676 def mutatingtuple(tuple1, f, tuple2):
677 # this builds a tuple t which is a copy of tuple1,
678 # then calls f(t), then mutates t to be equal to tuple2
679 # (needs len(tuple1) == len(tuple2)).
680 def g(value, first=[1]):
681 if first:
682 del first[:]
683 f(z.next())
684 return value
685 items = list(tuple2)
686 items[1:1] = list(tuple1)
687 gen = imap(g, items)
688 z = izip(*[gen]*len(tuple1))
689 z.next()
690
691 def f(t):
692 global T
693 T = t
694 first[:] = list(T)
695
696 first = []
697 mutatingtuple((1,2,3), f, (4,5,6))
698 second = list(T)
699 self.assertEqual(first, second)
700
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000701
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000702 def test_sf_950057(self):
703 # Make sure that chain() and cycle() catch exceptions immediately
704 # rather than when shifting between input sources
705
706 def gen1():
707 hist.append(0)
708 yield 1
709 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000710 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000711 hist.append(2)
712
713 def gen2(x):
714 hist.append(3)
715 yield 2
716 hist.append(4)
717 if x:
718 raise StopIteration
719
720 hist = []
721 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
722 self.assertEqual(hist, [0,1])
723
724 hist = []
725 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
726 self.assertEqual(hist, [0,1])
727
728 hist = []
729 self.assertRaises(AssertionError, list, cycle(gen1()))
730 self.assertEqual(hist, [0,1])
731
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000732libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000733
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000734
735>>> amounts = [120.15, 764.05, 823.14]
736>>> for checknum, amount in izip(count(1200), amounts):
737... print 'Check %d is for $%.2f' % (checknum, amount)
738...
739Check 1200 is for $120.15
740Check 1201 is for $764.05
741Check 1202 is for $823.14
742
743>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000744>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
745... print cube
746...
7471
7488
74927
750
751>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000752>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000753... print name.title()
754...
755Alex
756Laura
757Martin
758Walter
759Samuele
760
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000761>>> from operator import itemgetter
762>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Raymond Hettinger64958a12003-12-17 20:43:33 +0000763>>> di = sorted(d.iteritems(), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000764>>> for k, g in groupby(di, itemgetter(1)):
765... print k, map(itemgetter(0), g)
766...
7671 ['a', 'c', 'e']
7682 ['b', 'd', 'f']
7693 ['g']
770
Raymond Hettinger734fb572004-01-20 20:04:40 +0000771# Find runs of consecutive numbers using groupby. The key to the solution
772# is differencing with a range so that consecutive numbers all appear in
773# same group.
774>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
775>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
776... print map(operator.itemgetter(1), g)
777...
778[1]
779[4, 5, 6]
780[10]
781[15, 16, 17, 18]
782[22]
783[25, 26, 27, 28]
784
Raymond Hettingera098b332003-09-08 23:58:40 +0000785>>> def take(n, seq):
786... return list(islice(seq, n))
787
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000788>>> def enumerate(iterable):
789... return izip(count(), iterable)
790
791>>> def tabulate(function):
792... "Return function(0), function(1), ..."
793... return imap(function, count())
794
795>>> def iteritems(mapping):
796... return izip(mapping.iterkeys(), mapping.itervalues())
797
798>>> def nth(iterable, n):
799... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000800... return list(islice(iterable, n, n+1))
801
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000802>>> def all(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000803... "Returns True if pred(x) is True for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000804... for elem in ifilterfalse(pred, seq):
805... return False
806... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000807
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000808>>> def any(seq, pred=bool):
Raymond Hettinger02420702003-06-29 20:36:23 +0000809... "Returns True if pred(x) is True for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000810... for elem in ifilter(pred, seq):
811... return True
812... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000813
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000814>>> def no(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000815... "Returns True if pred(x) is False for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000816... for elem in ifilter(pred, seq):
817... return False
818... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000819
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000820>>> def quantify(seq, pred=bool):
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000821... "Count how many times the predicate is True in the sequence"
822... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000823
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000824>>> def padnone(seq):
825... "Returns the sequence elements and then returns None indefinitely"
826... return chain(seq, repeat(None))
827
828>>> def ncycles(seq, n):
829... "Returns the sequence elements n times"
830... return chain(*repeat(seq, n))
831
832>>> def dotproduct(vec1, vec2):
833... return sum(imap(operator.mul, vec1, vec2))
834
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000835>>> def flatten(listOfLists):
836... return list(chain(*listOfLists))
837
838>>> def repeatfunc(func, times=None, *args):
839... "Repeat calls to func with specified arguments."
840... " Example: repeatfunc(random.random)"
841... if times is None:
842... return starmap(func, repeat(args))
843... else:
844... return starmap(func, repeat(args, times))
845
Raymond Hettingerd591f662003-10-26 15:34:50 +0000846>>> def pairwise(iterable):
847... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
848... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000849... try:
850... b.next()
851... except StopIteration:
852... pass
853... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000854
855This is not part of the examples but it tests to make sure the definitions
856perform as purported.
857
Raymond Hettingera098b332003-09-08 23:58:40 +0000858>>> take(10, count())
859[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
860
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000861>>> list(enumerate('abc'))
862[(0, 'a'), (1, 'b'), (2, 'c')]
863
864>>> list(islice(tabulate(lambda x: 2*x), 4))
865[0, 2, 4, 6]
866
867>>> nth('abcde', 3)
868['d']
869
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000870>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000871True
872
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000873>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000874False
875
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000876>>> any([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>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000880False
881
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000882>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000883True
884
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000885>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000886False
887
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000888>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000088950
890
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000891>>> a = [[1, 2, 3], [4, 5, 6]]
892>>> flatten(a)
893[1, 2, 3, 4, 5, 6]
894
895>>> list(repeatfunc(pow, 5, 2, 3))
896[8, 8, 8, 8, 8]
897
898>>> import random
899>>> take(5, imap(int, repeatfunc(random.random)))
900[0, 0, 0, 0, 0]
901
Raymond Hettingerd591f662003-10-26 15:34:50 +0000902>>> list(pairwise('abcd'))
903[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000904
Raymond Hettingerd591f662003-10-26 15:34:50 +0000905>>> list(pairwise([]))
906[]
907
908>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000909[]
910
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000911>>> list(islice(padnone('abc'), 0, 6))
912['a', 'b', 'c', None, None, None]
913
914>>> list(ncycles('abc', 3))
915['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
916
917>>> dotproduct([1,2,3], [4,5,6])
91832
919
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000920"""
921
922__test__ = {'libreftest' : libreftest}
923
924def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000925 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000926 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000927 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000928
929 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000930 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000931 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000932 counts = [None] * 5
933 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000934 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000935 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000936 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000937 print counts
938
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000939 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000940 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000941
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000942if __name__ == "__main__":
943 test_main(verbose=True)