blob: ba726b54312ccd8f1903400d6f264b6c5882b91c [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
Christian Heimesc3f30c42008-02-22 16:37:40 +00008from functools import reduce
Guido van Rossum360e4b82007-05-14 22:51:27 +00009maxsize = test_support.MAX_Py_ssize_t
10minsize = -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 Heimes380f7f22008-02-28 11:19:05 +000047def fact(n):
48 'Factorial'
49 return reduce(operator.mul, range(1, n+1), 1)
50
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000052 def test_chain(self):
53 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 self.assertEqual(list(chain('abc')), list('abc'))
55 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000056 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000057 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000058
Christian Heimes380f7f22008-02-28 11:19:05 +000059 def test_combinations(self):
60 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
61 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
62 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
63 self.assertRaises(ValueError, combinations, 'abc', 32) # r is too big
64 self.assertEqual(list(combinations(range(4), 3)),
65 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
66 for n in range(8):
67 values = [5*x-12 for x in range(n)]
68 for r in range(n+1):
69 result = list(combinations(values, r))
70 self.assertEqual(len(result), fact(n) / fact(r) / fact(n-r)) # right number of combs
71 self.assertEqual(len(result), len(set(result))) # no repeats
72 self.assertEqual(result, sorted(result)) # lexicographic order
73 for c in result:
74 self.assertEqual(len(c), r) # r-length combinations
75 self.assertEqual(len(set(c)), r) # no duplicate elements
76 self.assertEqual(list(c), sorted(c)) # keep original ordering
77 self.assert_(all(e in values for e in c)) # elements taken from input iterable
78
Raymond Hettinger96ef8112003-02-01 00:10:11 +000079 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +000080 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
81 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
82 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +000083 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
84 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000085 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000086 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +000087 self.assertEqual(list(islice(count(maxsize-5), 10)),
88 list(range(maxsize-5, maxsize+5)))
89 self.assertEqual(list(islice(count(-maxsize-5), 10)),
90 list(range(-maxsize-5, -maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000091 c = count(3)
92 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +000093 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000094 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 c = count(-9)
96 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +000097 next(c)
98 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +000099 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 +0000100 # Test repr (ignoring the L in longs)
101 r1 = repr(count(i)).replace('L', '')
102 r2 = 'count(%r)'.__mod__(i).replace('L', '')
103 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000104
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000105 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000106 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000107 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000108 self.assertRaises(TypeError, cycle)
109 self.assertRaises(TypeError, cycle, 5)
110 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000111
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000112 def test_groupby(self):
113 # Check whether it accepts arguments correctly
114 self.assertEqual([], list(groupby([])))
115 self.assertEqual([], list(groupby([], key=id)))
116 self.assertRaises(TypeError, list, groupby('abc', []))
117 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000118 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000119
120 # Check normal input
121 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
122 (2,15,22), (3,16,23), (3,17,23)]
123 dup = []
124 for k, g in groupby(s, lambda r:r[0]):
125 for elem in g:
126 self.assertEqual(k, elem[0])
127 dup.append(elem)
128 self.assertEqual(s, dup)
129
130 # Check nested case
131 dup = []
132 for k, g in groupby(s, lambda r:r[0]):
133 for ik, ig in groupby(g, lambda r:r[2]):
134 for elem in ig:
135 self.assertEqual(k, elem[0])
136 self.assertEqual(ik, elem[2])
137 dup.append(elem)
138 self.assertEqual(s, dup)
139
140 # Check case where inner iterator is not used
141 keys = [k for k, g in groupby(s, lambda r:r[0])]
142 expectedkeys = set([r[0] for r in s])
143 self.assertEqual(set(keys), expectedkeys)
144 self.assertEqual(len(keys), len(expectedkeys))
145
146 # Exercise pipes and filters style
147 s = 'abracadabra'
148 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000149 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000150 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
151 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000152 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000153 self.assertEqual(r, ['a', 'b', 'r'])
154 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000155 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000156 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
157 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000158 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000159 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
160
Georg Brandla18af4e2007-04-21 15:47:16 +0000161 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000162 class ExpectedError(Exception):
163 pass
164 def delayed_raise(n=0):
165 for i in range(n):
166 yield 'yo'
167 raise ExpectedError
168 def gulp(iterable, keyp=None, func=list):
169 return [func(g) for k, g in groupby(iterable, keyp)]
170
Georg Brandla18af4e2007-04-21 15:47:16 +0000171 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000172 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000173 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000174 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
175
176 # __cmp__ failure
177 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000178 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000179 raise ExpectedError
180 s = [DummyCmp(), DummyCmp(), None]
181
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000182 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000183 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000184 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000185 self.assertRaises(ExpectedError, gulp, s)
186
187 # keyfunc failure
188 def keyfunc(obj):
189 if keyfunc.skip > 0:
190 keyfunc.skip -= 1
191 return obj
192 else:
193 raise ExpectedError
194
195 # keyfunc failure on outer object
196 keyfunc.skip = 0
197 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
198 keyfunc.skip = 1
199 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
200
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000201 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000202 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000203 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Christian Heimes836baa52008-02-26 08:18:30 +0000204 self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000205 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000206 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000207 self.assertRaises(TypeError, ifilter, lambda x:x)
208 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000209 self.assertRaises(TypeError, ifilter, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000210 self.assertRaises(TypeError, next, ifilter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000211
212 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000213 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
214 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Christian Heimes836baa52008-02-26 08:18:30 +0000215 self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000216 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000217 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000218 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
219 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000220 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Georg Brandla18af4e2007-04-21 15:47:16 +0000221 self.assertRaises(TypeError, next, ifilterfalse(range(6), range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000222
223 def test_izip(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000224 # XXX This is rather silly now that builtin zip() calls izip()...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000225 ans = [(x,y) for x, y in izip('abc',count())]
226 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Guido van Rossum801f0d72006-08-24 19:48:10 +0000227 self.assertEqual(list(izip('abc', range(6))), lzip('abc', range(6)))
228 self.assertEqual(list(izip('abcdef', range(3))), lzip('abcdef', range(3)))
229 self.assertEqual(take(3,izip('abcdef', count())), lzip('abcdef', range(3)))
230 self.assertEqual(list(izip('abcdef')), lzip('abcdef'))
231 self.assertEqual(list(izip()), lzip())
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')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000236 lzip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000237 self.assertEqual([pair for pair in izip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000238 lzip('abc', 'def'))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000239 ids = list(map(id, izip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000240 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000241 ids = list(map(id, list(izip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000242 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000243
Thomas Wouterscf297e42007-02-23 15:07:44 +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 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000252 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
253 for i in range(max(map(len, args)))]
Thomas Wouterscf297e42007-02-23 15:07:44 +0000254 self.assertEqual(list(izip_longest(*args)), target)
255 self.assertEqual(list(izip_longest(*args, **{})), target)
256 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
257 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000258
Thomas Wouterscf297e42007-02-23 15:07:44 +0000259 self.assertEqual(take(3,izip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
260
261 self.assertEqual(list(izip_longest()), list(zip()))
262 self.assertEqual(list(izip_longest([])), list(zip([])))
263 self.assertEqual(list(izip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000265 self.assertEqual(list(izip_longest('abc', 'defg', **{})),
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000266 list(izip(list('abc')+[None], 'defg'))) # empty keyword dict
Thomas Wouterscf297e42007-02-23 15:07:44 +0000267 self.assertRaises(TypeError, izip_longest, 3)
268 self.assertRaises(TypeError, izip_longest, range(3), 3)
269
270 for stmt in [
271 "izip_longest('abc', fv=1)",
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000273 ]:
274 try:
275 eval(stmt, globals(), locals())
276 except TypeError:
277 pass
278 else:
279 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280
Thomas Wouterscf297e42007-02-23 15:07:44 +0000281 # Check tuple re-use (implementation detail)
282 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
283 list(zip('abc', 'def')))
284 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
285 list(zip('abc', 'def')))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000286 ids = list(map(id, izip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000287 self.assertEqual(min(ids), max(ids))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000288 ids = list(map(id, list(izip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000289 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
290
Christian Heimesc3f30c42008-02-22 16:37:40 +0000291 def test_product(self):
292 for args, result in [
293 ([], []), # zero iterables ??? is this correct
294 (['ab'], [('a',), ('b',)]), # one iterable
295 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
296 ([range(0), range(2), range(3)], []), # first iterable with zero length
297 ([range(2), range(0), range(3)], []), # middle iterable with zero length
298 ([range(2), range(3), range(0)], []), # last iterable with zero length
299 ]:
300 self.assertEqual(list(product(*args)), result)
301 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
302 self.assertRaises(TypeError, product, range(6), None)
303 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
304 set('abcdefg'), range(11), tuple(range(13))]
305 for i in range(100):
306 args = [random.choice(argtypes) for j in range(random.randrange(5))]
307 n = reduce(operator.mul, map(len, args), 1) if args else 0
308 self.assertEqual(len(list(product(*args))), n)
309 args = map(iter, args)
310 self.assertEqual(len(list(product(*args))), n)
311
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000312 # Test implementation detail: tuple re-use
313 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
314 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000315
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000316 def test_repeat(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000317 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000318 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000319 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000320 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000321 self.assertEqual(list(repeat('a', 0)), [])
322 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000323 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000324 self.assertRaises(TypeError, repeat, None, 3, 4)
325 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000326 r = repeat(1+0j)
327 self.assertEqual(repr(r), 'repeat((1+0j))')
328 r = repeat(1+0j, 5)
329 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
330 list(r)
331 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000332
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000333 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000334 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
335 [0**1, 1**2, 2**3])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000336 def tupleize(*args):
337 return args
338 self.assertEqual(list(imap(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000339 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000340 self.assertEqual(list(imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000341 [('a',0),('b',1),('c',2)])
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000342 self.assertEqual(take(2,imap(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000343 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000344 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000345 self.assertRaises(TypeError, imap)
Raymond Hettinger1dfde1d2008-01-22 23:25:35 +0000346 self.assertRaises(TypeError, list, imap(None, range(3), range(3)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000347 self.assertRaises(TypeError, imap, operator.neg)
Georg Brandla18af4e2007-04-21 15:47:16 +0000348 self.assertRaises(TypeError, next, imap(10, range(5)))
349 self.assertRaises(ValueError, next, imap(errfunc, [4], [5]))
350 self.assertRaises(TypeError, next, imap(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000351
352 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000353 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
354 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000355 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
356 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000357 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +0000358 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
359 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000360 self.assertRaises(TypeError, starmap)
361 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000362 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
363 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
364 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000365
366 def test_islice(self):
367 for args in [ # islice(args) should agree with range(args)
368 (10, 20, 3),
369 (10, 3, 20),
370 (10, 20),
371 (10, 3),
372 (20,)
373 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000374 self.assertEqual(list(islice(range(100), *args)),
375 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000376
377 for args, tgtargs in [ # Stop when seqn is exhausted
378 ((10, 110, 3), ((10, 100, 3))),
379 ((10, 110), ((10, 100))),
380 ((110,), (100,))
381 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +0000382 self.assertEqual(list(islice(range(100), *args)),
383 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000384
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000385 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +0000386 self.assertEqual(list(islice(range(10), None)), list(range(10)))
387 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
388 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
389 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
390 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000391
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000392 # Test number of items consumed SF #1171417
393 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +0000394 self.assertEqual(list(islice(it, 3)), list(range(3)))
395 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000396
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000397 # Test invalid arguments
Guido van Rossum805365e2007-05-07 22:24:25 +0000398 self.assertRaises(TypeError, islice, range(10))
399 self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
400 self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
401 self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
402 self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
403 self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
404 self.assertRaises(ValueError, islice, range(10), 'a')
405 self.assertRaises(ValueError, islice, range(10), 'a', 1)
406 self.assertRaises(ValueError, islice, range(10), 1, 'a')
407 self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
408 self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +0000409 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000410
411 def test_takewhile(self):
412 data = [1, 3, 5, 20, 2, 4, 6, 8]
413 underten = lambda x: x<10
414 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000415 self.assertEqual(list(takewhile(underten, [])), [])
416 self.assertRaises(TypeError, takewhile)
417 self.assertRaises(TypeError, takewhile, operator.pow)
418 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000419 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
420 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000421 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
422 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +0000423 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000424
425 def test_dropwhile(self):
426 data = [1, 3, 5, 20, 2, 4, 6, 8]
427 underten = lambda x: x<10
428 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000429 self.assertEqual(list(dropwhile(underten, [])), [])
430 self.assertRaises(TypeError, dropwhile)
431 self.assertRaises(TypeError, dropwhile, operator.pow)
432 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +0000433 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
434 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000435
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000436 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000437 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000438 def irange(n):
Guido van Rossum805365e2007-05-07 22:24:25 +0000439 for i in range(n):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000440 yield i
441
442 a, b = tee([]) # test empty iterator
443 self.assertEqual(list(a), [])
444 self.assertEqual(list(b), [])
445
446 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +0000447 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000448
449 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +0000450 self.assertEqual(list(a), list(range(n)))
451 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000452
453 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000454 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000455 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000456 del a
Guido van Rossum805365e2007-05-07 22:24:25 +0000457 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000458
459 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +0000460 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000461 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000462 del b
Guido van Rossum805365e2007-05-07 22:24:25 +0000463 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000464
Guido van Rossum805365e2007-05-07 22:24:25 +0000465 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000466 order = [0]*n + [1]*n
467 random.shuffle(order)
468 lists = ([], [])
469 its = tee(irange(n))
470 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +0000471 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000472 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +0000473 self.assertEqual(lists[0], list(range(n)))
474 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000475
Raymond Hettingerad983e72003-11-12 14:32:26 +0000476 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000477 self.assertRaises(TypeError, tee)
478 self.assertRaises(TypeError, tee, 3)
479 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000480 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000481
Raymond Hettingerad983e72003-11-12 14:32:26 +0000482 # tee object should be instantiable
483 a, b = tee('abc')
484 c = type(a)('def')
485 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000486
Raymond Hettingerad983e72003-11-12 14:32:26 +0000487 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +0000488 a, b, c = tee(range(2000), 3)
489 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000490 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +0000491 self.assertEqual(list(b), list(range(2000)))
492 self.assertEqual([next(c), next(c)], list(range(2)))
493 self.assertEqual(list(a), list(range(100,2000)))
494 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +0000495
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000496 # test values of n
497 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000498 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000499 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000500 result = tee('abc', n)
501 self.assertEqual(type(result), tuple)
502 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000503 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000504
Raymond Hettingerad983e72003-11-12 14:32:26 +0000505 # tee pass-through to copyable iterator
506 a, b = tee('abc')
507 c, d = tee(a)
508 self.assert_(a is c)
509
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000510 # test tee_new
511 t1, t2 = tee('abc')
512 tnew = type(t1)
513 self.assertRaises(TypeError, tnew)
514 self.assertRaises(TypeError, tnew, 10)
515 t3 = tnew(t1)
516 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000517
Raymond Hettingera9f60922004-10-17 16:40:14 +0000518 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +0000519 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +0000520 p = proxy(a)
521 self.assertEqual(getattr(p, '__class__'), type(b))
522 del a
523 self.assertRaises(ReferenceError, getattr, p, '__class__')
524
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000525 def test_StopIteration(self):
Georg Brandla18af4e2007-04-21 15:47:16 +0000526 self.assertRaises(StopIteration, next, izip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000527
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000528 for f in (chain, cycle, izip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +0000529 self.assertRaises(StopIteration, next, f([]))
530 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000531
Georg Brandla18af4e2007-04-21 15:47:16 +0000532 self.assertRaises(StopIteration, next, islice([], None))
533 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000534
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000535 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +0000536 self.assertRaises(StopIteration, next, p)
537 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000538 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +0000539 self.assertRaises(StopIteration, next, p)
540 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000541
Georg Brandla18af4e2007-04-21 15:47:16 +0000542 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000543
544 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +0000545 self.assertRaises(StopIteration, next, f(lambda x:x, []))
546 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000547
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000548class TestGC(unittest.TestCase):
549
550 def makecycle(self, iterator, container):
551 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +0000552 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000553 del container, iterator
554
555 def test_chain(self):
556 a = []
557 self.makecycle(chain(a), a)
558
559 def test_cycle(self):
560 a = []
561 self.makecycle(cycle([a]*2), a)
562
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000563 def test_dropwhile(self):
564 a = []
565 self.makecycle(dropwhile(bool, [0, a, a]), a)
566
567 def test_groupby(self):
568 a = []
569 self.makecycle(groupby([a]*2, lambda x:x), a)
570
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000571 def test_ifilter(self):
572 a = []
573 self.makecycle(ifilter(lambda x:True, [a]*2), a)
574
575 def test_ifilterfalse(self):
576 a = []
577 self.makecycle(ifilterfalse(lambda x:False, a), a)
578
579 def test_izip(self):
580 a = []
581 self.makecycle(izip([a]*2, [a]*3), a)
582
583 def test_imap(self):
584 a = []
585 self.makecycle(imap(lambda x:x, [a]*2), a)
586
587 def test_islice(self):
588 a = []
589 self.makecycle(islice([a]*2, None), a)
590
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000591 def test_repeat(self):
592 a = []
593 self.makecycle(repeat(a), a)
594
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000595 def test_starmap(self):
596 a = []
597 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
598
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000599 def test_takewhile(self):
600 a = []
601 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
602
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000603def R(seqn):
604 'Regular generator'
605 for i in seqn:
606 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000607
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000608class G:
609 'Sequence using __getitem__'
610 def __init__(self, seqn):
611 self.seqn = seqn
612 def __getitem__(self, i):
613 return self.seqn[i]
614
615class I:
616 'Sequence using iterator protocol'
617 def __init__(self, seqn):
618 self.seqn = seqn
619 self.i = 0
620 def __iter__(self):
621 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000622 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000623 if self.i >= len(self.seqn): raise StopIteration
624 v = self.seqn[self.i]
625 self.i += 1
626 return v
627
628class Ig:
629 'Sequence using iterator protocol defined with a generator'
630 def __init__(self, seqn):
631 self.seqn = seqn
632 self.i = 0
633 def __iter__(self):
634 for val in self.seqn:
635 yield val
636
637class X:
638 'Missing __getitem__ and __iter__'
639 def __init__(self, seqn):
640 self.seqn = seqn
641 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +0000642 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000643 if self.i >= len(self.seqn): raise StopIteration
644 v = self.seqn[self.i]
645 self.i += 1
646 return v
647
648class N:
Georg Brandla18af4e2007-04-21 15:47:16 +0000649 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000650 def __init__(self, seqn):
651 self.seqn = seqn
652 self.i = 0
653 def __iter__(self):
654 return self
655
656class E:
657 'Test propagation of exceptions'
658 def __init__(self, seqn):
659 self.seqn = seqn
660 self.i = 0
661 def __iter__(self):
662 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000663 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000664 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000665
666class S:
667 'Test immediate stop'
668 def __init__(self, seqn):
669 pass
670 def __iter__(self):
671 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000672 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000673 raise StopIteration
674
675def L(seqn):
676 'Test multiple tiers of iterators'
677 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
678
679
680class TestVariousIteratorArgs(unittest.TestCase):
681
682 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000683 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000684 for g in (G, I, Ig, S, L, R):
685 self.assertEqual(list(chain(g(s))), list(g(s)))
686 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
687 self.assertRaises(TypeError, chain, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000688 self.assertRaises(TypeError, chain, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000689 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
690
Christian Heimesc3f30c42008-02-22 16:37:40 +0000691 def test_product(self):
692 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
693 self.assertRaises(TypeError, product, X(s))
694 self.assertRaises(TypeError, product, N(s))
695 self.assertRaises(ZeroDivisionError, product, E(s))
696
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000697 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000698 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000699 for g in (G, I, Ig, S, L, R):
700 tgtlen = len(s) * 3
701 expected = list(g(s))*3
702 actual = list(islice(cycle(g(s)), tgtlen))
703 self.assertEqual(actual, expected)
704 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000705 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000706 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
707
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000708 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000709 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000710 for g in (G, I, Ig, S, L, R):
711 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
712 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000713 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000714 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
715
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000716 def test_ifilter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000717 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000718 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000719 self.assertEqual(list(ifilter(isEven, g(s))),
720 [x for x in g(s) if isEven(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000721 self.assertRaises(TypeError, ifilter, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000722 self.assertRaises(TypeError, ifilter, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000723 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
724
725 def test_ifilterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000726 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000727 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000728 self.assertEqual(list(ifilterfalse(isEven, g(s))),
729 [x for x in g(s) if isOdd(x)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000730 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000731 self.assertRaises(TypeError, ifilterfalse, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000732 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
733
734 def test_izip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000735 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000736 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000737 self.assertEqual(list(izip(g(s))), lzip(g(s)))
738 self.assertEqual(list(izip(g(s), g(s))), lzip(g(s), g(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000739 self.assertRaises(TypeError, izip, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000740 self.assertRaises(TypeError, izip, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000741 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
742
Thomas Wouterscf297e42007-02-23 15:07:44 +0000743 def test_iziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000744 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000745 for g in (G, I, Ig, S, L, R):
746 self.assertEqual(list(izip_longest(g(s))), list(zip(g(s))))
747 self.assertEqual(list(izip_longest(g(s), g(s))), list(zip(g(s), g(s))))
748 self.assertRaises(TypeError, izip_longest, X(s))
749 self.assertRaises(TypeError, izip_longest, N(s))
750 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
751
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000752 def test_imap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000753 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000754 for g in (G, I, Ig, S, L, R):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000755 self.assertEqual(list(imap(onearg, g(s))),
756 [onearg(x) for x in g(s)])
757 self.assertEqual(list(imap(operator.pow, g(s), g(s))),
758 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000759 self.assertRaises(TypeError, imap, onearg, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000760 self.assertRaises(TypeError, imap, onearg, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000761 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
762
763 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000764 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000765 for g in (G, I, Ig, S, L, R):
766 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
767 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000768 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000769 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
770
771 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000772 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000773 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000774 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000775 self.assertEqual(list(starmap(operator.pow, g(ss))),
776 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000777 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000778 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000779 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
780
781 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000782 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000783 for g in (G, I, Ig, S, L, R):
784 tgt = []
785 for elem in g(s):
786 if not isEven(elem): break
787 tgt.append(elem)
788 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
789 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000790 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000791 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
792
793 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000794 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000795 for g in (G, I, Ig, S, L, R):
796 tgt = []
797 for elem in g(s):
798 if not tgt and isOdd(elem): continue
799 tgt.append(elem)
800 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
801 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000802 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000803 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
804
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000805 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000806 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000807 for g in (G, I, Ig, S, L, R):
808 it1, it2 = tee(g(s))
809 self.assertEqual(list(it1), list(g(s)))
810 self.assertEqual(list(it2), list(g(s)))
811 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +0000812 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000813 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
814
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000815class LengthTransparency(unittest.TestCase):
816
817 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000818 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000819 self.assertEqual(len(repeat(None, 50)), 50)
820 self.assertRaises(TypeError, len, repeat(None))
821
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000822class RegressionTests(unittest.TestCase):
823
824 def test_sf_793826(self):
825 # Fix Armin Rigo's successful efforts to wreak havoc
826
827 def mutatingtuple(tuple1, f, tuple2):
828 # this builds a tuple t which is a copy of tuple1,
829 # then calls f(t), then mutates t to be equal to tuple2
830 # (needs len(tuple1) == len(tuple2)).
831 def g(value, first=[1]):
832 if first:
833 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +0000834 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000835 return value
836 items = list(tuple2)
837 items[1:1] = list(tuple1)
838 gen = imap(g, items)
839 z = izip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +0000840 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000841
842 def f(t):
843 global T
844 T = t
845 first[:] = list(T)
846
847 first = []
848 mutatingtuple((1,2,3), f, (4,5,6))
849 second = list(T)
850 self.assertEqual(first, second)
851
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000852
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000853 def test_sf_950057(self):
854 # Make sure that chain() and cycle() catch exceptions immediately
855 # rather than when shifting between input sources
856
857 def gen1():
858 hist.append(0)
859 yield 1
860 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000861 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000862 hist.append(2)
863
864 def gen2(x):
865 hist.append(3)
866 yield 2
867 hist.append(4)
868 if x:
869 raise StopIteration
870
871 hist = []
872 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
873 self.assertEqual(hist, [0,1])
874
875 hist = []
876 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
877 self.assertEqual(hist, [0,1])
878
879 hist = []
880 self.assertRaises(AssertionError, list, cycle(gen1()))
881 self.assertEqual(hist, [0,1])
882
Thomas Woutersb2137042007-02-01 18:02:27 +0000883class SubclassWithKwargsTest(unittest.TestCase):
884 def test_keywords_in_subclass(self):
885 # count is not subclassable...
886 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
887 starmap, islice, takewhile, dropwhile, cycle):
888 class Subclass(cls):
889 def __init__(self, newarg=None, *args):
890 cls.__init__(self, *args)
891 try:
892 Subclass(newarg=1)
893 except TypeError as err:
894 # we expect type errors because of wrong argument count
895 self.failIf("does not take keyword arguments" in err.args[0])
896
897
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000898libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000899
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000900
901>>> amounts = [120.15, 764.05, 823.14]
902>>> for checknum, amount in izip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +0000903... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000904...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000905Check 1200 is for $120.15
906Check 1201 is for $764.05
907Check 1202 is for $823.14
908
909>>> import operator
Guido van Rossum805365e2007-05-07 22:24:25 +0000910>>> for cube in imap(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +0000911... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000912...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00009131
9148
91527
916
917>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000918>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +0000919... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +0000920...
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000921Alex
922Laura
923Martin
924Walter
925Samuele
926
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000927>>> from operator import itemgetter
928>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000929>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000930>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000931... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000932...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00009331 ['a', 'c', 'e']
9342 ['b', 'd', 'f']
9353 ['g']
936
Raymond Hettinger734fb572004-01-20 20:04:40 +0000937# Find runs of consecutive numbers using groupby. The key to the solution
938# is differencing with a range so that consecutive numbers all appear in
939# same group.
940>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000941>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000942... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943...
Raymond Hettinger734fb572004-01-20 20:04:40 +0000944[1]
945[4, 5, 6]
946[10]
947[15, 16, 17, 18]
948[22]
949[25, 26, 27, 28]
950
Raymond Hettingera098b332003-09-08 23:58:40 +0000951>>> def take(n, seq):
952... return list(islice(seq, n))
953
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000954>>> def enumerate(iterable):
955... return izip(count(), iterable)
956
957>>> def tabulate(function):
958... "Return function(0), function(1), ..."
959... return imap(function, count())
960
961>>> def iteritems(mapping):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000962... return izip(mapping.keys(), mapping.values())
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000963
964>>> def nth(iterable, n):
965... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000966... return list(islice(iterable, n, n+1))
967
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000968>>> def all(seq, pred=None):
969... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000970... for elem in ifilterfalse(pred, seq):
971... return False
972... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000973
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000974>>> def any(seq, pred=None):
975... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000976... for elem in ifilter(pred, seq):
977... return True
978... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000979
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000980>>> def no(seq, pred=None):
981... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000982... for elem in ifilter(pred, seq):
983... return False
984... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000985
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000986>>> def quantify(seq, pred=None):
987... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000988... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000989
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000990>>> def padnone(seq):
991... "Returns the sequence elements and then returns None indefinitely"
992... return chain(seq, repeat(None))
993
994>>> def ncycles(seq, n):
995... "Returns the sequence elements n times"
996... return chain(*repeat(seq, n))
997
998>>> def dotproduct(vec1, vec2):
999... return sum(imap(operator.mul, vec1, vec2))
1000
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001001>>> def flatten(listOfLists):
1002... return list(chain(*listOfLists))
1003
1004>>> def repeatfunc(func, times=None, *args):
1005... "Repeat calls to func with specified arguments."
1006... " Example: repeatfunc(random.random)"
1007... if times is None:
1008... return starmap(func, repeat(args))
1009... else:
1010... return starmap(func, repeat(args, times))
1011
Raymond Hettingerd591f662003-10-26 15:34:50 +00001012>>> def pairwise(iterable):
1013... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1014... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001015... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001016... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001017... except StopIteration:
1018... pass
1019... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001020
1021This is not part of the examples but it tests to make sure the definitions
1022perform as purported.
1023
Raymond Hettingera098b332003-09-08 23:58:40 +00001024>>> take(10, count())
1025[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1026
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001027>>> list(enumerate('abc'))
1028[(0, 'a'), (1, 'b'), (2, 'c')]
1029
1030>>> list(islice(tabulate(lambda x: 2*x), 4))
1031[0, 2, 4, 6]
1032
1033>>> nth('abcde', 3)
1034['d']
1035
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001036>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001037True
1038
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001039>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001040False
1041
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001042>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001043True
1044
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001045>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001046False
1047
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001048>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001049True
1050
Raymond Hettingerdbe3d282003-10-05 16:47:36 +00001051>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001052False
1053
Guido van Rossum805365e2007-05-07 22:24:25 +00001054>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000105550
1056
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001057>>> a = [[1, 2, 3], [4, 5, 6]]
1058>>> flatten(a)
1059[1, 2, 3, 4, 5, 6]
1060
1061>>> list(repeatfunc(pow, 5, 2, 3))
1062[8, 8, 8, 8, 8]
1063
1064>>> import random
1065>>> take(5, imap(int, repeatfunc(random.random)))
1066[0, 0, 0, 0, 0]
1067
Raymond Hettingerd591f662003-10-26 15:34:50 +00001068>>> list(pairwise('abcd'))
1069[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001070
Raymond Hettingerd591f662003-10-26 15:34:50 +00001071>>> list(pairwise([]))
1072[]
1073
1074>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00001075[]
1076
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001077>>> list(islice(padnone('abc'), 0, 6))
1078['a', 'b', 'c', None, None, None]
1079
1080>>> list(ncycles('abc', 3))
1081['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1082
1083>>> dotproduct([1,2,3], [4,5,6])
108432
1085
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001086"""
1087
1088__test__ = {'libreftest' : libreftest}
1089
1090def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001091 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00001092 RegressionTests, LengthTransparency,
1093 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001094 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001095
1096 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001097 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001098 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001099 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001100 for i in range(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001101 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001102 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001103 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001104 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001105
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001106 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001107 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001108
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001109if __name__ == "__main__":
1110 test_main(verbose=True)