blob: aa809105479489dd87be6bb34c9928263a3ca92a [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettinger2012f172003-02-07 05:32:58 +00004import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00005import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00006import random
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00007
8def onearg(x):
9 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000010 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
12def errfunc(*args):
13 'Test function that raises an error'
14 raise ValueError
15
16def gen3():
17 'Non-restartable source sequence'
18 for i in (0, 1, 2):
19 yield i
20
21def isEven(x):
22 'Test predicate'
23 return x%2==0
24
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000025def isOdd(x):
26 'Test predicate'
27 return x%2==1
28
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000029class StopNow:
30 'Class emulating an empty iterable.'
31 def __iter__(self):
32 return self
33 def next(self):
34 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000035
Raymond Hettinger02420702003-06-29 20:36:23 +000036def take(n, seq):
37 'Convenience function for partially consuming a long of infinite iterable'
38 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000039
Raymond Hettinger96ef8112003-02-01 00:10:11 +000040class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000041 def test_chain(self):
42 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000043 self.assertEqual(list(chain('abc')), list('abc'))
44 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000045 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000047
Raymond Hettinger96ef8112003-02-01 00:10:11 +000048 def test_count(self):
49 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
50 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000051 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000052 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000053 self.assertRaises(TypeError, count, 'a')
54 c = count(sys.maxint-2) # verify that rollover doesn't crash
55 c.next(); c.next(); c.next(); c.next(); c.next()
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000056 c = count(3)
57 self.assertEqual(repr(c), 'count(3)')
58 c.next()
59 self.assertEqual(repr(c), 'count(4)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +000060
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000061 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000062 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000063 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000064 self.assertRaises(TypeError, cycle)
65 self.assertRaises(TypeError, cycle, 5)
66 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000067
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000068 def test_groupby(self):
69 # Check whether it accepts arguments correctly
70 self.assertEqual([], list(groupby([])))
71 self.assertEqual([], list(groupby([], key=id)))
72 self.assertRaises(TypeError, list, groupby('abc', []))
73 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000074 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000075
76 # Check normal input
77 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
78 (2,15,22), (3,16,23), (3,17,23)]
79 dup = []
80 for k, g in groupby(s, lambda r:r[0]):
81 for elem in g:
82 self.assertEqual(k, elem[0])
83 dup.append(elem)
84 self.assertEqual(s, dup)
85
86 # Check nested case
87 dup = []
88 for k, g in groupby(s, lambda r:r[0]):
89 for ik, ig in groupby(g, lambda r:r[2]):
90 for elem in ig:
91 self.assertEqual(k, elem[0])
92 self.assertEqual(ik, elem[2])
93 dup.append(elem)
94 self.assertEqual(s, dup)
95
96 # Check case where inner iterator is not used
97 keys = [k for k, g in groupby(s, lambda r:r[0])]
98 expectedkeys = set([r[0] for r in s])
99 self.assertEqual(set(keys), expectedkeys)
100 self.assertEqual(len(keys), len(expectedkeys))
101
102 # Exercise pipes and filters style
103 s = 'abracadabra'
104 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000105 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000106 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
107 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000108 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000109 self.assertEqual(r, ['a', 'b', 'r'])
110 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000111 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000112 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
113 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000114 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000115 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
116
117 # iter.next failure
118 class ExpectedError(Exception):
119 pass
120 def delayed_raise(n=0):
121 for i in range(n):
122 yield 'yo'
123 raise ExpectedError
124 def gulp(iterable, keyp=None, func=list):
125 return [func(g) for k, g in groupby(iterable, keyp)]
126
127 # iter.next failure on outer object
128 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
129 # iter.next failure on inner object
130 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
131
132 # __cmp__ failure
133 class DummyCmp:
134 def __cmp__(self, dst):
135 raise ExpectedError
136 s = [DummyCmp(), DummyCmp(), None]
137
138 # __cmp__ failure on outer object
139 self.assertRaises(ExpectedError, gulp, s, func=id)
140 # __cmp__ failure on inner object
141 self.assertRaises(ExpectedError, gulp, s)
142
143 # keyfunc failure
144 def keyfunc(obj):
145 if keyfunc.skip > 0:
146 keyfunc.skip -= 1
147 return obj
148 else:
149 raise ExpectedError
150
151 # keyfunc failure on outer object
152 keyfunc.skip = 0
153 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
154 keyfunc.skip = 1
155 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
156
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000157 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000158 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000159 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000160 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000161 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000162 self.assertRaises(TypeError, ifilter, lambda x:x)
163 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000164 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000165 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000166
167 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000168 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
169 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000170 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000171 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000172 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
173 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000174 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000175 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000176
177 def test_izip(self):
178 ans = [(x,y) for x, y in izip('abc',count())]
179 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000180 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
181 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000182 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000183 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000184 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000185 self.assertRaises(TypeError, izip, 3)
186 self.assertRaises(TypeError, izip, range(3), 3)
187 # Check tuple re-use (implementation detail)
188 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
189 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000190 self.assertEqual([pair for pair in izip('abc', 'def')],
191 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000192 ids = map(id, izip('abc', 'def'))
193 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000194 ids = map(id, list(izip('abc', 'def')))
195 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000196
197 def test_repeat(self):
198 self.assertEqual(zip(xrange(3),repeat('a')),
199 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000200 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000201 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000202 self.assertEqual(list(repeat('a', 0)), [])
203 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000204 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000205 self.assertRaises(TypeError, repeat, None, 3, 4)
206 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000207 r = repeat(1+0j)
208 self.assertEqual(repr(r), 'repeat((1+0j))')
209 r = repeat(1+0j, 5)
210 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
211 list(r)
212 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000213
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000214 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000215 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
216 [0**1, 1**2, 2**3])
217 self.assertEqual(list(imap(None, 'abc', range(5))),
218 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000219 self.assertEqual(list(imap(None, 'abc', count())),
220 [('a',0),('b',1),('c',2)])
221 self.assertEqual(take(2,imap(None, 'abc', count())),
222 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000223 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000224 self.assertRaises(TypeError, imap)
225 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000226 self.assertRaises(TypeError, imap(10, range(5)).next)
227 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
228 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000229
230 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000231 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
232 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000233 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
234 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000235 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000236 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000237 self.assertRaises(TypeError, starmap)
238 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
239 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
240 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
241 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000242
243 def test_islice(self):
244 for args in [ # islice(args) should agree with range(args)
245 (10, 20, 3),
246 (10, 3, 20),
247 (10, 20),
248 (10, 3),
249 (20,)
250 ]:
251 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
252
253 for args, tgtargs in [ # Stop when seqn is exhausted
254 ((10, 110, 3), ((10, 100, 3))),
255 ((10, 110), ((10, 100))),
256 ((110,), (100,))
257 ]:
258 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
259
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000260 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000261 self.assertEqual(list(islice(xrange(10), None)), range(10))
262 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
263 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
264
265 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000266 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000267 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
268 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
269 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
270 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
271 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000272 self.assertRaises(ValueError, islice, xrange(10), 'a')
273 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
274 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
275 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
276 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Raymond Hettinger2012f172003-02-07 05:32:58 +0000277 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000278
279 def test_takewhile(self):
280 data = [1, 3, 5, 20, 2, 4, 6, 8]
281 underten = lambda x: x<10
282 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000283 self.assertEqual(list(takewhile(underten, [])), [])
284 self.assertRaises(TypeError, takewhile)
285 self.assertRaises(TypeError, takewhile, operator.pow)
286 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
287 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
288 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000289 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
290 self.assertEqual(list(t), [1, 1, 1])
291 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000292
293 def test_dropwhile(self):
294 data = [1, 3, 5, 20, 2, 4, 6, 8]
295 underten = lambda x: x<10
296 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000297 self.assertEqual(list(dropwhile(underten, [])), [])
298 self.assertRaises(TypeError, dropwhile)
299 self.assertRaises(TypeError, dropwhile, operator.pow)
300 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
301 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
302 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000303
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000304 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000305 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000306 def irange(n):
307 for i in xrange(n):
308 yield i
309
310 a, b = tee([]) # test empty iterator
311 self.assertEqual(list(a), [])
312 self.assertEqual(list(b), [])
313
314 a, b = tee(irange(n)) # test 100% interleaved
315 self.assertEqual(zip(a,b), zip(range(n),range(n)))
316
317 a, b = tee(irange(n)) # test 0% interleaved
318 self.assertEqual(list(a), range(n))
319 self.assertEqual(list(b), range(n))
320
321 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000322 for i in xrange(100):
323 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000324 del a
325 self.assertEqual(list(b), range(n))
326
327 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000328 for i in xrange(100):
329 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000330 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000331 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000332
333 for j in xrange(5): # test randomly interleaved
334 order = [0]*n + [1]*n
335 random.shuffle(order)
336 lists = ([], [])
337 its = tee(irange(n))
338 for i in order:
339 value = its[i].next()
340 lists[i].append(value)
341 self.assertEqual(lists[0], range(n))
342 self.assertEqual(lists[1], range(n))
343
Raymond Hettingerad983e72003-11-12 14:32:26 +0000344 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000345 self.assertRaises(TypeError, tee)
346 self.assertRaises(TypeError, tee, 3)
347 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000348 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000349
Raymond Hettingerad983e72003-11-12 14:32:26 +0000350 # tee object should be instantiable
351 a, b = tee('abc')
352 c = type(a)('def')
353 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000354
Raymond Hettingerad983e72003-11-12 14:32:26 +0000355 # test long-lagged and multi-way split
356 a, b, c = tee(xrange(2000), 3)
357 for i in xrange(100):
358 self.assertEqual(a.next(), i)
359 self.assertEqual(list(b), range(2000))
360 self.assertEqual([c.next(), c.next()], range(2))
361 self.assertEqual(list(a), range(100,2000))
362 self.assertEqual(list(c), range(2,2000))
363
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000364 # test values of n
365 self.assertRaises(TypeError, tee, 'abc', 'invalid')
366 for n in xrange(5):
367 result = tee('abc', n)
368 self.assertEqual(type(result), tuple)
369 self.assertEqual(len(result), n)
370 self.assertEqual(map(list, result), [list('abc')]*n)
371
Raymond Hettingerad983e72003-11-12 14:32:26 +0000372 # tee pass-through to copyable iterator
373 a, b = tee('abc')
374 c, d = tee(a)
375 self.assert_(a is c)
376
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000377 # test tee_new
378 t1, t2 = tee('abc')
379 tnew = type(t1)
380 self.assertRaises(TypeError, tnew)
381 self.assertRaises(TypeError, tnew, 10)
382 t3 = tnew(t1)
383 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000384
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000385 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000386 self.assertRaises(StopIteration, izip().next)
387
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000388 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000389 self.assertRaises(StopIteration, f([]).next)
390 self.assertRaises(StopIteration, f(StopNow()).next)
391
392 self.assertRaises(StopIteration, islice([], None).next)
393 self.assertRaises(StopIteration, islice(StopNow(), None).next)
394
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000395 p, q = tee([])
396 self.assertRaises(StopIteration, p.next)
397 self.assertRaises(StopIteration, q.next)
398 p, q = tee(StopNow())
399 self.assertRaises(StopIteration, p.next)
400 self.assertRaises(StopIteration, q.next)
401
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000402 self.assertRaises(StopIteration, repeat(None, 0).next)
403
404 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
405 self.assertRaises(StopIteration, f(lambda x:x, []).next)
406 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
407
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000408class TestGC(unittest.TestCase):
409
410 def makecycle(self, iterator, container):
411 container.append(iterator)
412 iterator.next()
413 del container, iterator
414
415 def test_chain(self):
416 a = []
417 self.makecycle(chain(a), a)
418
419 def test_cycle(self):
420 a = []
421 self.makecycle(cycle([a]*2), a)
422
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000423 def test_dropwhile(self):
424 a = []
425 self.makecycle(dropwhile(bool, [0, a, a]), a)
426
427 def test_groupby(self):
428 a = []
429 self.makecycle(groupby([a]*2, lambda x:x), a)
430
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000431 def test_ifilter(self):
432 a = []
433 self.makecycle(ifilter(lambda x:True, [a]*2), a)
434
435 def test_ifilterfalse(self):
436 a = []
437 self.makecycle(ifilterfalse(lambda x:False, a), a)
438
439 def test_izip(self):
440 a = []
441 self.makecycle(izip([a]*2, [a]*3), a)
442
443 def test_imap(self):
444 a = []
445 self.makecycle(imap(lambda x:x, [a]*2), a)
446
447 def test_islice(self):
448 a = []
449 self.makecycle(islice([a]*2, None), a)
450
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000451 def test_repeat(self):
452 a = []
453 self.makecycle(repeat(a), a)
454
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000455 def test_starmap(self):
456 a = []
457 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
458
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000459 def test_takewhile(self):
460 a = []
461 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
462
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000463def R(seqn):
464 'Regular generator'
465 for i in seqn:
466 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000467
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000468class G:
469 'Sequence using __getitem__'
470 def __init__(self, seqn):
471 self.seqn = seqn
472 def __getitem__(self, i):
473 return self.seqn[i]
474
475class I:
476 'Sequence using iterator protocol'
477 def __init__(self, seqn):
478 self.seqn = seqn
479 self.i = 0
480 def __iter__(self):
481 return self
482 def next(self):
483 if self.i >= len(self.seqn): raise StopIteration
484 v = self.seqn[self.i]
485 self.i += 1
486 return v
487
488class Ig:
489 'Sequence using iterator protocol defined with a generator'
490 def __init__(self, seqn):
491 self.seqn = seqn
492 self.i = 0
493 def __iter__(self):
494 for val in self.seqn:
495 yield val
496
497class X:
498 'Missing __getitem__ and __iter__'
499 def __init__(self, seqn):
500 self.seqn = seqn
501 self.i = 0
502 def next(self):
503 if self.i >= len(self.seqn): raise StopIteration
504 v = self.seqn[self.i]
505 self.i += 1
506 return v
507
508class N:
509 'Iterator missing next()'
510 def __init__(self, seqn):
511 self.seqn = seqn
512 self.i = 0
513 def __iter__(self):
514 return self
515
516class E:
517 'Test propagation of exceptions'
518 def __init__(self, seqn):
519 self.seqn = seqn
520 self.i = 0
521 def __iter__(self):
522 return self
523 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000524 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000525
526class S:
527 'Test immediate stop'
528 def __init__(self, seqn):
529 pass
530 def __iter__(self):
531 return self
532 def next(self):
533 raise StopIteration
534
535def L(seqn):
536 'Test multiple tiers of iterators'
537 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
538
539
540class TestVariousIteratorArgs(unittest.TestCase):
541
542 def test_chain(self):
543 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
544 for g in (G, I, Ig, S, L, R):
545 self.assertEqual(list(chain(g(s))), list(g(s)))
546 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
547 self.assertRaises(TypeError, chain, X(s))
548 self.assertRaises(TypeError, list, chain(N(s)))
549 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
550
551 def test_cycle(self):
552 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
553 for g in (G, I, Ig, S, L, R):
554 tgtlen = len(s) * 3
555 expected = list(g(s))*3
556 actual = list(islice(cycle(g(s)), tgtlen))
557 self.assertEqual(actual, expected)
558 self.assertRaises(TypeError, cycle, X(s))
559 self.assertRaises(TypeError, list, cycle(N(s)))
560 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
561
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000562 def test_groupby(self):
563 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
564 for g in (G, I, Ig, S, L, R):
565 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
566 self.assertRaises(TypeError, groupby, X(s))
567 self.assertRaises(TypeError, list, groupby(N(s)))
568 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
569
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000570 def test_ifilter(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(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
574 self.assertRaises(TypeError, ifilter, isEven, X(s))
575 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
576 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
577
578 def test_ifilterfalse(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(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
582 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
583 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
584 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
585
586 def test_izip(self):
587 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
588 for g in (G, I, Ig, S, L, R):
589 self.assertEqual(list(izip(g(s))), zip(g(s)))
590 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
591 self.assertRaises(TypeError, izip, X(s))
592 self.assertRaises(TypeError, list, izip(N(s)))
593 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
594
595 def test_imap(self):
596 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
597 for g in (G, I, Ig, S, L, R):
598 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
599 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
600 self.assertRaises(TypeError, imap, onearg, X(s))
601 self.assertRaises(TypeError, list, imap(onearg, N(s)))
602 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
603
604 def test_islice(self):
605 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
606 for g in (G, I, Ig, S, L, R):
607 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
608 self.assertRaises(TypeError, islice, X(s), 10)
609 self.assertRaises(TypeError, list, islice(N(s), 10))
610 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
611
612 def test_starmap(self):
613 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
614 for g in (G, I, Ig, S, L, R):
615 ss = zip(s, s)
616 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
617 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
618 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
619 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
620
621 def test_takewhile(self):
622 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
623 for g in (G, I, Ig, S, L, R):
624 tgt = []
625 for elem in g(s):
626 if not isEven(elem): break
627 tgt.append(elem)
628 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
629 self.assertRaises(TypeError, takewhile, isEven, X(s))
630 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
631 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
632
633 def test_dropwhile(self):
634 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
635 for g in (G, I, Ig, S, L, R):
636 tgt = []
637 for elem in g(s):
638 if not tgt and isOdd(elem): continue
639 tgt.append(elem)
640 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
641 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
642 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
643 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
644
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000645 def test_tee(self):
646 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
647 for g in (G, I, Ig, S, L, R):
648 it1, it2 = tee(g(s))
649 self.assertEqual(list(it1), list(g(s)))
650 self.assertEqual(list(it2), list(g(s)))
651 self.assertRaises(TypeError, tee, X(s))
652 self.assertRaises(TypeError, list, tee(N(s))[0])
653 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
654
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000655class LengthTransparency(unittest.TestCase):
656
657 def test_repeat(self):
658 self.assertEqual(len(repeat(None, 50)), 50)
659 self.assertRaises(TypeError, len, repeat(None))
660
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000661class RegressionTests(unittest.TestCase):
662
663 def test_sf_793826(self):
664 # Fix Armin Rigo's successful efforts to wreak havoc
665
666 def mutatingtuple(tuple1, f, tuple2):
667 # this builds a tuple t which is a copy of tuple1,
668 # then calls f(t), then mutates t to be equal to tuple2
669 # (needs len(tuple1) == len(tuple2)).
670 def g(value, first=[1]):
671 if first:
672 del first[:]
673 f(z.next())
674 return value
675 items = list(tuple2)
676 items[1:1] = list(tuple1)
677 gen = imap(g, items)
678 z = izip(*[gen]*len(tuple1))
679 z.next()
680
681 def f(t):
682 global T
683 T = t
684 first[:] = list(T)
685
686 first = []
687 mutatingtuple((1,2,3), f, (4,5,6))
688 second = list(T)
689 self.assertEqual(first, second)
690
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000691
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000692 def test_sf_950057(self):
693 # Make sure that chain() and cycle() catch exceptions immediately
694 # rather than when shifting between input sources
695
696 def gen1():
697 hist.append(0)
698 yield 1
699 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000700 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000701 hist.append(2)
702
703 def gen2(x):
704 hist.append(3)
705 yield 2
706 hist.append(4)
707 if x:
708 raise StopIteration
709
710 hist = []
711 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
712 self.assertEqual(hist, [0,1])
713
714 hist = []
715 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
716 self.assertEqual(hist, [0,1])
717
718 hist = []
719 self.assertRaises(AssertionError, list, cycle(gen1()))
720 self.assertEqual(hist, [0,1])
721
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000722libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000723
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000724
725>>> amounts = [120.15, 764.05, 823.14]
726>>> for checknum, amount in izip(count(1200), amounts):
727... print 'Check %d is for $%.2f' % (checknum, amount)
728...
729Check 1200 is for $120.15
730Check 1201 is for $764.05
731Check 1202 is for $823.14
732
733>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000734>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
735... print cube
736...
7371
7388
73927
740
741>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000742>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000743... print name.title()
744...
745Alex
746Laura
747Martin
748Walter
749Samuele
750
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000751>>> from operator import itemgetter
752>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Raymond Hettinger64958a12003-12-17 20:43:33 +0000753>>> di = sorted(d.iteritems(), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000754>>> for k, g in groupby(di, itemgetter(1)):
755... print k, map(itemgetter(0), g)
756...
7571 ['a', 'c', 'e']
7582 ['b', 'd', 'f']
7593 ['g']
760
Raymond Hettinger734fb572004-01-20 20:04:40 +0000761# Find runs of consecutive numbers using groupby. The key to the solution
762# is differencing with a range so that consecutive numbers all appear in
763# same group.
764>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
765>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
766... print map(operator.itemgetter(1), g)
767...
768[1]
769[4, 5, 6]
770[10]
771[15, 16, 17, 18]
772[22]
773[25, 26, 27, 28]
774
Raymond Hettingera098b332003-09-08 23:58:40 +0000775>>> def take(n, seq):
776... return list(islice(seq, n))
777
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000778>>> def enumerate(iterable):
779... return izip(count(), iterable)
780
781>>> def tabulate(function):
782... "Return function(0), function(1), ..."
783... return imap(function, count())
784
785>>> def iteritems(mapping):
786... return izip(mapping.iterkeys(), mapping.itervalues())
787
788>>> def nth(iterable, n):
789... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000790... return list(islice(iterable, n, n+1))
791
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000792>>> def all(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000793... "Returns True if pred(x) is True for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000794... for elem in ifilterfalse(pred, seq):
795... return False
796... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000797
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000798>>> def any(seq, pred=bool):
Raymond Hettinger02420702003-06-29 20:36:23 +0000799... "Returns True if pred(x) is True for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000800... for elem in ifilter(pred, seq):
801... return True
802... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000803
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000804>>> def no(seq, pred=bool):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000805... "Returns True if pred(x) is False for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000806... for elem in ifilter(pred, seq):
807... return False
808... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000809
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000810>>> def quantify(seq, pred=bool):
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000811... "Count how many times the predicate is True in the sequence"
812... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000813
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000814>>> def padnone(seq):
815... "Returns the sequence elements and then returns None indefinitely"
816... return chain(seq, repeat(None))
817
818>>> def ncycles(seq, n):
819... "Returns the sequence elements n times"
820... return chain(*repeat(seq, n))
821
822>>> def dotproduct(vec1, vec2):
823... return sum(imap(operator.mul, vec1, vec2))
824
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000825>>> def flatten(listOfLists):
826... return list(chain(*listOfLists))
827
828>>> def repeatfunc(func, times=None, *args):
829... "Repeat calls to func with specified arguments."
830... " Example: repeatfunc(random.random)"
831... if times is None:
832... return starmap(func, repeat(args))
833... else:
834... return starmap(func, repeat(args, times))
835
Raymond Hettingerd591f662003-10-26 15:34:50 +0000836>>> def pairwise(iterable):
837... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
838... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000839... try:
840... b.next()
841... except StopIteration:
842... pass
843... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000844
845This is not part of the examples but it tests to make sure the definitions
846perform as purported.
847
Raymond Hettingera098b332003-09-08 23:58:40 +0000848>>> take(10, count())
849[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
850
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000851>>> list(enumerate('abc'))
852[(0, 'a'), (1, 'b'), (2, 'c')]
853
854>>> list(islice(tabulate(lambda x: 2*x), 4))
855[0, 2, 4, 6]
856
857>>> nth('abcde', 3)
858['d']
859
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000860>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000861True
862
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000863>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000864False
865
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000866>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000867True
868
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000869>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000870False
871
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000872>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000873True
874
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000875>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000876False
877
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000878>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000087950
880
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000881>>> a = [[1, 2, 3], [4, 5, 6]]
882>>> flatten(a)
883[1, 2, 3, 4, 5, 6]
884
885>>> list(repeatfunc(pow, 5, 2, 3))
886[8, 8, 8, 8, 8]
887
888>>> import random
889>>> take(5, imap(int, repeatfunc(random.random)))
890[0, 0, 0, 0, 0]
891
Raymond Hettingerd591f662003-10-26 15:34:50 +0000892>>> list(pairwise('abcd'))
893[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000894
Raymond Hettingerd591f662003-10-26 15:34:50 +0000895>>> list(pairwise([]))
896[]
897
898>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000899[]
900
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000901>>> list(islice(padnone('abc'), 0, 6))
902['a', 'b', 'c', None, None, None]
903
904>>> list(ncycles('abc', 3))
905['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
906
907>>> dotproduct([1,2,3], [4,5,6])
90832
909
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000910"""
911
912__test__ = {'libreftest' : libreftest}
913
914def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000915 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000916 RegressionTests, LengthTransparency)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000917 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000918
919 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000920 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +0000921 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000922 counts = [None] * 5
923 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000924 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +0000925 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000926 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000927 print counts
928
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000929 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +0000930 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000931
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000932if __name__ == "__main__":
933 test_main(verbose=True)