# -*- coding: utf-8 -*- import pytest import pytest_trio.plugin # noqa import trio from pyee import TrioEventEmitter class PyeeTestError(Exception): pass @pytest.mark.trio async def test_trio_emit(): """Test that the trio event emitter can handle wrapping coroutines """ async with TrioEventEmitter() as ee: should_call = trio.Event() @ee.on("event") async def event_handler(): should_call.set() ee.emit("event") result = False with trio.move_on_after(0.1): await should_call.wait() result = True assert result @pytest.mark.trio async def test_trio_once_emit(): """Test that trio event emitters also wrap coroutines when using once """ async with TrioEventEmitter() as ee: should_call = trio.Event() @ee.once("event") async def event_handler(): should_call.set() ee.emit("event") result = False with trio.move_on_after(0.1): await should_call.wait() result = True assert result @pytest.mark.trio async def test_trio_error(): """Test that trio event emitters can handle errors when wrapping coroutines """ async with TrioEventEmitter() as ee: send, rcv = trio.open_memory_channel(1) @ee.on("event") async def event_handler(): raise PyeeTestError() @ee.on("error") async def handle_error(exc): async with send: await send.send(exc) ee.emit("event") result = None with trio.move_on_after(0.1): async with rcv: result = await rcv.__anext__() assert isinstance(result, PyeeTestError) @pytest.mark.trio async def test_sync_error(event_loop): """Test that regular functions have the same error handling as coroutines""" async with TrioEventEmitter() as ee: send, rcv = trio.open_memory_channel(1) @ee.on("event") def sync_handler(): raise PyeeTestError() @ee.on("error") async def handle_error(exc): async with send: await send.send(exc) ee.emit("event") result = None with trio.move_on_after(0.1): async with rcv: result = await rcv.__anext__() assert isinstance(result, PyeeTestError)