blob: 0f74c6207359c968699438f57c907dbf64008c9b [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))
263 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
264 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
265
266 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000267 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000268 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
269 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
270 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
271 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
272 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000273 self.assertRaises(ValueError, islice, xrange(10), 'a')
274 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
275 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
276 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
277 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000278 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000279
280 def test_takewhile(self):
281 data = [1, 3, 5, 20, 2, 4, 6, 8]
282 underten = lambda x: x<10
283 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000284 self.assertEqual(list(takewhile(underten, [])), [])
285 self.assertRaises(TypeError, takewhile)
286 self.assertRaises(TypeError, takewhile, operator.pow)
287 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
288 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
289 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000290 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
291 self.assertEqual(list(t), [1, 1, 1])
292 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000293
294 def test_dropwhile(self):
295 data = [1, 3, 5, 20, 2, 4, 6, 8]
296 underten = lambda x: x<10
297 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000298 self.assertEqual(list(dropwhile(underten, [])), [])
299 self.assertRaises(TypeError, dropwhile)
300 self.assertRaises(TypeError, dropwhile, operator.pow)
301 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
302 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
303 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000304
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000305 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000306 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000307 def irange(n):
308 for i in xrange(n):
309 yield i
310
311 a, b = tee([]) # test empty iterator
312 self.assertEqual(list(a), [])
313 self.assertEqual(list(b), [])
314
315 a, b = tee(irange(n)) # test 100% interleaved
316 self.assertEqual(zip(a,b), zip(range(n),range(n)))
317
318 a, b = tee(irange(n)) # test 0% interleaved
319 self.assertEqual(list(a), range(n))
320 self.assertEqual(list(b), range(n))
321
322 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000323 for i in xrange(100):
324 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000325 del a
326 self.assertEqual(list(b), range(n))
327
328 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000329 for i in xrange(100):
330 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000331 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000332 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000333
334 for j in xrange(5): # test randomly interleaved
335 order = [0]*n + [1]*n
336 random.shuffle(order)
337 lists = ([], [])
338 its = tee(irange(n))
339 for i in order:
340 value = its[i].next()
341 lists[i].append(value)
342 self.assertEqual(lists[0], range(n))
343 self.assertEqual(lists[1], range(n))
344
Raymond Hettingerad983e72003-11-12 14:32:26 +0000345 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000346 self.assertRaises(TypeError, tee)
347 self.assertRaises(TypeError, tee, 3)
348 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000349 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000350
Raymond Hettingerad983e72003-11-12 14:32:26 +0000351 # tee object should be instantiable
352 a, b = tee('abc')
353 c = type(a)('def')
354 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000355
Raymond Hettingerad983e72003-11-12 14:32:26 +0000356 # test long-lagged and multi-way split
357 a, b, c = tee(xrange(2000), 3)
358 for i in xrange(100):
359 self.assertEqual(a.next(), i)
360 self.assertEqual(list(b), range(2000))
361 self.assertEqual([c.next(), c.next()], range(2))
362 self.assertEqual(list(a), range(100,2000))
363 self.assertEqual(list(c), range(2,2000))
364
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000365 # test values of n
366 self.assertRaises(TypeError, tee, 'abc', 'invalid')
367 for n in xrange(5):
368 result = tee('abc', n)
369 self.assertEqual(type(result), tuple)
370 self.assertEqual(len(result), n)
371 self.assertEqual(map(list, result), [list('abc')]*n)
372
Raymond Hettingerad983e72003-11-12 14:32:26 +0000373 # tee pass-through to copyable iterator
374 a, b = tee('abc')
375 c, d = tee(a)
376 self.assert_(a is c)
377
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000378 # test tee_new
379 t1, t2 = tee('abc')
380 tnew = type(t1)
381 self.assertRaises(TypeError, tnew)
382 self.assertRaises(TypeError, tnew, 10)
383 t3 = tnew(t1)
384 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000385
Raymond Hettingera9f60922004-10-17 16:40:14 +0000386 # test that tee objects are weak referencable
387 a, b = tee(xrange(10))
388 p = proxy(a)
389 self.assertEqual(getattr(p, '__class__'), type(b))
390 del a
391 self.assertRaises(ReferenceError, getattr, p, '__class__')
392
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000393 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000394 self.assertRaises(StopIteration, izip().next)
395
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000396 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000397 self.assertRaises(StopIteration, f([]).next)
398 self.assertRaises(StopIteration, f(StopNow()).next)
399
400 self.assertRaises(StopIteration, islice([], None).next)
401 self.assertRaises(StopIteration, islice(StopNow(), None).next)
402
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000403 p, q = tee([])
404 self.assertRaises(StopIteration, p.next)
405 self.assertRaises(StopIteration, q.next)
406 p, q = tee(StopNow())
407 self.assertRaises(StopIteration, p.next)
408 self.assertRaises(StopIteration, q.next)
409
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000410 self.assertRaises(StopIteration, repeat(None, 0).next)
411
412 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
413 self.assertRaises(StopIteration, f(lambda x:x, []).next)
414 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
415
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416class TestGC(unittest.TestCase):
417
418 def makecycle(self, iterator, container):
419 container.append(iterator)
420 iterator.next()
421 del container, iterator
422
423 def test_chain(self):
424 a = []
425 self.makecycle(chain(a), a)
426
427 def test_cycle(self):
428 a = []
429 self.makecycle(cycle([a]*2), a)
430
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000431 def test_dropwhile(self):
432 a = []
433 self.makecycle(dropwhile(bool, [0, a, a]), a)
434
435 def test_groupby(self):
436 a = []
437 self.makecycle(groupby([a]*2, lambda x:x), a)
438
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000439 def test_ifilter(self):
440 a = []
441 self.makecycle(ifilter(lambda x:True, [a]*2), a)
442
443 def test_ifilterfalse(self):
444 a = []
445 self.makecycle(ifilterfalse(lambda x:False, a), a)
446
447 def test_izip(self):
448 a = []
449 self.makecycle(izip([a]*2, [a]*3), a)
450
451 def test_imap(self):
452 a = []
453 self.makecycle(imap(lambda x:x, [a]*2), a)
454
455 def test_islice(self):
456 a = []
457 self.makecycle(islice([a]*2, None), a)
458
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000459 def test_repeat(self):
460 a = []
461 self.makecycle(repeat(a), a)
462
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000463 def test_starmap(self):
464 a = []
465 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
466
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000467 def test_takewhile(self):
468 a = []
469 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
470
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000471def R(seqn):
472 'Regular generator'
473 for i in seqn:
474 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000475
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000476class G:
477 'Sequence using __getitem__'
478 def __init__(self, seqn):
479 self.seqn = seqn
480 def __getitem__(self, i):
481 return self.seqn[i]
482
483class I:
484 'Sequence using iterator protocol'
485 def __init__(self, seqn):
486 self.seqn = seqn
487 self.i = 0
488 def __iter__(self):
489 return self
490 def next(self):
491 if self.i >= len(self.seqn): raise StopIteration
492 v = self.seqn[self.i]
493 self.i += 1
494 return v
495
496class Ig:
497 'Sequence using iterator protocol defined with a generator'
498 def __init__(self, seqn):
499 self.seqn = seqn
500 self.i = 0
501 def __iter__(self):
502 for val in self.seqn:
503 yield val
504
505class X:
506 'Missing __getitem__ and __iter__'
507 def __init__(self, seqn):
508 self.seqn = seqn
509 self.i = 0
510 def next(self):
511 if self.i >= len(self.seqn): raise StopIteration
512 v = self.seqn[self.i]
513 self.i += 1
514 return v
515
516class N:
517 'Iterator missing next()'
518 def __init__(self, seqn):
519 self.seqn = seqn
520 self.i = 0
521 def __iter__(self):
522 return self
523
524class E:
525 'Test propagation of exceptions'
526 def __init__(self, seqn):
527 self.seqn = seqn
528 self.i = 0
529 def __iter__(self):
530 return self
531 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000532 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000533
534class S:
535 'Test immediate stop'
536 def __init__(self, seqn):
537 pass
538 def __iter__(self):
539 return self
540 def next(self):
541 raise StopIteration
542
543def L(seqn):
544 'Test multiple tiers of iterators'
545 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
546
547
548class TestVariousIteratorArgs(unittest.TestCase):
549
550 def test_chain(self):
551 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
552 for g in (G, I, Ig, S, L, R):
553 self.assertEqual(list(chain(g(s))), list(g(s)))
554 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
555 self.assertRaises(TypeError, chain, X(s))
556 self.assertRaises(TypeError, list, chain(N(s)))
557 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
558
559 def test_cycle(self):
560 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
561 for g in (G, I, Ig, S, L, R):
562 tgtlen = len(s) * 3
563 expected = list(g(s))*3
564 actual = list(islice(cycle(g(s)), tgtlen))
565 self.assertEqual(actual, expected)
566 self.assertRaises(TypeError, cycle, X(s))
567 self.assertRaises(TypeError, list, cycle(N(s)))
568 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
569
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000570 def test_groupby(self):
571 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
572 for g in (G, I, Ig, S, L, R):
573 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
574 self.assertRaises(TypeError, groupby, X(s))
575 self.assertRaises(TypeError, list, groupby(N(s)))
576 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
577
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000578 def test_ifilter(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(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
582 self.assertRaises(TypeError, ifilter, isEven, X(s))
583 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
584 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
585
586 def test_ifilterfalse(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(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
590 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
591 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
592 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
593
594 def test_izip(self):
595 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
596 for g in (G, I, Ig, S, L, R):
597 self.assertEqual(list(izip(g(s))), zip(g(s)))
598 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
599 self.assertRaises(TypeError, izip, X(s))
600 self.assertRaises(TypeError, list, izip(N(s)))
601 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
602
603 def test_imap(self):
604 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
605 for g in (G, I, Ig, S, L, R):
606 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
607 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
608 self.assertRaises(TypeError, imap, onearg, X(s))
609 self.assertRaises(TypeError, list, imap(onearg, N(s)))
610 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
611
612 def test_islice(self):
613 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
614 for g in (G, I, Ig, S, L, R):
615 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
616 self.assertRaises(TypeError, islice, X(s), 10)
617 self.assertRaises(TypeError, list, islice(N(s), 10))
618 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
619
620 def test_starmap(self):
621 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
622 for g in (G, I, Ig, S, L, R):
623 ss = zip(s, s)
624 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
625 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
626 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
627 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
628
629 def test_takewhile(self):
630 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
631 for g in (G, I, Ig, S, L, R):
632 tgt = []
633 for elem in g(s):
634 if not isEven(elem): break
635 tgt.append(elem)
636 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
637 self.assertRaises(TypeError, takewhile, isEven, X(s))
638 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
639 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
640
641 def test_dropwhile(self):
642 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
643 for g in (G, I, Ig, S, L, R):
644 tgt = []
645 for elem in g(s):
646 if not tgt and isOdd(elem): continue
647 tgt.append(elem)
648 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
649 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
650 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
651 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
652
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000653 def test_tee(self):
654 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
655 for g in (G, I, Ig, S, L, R):
656 it1, it2 = tee(g(s))
657 self.assertEqual(list(it1), list(g(s)))
658 self.assertEqual(list(it2), list(g(s)))
659 self.assertRaises(TypeError, tee, X(s))
660 self.assertRaises(TypeError, list, tee(N(s))[0])
661 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
662
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000663class LengthTransparency(unittest.TestCase):
664
665 def test_repeat(self):
666 self.assertEqual(len(repeat(None, 50)), 50)
667 self.assertRaises(TypeError, len, repeat(None))
668
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000669class RegressionTests(unittest.TestCase):
670
671 def test_sf_793826(self):
672 # Fix Armin Rigo's successful efforts to wreak havoc
673
674 def mutatingtuple(tuple1, f, tuple2):
675 # this builds a tuple t which is a copy of tuple1,
676 # then calls f(t), then mutates t to be equal to tuple2
677 # (needs len(tuple1) == len(tuple2)).
678 def g(value, first=[1]):
679 if first:
680 del first[:]
681 f(z.next())
682 return value
683 items = list(tuple2)
684 items[1:1] = list(tuple1)
685 gen = imap(g, items)
686 z = izip(*[gen]*len(tuple1))
687 z.next()
688
689 def f(t):
690 global T
691 T = t
692 first[:] = list(T)
693
694 first = []
695 mutatingtuple((1,2,3), f, (4,5,6))
696 second = list(T)
697 self.assertEqual(first, second)
698
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000699
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000700 def test_sf_950057(self):
701 # Make sure that chain() and cycle() catch exceptions immediately
702 # rather than when shifting between input sources
703
704 def gen1():
705 hist.append(0)
706 yield 1
707 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000708 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000709 hist.append(2)
710
711 def gen2(x):
712 hist.append(3)
713 yield 2
714 hist.append(4)
715 if x:
716 raise StopIteration
717
718 hist = []
719 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
720 self.assertEqual(hist, [0,1])
721
722 hist = []
723 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
724 self.assertEqual(hist, [0,1])
725
726 hist = []
727 self.assertRaises(AssertionError, list, cycle(gen1()))
728 self.assertEqual(hist, [0,1])
729
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000730libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000731
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000732
733>>> amounts = [120.15, 764.05, 823.14]
734>>> for checknum, amount in izip(count(1200), amounts):
735... print 'Check %d is for $%.2f' % (checknum, amount)
736...
737Check 1200 is for $120.15
738Check 1201 is for $764.05
739Check 1202 is for $823.14
740
741>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000742>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
743... print cube
744...
7451
7468
74727
748
749>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000750>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000751... print name.title()
752...
753Alex
754Laura
755Martin
756Walter
757Samuele
758
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000759>>> from operator import itemgetter
760>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Raymond Hettinger64958a12003-12-17 20:43:33 +0000761>>> di = sorted(d.iteritems(), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000762>>> for k, g in groupby(di, itemgetter(1)):
763... print k, map(itemgetter(0), g)
764...
7651 ['a', 'c', 'e']
7662 ['b', 'd', 'f']
7673 ['g']
768
Raymond Hettinger734fb572004-01-20 20:04:40 +0000769# Find runs of consecutive numbers using groupby. The key to the solution
770# is differencing with a range so that consecutive numbers all appear in
771# same group.
772>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
773>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
774... print map(operator.itemgetter(1), g)
775...
776[1]
777[4, 5, 6]
778[10]
779[15, 16, 17, 18]
780[22]
781[25, 26, 27, 28]
782
Raymond Hettingera098b332003-09-08 23:58:40 +0000783>>> def take(n, seq):
784... return list(islice(seq, n))
785
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000786>>> def enumerate(iterable):
787... return izip(count(), iterable)
788
789>>> def tabulate(function):
790... "Return function(0), function(1), ..."
791... return imap(function, count())
792
793>>> def iteritems(mapping):
794... return izip(mapping.iterkeys(), mapping.itervalues())
795
796>>> def nth(iterable, n):
797... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000798... return list(islice(iterable, n, n+1))
799
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000800>>> def all(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000801... "Returns True if pred(x) is True for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000802... for elem in ifilterfalse(pred, seq):
803... return False
804... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000805
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000806>>> def any(seq, pred=bool):
Raymond Hettinger02420702003-06-29 20:36:23 +0000807... "Returns True if pred(x) is True for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000808... for elem in ifilter(pred, seq):
809... return True
810... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000811
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000812>>> def no(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000813... "Returns True if pred(x) is False for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000814... for elem in ifilter(pred, seq):
815... return False
816... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000817
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000818>>> def quantify(seq, pred=bool):
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000819... "Count how many times the predicate is True in the sequence"
820... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000821
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000822>>> def padnone(seq):
823... "Returns the sequence elements and then returns None indefinitely"
824... return chain(seq, repeat(None))
825
826>>> def ncycles(seq, n):
827... "Returns the sequence elements n times"
828... return chain(*repeat(seq, n))
829
830>>> def dotproduct(vec1, vec2):
831... return sum(imap(operator.mul, vec1, vec2))
832
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000833>>> def flatten(listOfLists):
834... return list(chain(*listOfLists))
835
836>>> def repeatfunc(func, times=None, *args):
837... "Repeat calls to func with specified arguments."
838... " Example: repeatfunc(random.random)"
839... if times is None:
840... return starmap(func, repeat(args))
841... else:
842... return starmap(func, repeat(args, times))
843
Raymond Hettingerd591f662003-10-26 15:34:50 +0000844>>> def pairwise(iterable):
845... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
846... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000847... try:
848... b.next()
849... except StopIteration:
850... pass
851... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000852
853This is not part of the examples but it tests to make sure the definitions
854perform as purported.
855
Raymond Hettingera098b332003-09-08 23:58:40 +0000856>>> take(10, count())
857[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
858
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000859>>> list(enumerate('abc'))
860[(0, 'a'), (1, 'b'), (2, 'c')]
861
862>>> list(islice(tabulate(lambda x: 2*x), 4))
863[0, 2, 4, 6]
864
865>>> nth('abcde', 3)
866['d']
867
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000868>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000869True
870
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000871>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000872False
873
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000874>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000875True
876
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000877>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000878False
879
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000880>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000881True
882
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000883>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000884False
885
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000886>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000088750
888
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000889>>> a = [[1, 2, 3], [4, 5, 6]]
890>>> flatten(a)
891[1, 2, 3, 4, 5, 6]
892
893>>> list(repeatfunc(pow, 5, 2, 3))
894[8, 8, 8, 8, 8]
895
896>>> import random
897>>> take(5, imap(int, repeatfunc(random.random)))
898[0, 0, 0, 0, 0]
899
Raymond Hettingerd591f662003-10-26 15:34:50 +0000900>>> list(pairwise('abcd'))
901[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000902
Raymond Hettingerd591f662003-10-26 15:34:50 +0000903>>> list(pairwise([]))
904[]
905
906>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000907[]
908
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000909>>> list(islice(padnone('abc'), 0, 6))
910['a', 'b', 'c', None, None, None]
911
912>>> list(ncycles('abc', 3))
913['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
914
915>>> dotproduct([1,2,3], [4,5,6])
91632
917
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000918"""
919
920__test__ = {'libreftest' : libreftest}
921
922def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000923 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000924 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000925 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000926
927 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000928 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000929 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000930 counts = [None] * 5
931 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000932 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000933 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000934 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000935 print counts
936
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000937 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000938 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000939
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000940if __name__ == "__main__":
941 test_main(verbose=True)