blob: 98683254c7f81863cccbfcc4115ee3268f6cfe2d [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
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettinger93e804d2008-02-26 23:40:50 +000043def fact(n):
44 'Factorial'
45 return reduce(operator.mul, range(1, n+1), 1)
46
Raymond Hettinger96ef8112003-02-01 00:10:11 +000047class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000048 def test_chain(self):
49 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000050 self.assertEqual(list(chain('abc')), list('abc'))
51 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000052 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000053 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000054
Raymond Hettinger93e804d2008-02-26 23:40:50 +000055 def test_combinations(self):
56 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
57 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
58 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
59 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
60 self.assertEqual(list(combinations(range(4), 3)),
61 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
62 for n in range(6):
63 values = [5*x-12 for x in range(n)]
64 for r in range(n+1):
65 result = list(combinations(values, r))
66 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
67 self.assertEqual(len(result), len(set(result))) # no repeats
68 self.assertEqual(result, sorted(result)) # lexicographic order
69 for c in result:
70 self.assertEqual(len(c), r) # r-length combinations
71 self.assertEqual(len(set(c)), r) # no duplicate elements
72 self.assertEqual(list(c), sorted(c)) # keep original ordering
73 self.assert_(all(e in values for e in c)) # elements taken from input iterable
74
Raymond Hettinger96ef8112003-02-01 00:10:11 +000075 def test_count(self):
76 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
77 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000078 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000079 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
80 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000081 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000082 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000083 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
84 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000085 c = count(3)
86 self.assertEqual(repr(c), 'count(3)')
87 c.next()
88 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000089 c = count(-9)
90 self.assertEqual(repr(c), 'count(-9)')
91 c.next()
92 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +000093 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
Raymond Hettinger3a0de082007-10-12 17:53:11 +000094 # Test repr (ignoring the L in longs)
95 r1 = repr(count(i)).replace('L', '')
96 r2 = 'count(%r)'.__mod__(i).replace('L', '')
97 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000098
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000099 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000100 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000101 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000102 self.assertRaises(TypeError, cycle)
103 self.assertRaises(TypeError, cycle, 5)
104 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000105
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000106 def test_groupby(self):
107 # Check whether it accepts arguments correctly
108 self.assertEqual([], list(groupby([])))
109 self.assertEqual([], list(groupby([], key=id)))
110 self.assertRaises(TypeError, list, groupby('abc', []))
111 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000112 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000113
114 # Check normal input
115 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
116 (2,15,22), (3,16,23), (3,17,23)]
117 dup = []
118 for k, g in groupby(s, lambda r:r[0]):
119 for elem in g:
120 self.assertEqual(k, elem[0])
121 dup.append(elem)
122 self.assertEqual(s, dup)
123
124 # Check nested case
125 dup = []
126 for k, g in groupby(s, lambda r:r[0]):
127 for ik, ig in groupby(g, lambda r:r[2]):
128 for elem in ig:
129 self.assertEqual(k, elem[0])
130 self.assertEqual(ik, elem[2])
131 dup.append(elem)
132 self.assertEqual(s, dup)
133
134 # Check case where inner iterator is not used
135 keys = [k for k, g in groupby(s, lambda r:r[0])]
136 expectedkeys = set([r[0] for r in s])
137 self.assertEqual(set(keys), expectedkeys)
138 self.assertEqual(len(keys), len(expectedkeys))
139
140 # Exercise pipes and filters style
141 s = 'abracadabra'
142 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000143 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000144 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
145 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000146 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000147 self.assertEqual(r, ['a', 'b', 'r'])
148 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000149 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000150 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
151 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000152 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000153 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
154
155 # iter.next failure
156 class ExpectedError(Exception):
157 pass
158 def delayed_raise(n=0):
159 for i in range(n):
160 yield 'yo'
161 raise ExpectedError
162 def gulp(iterable, keyp=None, func=list):
163 return [func(g) for k, g in groupby(iterable, keyp)]
164
165 # iter.next failure on outer object
166 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
167 # iter.next failure on inner object
168 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
169
170 # __cmp__ failure
171 class DummyCmp:
172 def __cmp__(self, dst):
173 raise ExpectedError
174 s = [DummyCmp(), DummyCmp(), None]
175
176 # __cmp__ failure on outer object
177 self.assertRaises(ExpectedError, gulp, s, func=id)
178 # __cmp__ failure on inner object
179 self.assertRaises(ExpectedError, gulp, s)
180
181 # keyfunc failure
182 def keyfunc(obj):
183 if keyfunc.skip > 0:
184 keyfunc.skip -= 1
185 return obj
186 else:
187 raise ExpectedError
188
189 # keyfunc failure on outer object
190 keyfunc.skip = 0
191 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
192 keyfunc.skip = 1
193 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
194
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000195 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000196 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000197 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000198 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000199 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000200 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000201 self.assertRaises(TypeError, ifilter, lambda x:x)
202 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000203 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000204 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000205
206 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000207 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
208 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000209 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000210 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000211 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000212 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
213 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000214 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000215 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000216
217 def test_izip(self):
218 ans = [(x,y) for x, y in izip('abc',count())]
219 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000220 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
221 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000222 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000223 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000224 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000225 self.assertRaises(TypeError, izip, 3)
226 self.assertRaises(TypeError, izip, range(3), 3)
227 # Check tuple re-use (implementation detail)
228 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
229 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000230 self.assertEqual([pair for pair in izip('abc', 'def')],
231 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000232 ids = map(id, izip('abc', 'def'))
233 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000234 ids = map(id, list(izip('abc', 'def')))
235 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000236
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000237 def test_iziplongest(self):
238 for args in [
239 ['abc', range(6)],
240 [range(6), 'abc'],
241 [range(1000), range(2000,2100), range(3000,3050)],
242 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
243 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
244 ]:
245 target = map(None, *args)
246 self.assertEqual(list(izip_longest(*args)), target)
247 self.assertEqual(list(izip_longest(*args, **{})), target)
248 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
249 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000250
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000251 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
252
253 self.assertEqual(list(izip_longest()), zip())
254 self.assertEqual(list(izip_longest([])), zip([]))
255 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000256
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000257 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
258 self.assertRaises(TypeError, izip_longest, 3)
259 self.assertRaises(TypeError, izip_longest, range(3), 3)
260
261 for stmt in [
262 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000263 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000264 ]:
265 try:
266 eval(stmt, globals(), locals())
267 except TypeError:
268 pass
269 else:
270 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000271
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000272 # Check tuple re-use (implementation detail)
273 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
274 zip('abc', 'def'))
275 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
276 zip('abc', 'def'))
277 ids = map(id, izip_longest('abc', 'def'))
278 self.assertEqual(min(ids), max(ids))
279 ids = map(id, list(izip_longest('abc', 'def')))
280 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
281
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000282 def test_product(self):
283 for args, result in [
284 ([], []), # zero iterables ??? is this correct
285 (['ab'], [('a',), ('b',)]), # one iterable
286 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
287 ([range(0), range(2), range(3)], []), # first iterable with zero length
288 ([range(2), range(0), range(3)], []), # middle iterable with zero length
289 ([range(2), range(3), range(0)], []), # last iterable with zero length
290 ]:
291 self.assertEqual(list(product(*args)), result)
292 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
293 self.assertRaises(TypeError, product, range(6), None)
294 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
295 set('abcdefg'), range(11), tuple(range(13))]
296 for i in range(100):
297 args = [random.choice(argtypes) for j in range(random.randrange(5))]
298 n = reduce(operator.mul, map(len, args), 1) if args else 0
299 self.assertEqual(len(list(product(*args))), n)
300 args = map(iter, args)
301 self.assertEqual(len(list(product(*args))), n)
302
Raymond Hettinger73d79632008-02-23 02:20:41 +0000303 # Test implementation detail: tuple re-use
304 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
305 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000306
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000307 def test_repeat(self):
308 self.assertEqual(zip(xrange(3),repeat('a')),
309 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000310 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000311 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000312 self.assertEqual(list(repeat('a', 0)), [])
313 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000314 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000315 self.assertRaises(TypeError, repeat, None, 3, 4)
316 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000317 r = repeat(1+0j)
318 self.assertEqual(repr(r), 'repeat((1+0j))')
319 r = repeat(1+0j, 5)
320 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
321 list(r)
322 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000323
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000324 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000325 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
326 [0**1, 1**2, 2**3])
327 self.assertEqual(list(imap(None, 'abc', range(5))),
328 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000329 self.assertEqual(list(imap(None, 'abc', count())),
330 [('a',0),('b',1),('c',2)])
331 self.assertEqual(take(2,imap(None, 'abc', count())),
332 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000333 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000334 self.assertRaises(TypeError, imap)
335 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000336 self.assertRaises(TypeError, imap(10, range(5)).next)
337 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
338 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000339
340 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000341 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
342 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000343 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
344 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000345 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000346 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
347 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000348 self.assertRaises(TypeError, starmap)
349 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
350 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
351 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
352 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000353
354 def test_islice(self):
355 for args in [ # islice(args) should agree with range(args)
356 (10, 20, 3),
357 (10, 3, 20),
358 (10, 20),
359 (10, 3),
360 (20,)
361 ]:
362 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
363
364 for args, tgtargs in [ # Stop when seqn is exhausted
365 ((10, 110, 3), ((10, 100, 3))),
366 ((10, 110), ((10, 100))),
367 ((110,), (100,))
368 ]:
369 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
370
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000371 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000372 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000373 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
374 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000375 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
376 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
377
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000378 # Test number of items consumed SF #1171417
379 it = iter(range(10))
380 self.assertEqual(list(islice(it, 3)), range(3))
381 self.assertEqual(list(it), range(3, 10))
382
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000383 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000384 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000385 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
386 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
387 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
388 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
389 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000390 self.assertRaises(ValueError, islice, xrange(10), 'a')
391 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
392 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
393 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
394 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000395 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000396
397 def test_takewhile(self):
398 data = [1, 3, 5, 20, 2, 4, 6, 8]
399 underten = lambda x: x<10
400 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000401 self.assertEqual(list(takewhile(underten, [])), [])
402 self.assertRaises(TypeError, takewhile)
403 self.assertRaises(TypeError, takewhile, operator.pow)
404 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
405 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
406 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000407 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
408 self.assertEqual(list(t), [1, 1, 1])
409 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000410
411 def test_dropwhile(self):
412 data = [1, 3, 5, 20, 2, 4, 6, 8]
413 underten = lambda x: x<10
414 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000415 self.assertEqual(list(dropwhile(underten, [])), [])
416 self.assertRaises(TypeError, dropwhile)
417 self.assertRaises(TypeError, dropwhile, operator.pow)
418 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
419 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
420 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000421
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000422 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000423 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000424 def irange(n):
425 for i in xrange(n):
426 yield i
427
428 a, b = tee([]) # test empty iterator
429 self.assertEqual(list(a), [])
430 self.assertEqual(list(b), [])
431
432 a, b = tee(irange(n)) # test 100% interleaved
433 self.assertEqual(zip(a,b), zip(range(n),range(n)))
434
435 a, b = tee(irange(n)) # test 0% interleaved
436 self.assertEqual(list(a), range(n))
437 self.assertEqual(list(b), range(n))
438
439 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000440 for i in xrange(100):
441 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000442 del a
443 self.assertEqual(list(b), range(n))
444
445 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000446 for i in xrange(100):
447 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000448 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000449 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000450
451 for j in xrange(5): # test randomly interleaved
452 order = [0]*n + [1]*n
453 random.shuffle(order)
454 lists = ([], [])
455 its = tee(irange(n))
456 for i in order:
457 value = its[i].next()
458 lists[i].append(value)
459 self.assertEqual(lists[0], range(n))
460 self.assertEqual(lists[1], range(n))
461
Raymond Hettingerad983e72003-11-12 14:32:26 +0000462 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000463 self.assertRaises(TypeError, tee)
464 self.assertRaises(TypeError, tee, 3)
465 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000466 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000467
Raymond Hettingerad983e72003-11-12 14:32:26 +0000468 # tee object should be instantiable
469 a, b = tee('abc')
470 c = type(a)('def')
471 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000472
Raymond Hettingerad983e72003-11-12 14:32:26 +0000473 # test long-lagged and multi-way split
474 a, b, c = tee(xrange(2000), 3)
475 for i in xrange(100):
476 self.assertEqual(a.next(), i)
477 self.assertEqual(list(b), range(2000))
478 self.assertEqual([c.next(), c.next()], range(2))
479 self.assertEqual(list(a), range(100,2000))
480 self.assertEqual(list(c), range(2,2000))
481
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000482 # test values of n
483 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000484 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000485 for n in xrange(5):
486 result = tee('abc', n)
487 self.assertEqual(type(result), tuple)
488 self.assertEqual(len(result), n)
489 self.assertEqual(map(list, result), [list('abc')]*n)
490
Raymond Hettingerad983e72003-11-12 14:32:26 +0000491 # tee pass-through to copyable iterator
492 a, b = tee('abc')
493 c, d = tee(a)
494 self.assert_(a is c)
495
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000496 # test tee_new
497 t1, t2 = tee('abc')
498 tnew = type(t1)
499 self.assertRaises(TypeError, tnew)
500 self.assertRaises(TypeError, tnew, 10)
501 t3 = tnew(t1)
502 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000503
Raymond Hettingera9f60922004-10-17 16:40:14 +0000504 # test that tee objects are weak referencable
505 a, b = tee(xrange(10))
506 p = proxy(a)
507 self.assertEqual(getattr(p, '__class__'), type(b))
508 del a
509 self.assertRaises(ReferenceError, getattr, p, '__class__')
510
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000511 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000512 self.assertRaises(StopIteration, izip().next)
513
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000514 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000515 self.assertRaises(StopIteration, f([]).next)
516 self.assertRaises(StopIteration, f(StopNow()).next)
517
518 self.assertRaises(StopIteration, islice([], None).next)
519 self.assertRaises(StopIteration, islice(StopNow(), None).next)
520
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000521 p, q = tee([])
522 self.assertRaises(StopIteration, p.next)
523 self.assertRaises(StopIteration, q.next)
524 p, q = tee(StopNow())
525 self.assertRaises(StopIteration, p.next)
526 self.assertRaises(StopIteration, q.next)
527
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000528 self.assertRaises(StopIteration, repeat(None, 0).next)
529
530 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
531 self.assertRaises(StopIteration, f(lambda x:x, []).next)
532 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
533
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000534class TestGC(unittest.TestCase):
535
536 def makecycle(self, iterator, container):
537 container.append(iterator)
538 iterator.next()
539 del container, iterator
540
541 def test_chain(self):
542 a = []
543 self.makecycle(chain(a), a)
544
545 def test_cycle(self):
546 a = []
547 self.makecycle(cycle([a]*2), a)
548
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000549 def test_dropwhile(self):
550 a = []
551 self.makecycle(dropwhile(bool, [0, a, a]), a)
552
553 def test_groupby(self):
554 a = []
555 self.makecycle(groupby([a]*2, lambda x:x), a)
556
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000557 def test_ifilter(self):
558 a = []
559 self.makecycle(ifilter(lambda x:True, [a]*2), a)
560
561 def test_ifilterfalse(self):
562 a = []
563 self.makecycle(ifilterfalse(lambda x:False, a), a)
564
565 def test_izip(self):
566 a = []
567 self.makecycle(izip([a]*2, [a]*3), a)
568
569 def test_imap(self):
570 a = []
571 self.makecycle(imap(lambda x:x, [a]*2), a)
572
573 def test_islice(self):
574 a = []
575 self.makecycle(islice([a]*2, None), a)
576
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000577 def test_repeat(self):
578 a = []
579 self.makecycle(repeat(a), a)
580
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000581 def test_starmap(self):
582 a = []
583 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
584
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000585 def test_takewhile(self):
586 a = []
587 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
588
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000589def R(seqn):
590 'Regular generator'
591 for i in seqn:
592 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000593
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000594class G:
595 'Sequence using __getitem__'
596 def __init__(self, seqn):
597 self.seqn = seqn
598 def __getitem__(self, i):
599 return self.seqn[i]
600
601class I:
602 'Sequence using iterator protocol'
603 def __init__(self, seqn):
604 self.seqn = seqn
605 self.i = 0
606 def __iter__(self):
607 return self
608 def next(self):
609 if self.i >= len(self.seqn): raise StopIteration
610 v = self.seqn[self.i]
611 self.i += 1
612 return v
613
614class Ig:
615 'Sequence using iterator protocol defined with a generator'
616 def __init__(self, seqn):
617 self.seqn = seqn
618 self.i = 0
619 def __iter__(self):
620 for val in self.seqn:
621 yield val
622
623class X:
624 'Missing __getitem__ and __iter__'
625 def __init__(self, seqn):
626 self.seqn = seqn
627 self.i = 0
628 def next(self):
629 if self.i >= len(self.seqn): raise StopIteration
630 v = self.seqn[self.i]
631 self.i += 1
632 return v
633
634class N:
635 'Iterator missing next()'
636 def __init__(self, seqn):
637 self.seqn = seqn
638 self.i = 0
639 def __iter__(self):
640 return self
641
642class E:
643 'Test propagation of exceptions'
644 def __init__(self, seqn):
645 self.seqn = seqn
646 self.i = 0
647 def __iter__(self):
648 return self
649 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000650 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000651
652class S:
653 'Test immediate stop'
654 def __init__(self, seqn):
655 pass
656 def __iter__(self):
657 return self
658 def next(self):
659 raise StopIteration
660
661def L(seqn):
662 'Test multiple tiers of iterators'
663 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
664
665
666class TestVariousIteratorArgs(unittest.TestCase):
667
668 def test_chain(self):
669 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
670 for g in (G, I, Ig, S, L, R):
671 self.assertEqual(list(chain(g(s))), list(g(s)))
672 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
673 self.assertRaises(TypeError, chain, X(s))
674 self.assertRaises(TypeError, list, chain(N(s)))
675 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
676
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000677 def test_product(self):
678 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
679 self.assertRaises(TypeError, product, X(s))
680 self.assertRaises(TypeError, product, N(s))
681 self.assertRaises(ZeroDivisionError, product, E(s))
682
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000683 def test_cycle(self):
684 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
685 for g in (G, I, Ig, S, L, R):
686 tgtlen = len(s) * 3
687 expected = list(g(s))*3
688 actual = list(islice(cycle(g(s)), tgtlen))
689 self.assertEqual(actual, expected)
690 self.assertRaises(TypeError, cycle, X(s))
691 self.assertRaises(TypeError, list, cycle(N(s)))
692 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
693
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000694 def test_groupby(self):
695 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
696 for g in (G, I, Ig, S, L, R):
697 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
698 self.assertRaises(TypeError, groupby, X(s))
699 self.assertRaises(TypeError, list, groupby(N(s)))
700 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
701
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000702 def test_ifilter(self):
703 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
704 for g in (G, I, Ig, S, L, R):
705 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
706 self.assertRaises(TypeError, ifilter, isEven, X(s))
707 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
708 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
709
710 def test_ifilterfalse(self):
711 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
712 for g in (G, I, Ig, S, L, R):
713 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
714 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
715 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
716 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
717
718 def test_izip(self):
719 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
720 for g in (G, I, Ig, S, L, R):
721 self.assertEqual(list(izip(g(s))), zip(g(s)))
722 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
723 self.assertRaises(TypeError, izip, X(s))
724 self.assertRaises(TypeError, list, izip(N(s)))
725 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
726
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000727 def test_iziplongest(self):
728 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
729 for g in (G, I, Ig, S, L, R):
730 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
731 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
732 self.assertRaises(TypeError, izip_longest, X(s))
733 self.assertRaises(TypeError, list, izip_longest(N(s)))
734 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
735
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000736 def test_imap(self):
737 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
738 for g in (G, I, Ig, S, L, R):
739 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
740 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
741 self.assertRaises(TypeError, imap, onearg, X(s))
742 self.assertRaises(TypeError, list, imap(onearg, N(s)))
743 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
744
745 def test_islice(self):
746 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
747 for g in (G, I, Ig, S, L, R):
748 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
749 self.assertRaises(TypeError, islice, X(s), 10)
750 self.assertRaises(TypeError, list, islice(N(s), 10))
751 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
752
753 def test_starmap(self):
754 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
755 for g in (G, I, Ig, S, L, R):
756 ss = zip(s, s)
757 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
758 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
759 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
760 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
761
762 def test_takewhile(self):
763 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
764 for g in (G, I, Ig, S, L, R):
765 tgt = []
766 for elem in g(s):
767 if not isEven(elem): break
768 tgt.append(elem)
769 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
770 self.assertRaises(TypeError, takewhile, isEven, X(s))
771 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
772 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
773
774 def test_dropwhile(self):
775 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
776 for g in (G, I, Ig, S, L, R):
777 tgt = []
778 for elem in g(s):
779 if not tgt and isOdd(elem): continue
780 tgt.append(elem)
781 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
782 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
783 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
784 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
785
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000786 def test_tee(self):
787 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
788 for g in (G, I, Ig, S, L, R):
789 it1, it2 = tee(g(s))
790 self.assertEqual(list(it1), list(g(s)))
791 self.assertEqual(list(it2), list(g(s)))
792 self.assertRaises(TypeError, tee, X(s))
793 self.assertRaises(TypeError, list, tee(N(s))[0])
794 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
795
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000796class LengthTransparency(unittest.TestCase):
797
798 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000799 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000800 self.assertEqual(len(repeat(None, 50)), 50)
801 self.assertRaises(TypeError, len, repeat(None))
802
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000803class RegressionTests(unittest.TestCase):
804
805 def test_sf_793826(self):
806 # Fix Armin Rigo's successful efforts to wreak havoc
807
808 def mutatingtuple(tuple1, f, tuple2):
809 # this builds a tuple t which is a copy of tuple1,
810 # then calls f(t), then mutates t to be equal to tuple2
811 # (needs len(tuple1) == len(tuple2)).
812 def g(value, first=[1]):
813 if first:
814 del first[:]
815 f(z.next())
816 return value
817 items = list(tuple2)
818 items[1:1] = list(tuple1)
819 gen = imap(g, items)
820 z = izip(*[gen]*len(tuple1))
821 z.next()
822
823 def f(t):
824 global T
825 T = t
826 first[:] = list(T)
827
828 first = []
829 mutatingtuple((1,2,3), f, (4,5,6))
830 second = list(T)
831 self.assertEqual(first, second)
832
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000833
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000834 def test_sf_950057(self):
835 # Make sure that chain() and cycle() catch exceptions immediately
836 # rather than when shifting between input sources
837
838 def gen1():
839 hist.append(0)
840 yield 1
841 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000842 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000843 hist.append(2)
844
845 def gen2(x):
846 hist.append(3)
847 yield 2
848 hist.append(4)
849 if x:
850 raise StopIteration
851
852 hist = []
853 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
854 self.assertEqual(hist, [0,1])
855
856 hist = []
857 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
858 self.assertEqual(hist, [0,1])
859
860 hist = []
861 self.assertRaises(AssertionError, list, cycle(gen1()))
862 self.assertEqual(hist, [0,1])
863
Georg Brandlb84c1372007-01-21 10:28:43 +0000864class SubclassWithKwargsTest(unittest.TestCase):
865 def test_keywords_in_subclass(self):
866 # count is not subclassable...
867 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
868 starmap, islice, takewhile, dropwhile, cycle):
869 class Subclass(cls):
870 def __init__(self, newarg=None, *args):
871 cls.__init__(self, *args)
872 try:
873 Subclass(newarg=1)
874 except TypeError, err:
875 # we expect type errors because of wrong argument count
876 self.failIf("does not take keyword arguments" in err.args[0])
877
878
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000879libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000880
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000881
882>>> amounts = [120.15, 764.05, 823.14]
883>>> for checknum, amount in izip(count(1200), amounts):
884... print 'Check %d is for $%.2f' % (checknum, amount)
885...
886Check 1200 is for $120.15
887Check 1201 is for $764.05
888Check 1202 is for $823.14
889
890>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000891>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
892... print cube
893...
8941
8958
89627
897
898>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000899>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000900... print name.title()
901...
902Alex
903Laura
904Martin
905Walter
906Samuele
907
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000908>>> from operator import itemgetter
909>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000910>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000911>>> for k, g in groupby(di, itemgetter(1)):
912... print k, map(itemgetter(0), g)
913...
9141 ['a', 'c', 'e']
9152 ['b', 'd', 'f']
9163 ['g']
917
Raymond Hettinger734fb572004-01-20 20:04:40 +0000918# Find runs of consecutive numbers using groupby. The key to the solution
919# is differencing with a range so that consecutive numbers all appear in
920# same group.
921>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
922>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
923... print map(operator.itemgetter(1), g)
924...
925[1]
926[4, 5, 6]
927[10]
928[15, 16, 17, 18]
929[22]
930[25, 26, 27, 28]
931
Raymond Hettingera098b332003-09-08 23:58:40 +0000932>>> def take(n, seq):
933... return list(islice(seq, n))
934
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000935>>> def enumerate(iterable):
936... return izip(count(), iterable)
937
938>>> def tabulate(function):
939... "Return function(0), function(1), ..."
940... return imap(function, count())
941
942>>> def iteritems(mapping):
943... return izip(mapping.iterkeys(), mapping.itervalues())
944
945>>> def nth(iterable, n):
946... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000947... return list(islice(iterable, n, n+1))
948
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000949>>> def all(seq, pred=None):
950... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000951... for elem in ifilterfalse(pred, seq):
952... return False
953... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000954
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000955>>> def any(seq, pred=None):
956... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000957... for elem in ifilter(pred, seq):
958... return True
959... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000960
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000961>>> def no(seq, pred=None):
962... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000963... for elem in ifilter(pred, seq):
964... return False
965... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000966
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000967>>> def quantify(seq, pred=None):
968... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000969... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000970
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000971>>> def padnone(seq):
972... "Returns the sequence elements and then returns None indefinitely"
973... return chain(seq, repeat(None))
974
975>>> def ncycles(seq, n):
976... "Returns the sequence elements n times"
977... return chain(*repeat(seq, n))
978
979>>> def dotproduct(vec1, vec2):
980... return sum(imap(operator.mul, vec1, vec2))
981
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000982>>> def flatten(listOfLists):
983... return list(chain(*listOfLists))
984
985>>> def repeatfunc(func, times=None, *args):
986... "Repeat calls to func with specified arguments."
987... " Example: repeatfunc(random.random)"
988... if times is None:
989... return starmap(func, repeat(args))
990... else:
991... return starmap(func, repeat(args, times))
992
Raymond Hettingerd591f662003-10-26 15:34:50 +0000993>>> def pairwise(iterable):
994... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
995... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000996... try:
997... b.next()
998... except StopIteration:
999... pass
1000... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001001
1002This is not part of the examples but it tests to make sure the definitions
1003perform as purported.
1004
Raymond Hettingera098b332003-09-08 23:58:40 +00001005>>> take(10, count())
1006[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1007
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001008>>> list(enumerate('abc'))
1009[(0, 'a'), (1, 'b'), (2, 'c')]
1010
1011>>> list(islice(tabulate(lambda x: 2*x), 4))
1012[0, 2, 4, 6]
1013
1014>>> nth('abcde', 3)
1015['d']
1016
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001017>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001018True
1019
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001020>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001021False
1022
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001023>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001024True
1025
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001026>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001027False
1028
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001029>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001030True
1031
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001032>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001033False
1034
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001035>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000103650
1037
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001038>>> a = [[1, 2, 3], [4, 5, 6]]
1039>>> flatten(a)
1040[1, 2, 3, 4, 5, 6]
1041
1042>>> list(repeatfunc(pow, 5, 2, 3))
1043[8, 8, 8, 8, 8]
1044
1045>>> import random
1046>>> take(5, imap(int, repeatfunc(random.random)))
1047[0, 0, 0, 0, 0]
1048
Raymond Hettingerd591f662003-10-26 15:34:50 +00001049>>> list(pairwise('abcd'))
1050[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001051
Raymond Hettingerd591f662003-10-26 15:34:50 +00001052>>> list(pairwise([]))
1053[]
1054
1055>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001056[]
1057
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001058>>> list(islice(padnone('abc'), 0, 6))
1059['a', 'b', 'c', None, None, None]
1060
1061>>> list(ncycles('abc', 3))
1062['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1063
1064>>> dotproduct([1,2,3], [4,5,6])
106532
1066
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001067"""
1068
1069__test__ = {'libreftest' : libreftest}
1070
1071def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001072 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001073 RegressionTests, LengthTransparency,
1074 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001075 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001076
1077 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001078 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001079 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001080 counts = [None] * 5
1081 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001082 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001083 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001084 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001085 print counts
1086
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001087 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001088 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001089
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001090if __name__ == "__main__":
1091 test_main(verbose=True)