209 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
| import py
 | |
| mypath = py.magic.autopath()
 | |
| 
 | |
| def test_excinfo_simple():
 | |
|     try:
 | |
|         raise ValueError
 | |
|     except ValueError:
 | |
|         info = py.code.ExceptionInfo()
 | |
|     assert info.type == ValueError
 | |
| 
 | |
| def test_excinfo_getstatement():
 | |
|     def g():
 | |
|         raise ValueError
 | |
|     def f():
 | |
|         g()
 | |
|     try:
 | |
|         f()
 | |
|     except ValueError:
 | |
|         excinfo = py.code.ExceptionInfo()
 | |
|     linenumbers = [f.func_code.co_firstlineno-1+3,
 | |
|                    f.func_code.co_firstlineno-1+1,
 | |
|                    g.func_code.co_firstlineno-1+1,]
 | |
|     l = list(excinfo.traceback)
 | |
|     foundlinenumbers = [x.lineno for x in l]
 | |
|     print l[0].frame.statement
 | |
|     assert foundlinenumbers == linenumbers
 | |
|     #for x in info:
 | |
|     #    print "%s:%d  %s" %(x.path.relto(root), x.lineno, x.statement)
 | |
|     #xxx
 | |
| 
 | |
| # testchain for getentries test below
 | |
| def f():
 | |
|     #
 | |
|     raise ValueError
 | |
|     #
 | |
| def g():
 | |
|     #
 | |
|     __tracebackhide__ = True
 | |
|     f()
 | |
|     #
 | |
| def h():
 | |
|     #
 | |
|     g()
 | |
|     #
 | |
| 
 | |
| class TestTraceback_f_g_h: 
 | |
|     def setup_method(self, method): 
 | |
|         try:
 | |
|             h()
 | |
|         except ValueError:
 | |
|             self.excinfo = py.code.ExceptionInfo()
 | |
| 
 | |
|     def test_traceback_entries(self):
 | |
|         tb = self.excinfo.traceback 
 | |
|         entries = list(tb) 
 | |
|         assert len(tb) == 4 # maybe fragile test 
 | |
|         assert len(entries) == 4 # maybe fragile test 
 | |
|         names = ['f', 'g', 'h']
 | |
|         for entry in entries:
 | |
|             try:
 | |
|                 names.remove(entry.frame.code.name)
 | |
|             except ValueError:
 | |
|                 pass
 | |
|         assert not names
 | |
| 
 | |
|     def test_traceback_entry_getsource(self):
 | |
|         tb = self.excinfo.traceback 
 | |
|         s = str(tb[-1].getsource() )
 | |
|         assert s.startswith("def f():")
 | |
|         assert s.endswith("raise ValueError") 
 | |
| 
 | |
|     def test_traceback_entry_getsource_in_construct(self):
 | |
|         source = py.code.Source("""\
 | |
|             def xyz():
 | |
|                 try:
 | |
|                     raise ValueError
 | |
|                 except somenoname:
 | |
|                     pass
 | |
|             xyz()
 | |
|         """) 
 | |
|         try: 
 | |
|             exec source.compile()
 | |
|         except NameError: 
 | |
|             tb = py.code.ExceptionInfo().traceback 
 | |
|             print tb[-1].getsource()
 | |
|             s = str(tb[-1].getsource())
 | |
|             assert s.startswith("def xyz():\n    try:")
 | |
|             assert s.endswith("except somenoname:") 
 | |
| 
 | |
|     def test_traceback_cut(self):
 | |
|         co = py.code.Code(f)
 | |
|         path, firstlineno = co.path, co.firstlineno 
 | |
|         traceback = self.excinfo.traceback 
 | |
|         newtraceback = traceback.cut(path=path, firstlineno=firstlineno)
 | |
|         assert len(newtraceback) == 1
 | |
|         newtraceback = traceback.cut(path=path, lineno=firstlineno+2)
 | |
|         assert len(newtraceback) == 1
 | |
| 
 | |
|     def test_traceback_filter(self):
 | |
|         traceback = self.excinfo.traceback
 | |
|         ntraceback = traceback.filter()
 | |
|         assert len(ntraceback) == len(traceback) - 1
 | |
| 
 | |
|     def test_traceback_recursion_index(self):
 | |
|         def f(n):
 | |
|             if n < 10:
 | |
|                 n += 1
 | |
|             f(n)
 | |
|         excinfo = py.test.raises(RuntimeError, f, 8)
 | |
|         traceback = excinfo.traceback 
 | |
|         recindex = traceback.recursionindex() 
 | |
|         assert recindex == 3
 | |
| 
 | |
|     def test_traceback_no_recursion_index(self):
 | |
|         def do_stuff():
 | |
|             raise RuntimeError
 | |
|         def reraise_me():
 | |
|             import sys
 | |
|             exc, val, tb = sys.exc_info()
 | |
|             raise exc, val, tb
 | |
|         def f(n):
 | |
|             try:
 | |
|                 do_stuff()
 | |
|             except:
 | |
|                 reraise_me()
 | |
|         excinfo = py.test.raises(RuntimeError, f, 8)
 | |
|         traceback = excinfo.traceback 
 | |
|         recindex = traceback.recursionindex() 
 | |
|         assert recindex is None
 | |
| 
 | |
|     def test_traceback_getcrashentry(self):
 | |
|         def i():
 | |
|             __tracebackhide__ = True
 | |
|             raise ValueError 
 | |
|         def h():
 | |
|             i()
 | |
|         def g():
 | |
|             __tracebackhide__ = True
 | |
|             h()
 | |
|         def f():
 | |
|             g()
 | |
| 
 | |
|         excinfo = py.test.raises(ValueError, f)
 | |
|         tb = excinfo.traceback
 | |
|         entry = tb.getcrashentry()
 | |
|         co = py.code.Code(h)
 | |
|         assert entry.frame.code.path == co.path
 | |
|         assert entry.lineno == co.firstlineno + 1 
 | |
|         assert entry.frame.code.name == 'h'
 | |
| 
 | |
|     def test_traceback_getcrashentry_empty(self):
 | |
|         def g():
 | |
|             __tracebackhide__ = True
 | |
|             raise ValueError 
 | |
|         def f():
 | |
|             __tracebackhide__ = True
 | |
|             g()
 | |
| 
 | |
|         excinfo = py.test.raises(ValueError, f)
 | |
|         tb = excinfo.traceback
 | |
|         entry = tb.getcrashentry()
 | |
|         co = py.code.Code(g)
 | |
|         assert entry.frame.code.path == co.path
 | |
|         assert entry.lineno == co.firstlineno + 2
 | |
|         assert entry.frame.code.name == 'g'
 | |
|         
 | |
|     #def test_traceback_display_func(self):
 | |
|     #    tb = self.excinfo.traceback 
 | |
|     #    for x in tb: 
 | |
|     #        x.setdisplay(lambda entry: entry.frame.code.name + '\n')
 | |
|     ##    l = tb.display().rstrip().split('\n')
 | |
|     #    assert l == ['setup_method', 'h', 'g', 'f']
 | |
| 
 | |
| 
 | |
| def hello(x): 
 | |
|     x + 5 
 | |
| 
 | |
| def test_tbentry_reinterpret(): 
 | |
|     try: 
 | |
|         hello("hello") 
 | |
|     except TypeError: 
 | |
|         excinfo = py.code.ExceptionInfo() 
 | |
|     tbentry = excinfo.traceback[-1]
 | |
|     msg = tbentry.reinterpret() 
 | |
|     assert msg.startswith("TypeError: ('hello' + 5)") 
 | |
| 
 | |
| #def test_excinfo_getentries_type_error():
 | |
| #    excinfo = py.test.raises(ValueError, h)
 | |
| #    entries = excinfo.getentries(
 | |
| #            lambda x: x.frame.code.name != 'raises',
 | |
| #            lambda x: x.frame.code.name != 'f')
 | |
| #    names = [x.frame.code.name for x in entries]
 | |
| #    assert names == ['h','g']
 | |
| 
 | |
| def test_excinfo_exconly():
 | |
|     excinfo = py.test.raises(ValueError, h)
 | |
|     assert excinfo.exconly().startswith('ValueError')
 | |
| 
 | |
| def test_excinfo_errisinstance():
 | |
|     excinfo = py.test.raises(ValueError, h)
 | |
|     assert excinfo.errisinstance(ValueError) 
 | |
| 
 | |
| def test_excinfo_no_sourcecode():
 | |
|     try:
 | |
|         exec "raise ValueError()"
 | |
|     except ValueError: 
 | |
|         excinfo = py.code.ExceptionInfo()
 | |
|     s = str(excinfo.traceback[-1])
 |