def test_event(): """Multiple tasks can be blocked on an event.""" event = Event() log = [] async def event_waiter(): log.append("event_waiter started") await event log.append("event_waiter finished") do(event_waiter()) do(event_waiter()) async def runtest(): await loop.next_tick() log.append(f"Tasks blocked: {len(event)}; setting event") event.set() log.append(f"Tasks blocked: {len(event)}") await loop.next_tick() run(runtest()) assert log == [ "event_waiter started", "event_waiter started", "Tasks blocked: 2; setting event", "Tasks blocked: 0", "event_waiter finished", "event_waiter finished", ]
async def spawn_explosions(): """Continue spawning explosions.""" while True: px = random.uniform(50, scene.width - 50) py = random.uniform(50, scene.height - 50) do(explode((px, py))) await clock.coro.sleep(random.uniform(0.5, 3))
def test_interpolate(clock): """We can interpolate a value over multiple frames.""" vs = [] async def interpolator(): async for v in clock.coro.interpolate(1.0, 2.0, duration=0.5): vs.append(v) do(interpolator()) run(run_clock(clock, frames=10, framerate=5)) assert vs == pytest.approx([1.4, 1.8, 2.0])
def test_await_seconds(clock): """We can iterate over a sequence of frames, in seconds.""" ts = [] async def multi_frame_waiter(): async for t in clock.coro.frames(seconds=1.0): ts.append(t) do(multi_frame_waiter()) run(run_clock(clock, frames=10, framerate=5)) assert ts == pytest.approx([0.2, 0.4, 0.6, 0.8, 1.0])
def test_await_frames(clock): """We can iterate over a sequence of frames.""" ts = [] async def multi_frame_waiter(): async for t in clock.coro.frames(frames=3): ts.append(t) do(multi_frame_waiter()) run(run_clock(clock, frames=3, framerate=10)) assert ts == pytest.approx([0.1, 0.2, 0.3])
def test_schedule(clock): """We can schedule a coroutine.""" v = None async def set_v(val): nonlocal v await clock.coro.sleep(0.1) v = val do(set_v(3)) assert v is None run(run_clock(clock, frames=10)) assert v == 3
async def start_cancel(): task = do(multi_frame_waiter()) await loop.next_tick() # Allow task to start and block on clock clock.tick(0.1) await loop.next_tick() # Allow task to run one loop task.cancel() await loop.next_tick() # Allow task to cancel