blob: 7c858eb97e09735935c651d0bb48af55c4a0c204 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from 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
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Benjamin Petersonee8712c2008-05-20 21:35:26 +00009maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000010minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000011
Guido van Rossum801f0d72006-08-24 19:48:10 +000012def lzip(*args):
13 return list(zip(*args))
14
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015def onearg(x):
16 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000017 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000018
19def errfunc(*args):
20 'Test function that raises an error'
21 raise ValueError
22
23def gen3():
24 'Non-restartable source sequence'
25 for i in (0, 1, 2):
26 yield i
27
28def isEven(x):
29 'Test predicate'
30 return x%2==0
31
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000032def isOdd(x):
33 'Test predicate'
34 return x%2==1
35
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000036class StopNow:
37 'Class emulating an empty iterable.'
38 def __iter__(self):
39 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000040 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000041 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000042
Raymond Hettinger02420702003-06-29 20:36:23 +000043def take(n, seq):
44 'Convenience function for partially consuming a long of infinite iterable'
45 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000046
Christian Heimes78644762008-03-04 23:39:23 +000047def prod(iterable):
48 return reduce(operator.mul, iterable, 1)
49
Christian Heimes380f7f22008-02-28 11:19:05 +000050def fact(n):
51 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000052 return prod(range(1, n+1))
53
Raymond Hettinger96ef8112003-02-01 00:10:11 +000054class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000055 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +000056
57 def chain2(*iterables):
58 'Pure python version in the docs'
59 for it in iterables:
60 for element in it:
61 yield element
62
63 for c in (chain, chain2):
64 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
65 self.assertEqual(list(c('abc')), list('abc'))
66 self.assertEqual(list(c('')), [])
67 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
68 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +000069
70 def test_chain_from_iterable(self):
71 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
72 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
73 self.assertEqual(list(chain.from_iterable([''])), [])
74 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
75 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000076
Christian Heimes380f7f22008-02-28 11:19:05 +000077 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000078 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +000079 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +000080 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +000081 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000082 self.assertEqual(list(combinations('abc', 32)), []) # r > n
Christian Heimes380f7f22008-02-28 11:19:05 +000083 self.assertEqual(list(combinations(range(4), 3)),
84 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
Christian Heimes78644762008-03-04 23:39:23 +000085
86 def combinations1(iterable, r):
87 'Pure python version shown in the docs'
88 pool = tuple(iterable)
89 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +000090 if r > n:
91 return
Christian Heimes78644762008-03-04 23:39:23 +000092 indices = list(range(r))
93 yield tuple(pool[i] for i in indices)
94 while 1:
95 for i in reversed(range(r)):
96 if indices[i] != i + n - r:
97 break
98 else:
99 return
100 indices[i] += 1
101 for j in range(i+1, r):
102 indices[j] = indices[j-1] + 1
103 yield tuple(pool[i] for i in indices)
104
105 def combinations2(iterable, r):
106 'Pure python version shown in the docs'
107 pool = tuple(iterable)
108 n = len(pool)
109 for indices in permutations(range(n), r):
110 if sorted(indices) == list(indices):
111 yield tuple(pool[i] for i in indices)
112
113 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000114 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000115 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000116 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000117 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs
Christian Heimes380f7f22008-02-28 11:19:05 +0000118 self.assertEqual(len(result), len(set(result))) # no repeats
119 self.assertEqual(result, sorted(result)) # lexicographic order
120 for c in result:
121 self.assertEqual(len(c), r) # r-length combinations
122 self.assertEqual(len(set(c)), r) # no duplicate elements
123 self.assertEqual(list(c), sorted(c)) # keep original ordering
124 self.assert_(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000125 self.assertEqual(list(c),
126 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000127 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000128 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000129
130 # Test implementation detail: tuple re-use
131 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
132 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
133
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000134 def test_combinations_with_replacement(self):
135 cwr = combinations_with_replacement
136 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
137 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
138 self.assertRaises(TypeError, cwr, None) # pool is not iterable
139 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
140 self.assertEqual(list(cwr('ABC', 2)),
141 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
142
143 def cwr1(iterable, r):
144 'Pure python version shown in the docs'
145 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
146 pool = tuple(iterable)
147 n = len(pool)
148 if not n and r:
149 return
150 indices = [0] * r
151 yield tuple(pool[i] for i in indices)
152 while 1:
153 for i in reversed(range(r)):
154 if indices[i] != n - 1:
155 break
156 else:
157 return
158 indices[i:] = [indices[i] + 1] * (r - i)
159 yield tuple(pool[i] for i in indices)
160
161 def cwr2(iterable, r):
162 'Pure python version shown in the docs'
163 pool = tuple(iterable)
164 n = len(pool)
165 for indices in product(range(n), repeat=r):
166 if sorted(indices) == list(indices):
167 yield tuple(pool[i] for i in indices)
168
169 def numcombs(n, r):
170 if not n:
171 return 0 if r else 1
172 return fact(n+r-1) / fact(r)/ fact(n-1)
173
174 for n in range(7):
175 values = [5*x-12 for x in range(n)]
176 for r in range(n+2):
177 result = list(cwr(values, r))
178
179 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
180 self.assertEqual(len(result), len(set(result))) # no repeats
181 self.assertEqual(result, sorted(result)) # lexicographic order
182
183 regular_combs = list(combinations(values, r)) # compare to combs without replacement
184 if n == 0 or r <= 1:
185 self.assertEquals(result, regular_combs) # cases that should be identical
186 else:
187 self.assert_(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
188
189 for c in result:
190 self.assertEqual(len(c), r) # r-length combinations
191 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
192 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
193 self.assertEqual(list(c), sorted(c)) # keep original ordering
194 self.assert_(all(e in values for e in c)) # elements taken from input iterable
195 self.assertEqual(noruns,
196 [e for e in values if e in c]) # comb is a subsequence of the input iterable
197 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
198 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
199
200 # Test implementation detail: tuple re-use
201 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
202 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
203
Christian Heimes78644762008-03-04 23:39:23 +0000204 def test_permutations(self):
205 self.assertRaises(TypeError, permutations) # too few arguments
206 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000207 self.assertRaises(TypeError, permutations, None) # pool is not iterable
208 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000209 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000210 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000211 self.assertEqual(list(permutations(range(3), 2)),
212 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
213
214 def permutations1(iterable, r=None):
215 'Pure python version shown in the docs'
216 pool = tuple(iterable)
217 n = len(pool)
218 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000219 if r > n:
220 return
Christian Heimes78644762008-03-04 23:39:23 +0000221 indices = list(range(n))
222 cycles = list(range(n-r+1, n+1))[::-1]
223 yield tuple(pool[i] for i in indices[:r])
224 while n:
225 for i in reversed(range(r)):
226 cycles[i] -= 1
227 if cycles[i] == 0:
228 indices[i:] = indices[i+1:] + indices[i:i+1]
229 cycles[i] = n - i
230 else:
231 j = cycles[i]
232 indices[i], indices[-j] = indices[-j], indices[i]
233 yield tuple(pool[i] for i in indices[:r])
234 break
235 else:
236 return
237
238 def permutations2(iterable, r=None):
239 'Pure python version shown in the docs'
240 pool = tuple(iterable)
241 n = len(pool)
242 r = n if r is None else r
243 for indices in product(range(n), repeat=r):
244 if len(set(indices)) == r:
245 yield tuple(pool[i] for i in indices)
246
247 for n in range(7):
248 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000249 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000250 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000251 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms
Christian Heimes78644762008-03-04 23:39:23 +0000252 self.assertEqual(len(result), len(set(result))) # no repeats
253 self.assertEqual(result, sorted(result)) # lexicographic order
254 for p in result:
255 self.assertEqual(len(p), r) # r-length permutations
256 self.assertEqual(len(set(p)), r) # no duplicate elements
257 self.assert_(all(e in values for e in p)) # elements taken from input iterable
258 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000259 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000260 if r == n:
261 self.assertEqual(result, list(permutations(values, None))) # test r as None
262 self.assertEqual(result, list(permutations(values))) # test default r
263
264 # Test implementation detail: tuple re-use
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000265 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000266 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000267
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000268 def test_compress(self):
269 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
270 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
271 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
272 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
273 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
274 n = 10000
275 data = chain.from_iterable(repeat(range(6), n))
276 selectors = chain.from_iterable(repeat((0, 1)))
277 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
278 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
279 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
280 self.assertRaises(TypeError, compress, range(6)) # too few args
281 self.assertRaises(TypeError, compress, range(6), None) # too many args
282
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000283 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000284 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
285 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
286 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000287 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
288 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000289 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000290 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000291 self.assertEqual(list(islice(count(maxsize-5), 10)),
292 list(range(maxsize-5, maxsize+5)))
293 self.assertEqual(list(islice(count(-maxsize-5), 10)),
294 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000295 c = count(3)
296 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000297 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000298 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000299 c = count(-9)
300 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000301 next(c)
302 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000303 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000304 # Test repr (ignoring the L in longs)
305 r1 = repr(count(i)).replace('L', '')
306 r2 = 'count(%r)'.__mod__(i).replace('L', '')
307 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000308
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000309 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000310 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000311 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000312 self.assertRaises(TypeError, cycle)
313 self.assertRaises(TypeError, cycle, 5)
314 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000315
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000316 def test_groupby(self):
317 # Check whether it accepts arguments correctly
318 self.assertEqual([], list(groupby([])))
319 self.assertEqual([], list(groupby([], key=id)))
320 self.assertRaises(TypeError, list, groupby('abc', []))
321 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000322 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000323
324 # Check normal input
325 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
326 (2,15,22), (3,16,23), (3,17,23)]
327 dup = []
328 for k, g in groupby(s, lambda r:r[0]):
329 for elem in g:
330 self.assertEqual(k, elem[0])
331 dup.append(elem)
332 self.assertEqual(s, dup)
333
334 # Check nested case
335 dup = []
336 for k, g in groupby(s, lambda r:r[0]):
337 for ik, ig in groupby(g, lambda r:r[2]):
338 for elem in ig:
339 self.assertEqual(k, elem[0])
340 self.assertEqual(ik, elem[2])
341 dup.append(elem)
342 self.assertEqual(s, dup)
343
344 # Check case where inner iterator is not used
345 keys = [k for k, g in groupby(s, lambda r:r[0])]
346 expectedkeys = set([r[0] for r in s])
347 self.assertEqual(set(keys), expectedkeys)
348 self.assertEqual(len(keys), len(expectedkeys))
349
350 # Exercise pipes and filters style
351 s = 'abracadabra'
352 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000353 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000354 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
355 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000356 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000357 self.assertEqual(r, ['a', 'b', 'r'])
358 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000359 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000360 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
361 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000362 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000363 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
364
Georg Brandla18af4e2007-04-21 15:47:16 +0000365 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000366 class ExpectedError(Exception):
367 pass
368 def delayed_raise(n=0):
369 for i in range(n):
370 yield 'yo'
371 raise ExpectedError
372 def gulp(iterable, keyp=None, func=list):
373 return [func(g) for k, g in groupby(iterable, keyp)]
374
Georg Brandla18af4e2007-04-21 15:47:16 +0000375 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000376 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000377 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000378 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
379
380 # __cmp__ failure
381 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000382 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000383 raise ExpectedError
384 s = [DummyCmp(), DummyCmp(), None]
385
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000386 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000387 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000388 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000389 self.assertRaises(ExpectedError, gulp, s)
390
391 # keyfunc failure
392 def keyfunc(obj):
393 if keyfunc.skip > 0:
394 keyfunc.skip -= 1
395 return obj
396 else:
397 raise ExpectedError
398
399 # keyfunc failure on outer object
400 keyfunc.skip = 0
401 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
402 keyfunc.skip = 1
403 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
404
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000405 def test_filter(self):
406 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
407 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
408 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
409 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
410 self.assertRaises(TypeError, filter)
411 self.assertRaises(TypeError, filter, lambda x:x)
412 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
413 self.assertRaises(TypeError, filter, isEven, 3)
414 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000415
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000416 def test_filterfalse(self):
417 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
418 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
419 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
420 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
421 self.assertRaises(TypeError, filterfalse)
422 self.assertRaises(TypeError, filterfalse, lambda x:x)
423 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
424 self.assertRaises(TypeError, filterfalse, isEven, 3)
425 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000426
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000427 def test_zip(self):
428 # XXX This is rather silly now that builtin zip() calls zip()...
429 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000430 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000431 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
432 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
433 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
434 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
435 self.assertEqual(list(zip()), lzip())
436 self.assertRaises(TypeError, zip, 3)
437 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000438 # Check tuple re-use (implementation detail)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000439 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000440 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000441 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000442 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000443 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000444 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000445 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000446 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000447
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000448 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000449 for args in [
450 ['abc', range(6)],
451 [range(6), 'abc'],
452 [range(1000), range(2000,2100), range(3000,3050)],
453 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
454 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
455 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000456 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
457 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000458 self.assertEqual(list(zip_longest(*args)), target)
459 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000461 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000462
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000463 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000464
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000465 self.assertEqual(list(zip_longest()), list(zip()))
466 self.assertEqual(list(zip_longest([])), list(zip([])))
467 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000468
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000469 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000470 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000471 self.assertRaises(TypeError, zip_longest, 3)
472 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000473
474 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000475 "zip_longest('abc', fv=1)",
476 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000477 ]:
478 try:
479 eval(stmt, globals(), locals())
480 except TypeError:
481 pass
482 else:
483 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484
Thomas Wouterscf297e42007-02-23 15:07:44 +0000485 # Check tuple re-use (implementation detail)
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000486 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000487 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000488 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000489 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000490 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000491 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000492 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000493 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
494
Christian Heimesc3f30c42008-02-22 16:37:40 +0000495 def test_product(self):
496 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000497 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000498 (['ab'], [('a',), ('b',)]), # one iterable
499 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
500 ([range(0), range(2), range(3)], []), # first iterable with zero length
501 ([range(2), range(0), range(3)], []), # middle iterable with zero length
502 ([range(2), range(3), range(0)], []), # last iterable with zero length
503 ]:
504 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000505 for r in range(4):
506 self.assertEqual(list(product(*(args*r))),
507 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000508 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
509 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000510
511 def product1(*args, **kwds):
512 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
513 n = len(pools)
514 if n == 0:
515 yield ()
516 return
517 if any(len(pool) == 0 for pool in pools):
518 return
519 indices = [0] * n
520 yield tuple(pool[i] for pool, i in zip(pools, indices))
521 while 1:
522 for i in reversed(range(n)): # right to left
523 if indices[i] == len(pools[i]) - 1:
524 continue
525 indices[i] += 1
526 for j in range(i+1, n):
527 indices[j] = 0
528 yield tuple(pool[i] for pool, i in zip(pools, indices))
529 break
530 else:
531 return
532
533 def product2(*args, **kwds):
534 'Pure python version used in docs'
535 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
536 result = [[]]
537 for pool in pools:
538 result = [x+[y] for x in result for y in pool]
539 for prod in result:
540 yield tuple(prod)
541
Christian Heimesc3f30c42008-02-22 16:37:40 +0000542 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
543 set('abcdefg'), range(11), tuple(range(13))]
544 for i in range(100):
545 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000546 expected_len = prod(map(len, args))
547 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000548 self.assertEqual(list(product(*args)), list(product1(*args)))
549 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000550 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000551 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000552
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000553 # Test implementation detail: tuple re-use
554 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
555 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000556
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000557 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000558 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000559 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000560 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000561 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000562 self.assertEqual(list(repeat('a', 0)), [])
563 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000564 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000565 self.assertRaises(TypeError, repeat, None, 3, 4)
566 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000567 r = repeat(1+0j)
568 self.assertEqual(repr(r), 'repeat((1+0j))')
569 r = repeat(1+0j, 5)
570 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
571 list(r)
572 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000573
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000574 def test_map(self):
575 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000576 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000577 def tupleize(*args):
578 return args
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000579 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000580 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000581 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000582 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000583 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000584 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000585 self.assertEqual(list(map(operator.pow, [])), [])
586 self.assertRaises(TypeError, map)
587 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
588 self.assertRaises(TypeError, map, operator.neg)
589 self.assertRaises(TypeError, next, map(10, range(5)))
590 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
591 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000592
593 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000594 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
595 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000596 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +0000597 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000598 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000599 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
600 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000601 self.assertRaises(TypeError, starmap)
602 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000603 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
604 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
605 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000606
607 def test_islice(self):
608 for args in [ # islice(args) should agree with range(args)
609 (10, 20, 3),
610 (10, 3, 20),
611 (10, 20),
612 (10, 3),
613 (20,)
614 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000615 self.assertEqual(list(islice(range(100), *args)),
616 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000617
618 for args, tgtargs in [ # Stop when seqn is exhausted
619 ((10, 110, 3), ((10, 100, 3))),
620 ((10, 110), ((10, 100))),
621 ((110,), (100,))
622 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000623 self.assertEqual(list(islice(range(100), *args)),
624 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000625
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000626 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000627 self.assertEqual(list(islice(range(10), None)), list(range(10)))
628 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
629 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
630 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
631 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000632
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000633 # Test number of items consumed SF #1171417
634 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000635 self.assertEqual(list(islice(it, 3)), list(range(3)))
636 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000637
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000638 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000639 self.assertRaises(TypeError, islice, range(10))
640 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
641 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
642 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
643 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
644 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
645 self.assertRaises(ValueError, islice, range(10), 'a')
646 self.assertRaises(ValueError, islice, range(10), 'a', 1)
647 self.assertRaises(ValueError, islice, range(10), 1, 'a')
648 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
649 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000650 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000651
652 def test_takewhile(self):
653 data = [1, 3, 5, 20, 2, 4, 6, 8]
654 underten = lambda x: x<10
655 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000656 self.assertEqual(list(takewhile(underten, [])), [])
657 self.assertRaises(TypeError, takewhile)
658 self.assertRaises(TypeError, takewhile, operator.pow)
659 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000660 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
661 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000662 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
663 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000664 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000665
666 def test_dropwhile(self):
667 data = [1, 3, 5, 20, 2, 4, 6, 8]
668 underten = lambda x: x<10
669 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000670 self.assertEqual(list(dropwhile(underten, [])), [])
671 self.assertRaises(TypeError, dropwhile)
672 self.assertRaises(TypeError, dropwhile, operator.pow)
673 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000674 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
675 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000676
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000677 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000678 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000679 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000680 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000681 yield i
682
683 a, b = tee([]) # test empty iterator
684 self.assertEqual(list(a), [])
685 self.assertEqual(list(b), [])
686
687 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000688 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000689
690 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000691 self.assertEqual(list(a), list(range(n)))
692 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000693
694 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000695 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000696 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000697 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000698 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000699
700 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000701 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000702 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000703 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000704 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000705
Guido van Rossum805365e2007-05-07 22:24:25 +0000706 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000707 order = [0]*n + [1]*n
708 random.shuffle(order)
709 lists = ([], [])
710 its = tee(irange(n))
711 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000712 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000713 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000714 self.assertEqual(lists[0], list(range(n)))
715 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000716
Raymond Hettingerad983e72003-11-12 14:32:26 +0000717 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000718 self.assertRaises(TypeError, tee)
719 self.assertRaises(TypeError, tee, 3)
720 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000721 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000722
Raymond Hettingerad983e72003-11-12 14:32:26 +0000723 # tee object should be instantiable
724 a, b = tee('abc')
725 c = type(a)('def')
726 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000727
Raymond Hettingerad983e72003-11-12 14:32:26 +0000728 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000729 a, b, c = tee(range(2000), 3)
730 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000731 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000732 self.assertEqual(list(b), list(range(2000)))
733 self.assertEqual([next(c), next(c)], list(range(2)))
734 self.assertEqual(list(a), list(range(100,2000)))
735 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000736
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000737 # test values of n
738 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000739 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000740 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000741 result = tee('abc', n)
742 self.assertEqual(type(result), tuple)
743 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000744 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000745
Raymond Hettingerad983e72003-11-12 14:32:26 +0000746 # tee pass-through to copyable iterator
747 a, b = tee('abc')
748 c, d = tee(a)
749 self.assert_(a is c)
750
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000751 # test tee_new
752 t1, t2 = tee('abc')
753 tnew = type(t1)
754 self.assertRaises(TypeError, tnew)
755 self.assertRaises(TypeError, tnew, 10)
756 t3 = tnew(t1)
757 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000758
Raymond Hettingera9f60922004-10-17 16:40:14 +0000759 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000760 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000761 p = proxy(a)
762 self.assertEqual(getattr(p, '__class__'), type(b))
763 del a
764 self.assertRaises(ReferenceError, getattr, p, '__class__')
765
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000766 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000767 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000768
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000769 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000770 self.assertRaises(StopIteration, next, f([]))
771 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000772
Georg Brandla18af4e2007-04-21 15:47:16 +0000773 self.assertRaises(StopIteration, next, islice([], None))
774 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000775
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000776 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000777 self.assertRaises(StopIteration, next, p)
778 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000779 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000780 self.assertRaises(StopIteration, next, p)
781 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000782
Georg Brandla18af4e2007-04-21 15:47:16 +0000783 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000784
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000785 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000786 self.assertRaises(StopIteration, next, f(lambda x:x, []))
787 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000788
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000789class TestExamples(unittest.TestCase):
790
791 def test_chain(self):
792 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
793
794 def test_chain_from_iterable(self):
795 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
796
797 def test_combinations(self):
798 self.assertEqual(list(combinations('ABCD', 2)),
799 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
800 self.assertEqual(list(combinations(range(4), 3)),
801 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
802
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000803 def test_combinations_with_replacement(self):
804 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
805 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
806
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000807 def test_compress(self):
808 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
809
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000810 def test_count(self):
811 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
812
813 def test_cycle(self):
814 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
815
816 def test_dropwhile(self):
817 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
818
819 def test_groupby(self):
820 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
821 list('ABCDAB'))
822 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
823 [list('AAAA'), list('BBB'), list('CC'), list('D')])
824
825 def test_filter(self):
826 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
827
828 def test_filterfalse(self):
829 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
830
831 def test_map(self):
832 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
833
834 def test_islice(self):
835 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
836 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
837 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
838 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
839
840 def test_zip(self):
841 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
842
843 def test_zip_longest(self):
844 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
845 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
846
847 def test_permutations(self):
848 self.assertEqual(list(permutations('ABCD', 2)),
849 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
850 self.assertEqual(list(permutations(range(3))),
851 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
852
853 def test_product(self):
854 self.assertEqual(list(product('ABCD', 'xy')),
855 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
856 self.assertEqual(list(product(range(2), repeat=3)),
857 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
858 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
859
860 def test_repeat(self):
861 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
862
863 def test_stapmap(self):
864 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
865 [32, 9, 1000])
866
867 def test_takewhile(self):
868 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
869
870
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000871class TestGC(unittest.TestCase):
872
873 def makecycle(self, iterator, container):
874 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000875 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000876 del container, iterator
877
878 def test_chain(self):
879 a = []
880 self.makecycle(chain(a), a)
881
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000882 def test_chain_from_iterable(self):
883 a = []
884 self.makecycle(chain.from_iterable([a]), a)
885
886 def test_combinations(self):
887 a = []
888 self.makecycle(combinations([1,2,a,3], 3), a)
889
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000890 def test_combinations_with_replacement(self):
891 a = []
892 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
893
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000894 def test_compress(self):
895 a = []
896 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
897
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000898 def test_cycle(self):
899 a = []
900 self.makecycle(cycle([a]*2), a)
901
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000902 def test_dropwhile(self):
903 a = []
904 self.makecycle(dropwhile(bool, [0, a, a]), a)
905
906 def test_groupby(self):
907 a = []
908 self.makecycle(groupby([a]*2, lambda x:x), a)
909
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000910 def test_issue2246(self):
911 # Issue 2246 -- the _grouper iterator was not included in GC
912 n = 10
913 keyfunc = lambda x: x
914 for i, j in groupby(range(n), key=keyfunc):
915 keyfunc.__dict__.setdefault('x',[]).append(j)
916
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000917 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000918 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000919 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000920
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000921 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000922 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000923 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000924
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000925 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000926 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000927 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000928
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000929 def test_zip_longest(self):
930 a = []
931 self.makecycle(zip_longest([a]*2, [a]*3), a)
932 b = [a, None]
933 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
934
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000935 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000936 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000937 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000938
939 def test_islice(self):
940 a = []
941 self.makecycle(islice([a]*2, None), a)
942
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000943 def test_permutations(self):
944 a = []
945 self.makecycle(permutations([1,2,a,3], 3), a)
946
947 def test_product(self):
948 a = []
949 self.makecycle(product([1,2,a,3], repeat=3), a)
950
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000951 def test_repeat(self):
952 a = []
953 self.makecycle(repeat(a), a)
954
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000955 def test_starmap(self):
956 a = []
957 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
958
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000959 def test_takewhile(self):
960 a = []
961 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
962
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000963def R(seqn):
964 'Regular generator'
965 for i in seqn:
966 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000967
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000968class G:
969 'Sequence using __getitem__'
970 def __init__(self, seqn):
971 self.seqn = seqn
972 def __getitem__(self, i):
973 return self.seqn[i]
974
975class I:
976 'Sequence using iterator protocol'
977 def __init__(self, seqn):
978 self.seqn = seqn
979 self.i = 0
980 def __iter__(self):
981 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000982 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000983 if self.i >= len(self.seqn): raise StopIteration
984 v = self.seqn[self.i]
985 self.i += 1
986 return v
987
988class Ig:
989 'Sequence using iterator protocol defined with a generator'
990 def __init__(self, seqn):
991 self.seqn = seqn
992 self.i = 0
993 def __iter__(self):
994 for val in self.seqn:
995 yield val
996
997class X:
998 'Missing __getitem__ and __iter__'
999 def __init__(self, seqn):
1000 self.seqn = seqn
1001 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001002 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001003 if self.i >= len(self.seqn): raise StopIteration
1004 v = self.seqn[self.i]
1005 self.i += 1
1006 return v
1007
1008class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001009 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001010 def __init__(self, seqn):
1011 self.seqn = seqn
1012 self.i = 0
1013 def __iter__(self):
1014 return self
1015
1016class E:
1017 'Test propagation of exceptions'
1018 def __init__(self, seqn):
1019 self.seqn = seqn
1020 self.i = 0
1021 def __iter__(self):
1022 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001023 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001024 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001025
1026class S:
1027 'Test immediate stop'
1028 def __init__(self, seqn):
1029 pass
1030 def __iter__(self):
1031 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001032 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001033 raise StopIteration
1034
1035def L(seqn):
1036 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001037 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001038
1039
1040class TestVariousIteratorArgs(unittest.TestCase):
1041
1042 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001043 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001044 for g in (G, I, Ig, S, L, R):
1045 self.assertEqual(list(chain(g(s))), list(g(s)))
1046 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001047 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001048 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001049 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1050
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001051 def test_compress(self):
1052 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1053 n = len(s)
1054 for g in (G, I, Ig, S, L, R):
1055 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1056 self.assertRaises(TypeError, compress, X(s), repeat(1))
1057 self.assertRaises(TypeError, compress, N(s), repeat(1))
1058 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1059
Christian Heimesc3f30c42008-02-22 16:37:40 +00001060 def test_product(self):
1061 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1062 self.assertRaises(TypeError, product, X(s))
1063 self.assertRaises(TypeError, product, N(s))
1064 self.assertRaises(ZeroDivisionError, product, E(s))
1065
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001066 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001067 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001068 for g in (G, I, Ig, S, L, R):
1069 tgtlen = len(s) * 3
1070 expected = list(g(s))*3
1071 actual = list(islice(cycle(g(s)), tgtlen))
1072 self.assertEqual(actual, expected)
1073 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001074 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001075 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1076
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001077 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001078 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001079 for g in (G, I, Ig, S, L, R):
1080 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1081 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001082 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001083 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1084
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001085 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001086 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001087 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001088 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001089 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001090 self.assertRaises(TypeError, filter, isEven, X(s))
1091 self.assertRaises(TypeError, filter, isEven, N(s))
1092 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001093
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001094 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001095 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001096 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001097 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001098 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001099 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1100 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1101 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001102
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001103 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001104 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001105 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001106 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1107 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1108 self.assertRaises(TypeError, zip, X(s))
1109 self.assertRaises(TypeError, zip, N(s))
1110 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001111
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001112 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001113 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001114 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001115 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1116 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1117 self.assertRaises(TypeError, zip_longest, X(s))
1118 self.assertRaises(TypeError, zip_longest, N(s))
1119 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001120
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001121 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001122 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001123 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001124 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001125 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001126 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001127 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001128 self.assertRaises(TypeError, map, onearg, X(s))
1129 self.assertRaises(TypeError, map, onearg, N(s))
1130 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001131
1132 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001133 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001134 for g in (G, I, Ig, S, L, R):
1135 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1136 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001137 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001138 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1139
1140 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001141 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001142 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001143 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001144 self.assertEqual(list(starmap(operator.pow, g(ss))),
1145 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001146 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001147 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001148 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1149
1150 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001151 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001152 for g in (G, I, Ig, S, L, R):
1153 tgt = []
1154 for elem in g(s):
1155 if not isEven(elem): break
1156 tgt.append(elem)
1157 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1158 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001159 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001160 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1161
1162 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001163 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001164 for g in (G, I, Ig, S, L, R):
1165 tgt = []
1166 for elem in g(s):
1167 if not tgt and isOdd(elem): continue
1168 tgt.append(elem)
1169 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1170 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001171 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001172 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1173
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001174 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001175 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001176 for g in (G, I, Ig, S, L, R):
1177 it1, it2 = tee(g(s))
1178 self.assertEqual(list(it1), list(g(s)))
1179 self.assertEqual(list(it2), list(g(s)))
1180 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001181 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001182 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1183
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001184class LengthTransparency(unittest.TestCase):
1185
1186 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001187 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001188 self.assertEqual(len(repeat(None, 50)), 50)
1189 self.assertRaises(TypeError, len, repeat(None))
1190
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001191class RegressionTests(unittest.TestCase):
1192
1193 def test_sf_793826(self):
1194 # Fix Armin Rigo's successful efforts to wreak havoc
1195
1196 def mutatingtuple(tuple1, f, tuple2):
1197 # this builds a tuple t which is a copy of tuple1,
1198 # then calls f(t), then mutates t to be equal to tuple2
1199 # (needs len(tuple1) == len(tuple2)).
1200 def g(value, first=[1]):
1201 if first:
1202 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001203 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001204 return value
1205 items = list(tuple2)
1206 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001207 gen = map(g, items)
1208 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001209 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001210
1211 def f(t):
1212 global T
1213 T = t
1214 first[:] = list(T)
1215
1216 first = []
1217 mutatingtuple((1,2,3), f, (4,5,6))
1218 second = list(T)
1219 self.assertEqual(first, second)
1220
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001221
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001222 def test_sf_950057(self):
1223 # Make sure that chain() and cycle() catch exceptions immediately
1224 # rather than when shifting between input sources
1225
1226 def gen1():
1227 hist.append(0)
1228 yield 1
1229 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001230 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001231 hist.append(2)
1232
1233 def gen2(x):
1234 hist.append(3)
1235 yield 2
1236 hist.append(4)
1237 if x:
1238 raise StopIteration
1239
1240 hist = []
1241 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1242 self.assertEqual(hist, [0,1])
1243
1244 hist = []
1245 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1246 self.assertEqual(hist, [0,1])
1247
1248 hist = []
1249 self.assertRaises(AssertionError, list, cycle(gen1()))
1250 self.assertEqual(hist, [0,1])
1251
Thomas Woutersb2137042007-02-01 18:02:27 +00001252class SubclassWithKwargsTest(unittest.TestCase):
1253 def test_keywords_in_subclass(self):
1254 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001255 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001256 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001257 class Subclass(cls):
1258 def __init__(self, newarg=None, *args):
1259 cls.__init__(self, *args)
1260 try:
1261 Subclass(newarg=1)
1262 except TypeError as err:
1263 # we expect type errors because of wrong argument count
1264 self.failIf("does not take keyword arguments" in err.args[0])
1265
1266
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001267libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001268
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001269
1270>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001271>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001272... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001273...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001274Check 1200 is for $120.15
1275Check 1201 is for $764.05
1276Check 1202 is for $823.14
1277
1278>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001279>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001280... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001281...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000012821
12838
128427
1285
1286>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001287>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001288... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001289...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001290Alex
1291Laura
1292Martin
1293Walter
1294Samuele
1295
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001296>>> from operator import itemgetter
1297>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001298>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001299>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001300... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001301...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000013021 ['a', 'c', 'e']
13032 ['b', 'd', 'f']
13043 ['g']
1305
Raymond Hettinger734fb572004-01-20 20:04:40 +00001306# Find runs of consecutive numbers using groupby. The key to the solution
1307# is differencing with a range so that consecutive numbers all appear in
1308# same group.
1309>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001310>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001311... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001312...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001313[1]
1314[4, 5, 6]
1315[10]
1316[15, 16, 17, 18]
1317[22]
1318[25, 26, 27, 28]
1319
Georg Brandl3dbca812008-07-23 16:10:53 +00001320>>> def take(n, iterable):
1321... "Return first n items of the iterable as a list"
1322... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001323
Georg Brandl3dbca812008-07-23 16:10:53 +00001324>>> def enumerate(iterable, start=0):
1325... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001326
Georg Brandl3dbca812008-07-23 16:10:53 +00001327>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001328... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001329... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001330
1331>>> def nth(iterable, n):
Georg Brandl3dbca812008-07-23 16:10:53 +00001332... "Returns the nth item or empty list"
Raymond Hettinger60eca932003-02-09 06:40:58 +00001333... return list(islice(iterable, n, n+1))
1334
Georg Brandl3dbca812008-07-23 16:10:53 +00001335>>> def quantify(iterable, pred=bool):
1336... "Count how many times the predicate is true"
1337... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001338
Georg Brandl3dbca812008-07-23 16:10:53 +00001339>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001340... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001341... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001342
Georg Brandl3dbca812008-07-23 16:10:53 +00001343>>> def ncycles(iterable, n):
1344... "Returns the seqeuence elements n times"
1345... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001346
1347>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001348... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001349
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001350>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001351... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001352
1353>>> def repeatfunc(func, times=None, *args):
1354... "Repeat calls to func with specified arguments."
1355... " Example: repeatfunc(random.random)"
1356... if times is None:
1357... return starmap(func, repeat(args))
1358... else:
1359... return starmap(func, repeat(args, times))
1360
Raymond Hettingerd591f662003-10-26 15:34:50 +00001361>>> def pairwise(iterable):
1362... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1363... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001364... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001365... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001366... except StopIteration:
1367... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001368... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001369
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001370>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001371... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001372... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001373... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001374
1375>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001376... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001377... # Recipe credited to George Sakkis
1378... pending = len(iterables)
1379... nexts = cycle(iter(it).__next__ for it in iterables)
1380... while pending:
1381... try:
1382... for next in nexts:
1383... yield next()
1384... except StopIteration:
1385... pending -= 1
1386... nexts = cycle(islice(nexts, pending))
1387
1388>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001389... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1390... s = list(iterable)
1391... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001392
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001393>>> def unique_everseen(iterable, key=None):
1394... "List unique elements, preserving order. Remember all elements ever seen."
1395... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1396... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1397... seen = set()
1398... seen_add = seen.add
1399... if key is None:
1400... for element in iterable:
1401... if element not in seen:
1402... seen_add(element)
1403... yield element
1404... else:
1405... for element in iterable:
1406... k = key(element)
1407... if k not in seen:
1408... seen_add(k)
1409... yield element
1410
1411>>> def unique_justseen(iterable, key=None):
1412... "List unique elements, preserving order. Remember only the element just seen."
1413... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1414... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1415... return map(next, map(itemgetter(1), groupby(iterable, key)))
1416
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001417This is not part of the examples but it tests to make sure the definitions
1418perform as purported.
1419
Raymond Hettingera098b332003-09-08 23:58:40 +00001420>>> take(10, count())
1421[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1422
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001423>>> list(enumerate('abc'))
1424[(0, 'a'), (1, 'b'), (2, 'c')]
1425
1426>>> list(islice(tabulate(lambda x: 2*x), 4))
1427[0, 2, 4, 6]
1428
1429>>> nth('abcde', 3)
1430['d']
1431
Guido van Rossum805365e2007-05-07 22:24:25 +00001432>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000143350
1434
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001435>>> a = [[1, 2, 3], [4, 5, 6]]
1436>>> flatten(a)
1437[1, 2, 3, 4, 5, 6]
1438
1439>>> list(repeatfunc(pow, 5, 2, 3))
1440[8, 8, 8, 8, 8]
1441
1442>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001443>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001444[0, 0, 0, 0, 0]
1445
Raymond Hettingerd591f662003-10-26 15:34:50 +00001446>>> list(pairwise('abcd'))
1447[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001448
Raymond Hettingerd591f662003-10-26 15:34:50 +00001449>>> list(pairwise([]))
1450[]
1451
1452>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001453[]
1454
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001455>>> list(islice(padnone('abc'), 0, 6))
1456['a', 'b', 'c', None, None, None]
1457
1458>>> list(ncycles('abc', 3))
1459['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1460
1461>>> dotproduct([1,2,3], [4,5,6])
146232
1463
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001464>>> list(grouper(3, 'abcdefg', 'x'))
1465[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
1466
1467>>> list(roundrobin('abc', 'd', 'ef'))
1468['a', 'd', 'e', 'b', 'f', 'c']
1469
Raymond Hettingerace67332009-01-26 02:23:50 +00001470>>> list(powerset([1,2,3]))
1471[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001472
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001473>>> list(unique_everseen('AAAABBBCCDAABBB'))
1474['A', 'B', 'C', 'D']
1475
1476>>> list(unique_everseen('ABBCcAD', str.lower))
1477['A', 'B', 'C', 'D']
1478
1479>>> list(unique_justseen('AAAABBBCCDAABBB'))
1480['A', 'B', 'C', 'D', 'A', 'B']
1481
1482>>> list(unique_justseen('ABBCcAD', str.lower))
1483['A', 'B', 'C', 'A', 'D']
1484
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001485"""
1486
1487__test__ = {'libreftest' : libreftest}
1488
1489def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001490 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001491 RegressionTests, LengthTransparency,
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001492 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001493 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001494
1495 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001496 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001497 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001498 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001499 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001500 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001501 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001502 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001503 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001504
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001505 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001506 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001507
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001508if __name__ == "__main__":
1509 test_main(verbose=True)