from itertools import takewhile import pytest from funcy import repeatedly from pyinfra.server.dispatcher.dispatcher import Nothing from pyinfra.server.bufferizer.lazy_bufferizer import LazyBufferizer from pyinfra.utils.func import lift def func(x): return [x ** 2] def test_lazy_bufferizer(): lazy_bufferizer = LazyBufferizer(lift(func)) for i in range(10): lazy_bufferizer.submit(i) output = list(takewhile(lambda r: r != Nothing, repeatedly(lazy_bufferizer.compute_next))) assert output == [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] def test_lazy_bufferizer_returns_nothing_when_input_queue_is_empty(): lazy_bufferizer = LazyBufferizer(lift(func)) assert lazy_bufferizer.compute_next() is Nothing assert lazy_bufferizer.compute_next() is Nothing lazy_bufferizer.submit(2) assert lazy_bufferizer.compute_next() == 4 assert lazy_bufferizer.compute_next() is Nothing def test_lazy_bufferizer_raises_when_wrapped_function_is_not_mappable(): lazy_bufferizer = LazyBufferizer(func) with pytest.raises(TypeError): lazy_bufferizer.submit(2) assert lazy_bufferizer.compute_next() == 4