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])
 |