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
 |