import pytest

# here's a little voodoo -- any generic tests depend on this 'framework'
# fixture, which (sneakily using internal-only APIs) ensures that each
# tests runs twice: once enabled for Twisted and once enabled for
# asyncio.
#
# ...but there's a catch: not all environments support both, so we
# catch ImportError and skip those tests.
#
# To write a test that only works on one or the other framework, use
# the framework_tx or framework_aio fixtures instead


@pytest.fixture(
    params=['twisted', 'asyncio'],
)
def framework(request):
    """
    This is a framework that uses txaio internals to set up a
    framework to use, as the 'official' way is to call .use_twisted()
    or .use_asyncio() -- but we want to test with both frameworks if
    they're available.
    """

    try:
        if request.param == 'twisted':
            return _notfixture_framework_tx()
        elif request.param == 'asyncio':
            return _notfixture_framework_aio()
    except ImportError:
        pytest.skip()


@pytest.fixture
def framework_uninitialized():
    import txaio
    from txaio import _unframework
    txaio._use_framework(_unframework)
    txaio._explicit_framework = None
    return _unframework


@pytest.fixture
def framework_tx():
    return _notfixture_framework_tx()


def _notfixture_framework_tx():
    try:
        import txaio
        from txaio import tx
        tx._loggers = set()
        txaio._use_framework(tx)
        txaio._explicit_framework = 'twisted'
        return tx
    except ImportError:
        pytest.skip()


@pytest.fixture
def framework_aio():
    return _notfixture_framework_aio()


def _notfixture_framework_aio():
    try:
        import txaio
        from txaio import aio
        aio._loggers = set()
        txaio._use_framework(aio)
        txaio._explicit_framework = 'asyncio'
        return aio
    except ImportError:
        pytest.skip()
