98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
import py
 | 
						|
try:
 | 
						|
    from py.magic import greenlet
 | 
						|
except (ImportError, RuntimeError), e:
 | 
						|
    py.test.skip(str(e))
 | 
						|
 | 
						|
def switch(*args):
 | 
						|
    return greenlet.getcurrent().parent.switch(*args)
 | 
						|
 | 
						|
def test_class():
 | 
						|
    def f():
 | 
						|
        try:
 | 
						|
            switch("ok")
 | 
						|
        except RuntimeError:
 | 
						|
            switch("ok")
 | 
						|
            return
 | 
						|
        switch("fail")
 | 
						|
 | 
						|
    g = greenlet(f)
 | 
						|
    res = g.switch()
 | 
						|
    assert res == "ok"
 | 
						|
    res = g.throw(RuntimeError)
 | 
						|
    assert res == "ok"
 | 
						|
 | 
						|
def test_val():
 | 
						|
    def f():
 | 
						|
        try:
 | 
						|
            switch("ok")
 | 
						|
        except RuntimeError, val:
 | 
						|
            if str(val) == "ciao":
 | 
						|
                switch("ok")
 | 
						|
                return
 | 
						|
        switch("fail")
 | 
						|
 | 
						|
    g = greenlet(f)
 | 
						|
    res = g.switch()
 | 
						|
    assert res == "ok"
 | 
						|
    res = g.throw(RuntimeError("ciao"))
 | 
						|
    assert res == "ok"
 | 
						|
 | 
						|
    g = greenlet(f)
 | 
						|
    res = g.switch()
 | 
						|
    assert res == "ok"
 | 
						|
    res = g.throw(RuntimeError, "ciao")
 | 
						|
    assert res == "ok"
 | 
						|
 | 
						|
def test_kill():
 | 
						|
    def f():
 | 
						|
        switch("ok")
 | 
						|
        switch("fail")
 | 
						|
 | 
						|
    g = greenlet(f)
 | 
						|
    res = g.switch()
 | 
						|
    assert res == "ok"
 | 
						|
    res = g.throw()
 | 
						|
    assert isinstance(res, greenlet.GreenletExit)
 | 
						|
    assert g.dead
 | 
						|
    res = g.throw()    # immediately eaten by the already-dead greenlet
 | 
						|
    assert isinstance(res, greenlet.GreenletExit)
 | 
						|
 | 
						|
def test_throw_goes_to_original_parent():
 | 
						|
    main = greenlet.getcurrent()
 | 
						|
    def f1():
 | 
						|
        try:
 | 
						|
            main.switch("f1 ready to catch")
 | 
						|
        except IndexError:
 | 
						|
            return "caught"
 | 
						|
        else:
 | 
						|
            return "normal exit"
 | 
						|
    def f2():
 | 
						|
        main.switch("from f2")
 | 
						|
 | 
						|
    g1 = greenlet(f1)
 | 
						|
    g2 = greenlet(f2, parent=g1)
 | 
						|
    py.test.raises(IndexError, g2.throw, IndexError)
 | 
						|
    assert g2.dead
 | 
						|
    assert g1.dead
 | 
						|
 | 
						|
    g1 = greenlet(f1)
 | 
						|
    g2 = greenlet(f2, parent=g1)
 | 
						|
    res = g1.switch()
 | 
						|
    assert res == "f1 ready to catch"
 | 
						|
    res = g2.throw(IndexError)
 | 
						|
    assert res == "caught"
 | 
						|
    assert g2.dead
 | 
						|
    assert g1.dead
 | 
						|
 | 
						|
    g1 = greenlet(f1)
 | 
						|
    g2 = greenlet(f2, parent=g1)
 | 
						|
    res = g1.switch()
 | 
						|
    assert res == "f1 ready to catch"
 | 
						|
    res = g2.switch()
 | 
						|
    assert res == "from f2"
 | 
						|
    res = g2.throw(IndexError)
 | 
						|
    assert res == "caught"
 | 
						|
    assert g2.dead
 | 
						|
    assert g1.dead
 |