async def test_selector_order(): source_1 = make_async_gen([1, 2, 3], step_delay=0.2) source_2 = make_async_gen([4, 5, 6], initial_delay=0.1, step_delay=0.2) expected = [1, 4, 2, 5, 3, 6] async for value in Selector(source_1(), source_2()): assert value == expected.pop(0)
async def test_selector_blocking(): source_1 = make_async_gen([1, 2, 3], step_delay=1) source_2 = make_async_gen([1, 2, 3], step_delay=1) with profile(max_duration=3.1): async for _ in Selector(source_1(), source_2()): pass
async def test_yielded_source_with_values(): source_values = [ [object(), object(), object()], [object(), object(), object()], [object(), object(), object()], ] source_values = {make_async_gen(vs)(): vs.copy() for vs in source_values} sel = Selector(*source_values.keys(), yield_source=True) async for source, value in sel: source_values[source].remove(value) else: assert all(len(vs) == 0 for vs in source_values.values())
async def test_non_raised_exception_passes(): class AnException(Exception): pass exc1 = AnException() exc2 = AnException() src1 = [0, 1, 2, 3, exc1, 4] src2 = [0, 1, exc2, 3, 4, 5] source_1 = make_async_gen(src1, initial_delay=0.2) source_2 = make_async_gen(src2, raise_exc=False) expected = [0, 1, exc2, 3, 4, 5, 0, 1, 2, 3, exc1] result = [] sel = Selector(source_1, source_2) sel_agen = sel.__aiter__() while True: try: result.append(await sel_agen.__anext__()) except AnException as e: result.append(e) except StopAsyncIteration: break assert result == expected