blob: 500afef01e5b31d6466c1cf1f20e05f47d7c638f [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 Hettinger05bf6332008-02-28 22:30:42 +000053 self.assertRaises(TypeError, list,chain(2, 3))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000054
Raymond Hettingerb4cbc982008-02-28 22:46:41 +000055 def test_chain_from_iterable(self):
56 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
57 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
58 self.assertEqual(list(chain.from_iterable([''])), [])
59 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
60 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
61
Raymond Hettinger93e804d2008-02-26 23:40:50 +000062 def test_combinations(self):
63 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
64 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
65 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
66 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
67 self.assertEqual(list(combinations(range(4), 3)),
68 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Raymond Hettinger2ab05522008-02-27 01:08:30 +000069 for n in range(8):
Raymond Hettinger93e804d2008-02-26 23:40:50 +000070 values = [5*x-12 for x in range(n)]
71 for r in range(n+1):
72 result = list(combinations(values, r))
73 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
74 self.assertEqual(len(result), len(set(result))) # no repeats
75 self.assertEqual(result, sorted(result)) # lexicographic order
76 for c in result:
77 self.assertEqual(len(c), r) # r-length combinations
78 self.assertEqual(len(set(c)), r) # no duplicate elements
79 self.assertEqual(list(c), sorted(c)) # keep original ordering
80 self.assert_(all(e in values for e in c)) # elements taken from input iterable
81
Raymond Hettinger96ef8112003-02-01 00:10:11 +000082 def test_count(self):
83 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
84 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000085 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000086 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
87 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000088 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000089 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000090 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
91 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000092 c = count(3)
93 self.assertEqual(repr(c), 'count(3)')
94 c.next()
95 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000096 c = count(-9)
97 self.assertEqual(repr(c), 'count(-9)')
98 c.next()
99 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +0000100 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 +0000101 # Test repr (ignoring the L in longs)
102 r1 = repr(count(i)).replace('L', '')
103 r2 = 'count(%r)'.__mod__(i).replace('L', '')
104 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000105
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000106 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000107 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000108 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000109 self.assertRaises(TypeError, cycle)
110 self.assertRaises(TypeError, cycle, 5)
111 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000112
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000113 def test_groupby(self):
114 # Check whether it accepts arguments correctly
115 self.assertEqual([], list(groupby([])))
116 self.assertEqual([], list(groupby([], key=id)))
117 self.assertRaises(TypeError, list, groupby('abc', []))
118 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000119 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120
121 # Check normal input
122 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
123 (2,15,22), (3,16,23), (3,17,23)]
124 dup = []
125 for k, g in groupby(s, lambda r:r[0]):
126 for elem in g:
127 self.assertEqual(k, elem[0])
128 dup.append(elem)
129 self.assertEqual(s, dup)
130
131 # Check nested case
132 dup = []
133 for k, g in groupby(s, lambda r:r[0]):
134 for ik, ig in groupby(g, lambda r:r[2]):
135 for elem in ig:
136 self.assertEqual(k, elem[0])
137 self.assertEqual(ik, elem[2])
138 dup.append(elem)
139 self.assertEqual(s, dup)
140
141 # Check case where inner iterator is not used
142 keys = [k for k, g in groupby(s, lambda r:r[0])]
143 expectedkeys = set([r[0] for r in s])
144 self.assertEqual(set(keys), expectedkeys)
145 self.assertEqual(len(keys), len(expectedkeys))
146
147 # Exercise pipes and filters style
148 s = 'abracadabra'
149 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000150 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000151 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
152 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000153 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000154 self.assertEqual(r, ['a', 'b', 'r'])
155 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000156 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000157 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
158 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000159 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000160 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
161
162 # iter.next failure
163 class ExpectedError(Exception):
164 pass
165 def delayed_raise(n=0):
166 for i in range(n):
167 yield 'yo'
168 raise ExpectedError
169 def gulp(iterable, keyp=None, func=list):
170 return [func(g) for k, g in groupby(iterable, keyp)]
171
172 # iter.next failure on outer object
173 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
174 # iter.next failure on inner object
175 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
176
177 # __cmp__ failure
178 class DummyCmp:
179 def __cmp__(self, dst):
180 raise ExpectedError
181 s = [DummyCmp(), DummyCmp(), None]
182
183 # __cmp__ failure on outer object
184 self.assertRaises(ExpectedError, gulp, s, func=id)
185 # __cmp__ failure on inner object
186 self.assertRaises(ExpectedError, gulp, s)
187
188 # keyfunc failure
189 def keyfunc(obj):
190 if keyfunc.skip > 0:
191 keyfunc.skip -= 1
192 return obj
193 else:
194 raise ExpectedError
195
196 # keyfunc failure on outer object
197 keyfunc.skip = 0
198 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
199 keyfunc.skip = 1
200 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
201
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000202 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000203 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000204 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000205 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000206 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000207 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000208 self.assertRaises(TypeError, ifilter, lambda x:x)
209 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000211 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000212
213 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000214 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
215 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger9d638372008-02-25 22:42:32 +0000216 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000217 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000218 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000219 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
220 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000221 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000222 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000223
224 def test_izip(self):
225 ans = [(x,y) for x, y in izip('abc',count())]
226 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000227 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
228 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000229 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000230 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000231 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000232 self.assertRaises(TypeError, izip, 3)
233 self.assertRaises(TypeError, izip, range(3), 3)
234 # Check tuple re-use (implementation detail)
235 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
236 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000237 self.assertEqual([pair for pair in izip('abc', 'def')],
238 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000239 ids = map(id, izip('abc', 'def'))
240 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000241 ids = map(id, list(izip('abc', 'def')))
242 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000243
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000244 def test_iziplongest(self):
245 for args in [
246 ['abc', range(6)],
247 [range(6), 'abc'],
248 [range(1000), range(2000,2100), range(3000,3050)],
249 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
250 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
251 ]:
252 target = map(None, *args)
253 self.assertEqual(list(izip_longest(*args)), target)
254 self.assertEqual(list(izip_longest(*args, **{})), target)
255 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
256 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000257
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000258 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
259
260 self.assertEqual(list(izip_longest()), zip())
261 self.assertEqual(list(izip_longest([])), zip([]))
262 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000263
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000264 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
265 self.assertRaises(TypeError, izip_longest, 3)
266 self.assertRaises(TypeError, izip_longest, range(3), 3)
267
268 for stmt in [
269 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000270 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000271 ]:
272 try:
273 eval(stmt, globals(), locals())
274 except TypeError:
275 pass
276 else:
277 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000278
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000279 # Check tuple re-use (implementation detail)
280 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
281 zip('abc', 'def'))
282 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
283 zip('abc', 'def'))
284 ids = map(id, izip_longest('abc', 'def'))
285 self.assertEqual(min(ids), max(ids))
286 ids = map(id, list(izip_longest('abc', 'def')))
287 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
288
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000289 def test_product(self):
290 for args, result in [
291 ([], []), # zero iterables ??? is this correct
292 (['ab'], [('a',), ('b',)]), # one iterable
293 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
294 ([range(0), range(2), range(3)], []), # first iterable with zero length
295 ([range(2), range(0), range(3)], []), # middle iterable with zero length
296 ([range(2), range(3), range(0)], []), # last iterable with zero length
297 ]:
298 self.assertEqual(list(product(*args)), result)
299 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
300 self.assertRaises(TypeError, product, range(6), None)
301 argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
302 set('abcdefg'), range(11), tuple(range(13))]
303 for i in range(100):
304 args = [random.choice(argtypes) for j in range(random.randrange(5))]
305 n = reduce(operator.mul, map(len, args), 1) if args else 0
306 self.assertEqual(len(list(product(*args))), n)
307 args = map(iter, args)
308 self.assertEqual(len(list(product(*args))), n)
309
Raymond Hettinger73d79632008-02-23 02:20:41 +0000310 # Test implementation detail: tuple re-use
311 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
312 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000313
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000314 def test_repeat(self):
315 self.assertEqual(zip(xrange(3),repeat('a')),
316 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000317 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000318 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000319 self.assertEqual(list(repeat('a', 0)), [])
320 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000321 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000322 self.assertRaises(TypeError, repeat, None, 3, 4)
323 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000324 r = repeat(1+0j)
325 self.assertEqual(repr(r), 'repeat((1+0j))')
326 r = repeat(1+0j, 5)
327 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
328 list(r)
329 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000330
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000331 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000332 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
333 [0**1, 1**2, 2**3])
334 self.assertEqual(list(imap(None, 'abc', range(5))),
335 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000336 self.assertEqual(list(imap(None, 'abc', count())),
337 [('a',0),('b',1),('c',2)])
338 self.assertEqual(take(2,imap(None, 'abc', count())),
339 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000340 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000341 self.assertRaises(TypeError, imap)
342 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000343 self.assertRaises(TypeError, imap(10, range(5)).next)
344 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
345 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000346
347 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000348 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
349 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000350 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
351 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000352 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger47317092008-01-17 03:02:14 +0000353 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
354 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000355 self.assertRaises(TypeError, starmap)
356 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
357 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
358 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
359 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000360
361 def test_islice(self):
362 for args in [ # islice(args) should agree with range(args)
363 (10, 20, 3),
364 (10, 3, 20),
365 (10, 20),
366 (10, 3),
367 (20,)
368 ]:
369 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
370
371 for args, tgtargs in [ # Stop when seqn is exhausted
372 ((10, 110, 3), ((10, 100, 3))),
373 ((10, 110), ((10, 100))),
374 ((110,), (100,))
375 ]:
376 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
377
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000378 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000379 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000380 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
381 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000382 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
383 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
384
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000385 # Test number of items consumed SF #1171417
386 it = iter(range(10))
387 self.assertEqual(list(islice(it, 3)), range(3))
388 self.assertEqual(list(it), range(3, 10))
389
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000390 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000391 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000392 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
393 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
394 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
395 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
396 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000397 self.assertRaises(ValueError, islice, xrange(10), 'a')
398 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
399 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
400 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
401 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000402 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000403
404 def test_takewhile(self):
405 data = [1, 3, 5, 20, 2, 4, 6, 8]
406 underten = lambda x: x<10
407 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000408 self.assertEqual(list(takewhile(underten, [])), [])
409 self.assertRaises(TypeError, takewhile)
410 self.assertRaises(TypeError, takewhile, operator.pow)
411 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
412 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
413 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000414 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
415 self.assertEqual(list(t), [1, 1, 1])
416 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000417
418 def test_dropwhile(self):
419 data = [1, 3, 5, 20, 2, 4, 6, 8]
420 underten = lambda x: x<10
421 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000422 self.assertEqual(list(dropwhile(underten, [])), [])
423 self.assertRaises(TypeError, dropwhile)
424 self.assertRaises(TypeError, dropwhile, operator.pow)
425 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
426 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
427 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000428
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000429 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000430 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000431 def irange(n):
432 for i in xrange(n):
433 yield i
434
435 a, b = tee([]) # test empty iterator
436 self.assertEqual(list(a), [])
437 self.assertEqual(list(b), [])
438
439 a, b = tee(irange(n)) # test 100% interleaved
440 self.assertEqual(zip(a,b), zip(range(n),range(n)))
441
442 a, b = tee(irange(n)) # test 0% interleaved
443 self.assertEqual(list(a), range(n))
444 self.assertEqual(list(b), range(n))
445
446 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000447 for i in xrange(100):
448 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000449 del a
450 self.assertEqual(list(b), range(n))
451
452 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000453 for i in xrange(100):
454 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000455 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000456 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000457
458 for j in xrange(5): # test randomly interleaved
459 order = [0]*n + [1]*n
460 random.shuffle(order)
461 lists = ([], [])
462 its = tee(irange(n))
463 for i in order:
464 value = its[i].next()
465 lists[i].append(value)
466 self.assertEqual(lists[0], range(n))
467 self.assertEqual(lists[1], range(n))
468
Raymond Hettingerad983e72003-11-12 14:32:26 +0000469 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000470 self.assertRaises(TypeError, tee)
471 self.assertRaises(TypeError, tee, 3)
472 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000473 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000474
Raymond Hettingerad983e72003-11-12 14:32:26 +0000475 # tee object should be instantiable
476 a, b = tee('abc')
477 c = type(a)('def')
478 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000479
Raymond Hettingerad983e72003-11-12 14:32:26 +0000480 # test long-lagged and multi-way split
481 a, b, c = tee(xrange(2000), 3)
482 for i in xrange(100):
483 self.assertEqual(a.next(), i)
484 self.assertEqual(list(b), range(2000))
485 self.assertEqual([c.next(), c.next()], range(2))
486 self.assertEqual(list(a), range(100,2000))
487 self.assertEqual(list(c), range(2,2000))
488
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000489 # test values of n
490 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000491 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000492 for n in xrange(5):
493 result = tee('abc', n)
494 self.assertEqual(type(result), tuple)
495 self.assertEqual(len(result), n)
496 self.assertEqual(map(list, result), [list('abc')]*n)
497
Raymond Hettingerad983e72003-11-12 14:32:26 +0000498 # tee pass-through to copyable iterator
499 a, b = tee('abc')
500 c, d = tee(a)
501 self.assert_(a is c)
502
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000503 # test tee_new
504 t1, t2 = tee('abc')
505 tnew = type(t1)
506 self.assertRaises(TypeError, tnew)
507 self.assertRaises(TypeError, tnew, 10)
508 t3 = tnew(t1)
509 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000510
Raymond Hettingera9f60922004-10-17 16:40:14 +0000511 # test that tee objects are weak referencable
512 a, b = tee(xrange(10))
513 p = proxy(a)
514 self.assertEqual(getattr(p, '__class__'), type(b))
515 del a
516 self.assertRaises(ReferenceError, getattr, p, '__class__')
517
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000518 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000519 self.assertRaises(StopIteration, izip().next)
520
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000521 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000522 self.assertRaises(StopIteration, f([]).next)
523 self.assertRaises(StopIteration, f(StopNow()).next)
524
525 self.assertRaises(StopIteration, islice([], None).next)
526 self.assertRaises(StopIteration, islice(StopNow(), None).next)
527
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000528 p, q = tee([])
529 self.assertRaises(StopIteration, p.next)
530 self.assertRaises(StopIteration, q.next)
531 p, q = tee(StopNow())
532 self.assertRaises(StopIteration, p.next)
533 self.assertRaises(StopIteration, q.next)
534
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000535 self.assertRaises(StopIteration, repeat(None, 0).next)
536
537 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
538 self.assertRaises(StopIteration, f(lambda x:x, []).next)
539 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
540
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000541class TestGC(unittest.TestCase):
542
543 def makecycle(self, iterator, container):
544 container.append(iterator)
545 iterator.next()
546 del container, iterator
547
548 def test_chain(self):
549 a = []
550 self.makecycle(chain(a), a)
551
552 def test_cycle(self):
553 a = []
554 self.makecycle(cycle([a]*2), a)
555
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000556 def test_dropwhile(self):
557 a = []
558 self.makecycle(dropwhile(bool, [0, a, a]), a)
559
560 def test_groupby(self):
561 a = []
562 self.makecycle(groupby([a]*2, lambda x:x), a)
563
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000564 def test_ifilter(self):
565 a = []
566 self.makecycle(ifilter(lambda x:True, [a]*2), a)
567
568 def test_ifilterfalse(self):
569 a = []
570 self.makecycle(ifilterfalse(lambda x:False, a), a)
571
572 def test_izip(self):
573 a = []
574 self.makecycle(izip([a]*2, [a]*3), a)
575
576 def test_imap(self):
577 a = []
578 self.makecycle(imap(lambda x:x, [a]*2), a)
579
580 def test_islice(self):
581 a = []
582 self.makecycle(islice([a]*2, None), a)
583
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000584 def test_repeat(self):
585 a = []
586 self.makecycle(repeat(a), a)
587
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000588 def test_starmap(self):
589 a = []
590 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
591
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000592 def test_takewhile(self):
593 a = []
594 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
595
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000596def R(seqn):
597 'Regular generator'
598 for i in seqn:
599 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000600
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000601class G:
602 'Sequence using __getitem__'
603 def __init__(self, seqn):
604 self.seqn = seqn
605 def __getitem__(self, i):
606 return self.seqn[i]
607
608class I:
609 'Sequence using iterator protocol'
610 def __init__(self, seqn):
611 self.seqn = seqn
612 self.i = 0
613 def __iter__(self):
614 return self
615 def next(self):
616 if self.i >= len(self.seqn): raise StopIteration
617 v = self.seqn[self.i]
618 self.i += 1
619 return v
620
621class Ig:
622 'Sequence using iterator protocol defined with a generator'
623 def __init__(self, seqn):
624 self.seqn = seqn
625 self.i = 0
626 def __iter__(self):
627 for val in self.seqn:
628 yield val
629
630class X:
631 'Missing __getitem__ and __iter__'
632 def __init__(self, seqn):
633 self.seqn = seqn
634 self.i = 0
635 def next(self):
636 if self.i >= len(self.seqn): raise StopIteration
637 v = self.seqn[self.i]
638 self.i += 1
639 return v
640
641class N:
642 'Iterator missing next()'
643 def __init__(self, seqn):
644 self.seqn = seqn
645 self.i = 0
646 def __iter__(self):
647 return self
648
649class E:
650 'Test propagation of exceptions'
651 def __init__(self, seqn):
652 self.seqn = seqn
653 self.i = 0
654 def __iter__(self):
655 return self
656 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000657 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000658
659class S:
660 'Test immediate stop'
661 def __init__(self, seqn):
662 pass
663 def __iter__(self):
664 return self
665 def next(self):
666 raise StopIteration
667
668def L(seqn):
669 'Test multiple tiers of iterators'
670 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
671
672
673class TestVariousIteratorArgs(unittest.TestCase):
674
675 def test_chain(self):
676 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
677 for g in (G, I, Ig, S, L, R):
678 self.assertEqual(list(chain(g(s))), list(g(s)))
679 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Raymond Hettinger05bf6332008-02-28 22:30:42 +0000680 self.assertRaises(TypeError, list, chain(X(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000681 self.assertRaises(TypeError, list, chain(N(s)))
682 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
683
Raymond Hettinger50986cc2008-02-22 03:16:42 +0000684 def test_product(self):
685 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
686 self.assertRaises(TypeError, product, X(s))
687 self.assertRaises(TypeError, product, N(s))
688 self.assertRaises(ZeroDivisionError, product, E(s))
689
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000690 def test_cycle(self):
691 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
692 for g in (G, I, Ig, S, L, R):
693 tgtlen = len(s) * 3
694 expected = list(g(s))*3
695 actual = list(islice(cycle(g(s)), tgtlen))
696 self.assertEqual(actual, expected)
697 self.assertRaises(TypeError, cycle, X(s))
698 self.assertRaises(TypeError, list, cycle(N(s)))
699 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
700
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000701 def test_groupby(self):
702 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
703 for g in (G, I, Ig, S, L, R):
704 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
705 self.assertRaises(TypeError, groupby, X(s))
706 self.assertRaises(TypeError, list, groupby(N(s)))
707 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
708
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000709 def test_ifilter(self):
710 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
711 for g in (G, I, Ig, S, L, R):
712 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
713 self.assertRaises(TypeError, ifilter, isEven, X(s))
714 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
715 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
716
717 def test_ifilterfalse(self):
718 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
719 for g in (G, I, Ig, S, L, R):
720 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
721 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
722 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
723 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
724
725 def test_izip(self):
726 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
727 for g in (G, I, Ig, S, L, R):
728 self.assertEqual(list(izip(g(s))), zip(g(s)))
729 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
730 self.assertRaises(TypeError, izip, X(s))
731 self.assertRaises(TypeError, list, izip(N(s)))
732 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
733
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000734 def test_iziplongest(self):
735 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
736 for g in (G, I, Ig, S, L, R):
737 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
738 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
739 self.assertRaises(TypeError, izip_longest, X(s))
740 self.assertRaises(TypeError, list, izip_longest(N(s)))
741 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
742
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000743 def test_imap(self):
744 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
745 for g in (G, I, Ig, S, L, R):
746 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
747 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
748 self.assertRaises(TypeError, imap, onearg, X(s))
749 self.assertRaises(TypeError, list, imap(onearg, N(s)))
750 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
751
752 def test_islice(self):
753 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
754 for g in (G, I, Ig, S, L, R):
755 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
756 self.assertRaises(TypeError, islice, X(s), 10)
757 self.assertRaises(TypeError, list, islice(N(s), 10))
758 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
759
760 def test_starmap(self):
761 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
762 for g in (G, I, Ig, S, L, R):
763 ss = zip(s, s)
764 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
765 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
766 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
767 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
768
769 def test_takewhile(self):
770 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
771 for g in (G, I, Ig, S, L, R):
772 tgt = []
773 for elem in g(s):
774 if not isEven(elem): break
775 tgt.append(elem)
776 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
777 self.assertRaises(TypeError, takewhile, isEven, X(s))
778 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
779 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
780
781 def test_dropwhile(self):
782 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
783 for g in (G, I, Ig, S, L, R):
784 tgt = []
785 for elem in g(s):
786 if not tgt and isOdd(elem): continue
787 tgt.append(elem)
788 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
789 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
790 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
791 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
792
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000793 def test_tee(self):
794 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
795 for g in (G, I, Ig, S, L, R):
796 it1, it2 = tee(g(s))
797 self.assertEqual(list(it1), list(g(s)))
798 self.assertEqual(list(it2), list(g(s)))
799 self.assertRaises(TypeError, tee, X(s))
800 self.assertRaises(TypeError, list, tee(N(s))[0])
801 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
802
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000803class LengthTransparency(unittest.TestCase):
804
805 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000806 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000807 self.assertEqual(len(repeat(None, 50)), 50)
808 self.assertRaises(TypeError, len, repeat(None))
809
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000810class RegressionTests(unittest.TestCase):
811
812 def test_sf_793826(self):
813 # Fix Armin Rigo's successful efforts to wreak havoc
814
815 def mutatingtuple(tuple1, f, tuple2):
816 # this builds a tuple t which is a copy of tuple1,
817 # then calls f(t), then mutates t to be equal to tuple2
818 # (needs len(tuple1) == len(tuple2)).
819 def g(value, first=[1]):
820 if first:
821 del first[:]
822 f(z.next())
823 return value
824 items = list(tuple2)
825 items[1:1] = list(tuple1)
826 gen = imap(g, items)
827 z = izip(*[gen]*len(tuple1))
828 z.next()
829
830 def f(t):
831 global T
832 T = t
833 first[:] = list(T)
834
835 first = []
836 mutatingtuple((1,2,3), f, (4,5,6))
837 second = list(T)
838 self.assertEqual(first, second)
839
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000840
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000841 def test_sf_950057(self):
842 # Make sure that chain() and cycle() catch exceptions immediately
843 # rather than when shifting between input sources
844
845 def gen1():
846 hist.append(0)
847 yield 1
848 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000849 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000850 hist.append(2)
851
852 def gen2(x):
853 hist.append(3)
854 yield 2
855 hist.append(4)
856 if x:
857 raise StopIteration
858
859 hist = []
860 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
861 self.assertEqual(hist, [0,1])
862
863 hist = []
864 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
865 self.assertEqual(hist, [0,1])
866
867 hist = []
868 self.assertRaises(AssertionError, list, cycle(gen1()))
869 self.assertEqual(hist, [0,1])
870
Georg Brandlb84c1372007-01-21 10:28:43 +0000871class SubclassWithKwargsTest(unittest.TestCase):
872 def test_keywords_in_subclass(self):
873 # count is not subclassable...
874 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
875 starmap, islice, takewhile, dropwhile, cycle):
876 class Subclass(cls):
877 def __init__(self, newarg=None, *args):
878 cls.__init__(self, *args)
879 try:
880 Subclass(newarg=1)
881 except TypeError, err:
882 # we expect type errors because of wrong argument count
883 self.failIf("does not take keyword arguments" in err.args[0])
884
885
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000886libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000887
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000888
889>>> amounts = [120.15, 764.05, 823.14]
890>>> for checknum, amount in izip(count(1200), amounts):
891... print 'Check %d is for $%.2f' % (checknum, amount)
892...
893Check 1200 is for $120.15
894Check 1201 is for $764.05
895Check 1202 is for $823.14
896
897>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000898>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
899... print cube
900...
9011
9028
90327
904
905>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000906>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000907... print name.title()
908...
909Alex
910Laura
911Martin
912Walter
913Samuele
914
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000915>>> from operator import itemgetter
916>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000917>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000918>>> for k, g in groupby(di, itemgetter(1)):
919... print k, map(itemgetter(0), g)
920...
9211 ['a', 'c', 'e']
9222 ['b', 'd', 'f']
9233 ['g']
924
Raymond Hettinger734fb572004-01-20 20:04:40 +0000925# Find runs of consecutive numbers using groupby. The key to the solution
926# is differencing with a range so that consecutive numbers all appear in
927# same group.
928>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
929>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
930... print map(operator.itemgetter(1), g)
931...
932[1]
933[4, 5, 6]
934[10]
935[15, 16, 17, 18]
936[22]
937[25, 26, 27, 28]
938
Raymond Hettingera098b332003-09-08 23:58:40 +0000939>>> def take(n, seq):
940... return list(islice(seq, n))
941
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000942>>> def enumerate(iterable):
943... return izip(count(), iterable)
944
945>>> def tabulate(function):
946... "Return function(0), function(1), ..."
947... return imap(function, count())
948
949>>> def iteritems(mapping):
950... return izip(mapping.iterkeys(), mapping.itervalues())
951
952>>> def nth(iterable, n):
953... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000954... return list(islice(iterable, n, n+1))
955
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000956>>> def all(seq, pred=None):
957... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000958... for elem in ifilterfalse(pred, seq):
959... return False
960... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000961
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000962>>> def any(seq, pred=None):
963... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000964... for elem in ifilter(pred, seq):
965... return True
966... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000967
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000968>>> def no(seq, pred=None):
969... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000970... for elem in ifilter(pred, seq):
971... return False
972... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000973
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000974>>> def quantify(seq, pred=None):
975... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000976... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000977
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000978>>> def padnone(seq):
979... "Returns the sequence elements and then returns None indefinitely"
980... return chain(seq, repeat(None))
981
982>>> def ncycles(seq, n):
983... "Returns the sequence elements n times"
984... return chain(*repeat(seq, n))
985
986>>> def dotproduct(vec1, vec2):
987... return sum(imap(operator.mul, vec1, vec2))
988
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000989>>> def flatten(listOfLists):
990... return list(chain(*listOfLists))
991
992>>> def repeatfunc(func, times=None, *args):
993... "Repeat calls to func with specified arguments."
994... " Example: repeatfunc(random.random)"
995... if times is None:
996... return starmap(func, repeat(args))
997... else:
998... return starmap(func, repeat(args, times))
999
Raymond Hettingerd591f662003-10-26 15:34:50 +00001000>>> def pairwise(iterable):
1001... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1002... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001003... try:
1004... b.next()
1005... except StopIteration:
1006... pass
1007... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001008
1009This is not part of the examples but it tests to make sure the definitions
1010perform as purported.
1011
Raymond Hettingera098b332003-09-08 23:58:40 +00001012>>> take(10, count())
1013[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1014
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001015>>> list(enumerate('abc'))
1016[(0, 'a'), (1, 'b'), (2, 'c')]
1017
1018>>> list(islice(tabulate(lambda x: 2*x), 4))
1019[0, 2, 4, 6]
1020
1021>>> nth('abcde', 3)
1022['d']
1023
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001024>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001025True
1026
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001027>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001028False
1029
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001030>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001031True
1032
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001033>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001034False
1035
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001036>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001037True
1038
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001039>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001040False
1041
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001042>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000104350
1044
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001045>>> a = [[1, 2, 3], [4, 5, 6]]
1046>>> flatten(a)
1047[1, 2, 3, 4, 5, 6]
1048
1049>>> list(repeatfunc(pow, 5, 2, 3))
1050[8, 8, 8, 8, 8]
1051
1052>>> import random
1053>>> take(5, imap(int, repeatfunc(random.random)))
1054[0, 0, 0, 0, 0]
1055
Raymond Hettingerd591f662003-10-26 15:34:50 +00001056>>> list(pairwise('abcd'))
1057[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001058
Raymond Hettingerd591f662003-10-26 15:34:50 +00001059>>> list(pairwise([]))
1060[]
1061
1062>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001063[]
1064
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001065>>> list(islice(padnone('abc'), 0, 6))
1066['a', 'b', 'c', None, None, None]
1067
1068>>> list(ncycles('abc', 3))
1069['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1070
1071>>> dotproduct([1,2,3], [4,5,6])
107232
1073
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001074"""
1075
1076__test__ = {'libreftest' : libreftest}
1077
1078def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001079 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001080 RegressionTests, LengthTransparency,
1081 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001082 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001083
1084 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001085 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001086 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001087 counts = [None] * 5
1088 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001089 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001090 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001091 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001092 print counts
1093
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001094 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001095 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001096
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001097if __name__ == "__main__":
1098 test_main(verbose=True)