Home | History | Annotate | Download | only in test
      1 import unittest
      2 from test import test_support
      3 from itertools import *
      4 from weakref import proxy
      5 from decimal import Decimal
      6 from fractions import Fraction
      7 import sys
      8 import operator
      9 import random
     10 import copy
     11 import pickle
     12 from functools import reduce
     13 maxsize = test_support.MAX_Py_ssize_t
     14 minsize = -maxsize-1
     15 
     16 def onearg(x):
     17     'Test function of one argument'
     18     return 2*x
     19 
     20 def errfunc(*args):
     21     'Test function that raises an error'
     22     raise ValueError
     23 
     24 def gen3():
     25     'Non-restartable source sequence'
     26     for i in (0, 1, 2):
     27         yield i
     28 
     29 def isEven(x):
     30     'Test predicate'
     31     return x%2==0
     32 
     33 def isOdd(x):
     34     'Test predicate'
     35     return x%2==1
     36 
     37 class StopNow:
     38     'Class emulating an empty iterable.'
     39     def __iter__(self):
     40         return self
     41     def next(self):
     42         raise StopIteration
     43 
     44 def take(n, seq):
     45     'Convenience function for partially consuming a long of infinite iterable'
     46     return list(islice(seq, n))
     47 
     48 def prod(iterable):
     49     return reduce(operator.mul, iterable, 1)
     50 
     51 def fact(n):
     52     'Factorial'
     53     return prod(range(1, n+1))
     54 
     55 class TestBasicOps(unittest.TestCase):
     56     def test_chain(self):
     57 
     58         def chain2(*iterables):
     59             'Pure python version in the docs'
     60             for it in iterables:
     61                 for element in it:
     62                     yield element
     63 
     64         for c in (chain, chain2):
     65             self.assertEqual(list(c('abc', 'def')), list('abcdef'))
     66             self.assertEqual(list(c('abc')), list('abc'))
     67             self.assertEqual(list(c('')), [])
     68             self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
     69             self.assertRaises(TypeError, list,c(2, 3))
     70 
     71     def test_chain_from_iterable(self):
     72         self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
     73         self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
     74         self.assertEqual(list(chain.from_iterable([''])), [])
     75         self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
     76         self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
     77 
     78     def test_combinations(self):
     79         self.assertRaises(TypeError, combinations, 'abc')       # missing r argument
     80         self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
     81         self.assertRaises(TypeError, combinations, None)        # pool is not iterable
     82         self.assertRaises(ValueError, combinations, 'abc', -2)  # r is negative
     83         self.assertEqual(list(combinations('abc', 32)), [])     # r > n
     84         self.assertEqual(list(combinations(range(4), 3)),
     85                                            [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
     86 
     87         def combinations1(iterable, r):
     88             'Pure python version shown in the docs'
     89             pool = tuple(iterable)
     90             n = len(pool)
     91             if r > n:
     92                 return
     93             indices = range(r)
     94             yield tuple(pool[i] for i in indices)
     95             while 1:
     96                 for i in reversed(range(r)):
     97                     if indices[i] != i + n - r:
     98                         break
     99                 else:
    100                     return
    101                 indices[i] += 1
    102                 for j in range(i+1, r):
    103                     indices[j] = indices[j-1] + 1
    104                 yield tuple(pool[i] for i in indices)
    105 
    106         def combinations2(iterable, r):
    107             'Pure python version shown in the docs'
    108             pool = tuple(iterable)
    109             n = len(pool)
    110             for indices in permutations(range(n), r):
    111                 if sorted(indices) == list(indices):
    112                     yield tuple(pool[i] for i in indices)
    113 
    114         def combinations3(iterable, r):
    115             'Pure python version from cwr()'
    116             pool = tuple(iterable)
    117             n = len(pool)
    118             for indices in combinations_with_replacement(range(n), r):
    119                 if len(set(indices)) == r:
    120                     yield tuple(pool[i] for i in indices)
    121 
    122         for n in range(7):
    123             values = [5*x-12 for x in range(n)]
    124             for r in range(n+2):
    125                 result = list(combinations(values, r))
    126                 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(r) // fact(n-r)) # right number of combs
    127                 self.assertEqual(len(result), len(set(result)))         # no repeats
    128                 self.assertEqual(result, sorted(result))                # lexicographic order
    129                 for c in result:
    130                     self.assertEqual(len(c), r)                         # r-length combinations
    131                     self.assertEqual(len(set(c)), r)                    # no duplicate elements
    132                     self.assertEqual(list(c), sorted(c))                # keep original ordering
    133                     self.assertTrue(all(e in values for e in c))           # elements taken from input iterable
    134                     self.assertEqual(list(c),
    135                                      [e for e in values if e in c])      # comb is a subsequence of the input iterable
    136                 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
    137                 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
    138                 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
    139 
    140     @test_support.impl_detail("tuple reuse is specific to CPython")
    141     def test_combinations_tuple_reuse(self):
    142         self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
    143         self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
    144 
    145     def test_combinations_with_replacement(self):
    146         cwr = combinations_with_replacement
    147         self.assertRaises(TypeError, cwr, 'abc')       # missing r argument
    148         self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
    149         self.assertRaises(TypeError, cwr, None)        # pool is not iterable
    150         self.assertRaises(ValueError, cwr, 'abc', -2)  # r is negative
    151         self.assertEqual(list(cwr('ABC', 2)),
    152                          [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
    153 
    154         def cwr1(iterable, r):
    155             'Pure python version shown in the docs'
    156             # number items returned:  (n+r-1)! / r! / (n-1)! when n>0
    157             pool = tuple(iterable)
    158             n = len(pool)
    159             if not n and r:
    160                 return
    161             indices = [0] * r
    162             yield tuple(pool[i] for i in indices)
    163             while 1:
    164                 for i in reversed(range(r)):
    165                     if indices[i] != n - 1:
    166                         break
    167                 else:
    168                     return
    169                 indices[i:] = [indices[i] + 1] * (r - i)
    170                 yield tuple(pool[i] for i in indices)
    171 
    172         def cwr2(iterable, r):
    173             'Pure python version shown in the docs'
    174             pool = tuple(iterable)
    175             n = len(pool)
    176             for indices in product(range(n), repeat=r):
    177                 if sorted(indices) == list(indices):
    178                     yield tuple(pool[i] for i in indices)
    179 
    180         def numcombs(n, r):
    181             if not n:
    182                 return 0 if r else 1
    183             return fact(n+r-1) // fact(r) // fact(n-1)
    184 
    185         for n in range(7):
    186             values = [5*x-12 for x in range(n)]
    187             for r in range(n+2):
    188                 result = list(cwr(values, r))
    189 
    190                 self.assertEqual(len(result), numcombs(n, r))           # right number of combs
    191                 self.assertEqual(len(result), len(set(result)))         # no repeats
    192                 self.assertEqual(result, sorted(result))                # lexicographic order
    193 
    194                 regular_combs = list(combinations(values, r))           # compare to combs without replacement
    195                 if n == 0 or r <= 1:
    196                     self.assertEqual(result, regular_combs)            # cases that should be identical
    197                 else:
    198                     self.assertTrue(set(result) >= set(regular_combs))     # rest should be supersets of regular combs
    199 
    200                 for c in result:
    201                     self.assertEqual(len(c), r)                         # r-length combinations
    202                     noruns = [k for k,v in groupby(c)]                  # combo without consecutive repeats
    203                     self.assertEqual(len(noruns), len(set(noruns)))     # no repeats other than consecutive
    204                     self.assertEqual(list(c), sorted(c))                # keep original ordering
    205                     self.assertTrue(all(e in values for e in c))           # elements taken from input iterable
    206                     self.assertEqual(noruns,
    207                                      [e for e in values if e in c])     # comb is a subsequence of the input iterable
    208                 self.assertEqual(result, list(cwr1(values, r)))         # matches first pure python version
    209                 self.assertEqual(result, list(cwr2(values, r)))         # matches second pure python version
    210 
    211     @test_support.impl_detail("tuple reuse is specific to CPython")
    212     def test_combinations_with_replacement_tuple_reuse(self):
    213         cwr = combinations_with_replacement
    214         self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
    215         self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
    216 
    217     def test_permutations(self):
    218         self.assertRaises(TypeError, permutations)              # too few arguments
    219         self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
    220         self.assertRaises(TypeError, permutations, None)        # pool is not iterable
    221         self.assertRaises(ValueError, permutations, 'abc', -2)  # r is negative
    222         self.assertEqual(list(permutations('abc', 32)), [])     # r > n
    223         self.assertRaises(TypeError, permutations, 'abc', 's')  # r is not an int or None
    224         self.assertEqual(list(permutations(range(3), 2)),
    225                                            [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
    226 
    227         def permutations1(iterable, r=None):
    228             'Pure python version shown in the docs'
    229             pool = tuple(iterable)
    230             n = len(pool)
    231             r = n if r is None else r
    232             if r > n:
    233                 return
    234             indices = range(n)
    235             cycles = range(n, n-r, -1)
    236             yield tuple(pool[i] for i in indices[:r])
    237             while n:
    238                 for i in reversed(range(r)):
    239                     cycles[i] -= 1
    240                     if cycles[i] == 0:
    241                         indices[i:] = indices[i+1:] + indices[i:i+1]
    242                         cycles[i] = n - i
    243                     else:
    244                         j = cycles[i]
    245                         indices[i], indices[-j] = indices[-j], indices[i]
    246                         yield tuple(pool[i] for i in indices[:r])
    247                         break
    248                 else:
    249                     return
    250 
    251         def permutations2(iterable, r=None):
    252             'Pure python version shown in the docs'
    253             pool = tuple(iterable)
    254             n = len(pool)
    255             r = n if r is None else r
    256             for indices in product(range(n), repeat=r):
    257                 if len(set(indices)) == r:
    258                     yield tuple(pool[i] for i in indices)
    259 
    260         for n in range(7):
    261             values = [5*x-12 for x in range(n)]
    262             for r in range(n+2):
    263                 result = list(permutations(values, r))
    264                 self.assertEqual(len(result), 0 if r>n else fact(n) // fact(n-r))      # right number of perms
    265                 self.assertEqual(len(result), len(set(result)))         # no repeats
    266                 self.assertEqual(result, sorted(result))                # lexicographic order
    267                 for p in result:
    268                     self.assertEqual(len(p), r)                         # r-length permutations
    269                     self.assertEqual(len(set(p)), r)                    # no duplicate elements
    270                     self.assertTrue(all(e in values for e in p))           # elements taken from input iterable
    271                 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
    272                 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
    273                 if r == n:
    274                     self.assertEqual(result, list(permutations(values, None))) # test r as None
    275                     self.assertEqual(result, list(permutations(values)))       # test default r
    276 
    277     @test_support.impl_detail("tuple resuse is CPython specific")
    278     def test_permutations_tuple_reuse(self):
    279         self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
    280         self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
    281 
    282     def test_combinatorics(self):
    283         # Test relationships between product(), permutations(),
    284         # combinations() and combinations_with_replacement().
    285 
    286         for n in range(6):
    287             s = 'ABCDEFG'[:n]
    288             for r in range(8):
    289                 prod = list(product(s, repeat=r))
    290                 cwr = list(combinations_with_replacement(s, r))
    291                 perm = list(permutations(s, r))
    292                 comb = list(combinations(s, r))
    293 
    294                 # Check size
    295                 self.assertEqual(len(prod), n**r)
    296                 self.assertEqual(len(cwr), (fact(n+r-1) // fact(r) // fact(n-1)) if n else (not r))
    297                 self.assertEqual(len(perm), 0 if r>n else fact(n) // fact(n-r))
    298                 self.assertEqual(len(comb), 0 if r>n else fact(n) // fact(r) // fact(n-r))
    299 
    300                 # Check lexicographic order without repeated tuples
    301                 self.assertEqual(prod, sorted(set(prod)))
    302                 self.assertEqual(cwr, sorted(set(cwr)))
    303                 self.assertEqual(perm, sorted(set(perm)))
    304                 self.assertEqual(comb, sorted(set(comb)))
    305 
    306                 # Check interrelationships
    307                 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
    308                 self.assertEqual(perm, [t for t in prod if len(set(t))==r])    # perm: prods with no dups
    309                 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
    310                 self.assertEqual(comb, [t for t in cwr if len(set(t))==r])      # comb: cwrs without dups
    311                 self.assertEqual(comb, filter(set(cwr).__contains__, perm))     # comb: perm that is a cwr
    312                 self.assertEqual(comb, filter(set(perm).__contains__, cwr))     # comb: cwr that is a perm
    313                 self.assertEqual(comb, sorted(set(cwr) & set(perm)))            # comb: both a cwr and a perm
    314 
    315     def test_compress(self):
    316         self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
    317         self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
    318         self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
    319         self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
    320         self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
    321         self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
    322         n = 10000
    323         data = chain.from_iterable(repeat(range(6), n))
    324         selectors = chain.from_iterable(repeat((0, 1)))
    325         self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
    326         self.assertRaises(TypeError, compress, None, range(6))      # 1st arg not iterable
    327         self.assertRaises(TypeError, compress, range(6), None)      # 2nd arg not iterable
    328         self.assertRaises(TypeError, compress, range(6))            # too few args
    329         self.assertRaises(TypeError, compress, range(6), None)      # too many args
    330 
    331     def test_count(self):
    332         self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
    333         self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
    334         self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
    335         self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
    336         self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
    337         self.assertRaises(TypeError, count, 2, 3, 4)
    338         self.assertRaises(TypeError, count, 'a')
    339         self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
    340         self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
    341         c = count(3)
    342         self.assertEqual(repr(c), 'count(3)')
    343         c.next()
    344         self.assertEqual(repr(c), 'count(4)')
    345         c = count(-9)
    346         self.assertEqual(repr(c), 'count(-9)')
    347         c.next()
    348         self.assertEqual(repr(count(10.25)), 'count(10.25)')
    349         self.assertEqual(c.next(), -8)
    350         for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
    351             # Test repr (ignoring the L in longs)
    352             r1 = repr(count(i)).replace('L', '')
    353             r2 = 'count(%r)'.__mod__(i).replace('L', '')
    354             self.assertEqual(r1, r2)
    355 
    356         # check copy, deepcopy, pickle
    357         for value in -3, 3, sys.maxint-5, sys.maxint+5:
    358             c = count(value)
    359             self.assertEqual(next(copy.copy(c)), value)
    360             self.assertEqual(next(copy.deepcopy(c)), value)
    361             self.assertEqual(next(pickle.loads(pickle.dumps(c))), value)
    362 
    363     def test_count_with_stride(self):
    364         self.assertEqual(zip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
    365         self.assertEqual(zip('abc',count(start=2,step=3)),
    366                          [('a', 2), ('b', 5), ('c', 8)])
    367         self.assertEqual(zip('abc',count(step=-1)),
    368                          [('a', 0), ('b', -1), ('c', -2)])
    369         self.assertEqual(zip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
    370         self.assertEqual(zip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
    371         self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
    372         self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
    373         self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
    374         self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
    375                          [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
    376         self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
    377                          [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
    378         self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
    379         c = count(3, 5)
    380         self.assertEqual(repr(c), 'count(3, 5)')
    381         c.next()
    382         self.assertEqual(repr(c), 'count(8, 5)')
    383         c = count(-9, 0)
    384         self.assertEqual(repr(c), 'count(-9, 0)')
    385         c.next()
    386         self.assertEqual(repr(c), 'count(-9, 0)')
    387         c = count(-9, -3)
    388         self.assertEqual(repr(c), 'count(-9, -3)')
    389         c.next()
    390         self.assertEqual(repr(c), 'count(-12, -3)')
    391         self.assertEqual(repr(c), 'count(-12, -3)')
    392         self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
    393         self.assertEqual(repr(count(10.5, 1)), 'count(10.5)')           # suppress step=1 when it's an int
    394         self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)')   # do show float values lilke 1.0
    395         for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
    396             for j in  (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 1, 10, sys.maxint-5, sys.maxint+5):
    397                 # Test repr (ignoring the L in longs)
    398                 r1 = repr(count(i, j)).replace('L', '')
    399                 if j == 1:
    400                     r2 = ('count(%r)' % i).replace('L', '')
    401                 else:
    402                     r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
    403                 self.assertEqual(r1, r2)
    404 
    405     def test_cycle(self):
    406         self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
    407         self.assertEqual(list(cycle('')), [])
    408         self.assertRaises(TypeError, cycle)
    409         self.assertRaises(TypeError, cycle, 5)
    410         self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
    411 
    412     def test_groupby(self):
    413         # Check whether it accepts arguments correctly
    414         self.assertEqual([], list(groupby([])))
    415         self.assertEqual([], list(groupby([], key=id)))
    416         self.assertRaises(TypeError, list, groupby('abc', []))
    417         self.assertRaises(TypeError, groupby, None)
    418         self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
    419 
    420         # Check normal input
    421         s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
    422              (2,15,22), (3,16,23), (3,17,23)]
    423         dup = []
    424         for k, g in groupby(s, lambda r:r[0]):
    425             for elem in g:
    426                 self.assertEqual(k, elem[0])
    427                 dup.append(elem)
    428         self.assertEqual(s, dup)
    429 
    430         # Check nested case
    431         dup = []
    432         for k, g in groupby(s, lambda r:r[0]):
    433             for ik, ig in groupby(g, lambda r:r[2]):
    434                 for elem in ig:
    435                     self.assertEqual(k, elem[0])
    436                     self.assertEqual(ik, elem[2])
    437                     dup.append(elem)
    438         self.assertEqual(s, dup)
    439 
    440         # Check case where inner iterator is not used
    441         keys = [k for k, g in groupby(s, lambda r:r[0])]
    442         expectedkeys = set([r[0] for r in s])
    443         self.assertEqual(set(keys), expectedkeys)
    444         self.assertEqual(len(keys), len(expectedkeys))
    445 
    446         # Exercise pipes and filters style
    447         s = 'abracadabra'
    448         # sort s | uniq
    449         r = [k for k, g in groupby(sorted(s))]
    450         self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
    451         # sort s | uniq -d
    452         r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
    453         self.assertEqual(r, ['a', 'b', 'r'])
    454         # sort s | uniq -c
    455         r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
    456         self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
    457         # sort s | uniq -c | sort -rn | head -3
    458         r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
    459         self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
    460 
    461         # iter.next failure
    462         class ExpectedError(Exception):
    463             pass
    464         def delayed_raise(n=0):
    465             for i in range(n):
    466                 yield 'yo'
    467             raise ExpectedError
    468         def gulp(iterable, keyp=None, func=list):
    469             return [func(g) for k, g in groupby(iterable, keyp)]
    470 
    471         # iter.next failure on outer object
    472         self.assertRaises(ExpectedError, gulp, delayed_raise(0))
    473         # iter.next failure on inner object
    474         self.assertRaises(ExpectedError, gulp, delayed_raise(1))
    475 
    476         # __cmp__ failure
    477         class DummyCmp:
    478             def __cmp__(self, dst):
    479                 raise ExpectedError
    480         s = [DummyCmp(), DummyCmp(), None]
    481 
    482         # __cmp__ failure on outer object
    483         self.assertRaises(ExpectedError, gulp, s, func=id)
    484         # __cmp__ failure on inner object
    485         self.assertRaises(ExpectedError, gulp, s)
    486 
    487         # keyfunc failure
    488         def keyfunc(obj):
    489             if keyfunc.skip > 0:
    490                 keyfunc.skip -= 1
    491                 return obj
    492             else:
    493                 raise ExpectedError
    494 
    495         # keyfunc failure on outer object
    496         keyfunc.skip = 0
    497         self.assertRaises(ExpectedError, gulp, [None], keyfunc)
    498         keyfunc.skip = 1
    499         self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
    500 
    501     def test_ifilter(self):
    502         self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
    503         self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
    504         self.assertEqual(list(ifilter(bool, [0,1,0,2,0])), [1,2])
    505         self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
    506         self.assertRaises(TypeError, ifilter)
    507         self.assertRaises(TypeError, ifilter, lambda x:x)
    508         self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
    509         self.assertRaises(TypeError, ifilter, isEven, 3)
    510         self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
    511 
    512     def test_ifilterfalse(self):
    513         self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
    514         self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
    515         self.assertEqual(list(ifilterfalse(bool, [0,1,0,2,0])), [0,0,0])
    516         self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
    517         self.assertRaises(TypeError, ifilterfalse)
    518         self.assertRaises(TypeError, ifilterfalse, lambda x:x)
    519         self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
    520         self.assertRaises(TypeError, ifilterfalse, isEven, 3)
    521         self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
    522 
    523     def test_izip(self):
    524         ans = [(x,y) for x, y in izip('abc',count())]
    525         self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
    526         self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
    527         self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
    528         self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
    529         self.assertEqual(list(izip('abcdef')), zip('abcdef'))
    530         self.assertEqual(list(izip()), zip())
    531         self.assertRaises(TypeError, izip, 3)
    532         self.assertRaises(TypeError, izip, range(3), 3)
    533         self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
    534                          zip('abc', 'def'))
    535         self.assertEqual([pair for pair in izip('abc', 'def')],
    536                          zip('abc', 'def'))
    537 
    538     @test_support.impl_detail("tuple reuse is specific to CPython")
    539     def test_izip_tuple_resuse(self):
    540         ids = map(id, izip('abc', 'def'))
    541         self.assertEqual(min(ids), max(ids))
    542         ids = map(id, list(izip('abc', 'def')))
    543         self.assertEqual(len(dict.fromkeys(ids)), len(ids))
    544 
    545     def test_iziplongest(self):
    546         for args in [
    547                 ['abc', range(6)],
    548                 [range(6), 'abc'],
    549                 [range(1000), range(2000,2100), range(3000,3050)],
    550                 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
    551                 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
    552             ]:
    553             # target = map(None, *args) <- this raises a py3k warning
    554             # this is the replacement:
    555             target = [tuple([arg[i] if i < len(arg) else None for arg in args])
    556                       for i in range(max(map(len, args)))]
    557             self.assertEqual(list(izip_longest(*args)), target)
    558             self.assertEqual(list(izip_longest(*args, **{})), target)
    559             target = [tuple((e is None and 'X' or e) for e in t) for t in target]   # Replace None fills with 'X'
    560             self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
    561 
    562         self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
    563 
    564         self.assertEqual(list(izip_longest()), zip())
    565         self.assertEqual(list(izip_longest([])), zip([]))
    566         self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
    567 
    568         self.assertEqual(list(izip_longest('abc', 'defg', **{})),
    569                          zip(list('abc') + [None], 'defg'))  # empty keyword dict
    570         self.assertRaises(TypeError, izip_longest, 3)
    571         self.assertRaises(TypeError, izip_longest, range(3), 3)
    572 
    573         for stmt in [
    574             "izip_longest('abc', fv=1)",
    575             "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
    576         ]:
    577             try:
    578                 eval(stmt, globals(), locals())
    579             except TypeError:
    580                 pass
    581             else:
    582                 self.fail('Did not raise Type in:  ' + stmt)
    583 
    584         self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
    585                          zip('abc', 'def'))
    586         self.assertEqual([pair for pair in izip_longest('abc', 'def')],
    587                          zip('abc', 'def'))
    588 
    589     @test_support.impl_detail("tuple reuse is specific to CPython")
    590     def test_izip_longest_tuple_reuse(self):
    591         ids = map(id, izip_longest('abc', 'def'))
    592         self.assertEqual(min(ids), max(ids))
    593         ids = map(id, list(izip_longest('abc', 'def')))
    594         self.assertEqual(len(dict.fromkeys(ids)), len(ids))
    595 
    596     def test_bug_7244(self):
    597 
    598         class Repeater(object):
    599             # this class is similar to itertools.repeat
    600             def __init__(self, o, t, e):
    601                 self.o = o
    602                 self.t = int(t)
    603                 self.e = e
    604             def __iter__(self): # its iterator is itself
    605                 return self
    606             def next(self):
    607                 if self.t > 0:
    608                     self.t -= 1
    609                     return self.o
    610                 else:
    611                     raise self.e
    612 
    613         # Formerly this code in would fail in debug mode
    614         # with Undetected Error and Stop Iteration
    615         r1 = Repeater(1, 3, StopIteration)
    616         r2 = Repeater(2, 4, StopIteration)
    617         def run(r1, r2):
    618             result = []
    619             for i, j in izip_longest(r1, r2, fillvalue=0):
    620                 with test_support.captured_output('stdout'):
    621                     print (i, j)
    622                 result.append((i, j))
    623             return result
    624         self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
    625 
    626         # Formerly, the RuntimeError would be lost
    627         # and StopIteration would stop as expected
    628         r1 = Repeater(1, 3, RuntimeError)
    629         r2 = Repeater(2, 4, StopIteration)
    630         it = izip_longest(r1, r2, fillvalue=0)
    631         self.assertEqual(next(it), (1, 2))
    632         self.assertEqual(next(it), (1, 2))
    633         self.assertEqual(next(it), (1, 2))
    634         self.assertRaises(RuntimeError, next, it)
    635 
    636     def test_product(self):
    637         for args, result in [
    638             ([], [()]),                     # zero iterables
    639             (['ab'], [('a',), ('b',)]),     # one iterable
    640             ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]),     # two iterables
    641             ([range(0), range(2), range(3)], []),           # first iterable with zero length
    642             ([range(2), range(0), range(3)], []),           # middle iterable with zero length
    643             ([range(2), range(3), range(0)], []),           # last iterable with zero length
    644             ]:
    645             self.assertEqual(list(product(*args)), result)
    646             for r in range(4):
    647                 self.assertEqual(list(product(*(args*r))),
    648                                  list(product(*args, **dict(repeat=r))))
    649         self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
    650         self.assertRaises(TypeError, product, range(6), None)
    651 
    652         def product1(*args, **kwds):
    653             pools = map(tuple, args) * kwds.get('repeat', 1)
    654             n = len(pools)
    655             if n == 0:
    656                 yield ()
    657                 return
    658             if any(len(pool) == 0 for pool in pools):
    659                 return
    660             indices = [0] * n
    661             yield tuple(pool[i] for pool, i in zip(pools, indices))
    662             while 1:
    663                 for i in reversed(range(n)):  # right to left
    664                     if indices[i] == len(pools[i]) - 1:
    665                         continue
    666                     indices[i] += 1
    667                     for j in range(i+1, n):
    668                         indices[j] = 0
    669                     yield tuple(pool[i] for pool, i in zip(pools, indices))
    670                     break
    671                 else:
    672                     return
    673 
    674         def product2(*args, **kwds):
    675             'Pure python version used in docs'
    676             pools = map(tuple, args) * kwds.get('repeat', 1)
    677             result = [[]]
    678             for pool in pools:
    679                 result = [x+[y] for x in result for y in pool]
    680             for prod in result:
    681                 yield tuple(prod)
    682 
    683         argtypes = ['', 'abc', '', xrange(0), xrange(4), dict(a=1, b=2, c=3),
    684                     set('abcdefg'), range(11), tuple(range(13))]
    685         for i in range(100):
    686             args = [random.choice(argtypes) for j in range(random.randrange(5))]
    687             expected_len = prod(map(len, args))
    688             self.assertEqual(len(list(product(*args))), expected_len)
    689             self.assertEqual(list(product(*args)), list(product1(*args)))
    690             self.assertEqual(list(product(*args)), list(product2(*args)))
    691             args = map(iter, args)
    692             self.assertEqual(len(list(product(*args))), expected_len)
    693 
    694     @test_support.impl_detail("tuple reuse is specific to CPython")
    695     def test_product_tuple_reuse(self):
    696         self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
    697         self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
    698 
    699     def test_repeat(self):
    700         self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
    701         self.assertEqual(zip(xrange(3),repeat('a')),
    702                          [(0, 'a'), (1, 'a'), (2, 'a')])
    703         self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
    704         self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
    705         self.assertEqual(list(repeat('a', 0)), [])
    706         self.assertEqual(list(repeat('a', -3)), [])
    707         self.assertRaises(TypeError, repeat)
    708         self.assertRaises(TypeError, repeat, None, 3, 4)
    709         self.assertRaises(TypeError, repeat, None, 'a')
    710         r = repeat(1+0j)
    711         self.assertEqual(repr(r), 'repeat((1+0j))')
    712         r = repeat(1+0j, 5)
    713         self.assertEqual(repr(r), 'repeat((1+0j), 5)')
    714         list(r)
    715         self.assertEqual(repr(r), 'repeat((1+0j), 0)')
    716 
    717     def test_imap(self):
    718         self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
    719                          [0**1, 1**2, 2**3])
    720         self.assertEqual(list(imap(None, 'abc', range(5))),
    721                          [('a',0),('b',1),('c',2)])
    722         self.assertEqual(list(imap(None, 'abc', count())),
    723                          [('a',0),('b',1),('c',2)])
    724         self.assertEqual(take(2,imap(None, 'abc', count())),
    725                          [('a',0),('b',1)])
    726         self.assertEqual(list(imap(operator.pow, [])), [])
    727         self.assertRaises(TypeError, imap)
    728         self.assertRaises(TypeError, imap, operator.neg)
    729         self.assertRaises(TypeError, imap(10, range(5)).next)
    730         self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
    731         self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
    732 
    733     def test_starmap(self):
    734         self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
    735                          [0**1, 1**2, 2**3])
    736         self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
    737                          [0**1, 1**2, 2**3])
    738         self.assertEqual(list(starmap(operator.pow, [])), [])
    739         self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
    740         self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
    741         self.assertRaises(TypeError, starmap)
    742         self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
    743         self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
    744         self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
    745         self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
    746 
    747     def test_islice(self):
    748         for args in [          # islice(args) should agree with range(args)
    749                 (10, 20, 3),
    750                 (10, 3, 20),
    751                 (10, 20),
    752                 (10, 3),
    753                 (20,)
    754                 ]:
    755             self.assertEqual(list(islice(xrange(100), *args)), range(*args))
    756 
    757         for args, tgtargs in [  # Stop when seqn is exhausted
    758                 ((10, 110, 3), ((10, 100, 3))),
    759                 ((10, 110), ((10, 100))),
    760                 ((110,), (100,))
    761                 ]:
    762             self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
    763 
    764         # Test stop=None
    765         self.assertEqual(list(islice(xrange(10), None)), range(10))
    766         self.assertEqual(list(islice(xrange(10), None, None)), range(10))
    767         self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
    768         self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
    769         self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
    770 
    771         # Test number of items consumed     SF #1171417
    772         it = iter(range(10))
    773         self.assertEqual(list(islice(it, 3)), range(3))
    774         self.assertEqual(list(it), range(3, 10))
    775 
    776         # Test invalid arguments
    777         self.assertRaises(TypeError, islice, xrange(10))
    778         self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
    779         self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
    780         self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
    781         self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
    782         self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
    783         self.assertRaises(ValueError, islice, xrange(10), 'a')
    784         self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
    785         self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
    786         self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
    787         self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
    788         self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
    789 
    790         # Issue #10323:  Less islice in a predictable state
    791         c = count()
    792         self.assertEqual(list(islice(c, 1, 3, 50)), [1])
    793         self.assertEqual(next(c), 3)
    794 
    795     def test_takewhile(self):
    796         data = [1, 3, 5, 20, 2, 4, 6, 8]
    797         underten = lambda x: x<10
    798         self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
    799         self.assertEqual(list(takewhile(underten, [])), [])
    800         self.assertRaises(TypeError, takewhile)
    801         self.assertRaises(TypeError, takewhile, operator.pow)
    802         self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
    803         self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
    804         self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
    805         t = takewhile(bool, [1, 1, 1, 0, 0, 0])
    806         self.assertEqual(list(t), [1, 1, 1])
    807         self.assertRaises(StopIteration, t.next)
    808 
    809     def test_dropwhile(self):
    810         data = [1, 3, 5, 20, 2, 4, 6, 8]
    811         underten = lambda x: x<10
    812         self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
    813         self.assertEqual(list(dropwhile(underten, [])), [])
    814         self.assertRaises(TypeError, dropwhile)
    815         self.assertRaises(TypeError, dropwhile, operator.pow)
    816         self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
    817         self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
    818         self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
    819 
    820     def test_tee(self):
    821         n = 200
    822         def irange(n):
    823             for i in xrange(n):
    824                 yield i
    825 
    826         a, b = tee([])        # test empty iterator
    827         self.assertEqual(list(a), [])
    828         self.assertEqual(list(b), [])
    829 
    830         a, b = tee(irange(n)) # test 100% interleaved
    831         self.assertEqual(zip(a,b), zip(range(n),range(n)))
    832 
    833         a, b = tee(irange(n)) # test 0% interleaved
    834         self.assertEqual(list(a), range(n))
    835         self.assertEqual(list(b), range(n))
    836 
    837         a, b = tee(irange(n)) # test dealloc of leading iterator
    838         for i in xrange(100):
    839             self.assertEqual(a.next(), i)
    840         del a
    841         self.assertEqual(list(b), range(n))
    842 
    843         a, b = tee(irange(n)) # test dealloc of trailing iterator
    844         for i in xrange(100):
    845             self.assertEqual(a.next(), i)
    846         del b
    847         self.assertEqual(list(a), range(100, n))
    848 
    849         for j in xrange(5):   # test randomly interleaved
    850             order = [0]*n + [1]*n
    851             random.shuffle(order)
    852             lists = ([], [])
    853             its = tee(irange(n))
    854             for i in order:
    855                 value = its[i].next()
    856                 lists[i].append(value)
    857             self.assertEqual(lists[0], range(n))
    858             self.assertEqual(lists[1], range(n))
    859 
    860         # test argument format checking
    861         self.assertRaises(TypeError, tee)
    862         self.assertRaises(TypeError, tee, 3)
    863         self.assertRaises(TypeError, tee, [1,2], 'x')
    864         self.assertRaises(TypeError, tee, [1,2], 3, 'x')
    865 
    866         # tee object should be instantiable
    867         a, b = tee('abc')
    868         c = type(a)('def')
    869         self.assertEqual(list(c), list('def'))
    870 
    871         # test long-lagged and multi-way split
    872         a, b, c = tee(xrange(2000), 3)
    873         for i in xrange(100):
    874             self.assertEqual(a.next(), i)
    875         self.assertEqual(list(b), range(2000))
    876         self.assertEqual([c.next(), c.next()], range(2))
    877         self.assertEqual(list(a), range(100,2000))
    878         self.assertEqual(list(c), range(2,2000))
    879 
    880         # test values of n
    881         self.assertRaises(TypeError, tee, 'abc', 'invalid')
    882         self.assertRaises(ValueError, tee, [], -1)
    883         for n in xrange(5):
    884             result = tee('abc', n)
    885             self.assertEqual(type(result), tuple)
    886             self.assertEqual(len(result), n)
    887             self.assertEqual(map(list, result), [list('abc')]*n)
    888 
    889         # tee pass-through to copyable iterator
    890         a, b = tee('abc')
    891         c, d = tee(a)
    892         self.assertTrue(a is c)
    893 
    894         # test tee_new
    895         t1, t2 = tee('abc')
    896         tnew = type(t1)
    897         self.assertRaises(TypeError, tnew)
    898         self.assertRaises(TypeError, tnew, 10)
    899         t3 = tnew(t1)
    900         self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
    901 
    902         # test that tee objects are weak referencable
    903         a, b = tee(xrange(10))
    904         p = proxy(a)
    905         self.assertEqual(getattr(p, '__class__'), type(b))
    906         del a
    907         self.assertRaises(ReferenceError, getattr, p, '__class__')
    908 
    909     # Issue 13454: Crash when deleting backward iterator from tee()
    910     def test_tee_del_backward(self):
    911         forward, backward = tee(repeat(None, 20000000))
    912         any(forward)  # exhaust the iterator
    913         del backward
    914 
    915     def test_StopIteration(self):
    916         self.assertRaises(StopIteration, izip().next)
    917 
    918         for f in (chain, cycle, izip, groupby):
    919             self.assertRaises(StopIteration, f([]).next)
    920             self.assertRaises(StopIteration, f(StopNow()).next)
    921 
    922         self.assertRaises(StopIteration, islice([], None).next)
    923         self.assertRaises(StopIteration, islice(StopNow(), None).next)
    924 
    925         p, q = tee([])
    926         self.assertRaises(StopIteration, p.next)
    927         self.assertRaises(StopIteration, q.next)
    928         p, q = tee(StopNow())
    929         self.assertRaises(StopIteration, p.next)
    930         self.assertRaises(StopIteration, q.next)
    931 
    932         self.assertRaises(StopIteration, repeat(None, 0).next)
    933 
    934         for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
    935             self.assertRaises(StopIteration, f(lambda x:x, []).next)
    936             self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
    937 
    938 class TestExamples(unittest.TestCase):
    939 
    940     def test_chain(self):
    941         self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
    942 
    943     def test_chain_from_iterable(self):
    944         self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
    945 
    946     def test_combinations(self):
    947         self.assertEqual(list(combinations('ABCD', 2)),
    948                          [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
    949         self.assertEqual(list(combinations(range(4), 3)),
    950                          [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
    951 
    952     def test_combinations_with_replacement(self):
    953         self.assertEqual(list(combinations_with_replacement('ABC', 2)),
    954                          [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
    955 
    956     def test_compress(self):
    957         self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
    958 
    959     def test_count(self):
    960         self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
    961 
    962     def test_cycle(self):
    963         self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
    964 
    965     def test_dropwhile(self):
    966         self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
    967 
    968     def test_groupby(self):
    969         self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
    970                          list('ABCDAB'))
    971         self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
    972                          [list('AAAA'), list('BBB'), list('CC'), list('D')])
    973 
    974     def test_ifilter(self):
    975         self.assertEqual(list(ifilter(lambda x: x%2, range(10))), [1,3,5,7,9])
    976 
    977     def test_ifilterfalse(self):
    978         self.assertEqual(list(ifilterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
    979 
    980     def test_imap(self):
    981         self.assertEqual(list(imap(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
    982 
    983     def test_islice(self):
    984         self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
    985         self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
    986         self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
    987         self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
    988 
    989     def test_izip(self):
    990         self.assertEqual(list(izip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
    991 
    992     def test_izip_longest(self):
    993         self.assertEqual(list(izip_longest('ABCD', 'xy', fillvalue='-')),
    994                          [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
    995 
    996     def test_permutations(self):
    997         self.assertEqual(list(permutations('ABCD', 2)),
    998                          map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))
    999         self.assertEqual(list(permutations(range(3))),
   1000                          [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
   1001 
   1002     def test_product(self):
   1003         self.assertEqual(list(product('ABCD', 'xy')),
   1004                          map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))
   1005         self.assertEqual(list(product(range(2), repeat=3)),
   1006                         [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
   1007                          (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
   1008 
   1009     def test_repeat(self):
   1010         self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
   1011 
   1012     def test_stapmap(self):
   1013         self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
   1014                          [32, 9, 1000])
   1015 
   1016     def test_takewhile(self):
   1017         self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
   1018 
   1019 
   1020 class TestGC(unittest.TestCase):
   1021 
   1022     def makecycle(self, iterator, container):
   1023         container.append(iterator)
   1024         iterator.next()
   1025         del container, iterator
   1026 
   1027     def test_chain(self):
   1028         a = []
   1029         self.makecycle(chain(a), a)
   1030 
   1031     def test_chain_from_iterable(self):
   1032         a = []
   1033         self.makecycle(chain.from_iterable([a]), a)
   1034 
   1035     def test_combinations(self):
   1036         a = []
   1037         self.makecycle(combinations([1,2,a,3], 3), a)
   1038 
   1039     def test_combinations_with_replacement(self):
   1040         a = []
   1041         self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
   1042 
   1043     def test_compress(self):
   1044         a = []
   1045         self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
   1046 
   1047     def test_count(self):
   1048         a = []
   1049         Int = type('Int', (int,), dict(x=a))
   1050         self.makecycle(count(Int(0), Int(1)), a)
   1051 
   1052     def test_cycle(self):
   1053         a = []
   1054         self.makecycle(cycle([a]*2), a)
   1055 
   1056     def test_dropwhile(self):
   1057         a = []
   1058         self.makecycle(dropwhile(bool, [0, a, a]), a)
   1059 
   1060     def test_groupby(self):
   1061         a = []
   1062         self.makecycle(groupby([a]*2, lambda x:x), a)
   1063 
   1064     def test_issue2246(self):
   1065         # Issue 2246 -- the _grouper iterator was not included in GC
   1066         n = 10
   1067         keyfunc = lambda x: x
   1068         for i, j in groupby(xrange(n), key=keyfunc):
   1069             keyfunc.__dict__.setdefault('x',[]).append(j)
   1070 
   1071     def test_ifilter(self):
   1072         a = []
   1073         self.makecycle(ifilter(lambda x:True, [a]*2), a)
   1074 
   1075     def test_ifilterfalse(self):
   1076         a = []
   1077         self.makecycle(ifilterfalse(lambda x:False, a), a)
   1078 
   1079     def test_izip(self):
   1080         a = []
   1081         self.makecycle(izip([a]*2, [a]*3), a)
   1082 
   1083     def test_izip_longest(self):
   1084         a = []
   1085         self.makecycle(izip_longest([a]*2, [a]*3), a)
   1086         b = [a, None]
   1087         self.makecycle(izip_longest([a]*2, [a]*3, fillvalue=b), a)
   1088 
   1089     def test_imap(self):
   1090         a = []
   1091         self.makecycle(imap(lambda x:x, [a]*2), a)
   1092 
   1093     def test_islice(self):
   1094         a = []
   1095         self.makecycle(islice([a]*2, None), a)
   1096 
   1097     def test_permutations(self):
   1098         a = []
   1099         self.makecycle(permutations([1,2,a,3], 3), a)
   1100 
   1101     def test_product(self):
   1102         a = []
   1103         self.makecycle(product([1,2,a,3], repeat=3), a)
   1104 
   1105     def test_repeat(self):
   1106         a = []
   1107         self.makecycle(repeat(a), a)
   1108 
   1109     def test_starmap(self):
   1110         a = []
   1111         self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
   1112 
   1113     def test_takewhile(self):
   1114         a = []
   1115         self.makecycle(takewhile(bool, [1, 0, a, a]), a)
   1116 
   1117 def R(seqn):
   1118     'Regular generator'
   1119     for i in seqn:
   1120         yield i
   1121 
   1122 class G:
   1123     'Sequence using __getitem__'
   1124     def __init__(self, seqn):
   1125         self.seqn = seqn
   1126     def __getitem__(self, i):
   1127         return self.seqn[i]
   1128 
   1129 class I:
   1130     'Sequence using iterator protocol'
   1131     def __init__(self, seqn):
   1132         self.seqn = seqn
   1133         self.i = 0
   1134     def __iter__(self):
   1135         return self
   1136     def next(self):
   1137         if self.i >= len(self.seqn): raise StopIteration
   1138         v = self.seqn[self.i]
   1139         self.i += 1
   1140         return v
   1141 
   1142 class Ig:
   1143     'Sequence using iterator protocol defined with a generator'
   1144     def __init__(self, seqn):
   1145         self.seqn = seqn
   1146         self.i = 0
   1147     def __iter__(self):
   1148         for val in self.seqn:
   1149             yield val
   1150 
   1151 class X:
   1152     'Missing __getitem__ and __iter__'
   1153     def __init__(self, seqn):
   1154         self.seqn = seqn
   1155         self.i = 0
   1156     def next(self):
   1157         if self.i >= len(self.seqn): raise StopIteration
   1158         v = self.seqn[self.i]
   1159         self.i += 1
   1160         return v
   1161 
   1162 class N:
   1163     'Iterator missing next()'
   1164     def __init__(self, seqn):
   1165         self.seqn = seqn
   1166         self.i = 0
   1167     def __iter__(self):
   1168         return self
   1169 
   1170 class E:
   1171     'Test propagation of exceptions'
   1172     def __init__(self, seqn):
   1173         self.seqn = seqn
   1174         self.i = 0
   1175     def __iter__(self):
   1176         return self
   1177     def next(self):
   1178         3 // 0
   1179 
   1180 class S:
   1181     'Test immediate stop'
   1182     def __init__(self, seqn):
   1183         pass
   1184     def __iter__(self):
   1185         return self
   1186     def next(self):
   1187         raise StopIteration
   1188 
   1189 def L(seqn):
   1190     'Test multiple tiers of iterators'
   1191     return chain(imap(lambda x:x, R(Ig(G(seqn)))))
   1192 
   1193 
   1194 class TestVariousIteratorArgs(unittest.TestCase):
   1195 
   1196     def test_chain(self):
   1197         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1198             for g in (G, I, Ig, S, L, R):
   1199                 self.assertEqual(list(chain(g(s))), list(g(s)))
   1200                 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
   1201             self.assertRaises(TypeError, list, chain(X(s)))
   1202             self.assertRaises(TypeError, list, chain(N(s)))
   1203             self.assertRaises(ZeroDivisionError, list, chain(E(s)))
   1204 
   1205     def test_compress(self):
   1206         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1207             n = len(s)
   1208             for g in (G, I, Ig, S, L, R):
   1209                 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
   1210             self.assertRaises(TypeError, compress, X(s), repeat(1))
   1211             self.assertRaises(TypeError, list, compress(N(s), repeat(1)))
   1212             self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
   1213 
   1214     def test_product(self):
   1215         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1216             self.assertRaises(TypeError, product, X(s))
   1217             self.assertRaises(TypeError, product, N(s))
   1218             self.assertRaises(ZeroDivisionError, product, E(s))
   1219 
   1220     def test_cycle(self):
   1221         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1222             for g in (G, I, Ig, S, L, R):
   1223                 tgtlen = len(s) * 3
   1224                 expected = list(g(s))*3
   1225                 actual = list(islice(cycle(g(s)), tgtlen))
   1226                 self.assertEqual(actual, expected)
   1227             self.assertRaises(TypeError, cycle, X(s))
   1228             self.assertRaises(TypeError, list, cycle(N(s)))
   1229             self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
   1230 
   1231     def test_groupby(self):
   1232         for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
   1233             for g in (G, I, Ig, S, L, R):
   1234                 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
   1235             self.assertRaises(TypeError, groupby, X(s))
   1236             self.assertRaises(TypeError, list, groupby(N(s)))
   1237             self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
   1238 
   1239     def test_ifilter(self):
   1240         for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
   1241             for g in (G, I, Ig, S, L, R):
   1242                 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
   1243             self.assertRaises(TypeError, ifilter, isEven, X(s))
   1244             self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
   1245             self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
   1246 
   1247     def test_ifilterfalse(self):
   1248         for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
   1249             for g in (G, I, Ig, S, L, R):
   1250                 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
   1251             self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
   1252             self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
   1253             self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
   1254 
   1255     def test_izip(self):
   1256         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1257             for g in (G, I, Ig, S, L, R):
   1258                 self.assertEqual(list(izip(g(s))), zip(g(s)))
   1259                 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
   1260             self.assertRaises(TypeError, izip, X(s))
   1261             self.assertRaises(TypeError, list, izip(N(s)))
   1262             self.assertRaises(ZeroDivisionError, list, izip(E(s)))
   1263 
   1264     def test_iziplongest(self):
   1265         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1266             for g in (G, I, Ig, S, L, R):
   1267                 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
   1268                 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
   1269             self.assertRaises(TypeError, izip_longest, X(s))
   1270             self.assertRaises(TypeError, list, izip_longest(N(s)))
   1271             self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
   1272 
   1273     def test_imap(self):
   1274         for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
   1275             for g in (G, I, Ig, S, L, R):
   1276                 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
   1277                 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
   1278             self.assertRaises(TypeError, imap, onearg, X(s))
   1279             self.assertRaises(TypeError, list, imap(onearg, N(s)))
   1280             self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
   1281 
   1282     def test_islice(self):
   1283         for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1284             for g in (G, I, Ig, S, L, R):
   1285                 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
   1286             self.assertRaises(TypeError, islice, X(s), 10)
   1287             self.assertRaises(TypeError, list, islice(N(s), 10))
   1288             self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
   1289 
   1290     def test_starmap(self):
   1291         for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
   1292             for g in (G, I, Ig, S, L, R):
   1293                 ss = zip(s, s)
   1294                 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
   1295             self.assertRaises(TypeError, starmap, operator.pow, X(ss))
   1296             self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
   1297             self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
   1298 
   1299     def test_takewhile(self):
   1300         for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
   1301             for g in (G, I, Ig, S, L, R):
   1302                 tgt = []
   1303                 for elem in g(s):
   1304                     if not isEven(elem): break
   1305                     tgt.append(elem)
   1306                 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
   1307             self.assertRaises(TypeError, takewhile, isEven, X(s))
   1308             self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
   1309             self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
   1310 
   1311     def test_dropwhile(self):
   1312         for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
   1313             for g in (G, I, Ig, S, L, R):
   1314                 tgt = []
   1315                 for elem in g(s):
   1316                     if not tgt and isOdd(elem): continue
   1317                     tgt.append(elem)
   1318                 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
   1319             self.assertRaises(TypeError, dropwhile, isOdd, X(s))
   1320             self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
   1321             self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
   1322 
   1323     def test_tee(self):
   1324         for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
   1325             for g in (G, I, Ig, S, L, R):
   1326                 it1, it2 = tee(g(s))
   1327                 self.assertEqual(list(it1), list(g(s)))
   1328                 self.assertEqual(list(it2), list(g(s)))
   1329             self.assertRaises(TypeError, tee, X(s))
   1330             self.assertRaises(TypeError, list, tee(N(s))[0])
   1331             self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
   1332 
   1333 class LengthTransparency(unittest.TestCase):
   1334 
   1335     def test_repeat(self):
   1336         from test.test_iterlen import len
   1337         self.assertEqual(len(repeat(None, 50)), 50)
   1338         self.assertRaises(TypeError, len, repeat(None))
   1339 
   1340 class RegressionTests(unittest.TestCase):
   1341 
   1342     def test_sf_793826(self):
   1343         # Fix Armin Rigo's successful efforts to wreak havoc
   1344 
   1345         def mutatingtuple(tuple1, f, tuple2):
   1346             # this builds a tuple t which is a copy of tuple1,
   1347             # then calls f(t), then mutates t to be equal to tuple2
   1348             # (needs len(tuple1) == len(tuple2)).
   1349             def g(value, first=[1]):
   1350                 if first:
   1351                     del first[:]
   1352                     f(z.next())
   1353                 return value
   1354             items = list(tuple2)
   1355             items[1:1] = list(tuple1)
   1356             gen = imap(g, items)
   1357             z = izip(*[gen]*len(tuple1))
   1358             z.next()
   1359 
   1360         def f(t):
   1361             global T
   1362             T = t
   1363             first[:] = list(T)
   1364 
   1365         first = []
   1366         mutatingtuple((1,2,3), f, (4,5,6))
   1367         second = list(T)
   1368         self.assertEqual(first, second)
   1369 
   1370 
   1371     def test_sf_950057(self):
   1372         # Make sure that chain() and cycle() catch exceptions immediately
   1373         # rather than when shifting between input sources
   1374 
   1375         def gen1():
   1376             hist.append(0)
   1377             yield 1
   1378             hist.append(1)
   1379             raise AssertionError
   1380             hist.append(2)
   1381 
   1382         def gen2(x):
   1383             hist.append(3)
   1384             yield 2
   1385             hist.append(4)
   1386             if x:
   1387                 raise StopIteration
   1388 
   1389         hist = []
   1390         self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
   1391         self.assertEqual(hist, [0,1])
   1392 
   1393         hist = []
   1394         self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
   1395         self.assertEqual(hist, [0,1])
   1396 
   1397         hist = []
   1398         self.assertRaises(AssertionError, list, cycle(gen1()))
   1399         self.assertEqual(hist, [0,1])
   1400 
   1401 class SubclassWithKwargsTest(unittest.TestCase):
   1402     def test_keywords_in_subclass(self):
   1403         # count is not subclassable...
   1404         for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
   1405                     starmap, islice, takewhile, dropwhile, cycle, compress):
   1406             class Subclass(cls):
   1407                 def __init__(self, newarg=None, *args):
   1408                     cls.__init__(self, *args)
   1409             try:
   1410                 Subclass(newarg=1)
   1411             except TypeError, err:
   1412                 # we expect type errors because of wrong argument count
   1413                 self.assertNotIn("does not take keyword arguments", err.args[0])
   1414 
   1415 
   1416 libreftest = """ Doctest for examples in the library reference: libitertools.tex
   1417 
   1418 
   1419 >>> amounts = [120.15, 764.05, 823.14]
   1420 >>> for checknum, amount in izip(count(1200), amounts):
   1421 ...     print 'Check %d is for $%.2f' % (checknum, amount)
   1422 ...
   1423 Check 1200 is for $120.15
   1424 Check 1201 is for $764.05
   1425 Check 1202 is for $823.14
   1426 
   1427 >>> import operator
   1428 >>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
   1429 ...    print cube
   1430 ...
   1431 1
   1432 8
   1433 27
   1434 
   1435 >>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
   1436 >>> for name in islice(reportlines, 3, None, 2):
   1437 ...    print name.title()
   1438 ...
   1439 Alex
   1440 Laura
   1441 Martin
   1442 Walter
   1443 Samuele
   1444 
   1445 >>> from operator import itemgetter
   1446 >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
   1447 >>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
   1448 >>> for k, g in groupby(di, itemgetter(1)):
   1449 ...     print k, map(itemgetter(0), g)
   1450 ...
   1451 1 ['a', 'c', 'e']
   1452 2 ['b', 'd', 'f']
   1453 3 ['g']
   1454 
   1455 # Find runs of consecutive numbers using groupby.  The key to the solution
   1456 # is differencing with a range so that consecutive numbers all appear in
   1457 # same group.
   1458 >>> data = [ 1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
   1459 >>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
   1460 ...     print map(operator.itemgetter(1), g)
   1461 ...
   1462 [1]
   1463 [4, 5, 6]
   1464 [10]
   1465 [15, 16, 17, 18]
   1466 [22]
   1467 [25, 26, 27, 28]
   1468 
   1469 >>> def take(n, iterable):
   1470 ...     "Return first n items of the iterable as a list"
   1471 ...     return list(islice(iterable, n))
   1472 
   1473 >>> def enumerate(iterable, start=0):
   1474 ...     return izip(count(start), iterable)
   1475 
   1476 >>> def tabulate(function, start=0):
   1477 ...     "Return function(0), function(1), ..."
   1478 ...     return imap(function, count(start))
   1479 
   1480 >>> def nth(iterable, n, default=None):
   1481 ...     "Returns the nth item or a default value"
   1482 ...     return next(islice(iterable, n, None), default)
   1483 
   1484 >>> def quantify(iterable, pred=bool):
   1485 ...     "Count how many times the predicate is true"
   1486 ...     return sum(imap(pred, iterable))
   1487 
   1488 >>> def padnone(iterable):
   1489 ...     "Returns the sequence elements and then returns None indefinitely"
   1490 ...     return chain(iterable, repeat(None))
   1491 
   1492 >>> def ncycles(iterable, n):
   1493 ...     "Returns the sequence elements n times"
   1494 ...     return chain(*repeat(iterable, n))
   1495 
   1496 >>> def dotproduct(vec1, vec2):
   1497 ...     return sum(imap(operator.mul, vec1, vec2))
   1498 
   1499 >>> def flatten(listOfLists):
   1500 ...     return list(chain.from_iterable(listOfLists))
   1501 
   1502 >>> def repeatfunc(func, times=None, *args):
   1503 ...     "Repeat calls to func with specified arguments."
   1504 ...     "   Example:  repeatfunc(random.random)"
   1505 ...     if times is None:
   1506 ...         return starmap(func, repeat(args))
   1507 ...     else:
   1508 ...         return starmap(func, repeat(args, times))
   1509 
   1510 >>> def pairwise(iterable):
   1511 ...     "s -> (s0,s1), (s1,s2), (s2, s3), ..."
   1512 ...     a, b = tee(iterable)
   1513 ...     for elem in b:
   1514 ...         break
   1515 ...     return izip(a, b)
   1516 
   1517 >>> def grouper(n, iterable, fillvalue=None):
   1518 ...     "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
   1519 ...     args = [iter(iterable)] * n
   1520 ...     return izip_longest(fillvalue=fillvalue, *args)
   1521 
   1522 >>> def roundrobin(*iterables):
   1523 ...     "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
   1524 ...     # Recipe credited to George Sakkis
   1525 ...     pending = len(iterables)
   1526 ...     nexts = cycle(iter(it).next for it in iterables)
   1527 ...     while pending:
   1528 ...         try:
   1529 ...             for next in nexts:
   1530 ...                 yield next()
   1531 ...         except StopIteration:
   1532 ...             pending -= 1
   1533 ...             nexts = cycle(islice(nexts, pending))
   1534 
   1535 >>> def powerset(iterable):
   1536 ...     "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
   1537 ...     s = list(iterable)
   1538 ...     return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
   1539 
   1540 >>> def unique_everseen(iterable, key=None):
   1541 ...     "List unique elements, preserving order. Remember all elements ever seen."
   1542 ...     # unique_everseen('AAAABBBCCDAABBB') --> A B C D
   1543 ...     # unique_everseen('ABBCcAD', str.lower) --> A B C D
   1544 ...     seen = set()
   1545 ...     seen_add = seen.add
   1546 ...     if key is None:
   1547 ...         for element in iterable:
   1548 ...             if element not in seen:
   1549 ...                 seen_add(element)
   1550 ...                 yield element
   1551 ...     else:
   1552 ...         for element in iterable:
   1553 ...             k = key(element)
   1554 ...             if k not in seen:
   1555 ...                 seen_add(k)
   1556 ...                 yield element
   1557 
   1558 >>> def unique_justseen(iterable, key=None):
   1559 ...     "List unique elements, preserving order. Remember only the element just seen."
   1560 ...     # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
   1561 ...     # unique_justseen('ABBCcAD', str.lower) --> A B C A D
   1562 ...     return imap(next, imap(itemgetter(1), groupby(iterable, key)))
   1563 
   1564 This is not part of the examples but it tests to make sure the definitions
   1565 perform as purported.
   1566 
   1567 >>> take(10, count())
   1568 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
   1569 
   1570 >>> list(enumerate('abc'))
   1571 [(0, 'a'), (1, 'b'), (2, 'c')]
   1572 
   1573 >>> list(islice(tabulate(lambda x: 2*x), 4))
   1574 [0, 2, 4, 6]
   1575 
   1576 >>> nth('abcde', 3)
   1577 'd'
   1578 
   1579 >>> nth('abcde', 9) is None
   1580 True
   1581 
   1582 >>> quantify(xrange(99), lambda x: x%2==0)
   1583 50
   1584 
   1585 >>> a = [[1, 2, 3], [4, 5, 6]]
   1586 >>> flatten(a)
   1587 [1, 2, 3, 4, 5, 6]
   1588 
   1589 >>> list(repeatfunc(pow, 5, 2, 3))
   1590 [8, 8, 8, 8, 8]
   1591 
   1592 >>> import random
   1593 >>> take(5, imap(int, repeatfunc(random.random)))
   1594 [0, 0, 0, 0, 0]
   1595 
   1596 >>> list(pairwise('abcd'))
   1597 [('a', 'b'), ('b', 'c'), ('c', 'd')]
   1598 
   1599 >>> list(pairwise([]))
   1600 []
   1601 
   1602 >>> list(pairwise('a'))
   1603 []
   1604 
   1605 >>> list(islice(padnone('abc'), 0, 6))
   1606 ['a', 'b', 'c', None, None, None]
   1607 
   1608 >>> list(ncycles('abc', 3))
   1609 ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
   1610 
   1611 >>> dotproduct([1,2,3], [4,5,6])
   1612 32
   1613 
   1614 >>> list(grouper(3, 'abcdefg', 'x'))
   1615 [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
   1616 
   1617 >>> list(roundrobin('abc', 'd', 'ef'))
   1618 ['a', 'd', 'e', 'b', 'f', 'c']
   1619 
   1620 >>> list(powerset([1,2,3]))
   1621 [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
   1622 
   1623 >>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
   1624 True
   1625 
   1626 >>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
   1627 True
   1628 
   1629 >>> list(unique_everseen('AAAABBBCCDAABBB'))
   1630 ['A', 'B', 'C', 'D']
   1631 
   1632 >>> list(unique_everseen('ABBCcAD', str.lower))
   1633 ['A', 'B', 'C', 'D']
   1634 
   1635 >>> list(unique_justseen('AAAABBBCCDAABBB'))
   1636 ['A', 'B', 'C', 'D', 'A', 'B']
   1637 
   1638 >>> list(unique_justseen('ABBCcAD', str.lower))
   1639 ['A', 'B', 'C', 'A', 'D']
   1640 
   1641 """
   1642 
   1643 __test__ = {'libreftest' : libreftest}
   1644 
   1645 def test_main(verbose=None):
   1646     test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
   1647                     RegressionTests, LengthTransparency,
   1648                     SubclassWithKwargsTest, TestExamples)
   1649     test_support.run_unittest(*test_classes)
   1650 
   1651     # verify reference counting
   1652     if verbose and hasattr(sys, "gettotalrefcount"):
   1653         import gc
   1654         counts = [None] * 5
   1655         for i in xrange(len(counts)):
   1656             test_support.run_unittest(*test_classes)
   1657             gc.collect()
   1658             counts[i] = sys.gettotalrefcount()
   1659         print counts
   1660 
   1661     # doctest the examples in the library reference
   1662     test_support.run_doctest(sys.modules[__name__], verbose)
   1663 
   1664 if __name__ == "__main__":
   1665     test_main(verbose=True)
   1666