import itertools
assert list(itertools.pairwise([1, 2, 3, 4])) == [(1, 2), (2, 3), (3, 4)]
assert list(itertools.pairwise('abc')) == [('a', 'b'), ('b', 'c')]
assert list(itertools.pairwise(range(4))) == [(0, 1), (1, 2), (2, 3)]
assert list(itertools.pairwise([1])) == []
assert list(itertools.pairwise([])) == []
shared = [0]
pairs = list(itertools.pairwise([shared, shared, shared]))
assert pairs == [([0], [0]), ([0], [0])]
assert pairs[0][1] is pairs[1][0]
partial = itertools.pairwise([1, 2, 3, 4])
assert next(partial) == (1, 2)
assert list(partial) == [(2, 3), (3, 4)]
assert list(partial) == []
spent = itertools.pairwise([1, 2])
assert list(spent) == [(1, 2)]
assert list(spent) == []
p = itertools.pairwise([1, 2])
assert iter(p) is p
assert str(type(itertools.pairwise([]))) == "<class 'itertools.pairwise'>"
try:
itertools.pairwise()
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'pairwise expected 1 argument, got 0'
try:
itertools.pairwise([1], [2])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'pairwise expected 1 argument, got 2'
try:
itertools.pairwise(5)
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "'int' object is not iterable"
try:
itertools.pairwise(iterable=[1, 2])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'pairwise() takes no keyword arguments'
assert list(itertools.compress('ABCDEF', [1, 0, 1, 0, 1, 1])) == ['A', 'C', 'E', 'F']
assert list(itertools.compress('ABC', [1, 1, 1, 1, 1])) == ['A', 'B', 'C']
assert list(itertools.compress('ABCDEF', [1, 1])) == ['A', 'B']
assert list(itertools.compress([1, 2, 3], ['x', '', None])) == [1]
assert list(itertools.compress([1, 2, 3], [[], [0], {}])) == [2]
assert list(itertools.compress([], [])) == []
assert list(itertools.compress(data='ABC', selectors=[0, 1, 1])) == ['B', 'C']
try:
itertools.compress()
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "compress() missing required argument 'data' (pos 1)"
try:
itertools.compress([1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "compress() missing required argument 'selectors' (pos 2)"
try:
itertools.compress([1], [1], data=[1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'compress() takes at most 2 arguments (3 given)'
try:
itertools.compress(5, [1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "'int' object is not iterable"
assert list(itertools.islice('ABCDEFG', 2)) == ['A', 'B']
assert list(itertools.islice('ABCDEFG', 2, 4)) == ['C', 'D']
assert list(itertools.islice('ABCDEFG', 2, None, 2)) == ['C', 'E', 'G']
assert list(itertools.islice('ABCDEFG', 0, None, 3)) == ['A', 'D', 'G']
assert list(itertools.islice('ABCDEFG', None)) == ['A', 'B', 'C', 'D', 'E', 'F', 'G']
assert list(itertools.islice('ABC', None, 2)) == ['A', 'B']
assert list(itertools.islice('ABC', 0, 2, None)) == ['A', 'B']
assert list(itertools.islice('AB', 10)) == ['A', 'B']
assert list(itertools.islice('ABC', 5, 10)) == []
assert list(itertools.islice([], 3)) == []
source = iter('ABCDEFG')
assert list(itertools.islice(source, 2)) == ['A', 'B']
assert list(source) == ['C', 'D', 'E', 'F', 'G']
try:
itertools.islice([1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'islice expected at least 2 arguments, got 1'
try:
itertools.islice([1], 1, 2, 3, 4)
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'islice expected at most 4 arguments, got 5'
try:
itertools.islice([1], -1)
assert False, 'expected ValueError'
except ValueError as exc:
assert str(exc) == 'Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize.'
try:
itertools.islice([1], -1, 2)
assert False, 'expected ValueError'
except ValueError as exc:
assert str(exc) == 'Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.'
try:
itertools.islice([1], 0, 1, 0)
assert False, 'expected ValueError'
except ValueError as exc:
assert str(exc) == 'Step for islice() must be a positive integer or None.'
try:
itertools.islice([1], stop=1)
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'islice() takes no keyword arguments'
assert list(itertools.chain([1, 2], [3], [4, 5])) == [1, 2, 3, 4, 5]
assert list(itertools.chain()) == []
assert list(itertools.chain([1, 2])) == [1, 2]
assert list(itertools.chain('ab', 'cd')) == ['a', 'b', 'c', 'd']
assert list(itertools.chain([], [1], [], [2], [])) == [1, 2]
assert list(itertools.chain([], [])) == []
assert list(itertools.chain(range(2), 'a', (9,))) == [0, 1, 'a', 9]
lazy = itertools.chain([1], 5)
assert next(lazy) == 1
try:
next(lazy)
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "'int' object is not iterable"
try:
itertools.chain(x=[1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'chain() takes no keyword arguments'
assert list(itertools.islice(itertools.cycle([1, 2, 3]), 7)) == [1, 2, 3, 1, 2, 3, 1]
assert list(itertools.islice(itertools.cycle('ab'), 5)) == ['a', 'b', 'a', 'b', 'a']
assert list(itertools.islice(itertools.cycle([9]), 3)) == [9, 9, 9]
assert list(itertools.cycle([])) == []
assert list(itertools.islice(itertools.cycle([]), 5)) == []
element = [0]
repeated = list(itertools.islice(itertools.cycle([element]), 3))
assert repeated == [[0], [0], [0]]
assert repeated[0] is repeated[1] is repeated[2]
drained = iter([1, 2, 3])
partial_cycle = itertools.cycle(drained)
assert next(partial_cycle) == 1
assert next(partial_cycle) == 2
try:
itertools.cycle()
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'cycle expected 1 argument, got 0'
try:
itertools.cycle([1], [2])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'cycle expected 1 argument, got 2'
try:
itertools.cycle(5)
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == "'int' object is not iterable"
try:
itertools.cycle(iterable=[1])
assert False, 'expected TypeError'
except TypeError as exc:
assert str(exc) == 'cycle() takes no keyword arguments'
for spent in (
itertools.pairwise([1, 2]),
itertools.compress([1], [1]),
itertools.islice([1], 1),
itertools.chain([1]),
itertools.cycle([1, 2]),
):
assert iter(spent) is spent
for exhausted in (
itertools.pairwise([1, 2]),
itertools.compress([1], [1]),
itertools.islice([1], 1),
itertools.chain([1]),
):
next(exhausted)
try:
next(exhausted)
assert False, 'expected StopIteration'
except StopIteration:
pass
try:
next(itertools.cycle([]))
assert False, 'expected StopIteration'
except StopIteration:
pass
class UpTo:
def __init__(self, limit):
self.limit = limit
self.n = 0
def __iter__(self):
return self
def __next__(self):
self.n += 1
if self.n > self.limit:
raise StopIteration
return self.n
assert list(itertools.pairwise(UpTo(3))) == [(1, 2), (2, 3)]
assert list(itertools.compress(UpTo(3), [1, 0, 1])) == [1, 3]
assert list(itertools.islice(UpTo(5), 1, 4)) == [2, 3, 4]
assert list(itertools.chain(UpTo(2), UpTo(2))) == [1, 2, 1, 2]
assert list(itertools.islice(itertools.cycle(UpTo(2)), 5)) == [1, 2, 1, 2, 1]
class Boom:
def __iter__(self):
return self
def __next__(self):
raise ValueError('boom')
for failing in (
itertools.pairwise(Boom()),
itertools.compress(Boom(), [1]),
itertools.islice(Boom(), 1),
itertools.chain(Boom()),
itertools.cycle(Boom()),
):
try:
next(failing)
assert False, 'expected ValueError'
except ValueError as exc:
assert str(exc) == 'boom'
assert list(itertools.pairwise(itertools.islice(itertools.count(), 4))) == [(0, 1), (1, 2), (2, 3)]
assert list(itertools.islice(itertools.chain(itertools.repeat(1, 2), [2]), 2)) == [1, 1]
assert list(itertools.compress(itertools.chain('ab', 'cd'), itertools.cycle([1, 0]))) == ['a', 'c']
assert list(itertools.islice(itertools.cycle(itertools.islice('abcdef', 2)), 5)) == ['a', 'b', 'a', 'b', 'a']
assert list(itertools.chain(itertools.pairwise([1, 2, 3]), [(9, 9)])) == [(1, 2), (2, 3), (9, 9)]
assert tuple(itertools.pairwise([1, 2, 3])) == ((1, 2), (2, 3))
assert sorted(itertools.chain([3, 1], [2])) == [1, 2, 3]
assert set(itertools.compress('aab', [1, 1, 1])) == {'a', 'b'}
assert sorted(set(itertools.islice(itertools.cycle('ab'), 5))) == ['a', 'b']
total = 0
for left, right in itertools.pairwise([1, 2, 3]):
total += left * right
assert total == 8
assert 3 in itertools.chain([1, 2], [3])
assert 'z' not in itertools.compress('abc', [1, 1, 1])