Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v9 / lib / python2.4 / test / test_itertools.py
CommitLineData
920dae64
AT
1import unittest
2from test import test_support
3from itertools import *
4from weakref import proxy
5import sys
6import operator
7import random
8
9def onearg(x):
10 'Test function of one argument'
11 return 2*x
12
13def errfunc(*args):
14 'Test function that raises an error'
15 raise ValueError
16
17def gen3():
18 'Non-restartable source sequence'
19 for i in (0, 1, 2):
20 yield i
21
22def isEven(x):
23 'Test predicate'
24 return x%2==0
25
26def isOdd(x):
27 'Test predicate'
28 return x%2==1
29
30class StopNow:
31 'Class emulating an empty iterable.'
32 def __iter__(self):
33 return self
34 def next(self):
35 raise StopIteration
36
37def take(n, seq):
38 'Convenience function for partially consuming a long of infinite iterable'
39 return list(islice(seq, n))
40
41class TestBasicOps(unittest.TestCase):
42 def test_chain(self):
43 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
44 self.assertEqual(list(chain('abc')), list('abc'))
45 self.assertEqual(list(chain('')), [])
46 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
47 self.assertRaises(TypeError, chain, 2, 3)
48
49 def test_count(self):
50 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
51 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
52 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
53 self.assertRaises(TypeError, count, 2, 3)
54 self.assertRaises(TypeError, count, 'a')
55 c = count(sys.maxint-2) # verify that rollover doesn't crash
56 c.next(); c.next(); c.next(); c.next(); c.next()
57 c = count(3)
58 self.assertEqual(repr(c), 'count(3)')
59 c.next()
60 self.assertEqual(repr(c), 'count(4)')
61
62 def test_cycle(self):
63 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
64 self.assertEqual(list(cycle('')), [])
65 self.assertRaises(TypeError, cycle)
66 self.assertRaises(TypeError, cycle, 5)
67 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
68
69 def test_groupby(self):
70 # Check whether it accepts arguments correctly
71 self.assertEqual([], list(groupby([])))
72 self.assertEqual([], list(groupby([], key=id)))
73 self.assertRaises(TypeError, list, groupby('abc', []))
74 self.assertRaises(TypeError, groupby, None)
75 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
76
77 # Check normal input
78 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
79 (2,15,22), (3,16,23), (3,17,23)]
80 dup = []
81 for k, g in groupby(s, lambda r:r[0]):
82 for elem in g:
83 self.assertEqual(k, elem[0])
84 dup.append(elem)
85 self.assertEqual(s, dup)
86
87 # Check nested case
88 dup = []
89 for k, g in groupby(s, lambda r:r[0]):
90 for ik, ig in groupby(g, lambda r:r[2]):
91 for elem in ig:
92 self.assertEqual(k, elem[0])
93 self.assertEqual(ik, elem[2])
94 dup.append(elem)
95 self.assertEqual(s, dup)
96
97 # Check case where inner iterator is not used
98 keys = [k for k, g in groupby(s, lambda r:r[0])]
99 expectedkeys = set([r[0] for r in s])
100 self.assertEqual(set(keys), expectedkeys)
101 self.assertEqual(len(keys), len(expectedkeys))
102
103 # Exercise pipes and filters style
104 s = 'abracadabra'
105 # sort s | uniq
106 r = [k for k, g in groupby(sorted(s))]
107 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
108 # sort s | uniq -d
109 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
110 self.assertEqual(r, ['a', 'b', 'r'])
111 # sort s | uniq -c
112 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
113 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
114 # sort s | uniq -c | sort -rn | head -3
115 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
116 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
117
118 # iter.next failure
119 class ExpectedError(Exception):
120 pass
121 def delayed_raise(n=0):
122 for i in range(n):
123 yield 'yo'
124 raise ExpectedError
125 def gulp(iterable, keyp=None, func=list):
126 return [func(g) for k, g in groupby(iterable, keyp)]
127
128 # iter.next failure on outer object
129 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
130 # iter.next failure on inner object
131 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
132
133 # __cmp__ failure
134 class DummyCmp:
135 def __cmp__(self, dst):
136 raise ExpectedError
137 s = [DummyCmp(), DummyCmp(), None]
138
139 # __cmp__ failure on outer object
140 self.assertRaises(ExpectedError, gulp, s, func=id)
141 # __cmp__ failure on inner object
142 self.assertRaises(ExpectedError, gulp, s)
143
144 # keyfunc failure
145 def keyfunc(obj):
146 if keyfunc.skip > 0:
147 keyfunc.skip -= 1
148 return obj
149 else:
150 raise ExpectedError
151
152 # keyfunc failure on outer object
153 keyfunc.skip = 0
154 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
155 keyfunc.skip = 1
156 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
157
158 def test_ifilter(self):
159 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
160 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
161 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
162 self.assertRaises(TypeError, ifilter)
163 self.assertRaises(TypeError, ifilter, lambda x:x)
164 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
165 self.assertRaises(TypeError, ifilter, isEven, 3)
166 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
167
168 def test_ifilterfalse(self):
169 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
170 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
171 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
172 self.assertRaises(TypeError, ifilterfalse)
173 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
174 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
175 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
176 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
177
178 def test_izip(self):
179 ans = [(x,y) for x, y in izip('abc',count())]
180 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
181 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
182 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
183 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
184 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
185 self.assertEqual(list(izip()), zip())
186 self.assertRaises(TypeError, izip, 3)
187 self.assertRaises(TypeError, izip, range(3), 3)
188 # Check tuple re-use (implementation detail)
189 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
190 zip('abc', 'def'))
191 self.assertEqual([pair for pair in izip('abc', 'def')],
192 zip('abc', 'def'))
193 ids = map(id, izip('abc', 'def'))
194 self.assertEqual(min(ids), max(ids))
195 ids = map(id, list(izip('abc', 'def')))
196 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
197
198 def test_repeat(self):
199 self.assertEqual(zip(xrange(3),repeat('a')),
200 [(0, 'a'), (1, 'a'), (2, 'a')])
201 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
202 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
203 self.assertEqual(list(repeat('a', 0)), [])
204 self.assertEqual(list(repeat('a', -3)), [])
205 self.assertRaises(TypeError, repeat)
206 self.assertRaises(TypeError, repeat, None, 3, 4)
207 self.assertRaises(TypeError, repeat, None, 'a')
208 r = repeat(1+0j)
209 self.assertEqual(repr(r), 'repeat((1+0j))')
210 r = repeat(1+0j, 5)
211 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
212 list(r)
213 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
214
215 def test_imap(self):
216 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
217 [0**1, 1**2, 2**3])
218 self.assertEqual(list(imap(None, 'abc', range(5))),
219 [('a',0),('b',1),('c',2)])
220 self.assertEqual(list(imap(None, 'abc', count())),
221 [('a',0),('b',1),('c',2)])
222 self.assertEqual(take(2,imap(None, 'abc', count())),
223 [('a',0),('b',1)])
224 self.assertEqual(list(imap(operator.pow, [])), [])
225 self.assertRaises(TypeError, imap)
226 self.assertRaises(TypeError, imap, operator.neg)
227 self.assertRaises(TypeError, imap(10, range(5)).next)
228 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
229 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
230
231 def test_starmap(self):
232 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
233 [0**1, 1**2, 2**3])
234 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
235 [0**1, 1**2, 2**3])
236 self.assertEqual(list(starmap(operator.pow, [])), [])
237 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
238 self.assertRaises(TypeError, starmap)
239 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
240 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
241 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
242 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
243
244 def test_islice(self):
245 for args in [ # islice(args) should agree with range(args)
246 (10, 20, 3),
247 (10, 3, 20),
248 (10, 20),
249 (10, 3),
250 (20,)
251 ]:
252 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
253
254 for args, tgtargs in [ # Stop when seqn is exhausted
255 ((10, 110, 3), ((10, 100, 3))),
256 ((10, 110), ((10, 100))),
257 ((110,), (100,))
258 ]:
259 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
260
261 # Test stop=None
262 self.assertEqual(list(islice(xrange(10), None)), range(10))
263 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
264 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
265
266 # Test invalid arguments
267 self.assertRaises(TypeError, islice, xrange(10))
268 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
269 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
270 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
271 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
272 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
273 self.assertRaises(ValueError, islice, xrange(10), 'a')
274 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
275 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
276 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
277 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
278 self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1)
279
280 def test_takewhile(self):
281 data = [1, 3, 5, 20, 2, 4, 6, 8]
282 underten = lambda x: x<10
283 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
284 self.assertEqual(list(takewhile(underten, [])), [])
285 self.assertRaises(TypeError, takewhile)
286 self.assertRaises(TypeError, takewhile, operator.pow)
287 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
288 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
289 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
290 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
291 self.assertEqual(list(t), [1, 1, 1])
292 self.assertRaises(StopIteration, t.next)
293
294 def test_dropwhile(self):
295 data = [1, 3, 5, 20, 2, 4, 6, 8]
296 underten = lambda x: x<10
297 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
298 self.assertEqual(list(dropwhile(underten, [])), [])
299 self.assertRaises(TypeError, dropwhile)
300 self.assertRaises(TypeError, dropwhile, operator.pow)
301 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
302 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
303 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
304
305 def test_tee(self):
306 n = 200
307 def irange(n):
308 for i in xrange(n):
309 yield i
310
311 a, b = tee([]) # test empty iterator
312 self.assertEqual(list(a), [])
313 self.assertEqual(list(b), [])
314
315 a, b = tee(irange(n)) # test 100% interleaved
316 self.assertEqual(zip(a,b), zip(range(n),range(n)))
317
318 a, b = tee(irange(n)) # test 0% interleaved
319 self.assertEqual(list(a), range(n))
320 self.assertEqual(list(b), range(n))
321
322 a, b = tee(irange(n)) # test dealloc of leading iterator
323 for i in xrange(100):
324 self.assertEqual(a.next(), i)
325 del a
326 self.assertEqual(list(b), range(n))
327
328 a, b = tee(irange(n)) # test dealloc of trailing iterator
329 for i in xrange(100):
330 self.assertEqual(a.next(), i)
331 del b
332 self.assertEqual(list(a), range(100, n))
333
334 for j in xrange(5): # test randomly interleaved
335 order = [0]*n + [1]*n
336 random.shuffle(order)
337 lists = ([], [])
338 its = tee(irange(n))
339 for i in order:
340 value = its[i].next()
341 lists[i].append(value)
342 self.assertEqual(lists[0], range(n))
343 self.assertEqual(lists[1], range(n))
344
345 # test argument format checking
346 self.assertRaises(TypeError, tee)
347 self.assertRaises(TypeError, tee, 3)
348 self.assertRaises(TypeError, tee, [1,2], 'x')
349 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
350
351 # tee object should be instantiable
352 a, b = tee('abc')
353 c = type(a)('def')
354 self.assertEqual(list(c), list('def'))
355
356 # test long-lagged and multi-way split
357 a, b, c = tee(xrange(2000), 3)
358 for i in xrange(100):
359 self.assertEqual(a.next(), i)
360 self.assertEqual(list(b), range(2000))
361 self.assertEqual([c.next(), c.next()], range(2))
362 self.assertEqual(list(a), range(100,2000))
363 self.assertEqual(list(c), range(2,2000))
364
365 # test values of n
366 self.assertRaises(TypeError, tee, 'abc', 'invalid')
367 for n in xrange(5):
368 result = tee('abc', n)
369 self.assertEqual(type(result), tuple)
370 self.assertEqual(len(result), n)
371 self.assertEqual(map(list, result), [list('abc')]*n)
372
373 # tee pass-through to copyable iterator
374 a, b = tee('abc')
375 c, d = tee(a)
376 self.assert_(a is c)
377
378 # test tee_new
379 t1, t2 = tee('abc')
380 tnew = type(t1)
381 self.assertRaises(TypeError, tnew)
382 self.assertRaises(TypeError, tnew, 10)
383 t3 = tnew(t1)
384 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
385
386 # test that tee objects are weak referencable
387 a, b = tee(xrange(10))
388 p = proxy(a)
389 self.assertEqual(getattr(p, '__class__'), type(b))
390 del a
391 self.assertRaises(ReferenceError, getattr, p, '__class__')
392
393 def test_StopIteration(self):
394 self.assertRaises(StopIteration, izip().next)
395
396 for f in (chain, cycle, izip, groupby):
397 self.assertRaises(StopIteration, f([]).next)
398 self.assertRaises(StopIteration, f(StopNow()).next)
399
400 self.assertRaises(StopIteration, islice([], None).next)
401 self.assertRaises(StopIteration, islice(StopNow(), None).next)
402
403 p, q = tee([])
404 self.assertRaises(StopIteration, p.next)
405 self.assertRaises(StopIteration, q.next)
406 p, q = tee(StopNow())
407 self.assertRaises(StopIteration, p.next)
408 self.assertRaises(StopIteration, q.next)
409
410 self.assertRaises(StopIteration, repeat(None, 0).next)
411
412 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
413 self.assertRaises(StopIteration, f(lambda x:x, []).next)
414 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
415
416class TestGC(unittest.TestCase):
417
418 def makecycle(self, iterator, container):
419 container.append(iterator)
420 iterator.next()
421 del container, iterator
422
423 def test_chain(self):
424 a = []
425 self.makecycle(chain(a), a)
426
427 def test_cycle(self):
428 a = []
429 self.makecycle(cycle([a]*2), a)
430
431 def test_dropwhile(self):
432 a = []
433 self.makecycle(dropwhile(bool, [0, a, a]), a)
434
435 def test_groupby(self):
436 a = []
437 self.makecycle(groupby([a]*2, lambda x:x), a)
438
439 def test_ifilter(self):
440 a = []
441 self.makecycle(ifilter(lambda x:True, [a]*2), a)
442
443 def test_ifilterfalse(self):
444 a = []
445 self.makecycle(ifilterfalse(lambda x:False, a), a)
446
447 def test_izip(self):
448 a = []
449 self.makecycle(izip([a]*2, [a]*3), a)
450
451 def test_imap(self):
452 a = []
453 self.makecycle(imap(lambda x:x, [a]*2), a)
454
455 def test_islice(self):
456 a = []
457 self.makecycle(islice([a]*2, None), a)
458
459 def test_repeat(self):
460 a = []
461 self.makecycle(repeat(a), a)
462
463 def test_starmap(self):
464 a = []
465 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
466
467 def test_takewhile(self):
468 a = []
469 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
470
471def R(seqn):
472 'Regular generator'
473 for i in seqn:
474 yield i
475
476class G:
477 'Sequence using __getitem__'
478 def __init__(self, seqn):
479 self.seqn = seqn
480 def __getitem__(self, i):
481 return self.seqn[i]
482
483class I:
484 'Sequence using iterator protocol'
485 def __init__(self, seqn):
486 self.seqn = seqn
487 self.i = 0
488 def __iter__(self):
489 return self
490 def next(self):
491 if self.i >= len(self.seqn): raise StopIteration
492 v = self.seqn[self.i]
493 self.i += 1
494 return v
495
496class Ig:
497 'Sequence using iterator protocol defined with a generator'
498 def __init__(self, seqn):
499 self.seqn = seqn
500 self.i = 0
501 def __iter__(self):
502 for val in self.seqn:
503 yield val
504
505class X:
506 'Missing __getitem__ and __iter__'
507 def __init__(self, seqn):
508 self.seqn = seqn
509 self.i = 0
510 def next(self):
511 if self.i >= len(self.seqn): raise StopIteration
512 v = self.seqn[self.i]
513 self.i += 1
514 return v
515
516class N:
517 'Iterator missing next()'
518 def __init__(self, seqn):
519 self.seqn = seqn
520 self.i = 0
521 def __iter__(self):
522 return self
523
524class E:
525 'Test propagation of exceptions'
526 def __init__(self, seqn):
527 self.seqn = seqn
528 self.i = 0
529 def __iter__(self):
530 return self
531 def next(self):
532 3 // 0
533
534class S:
535 'Test immediate stop'
536 def __init__(self, seqn):
537 pass
538 def __iter__(self):
539 return self
540 def next(self):
541 raise StopIteration
542
543def L(seqn):
544 'Test multiple tiers of iterators'
545 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
546
547
548class TestVariousIteratorArgs(unittest.TestCase):
549
550 def test_chain(self):
551 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
552 for g in (G, I, Ig, S, L, R):
553 self.assertEqual(list(chain(g(s))), list(g(s)))
554 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
555 self.assertRaises(TypeError, chain, X(s))
556 self.assertRaises(TypeError, list, chain(N(s)))
557 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
558
559 def test_cycle(self):
560 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
561 for g in (G, I, Ig, S, L, R):
562 tgtlen = len(s) * 3
563 expected = list(g(s))*3
564 actual = list(islice(cycle(g(s)), tgtlen))
565 self.assertEqual(actual, expected)
566 self.assertRaises(TypeError, cycle, X(s))
567 self.assertRaises(TypeError, list, cycle(N(s)))
568 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
569
570 def test_groupby(self):
571 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
572 for g in (G, I, Ig, S, L, R):
573 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
574 self.assertRaises(TypeError, groupby, X(s))
575 self.assertRaises(TypeError, list, groupby(N(s)))
576 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
577
578 def test_ifilter(self):
579 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
580 for g in (G, I, Ig, S, L, R):
581 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
582 self.assertRaises(TypeError, ifilter, isEven, X(s))
583 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
584 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
585
586 def test_ifilterfalse(self):
587 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
588 for g in (G, I, Ig, S, L, R):
589 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
590 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
591 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
592 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
593
594 def test_izip(self):
595 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
596 for g in (G, I, Ig, S, L, R):
597 self.assertEqual(list(izip(g(s))), zip(g(s)))
598 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
599 self.assertRaises(TypeError, izip, X(s))
600 self.assertRaises(TypeError, list, izip(N(s)))
601 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
602
603 def test_imap(self):
604 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
605 for g in (G, I, Ig, S, L, R):
606 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
607 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
608 self.assertRaises(TypeError, imap, onearg, X(s))
609 self.assertRaises(TypeError, list, imap(onearg, N(s)))
610 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
611
612 def test_islice(self):
613 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
614 for g in (G, I, Ig, S, L, R):
615 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
616 self.assertRaises(TypeError, islice, X(s), 10)
617 self.assertRaises(TypeError, list, islice(N(s), 10))
618 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
619
620 def test_starmap(self):
621 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
622 for g in (G, I, Ig, S, L, R):
623 ss = zip(s, s)
624 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
625 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
626 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
627 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
628
629 def test_takewhile(self):
630 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
631 for g in (G, I, Ig, S, L, R):
632 tgt = []
633 for elem in g(s):
634 if not isEven(elem): break
635 tgt.append(elem)
636 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
637 self.assertRaises(TypeError, takewhile, isEven, X(s))
638 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
639 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
640
641 def test_dropwhile(self):
642 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
643 for g in (G, I, Ig, S, L, R):
644 tgt = []
645 for elem in g(s):
646 if not tgt and isOdd(elem): continue
647 tgt.append(elem)
648 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
649 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
650 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
651 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
652
653 def test_tee(self):
654 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
655 for g in (G, I, Ig, S, L, R):
656 it1, it2 = tee(g(s))
657 self.assertEqual(list(it1), list(g(s)))
658 self.assertEqual(list(it2), list(g(s)))
659 self.assertRaises(TypeError, tee, X(s))
660 self.assertRaises(TypeError, list, tee(N(s))[0])
661 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
662
663class LengthTransparency(unittest.TestCase):
664
665 def test_repeat(self):
666 self.assertEqual(len(repeat(None, 50)), 50)
667 self.assertRaises(TypeError, len, repeat(None))
668
669class RegressionTests(unittest.TestCase):
670
671 def test_sf_793826(self):
672 # Fix Armin Rigo's successful efforts to wreak havoc
673
674 def mutatingtuple(tuple1, f, tuple2):
675 # this builds a tuple t which is a copy of tuple1,
676 # then calls f(t), then mutates t to be equal to tuple2
677 # (needs len(tuple1) == len(tuple2)).
678 def g(value, first=[1]):
679 if first:
680 del first[:]
681 f(z.next())
682 return value
683 items = list(tuple2)
684 items[1:1] = list(tuple1)
685 gen = imap(g, items)
686 z = izip(*[gen]*len(tuple1))
687 z.next()
688
689 def f(t):
690 global T
691 T = t
692 first[:] = list(T)
693
694 first = []
695 mutatingtuple((1,2,3), f, (4,5,6))
696 second = list(T)
697 self.assertEqual(first, second)
698
699
700 def test_sf_950057(self):
701 # Make sure that chain() and cycle() catch exceptions immediately
702 # rather than when shifting between input sources
703
704 def gen1():
705 hist.append(0)
706 yield 1
707 hist.append(1)
708 raise AssertionError
709 hist.append(2)
710
711 def gen2(x):
712 hist.append(3)
713 yield 2
714 hist.append(4)
715 if x:
716 raise StopIteration
717
718 hist = []
719 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
720 self.assertEqual(hist, [0,1])
721
722 hist = []
723 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
724 self.assertEqual(hist, [0,1])
725
726 hist = []
727 self.assertRaises(AssertionError, list, cycle(gen1()))
728 self.assertEqual(hist, [0,1])
729
730libreftest = """ Doctest for examples in the library reference: libitertools.tex
731
732
733>>> amounts = [120.15, 764.05, 823.14]
734>>> for checknum, amount in izip(count(1200), amounts):
735... print 'Check %d is for $%.2f' % (checknum, amount)
736...
737Check 1200 is for $120.15
738Check 1201 is for $764.05
739Check 1202 is for $823.14
740
741>>> import operator
742>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
743... print cube
744...
7451
7468
74727
748
749>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
750>>> for name in islice(reportlines, 3, None, 2):
751... print name.title()
752...
753Alex
754Laura
755Martin
756Walter
757Samuele
758
759>>> from operator import itemgetter
760>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
761>>> di = sorted(d.iteritems(), key=itemgetter(1))
762>>> for k, g in groupby(di, itemgetter(1)):
763... print k, map(itemgetter(0), g)
764...
7651 ['a', 'c', 'e']
7662 ['b', 'd', 'f']
7673 ['g']
768
769# Find runs of consecutive numbers using groupby. The key to the solution
770# is differencing with a range so that consecutive numbers all appear in
771# same group.
772>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
773>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
774... print map(operator.itemgetter(1), g)
775...
776[1]
777[4, 5, 6]
778[10]
779[15, 16, 17, 18]
780[22]
781[25, 26, 27, 28]
782
783>>> def take(n, seq):
784... return list(islice(seq, n))
785
786>>> def enumerate(iterable):
787... return izip(count(), iterable)
788
789>>> def tabulate(function):
790... "Return function(0), function(1), ..."
791... return imap(function, count())
792
793>>> def iteritems(mapping):
794... return izip(mapping.iterkeys(), mapping.itervalues())
795
796>>> def nth(iterable, n):
797... "Returns the nth item"
798... return list(islice(iterable, n, n+1))
799
800>>> def all(seq, pred=bool):
801... "Returns True if pred(x) is True for every element in the iterable"
802... for elem in ifilterfalse(pred, seq):
803... return False
804... return True
805
806>>> def any(seq, pred=bool):
807... "Returns True if pred(x) is True for at least one element in the iterable"
808... for elem in ifilter(pred, seq):
809... return True
810... return False
811
812>>> def no(seq, pred=bool):
813... "Returns True if pred(x) is False for every element in the iterable"
814... for elem in ifilter(pred, seq):
815... return False
816... return True
817
818>>> def quantify(seq, pred=bool):
819... "Count how many times the predicate is True in the sequence"
820... return sum(imap(pred, seq))
821
822>>> def padnone(seq):
823... "Returns the sequence elements and then returns None indefinitely"
824... return chain(seq, repeat(None))
825
826>>> def ncycles(seq, n):
827... "Returns the sequence elements n times"
828... return chain(*repeat(seq, n))
829
830>>> def dotproduct(vec1, vec2):
831... return sum(imap(operator.mul, vec1, vec2))
832
833>>> def flatten(listOfLists):
834... return list(chain(*listOfLists))
835
836>>> def repeatfunc(func, times=None, *args):
837... "Repeat calls to func with specified arguments."
838... " Example: repeatfunc(random.random)"
839... if times is None:
840... return starmap(func, repeat(args))
841... else:
842... return starmap(func, repeat(args, times))
843
844>>> def pairwise(iterable):
845... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
846... a, b = tee(iterable)
847... try:
848... b.next()
849... except StopIteration:
850... pass
851... return izip(a, b)
852
853This is not part of the examples but it tests to make sure the definitions
854perform as purported.
855
856>>> take(10, count())
857[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
858
859>>> list(enumerate('abc'))
860[(0, 'a'), (1, 'b'), (2, 'c')]
861
862>>> list(islice(tabulate(lambda x: 2*x), 4))
863[0, 2, 4, 6]
864
865>>> nth('abcde', 3)
866['d']
867
868>>> all([2, 4, 6, 8], lambda x: x%2==0)
869True
870
871>>> all([2, 3, 6, 8], lambda x: x%2==0)
872False
873
874>>> any([2, 4, 6, 8], lambda x: x%2==0)
875True
876
877>>> any([1, 3, 5, 9], lambda x: x%2==0,)
878False
879
880>>> no([1, 3, 5, 9], lambda x: x%2==0)
881True
882
883>>> no([1, 2, 5, 9], lambda x: x%2==0)
884False
885
886>>> quantify(xrange(99), lambda x: x%2==0)
88750
888
889>>> a = [[1, 2, 3], [4, 5, 6]]
890>>> flatten(a)
891[1, 2, 3, 4, 5, 6]
892
893>>> list(repeatfunc(pow, 5, 2, 3))
894[8, 8, 8, 8, 8]
895
896>>> import random
897>>> take(5, imap(int, repeatfunc(random.random)))
898[0, 0, 0, 0, 0]
899
900>>> list(pairwise('abcd'))
901[('a', 'b'), ('b', 'c'), ('c', 'd')]
902
903>>> list(pairwise([]))
904[]
905
906>>> list(pairwise('a'))
907[]
908
909>>> list(islice(padnone('abc'), 0, 6))
910['a', 'b', 'c', None, None, None]
911
912>>> list(ncycles('abc', 3))
913['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
914
915>>> dotproduct([1,2,3], [4,5,6])
91632
917
918"""
919
920__test__ = {'libreftest' : libreftest}
921
922def test_main(verbose=None):
923 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
924 RegressionTests, LengthTransparency)
925 test_support.run_unittest(*test_classes)
926
927 # verify reference counting
928 if verbose and hasattr(sys, "gettotalrefcount"):
929 import gc
930 counts = [None] * 5
931 for i in xrange(len(counts)):
932 test_support.run_unittest(*test_classes)
933 gc.collect()
934 counts[i] = sys.gettotalrefcount()
935 print counts
936
937 # doctest the examples in the library reference
938 test_support.run_doctest(sys.modules[__name__], verbose)
939
940if __name__ == "__main__":
941 test_main(verbose=True)