def test_simple_task(self): maintask = coroutine.getcurrent() def f():pass co = coroutine() co.bind(f) co.switch() assert not co.is_alive assert maintask is coroutine.getcurrent()
def test_is_zombie_del_with_frame(self): try: import _stackless # are we on pypy with a stackless build? except ImportError: skip("only works on pypy-c-stackless") import gc res = [] class MyCoroutine(coroutine): def __del__(self): res.append(self.is_zombie) main = coroutine.getcurrent() def f(): print 'in coro' main.switch() co = MyCoroutine() co.bind(f) co.switch() del co for i in range(10): gc.collect() if res: break co = coroutine() co.bind(f) co.switch() assert res[0], "is_zombie was False in __del__"
def test_backto_main(self): maintask = coroutine.getcurrent() def f(task): task.switch() co = coroutine() co.bind(f,maintask) co.switch()
def test_propagation(self): exceptions = [] co = coroutine() co2 = coroutine() def f(main): main.switch() co.bind(f, coroutine.getcurrent()) co.switch() try: co.throw(RuntimeError) except RuntimeError: exceptions.append(1) def f2(): raise RuntimeError co2.bind(f2) try: co2.switch() except RuntimeError: exceptions.append(2) assert exceptions == [1,2]
def test_throw(self): exceptions = [] co = coroutine() def f(main): try: main.switch() except RuntimeError: exceptions.append(True) co.bind(f, coroutine.getcurrent()) co.switch() co.throw(RuntimeError) assert exceptions == [True]
def test_wrapped_main(self): class mwrap(object): def __init__(self, coro): self._coro = coro def __getattr__(self, attr): return getattr(self._coro, attr) maintask = mwrap(coroutine.getcurrent()) def f(task): task.switch() co = coroutine() co.bind(f,maintask) co.switch()
def test_catch_coroutineexit(self): coroutineexit = [] co_a = coroutine() co_test = coroutine.getcurrent() def a(): try: co_test.switch() except CoroutineExit: coroutineexit.append(True) raise co_a.bind(a) co_a.switch() assert co_a.is_alive co_a.kill() assert coroutineexit == [True] assert not co_a.is_alive