mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.1393: insufficient testing for script debugging
Problem: Insufficient testing for script debugging.
Solution: Add more tests. (Ben Jackson)
b7f4fa5177
Check terminal feature in individual tests, not the test suite.
Avoid code coverage loss in test_debugger.vim.
This commit is contained in:
parent
1b40447df3
commit
bf6afcce20
@ -4,6 +4,17 @@ source shared.vim
|
|||||||
source screendump.vim
|
source screendump.vim
|
||||||
source check.vim
|
source check.vim
|
||||||
|
|
||||||
|
func CheckCWD()
|
||||||
|
" Check that the longer lines don't wrap due to the length of the script name
|
||||||
|
" in cwd
|
||||||
|
let script_len = len( getcwd() .. '/Xtest1.vim' )
|
||||||
|
let longest_line = len( 'Breakpoint in "" line 1' )
|
||||||
|
if script_len > ( 75 - longest_line )
|
||||||
|
throw 'Skipped: Your CWD has too many characters'
|
||||||
|
endif
|
||||||
|
endfunc
|
||||||
|
command! -nargs=0 -bar CheckCWD call CheckCWD()
|
||||||
|
|
||||||
func CheckDbgOutput(buf, lines, options = {})
|
func CheckDbgOutput(buf, lines, options = {})
|
||||||
" Verify the expected output
|
" Verify the expected output
|
||||||
let lnum = 20 - len(a:lines)
|
let lnum = 20 - len(a:lines)
|
||||||
@ -34,9 +45,7 @@ endfunc
|
|||||||
|
|
||||||
" Debugger tests
|
" Debugger tests
|
||||||
func Test_Debugger()
|
func Test_Debugger()
|
||||||
if !CanRunVimInTerminal()
|
CheckRunVimInTerminal
|
||||||
throw 'Skipped: cannot run Vim in a terminal window'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Create a Vim script with some functions
|
" Create a Vim script with some functions
|
||||||
let lines =<< trim END
|
let lines =<< trim END
|
||||||
@ -332,7 +341,7 @@ endfunc
|
|||||||
|
|
||||||
func Test_Backtrace_Through_Source()
|
func Test_Backtrace_Through_Source()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
CheckCWD
|
||||||
let file1 =<< trim END
|
let file1 =<< trim END
|
||||||
func SourceAnotherFile()
|
func SourceAnotherFile()
|
||||||
source Xtest2.vim
|
source Xtest2.vim
|
||||||
@ -393,6 +402,71 @@ func Test_Backtrace_Through_Source()
|
|||||||
\ '->0 script ' .. getcwd() .. '/Xtest2.vim',
|
\ '->0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
\ 'line 1: func DoAThing()'])
|
\ 'line 1: func DoAThing()'])
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'up' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ ' 3 function GlobalFunction[1]',
|
||||||
|
\ ' 2 CallAFunction[1]',
|
||||||
|
\ '->1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'up' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ ' 3 function GlobalFunction[1]',
|
||||||
|
\ '->2 CallAFunction[1]',
|
||||||
|
\ ' 1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'up' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ '->3 function GlobalFunction[1]',
|
||||||
|
\ ' 2 CallAFunction[1]',
|
||||||
|
\ ' 1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'up', [ 'frame at highest level: 3' ] )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ '->3 function GlobalFunction[1]',
|
||||||
|
\ ' 2 CallAFunction[1]',
|
||||||
|
\ ' 1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'down' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ ' 3 function GlobalFunction[1]',
|
||||||
|
\ '->2 CallAFunction[1]',
|
||||||
|
\ ' 1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'down' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ ' 3 function GlobalFunction[1]',
|
||||||
|
\ ' 2 CallAFunction[1]',
|
||||||
|
\ '->1 SourceAnotherFile[1]',
|
||||||
|
\ ' 0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'down' )
|
||||||
|
call RunDbgCmd( buf, 'backtrace', [
|
||||||
|
\ '>backtrace',
|
||||||
|
\ ' 3 function GlobalFunction[1]',
|
||||||
|
\ ' 2 CallAFunction[1]',
|
||||||
|
\ ' 1 SourceAnotherFile[1]',
|
||||||
|
\ '->0 script ' .. getcwd() .. '/Xtest2.vim',
|
||||||
|
\ 'line 1: func DoAThing()' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd( buf, 'down', [ 'frame is zero' ] )
|
||||||
|
|
||||||
" step until we have another meaninfgul trace
|
" step until we have another meaninfgul trace
|
||||||
call RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
|
call RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
|
call RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
|
||||||
@ -443,7 +517,7 @@ endfunc
|
|||||||
|
|
||||||
func Test_Backtrace_Autocmd()
|
func Test_Backtrace_Autocmd()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
CheckCWD
|
||||||
let file1 =<< trim END
|
let file1 =<< trim END
|
||||||
func SourceAnotherFile()
|
func SourceAnotherFile()
|
||||||
source Xtest2.vim
|
source Xtest2.vim
|
||||||
@ -606,7 +680,7 @@ endfunc
|
|||||||
|
|
||||||
func Test_Backtrace_CmdLine()
|
func Test_Backtrace_CmdLine()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
CheckCWD
|
||||||
let file1 =<< trim END
|
let file1 =<< trim END
|
||||||
func SourceAnotherFile()
|
func SourceAnotherFile()
|
||||||
source Xtest2.vim
|
source Xtest2.vim
|
||||||
@ -667,7 +741,7 @@ endfunc
|
|||||||
|
|
||||||
func Test_Backtrace_DefFunction()
|
func Test_Backtrace_DefFunction()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
CheckCWD
|
||||||
let file1 =<< trim END
|
let file1 =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
import File2Function from './Xtest2.vim'
|
import File2Function from './Xtest2.vim'
|
||||||
@ -758,6 +832,199 @@ func Test_Backtrace_DefFunction()
|
|||||||
call delete('Xtest2.vim')
|
call delete('Xtest2.vim')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_debug_backtrace_level()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
CheckCWD
|
||||||
|
let lines =<< trim END
|
||||||
|
let s:file1_var = 'file1'
|
||||||
|
let g:global_var = 'global'
|
||||||
|
|
||||||
|
func s:File1Func( arg )
|
||||||
|
let s:file1_var .= a:arg
|
||||||
|
let local_var = s:file1_var .. ' test1'
|
||||||
|
let g:global_var .= local_var
|
||||||
|
source Xtest2.vim
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
call s:File1Func( 'arg1' )
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xtest1.vim')
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
let s:file2_var = 'file2'
|
||||||
|
|
||||||
|
func s:File2Func( arg )
|
||||||
|
let s:file2_var .= a:arg
|
||||||
|
let local_var = s:file2_var .. ' test2'
|
||||||
|
let g:global_var .= local_var
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
call s:File2Func( 'arg2' )
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xtest2.vim')
|
||||||
|
|
||||||
|
let file1 = getcwd() .. '/Xtest1.vim'
|
||||||
|
let file2 = getcwd() .. '/Xtest2.vim'
|
||||||
|
|
||||||
|
" set a breakpoint and source file1.vim
|
||||||
|
let buf = RunVimInTerminal(
|
||||||
|
\ '-c "breakadd file 1 Xtest1.vim" -S Xtest1.vim',
|
||||||
|
\ #{ wait_for_ruler: 0 } )
|
||||||
|
|
||||||
|
call CheckDbgOutput(buf, [
|
||||||
|
\ 'Breakpoint in "' .. file1 .. '" line 1',
|
||||||
|
\ 'Entering Debug mode. Type "cont" to continue.',
|
||||||
|
\ 'command line..script ' .. file1,
|
||||||
|
\ 'line 1: let s:file1_var = ''file1'''
|
||||||
|
\ ])
|
||||||
|
|
||||||
|
" step throught the initial declarations
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 2: let g:global_var = ''global''' ] )
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 4: func s:File1Func( arg )' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo global_var', [ 'global' ] )
|
||||||
|
|
||||||
|
" step in to the first function
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 11: call s:File1Func( ''arg1'' )' ] )
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 1: let s:file1_var .= a:arg' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo global_var',
|
||||||
|
\[ 'E121: Undefined variable: global_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo local_var',
|
||||||
|
\[ 'E121: Undefined variable: local_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo l:local_var',
|
||||||
|
\[ 'E121: Undefined variable: l:local_var' ] )
|
||||||
|
|
||||||
|
" backtrace up
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 2 command line',
|
||||||
|
\ '\V 1 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V->0 function <SNR>\.\*_File1Func',
|
||||||
|
\ '\Vline 1: let s:file1_var .= a:arg',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
call RunDbgCmd(buf, 'up', [ '>up' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 2 command line',
|
||||||
|
\ '\V->1 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V 0 function <SNR>\.\*_File1Func',
|
||||||
|
\ '\Vline 1: let s:file1_var .= a:arg',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
|
||||||
|
" Expression evaluation in the script frame (not the function frame)
|
||||||
|
" FIXME: Unexpected in this scope (a: should not be visibnle)
|
||||||
|
call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
|
||||||
|
" FIXME: Unexpected in this scope (global should be found)
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo global_var',
|
||||||
|
\[ 'E121: Undefined variable: global_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo local_var',
|
||||||
|
\[ 'E121: Undefined variable: local_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo l:local_var',
|
||||||
|
\[ 'E121: Undefined variable: l:local_var' ] )
|
||||||
|
|
||||||
|
|
||||||
|
" step while backtraced jumps to the latest frame
|
||||||
|
call RunDbgCmd(buf, 'step', [
|
||||||
|
\ 'line 2: let local_var = s:file1_var .. '' test1''' ] )
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 2 command line',
|
||||||
|
\ '\V 1 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V->0 function <SNR>\.\*_File1Func',
|
||||||
|
\ '\Vline 2: let local_var = s:file1_var .. '' test1''',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 3: let g:global_var .= local_var' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo local_var', [ 'file1arg1 test1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo l:local_var', [ 'file1arg1 test1' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 4: source Xtest2.vim' ] )
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 1: let s:file2_var = ''file2''' ] )
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 3 command line',
|
||||||
|
\ '\V 2 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V 1 function <SNR>\.\*_File1Func[4]',
|
||||||
|
\ '\V->0 script ' .. file2,
|
||||||
|
\ '\Vline 1: let s:file2_var = ''file2''',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
|
||||||
|
" Expression evaluation in the script frame file2 (not the function frame)
|
||||||
|
call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\ 'echo s:file1_var',
|
||||||
|
\ [ 'E121: Undefined variable: s:file1_var' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo g:global_var', [ 'globalfile1arg1 test1' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo global_var', [ 'globalfile1arg1 test1' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo local_var',
|
||||||
|
\[ 'E121: Undefined variable: local_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\'echo l:local_var',
|
||||||
|
\[ 'E121: Undefined variable: l:local_var' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\ 'echo s:file2_var',
|
||||||
|
\ [ 'E121: Undefined variable: s:file2_var' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd(buf, 'step', [ 'line 3: func s:File2Func( arg )' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] )
|
||||||
|
|
||||||
|
" Up the stack to the other script context
|
||||||
|
call RunDbgCmd(buf, 'up')
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 3 command line',
|
||||||
|
\ '\V 2 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V->1 function <SNR>\.\*_File1Func[4]',
|
||||||
|
\ '\V 0 script ' .. file2,
|
||||||
|
\ '\Vline 3: func s:File2Func( arg )',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
" FIXME: Unexpected. Should see the a: and l: dicts from File1Func
|
||||||
|
call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] )
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\ 'echo l:local_var',
|
||||||
|
\ [ 'E121: Undefined variable: l:local_var' ] )
|
||||||
|
|
||||||
|
call RunDbgCmd(buf, 'up')
|
||||||
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
|
\ '\V>backtrace',
|
||||||
|
\ '\V 3 command line',
|
||||||
|
\ '\V->2 script ' .. file1 .. '[11]',
|
||||||
|
\ '\V 1 function <SNR>\.\*_File1Func[4]',
|
||||||
|
\ '\V 0 script ' .. file2,
|
||||||
|
\ '\Vline 3: func s:File2Func( arg )',
|
||||||
|
\ ],
|
||||||
|
\ #{ match: 'pattern' } )
|
||||||
|
|
||||||
|
" FIXME: Unexpected (wrong script vars are used)
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\ 'echo s:file1_var',
|
||||||
|
\ [ 'E121: Undefined variable: s:file1_var' ] )
|
||||||
|
call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] )
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('Xtest1.vim')
|
||||||
|
call delete('Xtest2.vim')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for setting a breakpoint on a :endif where the :if condition is false
|
" Test for setting a breakpoint on a :endif where the :if condition is false
|
||||||
" and then quit the script. This should generate an interrupt.
|
" and then quit the script. This should generate an interrupt.
|
||||||
func Test_breakpt_endif_intr()
|
func Test_breakpt_endif_intr()
|
||||||
|
Loading…
Reference in New Issue
Block a user