import asyncio
import pytest
from manteniment import TascaManteniment, tecnic_manteniment

@pytest.mark.asyncio
async def test_tecnic_manteniment_processa_tasca():
    """Test que verifica que el tècnic processa una tasca correctament."""
    cua = asyncio.PriorityQueue()
    tasca = TascaManteniment(prioritat=1, id_maquina=1, temps_reparacio=0.1)

    # Iniciem el tècnic
    tasca_tecnic = asyncio.create_task(tecnic_manteniment(1, cua))

    # Posem la tasca a la cua
    await cua.put(tasca)
    # Esperem que la tasca es processi
    await asyncio.sleep(0.2)  # Temps suficient per processar la tasca
    # Verifiquem que la tasca s'ha processat (la cua hauria d'estar buida)
    assert cua.empty()

    # Tornem a posar la tasca a la cua
    await cua.put(tasca)
    # Esperem que la tasca es processi
    await asyncio.sleep(0.2)  # Temps suficient per processar la tasca
    # Verifiquem que la tasca s'ha processat (la cua hauria d'estar buida)
    assert cua.empty()

    # Esperem que totes les tasques de la cua s'hagin processat completament
    await cua.join()

@pytest.mark.asyncio
async def test_tecnic_manteniment_cancellacio():
    """Test que verifica que el tècnic es cancel·la correctament."""
    cua = asyncio.PriorityQueue()

    # Iniciem el tècnic sense posar cap tasca a la cua
    tasca_tecnic = asyncio.create_task(tecnic_manteniment(1, cua))

    # Cancel·lem immediatament el tècnic
    tasca_tecnic.cancel()
    try:
        await tasca_tecnic
    except asyncio.CancelledError:
        pass

    # Verifiquem que el tècnic s'ha cancel·lat sense errors
    assert True
