Patch 9.0.1570
Problem:    Some tests are slow.
Solution:   Make a few test cases faster.
Files:      src/testdir/test_cmdline.vim, src/testdir/test_codestyle.vim,
            src/testdir/test_debugger.vim, src/testdir/test_filetype.vim


*** ../vim-9.0.1569/src/testdir/test_cmdline.vim        2023-04-17 
16:40:54.724586083 +0100
--- src/testdir/test_cmdline.vim        2023-05-19 20:24:12.757768306 +0100
***************
*** 791,800 ****
  endfunc
  
  func Test_expand_star_star()
!   call mkdir('a/b', 'pR')
!   call writefile(['asdfasdf'], 'a/b/fileXname')
!   call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt')
!   call assert_equal('find a/b/fileXname', @:)
    bwipe!
  endfunc
  
--- 791,800 ----
  endfunc
  
  func Test_expand_star_star()
!   call mkdir('a/b/c', 'pR')
!   call writefile(['asdfasdf'], 'a/b/c/fileXname')
!   call feedkeys(":find a/**/fileXname\<Tab>\<CR>", 'xt')
!   call assert_equal('find a/b/c/fileXname', @:)
    bwipe!
  endfunc
  
*** ../vim-9.0.1569/src/testdir/test_codestyle.vim      2023-05-09 
14:59:55.960088968 +0100
--- src/testdir/test_codestyle.vim      2023-05-19 20:41:15.034933084 +0100
***************
*** 2,7 ****
--- 2,8 ----
  
  def Test_source_files()
    for fname in glob('../*.[ch]', 0, 1)
+     bwipe!
      exe 'edit ' .. fname
  
      cursor(1, 1)
***************
*** 26,36 ****
      lnum = search(')\s*{', '', 0, 0, skip)
      assert_equal(0, lnum, fname .. ': curly after closing paren')
  
-     cursor(1, 1)
      # Examples in comments use double quotes.
      skip = "getline('.') =~ '\"'"
!     # Avoid examples that contain: "} else
!     lnum = search('[^"]}\s*else', '', 0, 0, skip)
      assert_equal(0, lnum, fname .. ': curly before "else"')
  
      cursor(1, 1)
--- 27,37 ----
      lnum = search(')\s*{', '', 0, 0, skip)
      assert_equal(0, lnum, fname .. ': curly after closing paren')
  
      # Examples in comments use double quotes.
      skip = "getline('.') =~ '\"'"
! 
!     cursor(1, 1)
!     lnum = search('}\s*else', '', 0, 0, skip)
      assert_equal(0, lnum, fname .. ': curly before "else"')
  
      cursor(1, 1)
*** ../vim-9.0.1569/src/testdir/test_debugger.vim       2022-10-07 
18:51:20.139679475 +0100
--- src/testdir/test_debugger.vim       2023-05-19 21:30:09.125965047 +0100
***************
*** 20,58 ****
  " "options" argument can contain:
  " 'msec' - time to wait for a match
  " 'match' - "pattern" to use "lines" as pattern instead of text
! func CheckDbgOutput(buf, lines, options = {})
!   " Verify the expected output
!   let lnum = 20 - len(a:lines)
!   let msec = get(a:options, 'msec', 1000)
!   for l in a:lines
!     if get(a:options, 'match', 'equal') ==# 'pattern'
!       call WaitForAssert({-> assert_match(l, term_getline(a:buf, lnum))}, 
msec)
      else
!       call WaitForAssert({-> assert_equal(l, term_getline(a:buf, lnum))}, 
msec)
      endif
!     let lnum += 1
    endfor
! endfunc
  
  " Run a Vim debugger command
  " If the expected output argument is supplied, then check for it.
! func RunDbgCmd(buf, cmd, ...)
!   call term_sendkeys(a:buf, a:cmd . "\r")
!   call TermWait(a:buf)
! 
!   if a:0 != 0
!     let options = #{match: 'equal'}
!     if a:0 > 1
!       call extend(options, a:2)
      endif
!     call CheckDbgOutput(a:buf, a:1, options)
    endif
! endfunc
  
  " Debugger tests
! func Test_Debugger()
!   " Create a Vim script with some functions
!   let lines =<< trim END
        func Foo()
          let var1 = 1
          let var2 = Bar(var1) + 9
--- 20,58 ----
  " "options" argument can contain:
  " 'msec' - time to wait for a match
  " 'match' - "pattern" to use "lines" as pattern instead of text
! def s:CheckDbgOutput(buf: number, lines: list<string>, options = {})
!   # Verify the expected output
!   var lnum = 20 - len(lines)
!   var msec = get(options, 'msec', 1000)
!   for l in lines
!     if get(options, 'match', 'equal') ==# 'pattern'
!       g:WaitForAssert(() => assert_match(l, term_getline(buf, lnum)), msec)
      else
!       g:WaitForAssert(() => assert_equal(l, term_getline(buf, lnum)), msec)
      endif
!     lnum += 1
    endfor
! enddef
  
  " Run a Vim debugger command
  " If the expected output argument is supplied, then check for it.
! def s:RunDbgCmd(buf: number, cmd: string, ...extra: list<any>)
!   term_sendkeys(buf, cmd .. "\r")
!   g:TermWait(buf)
! 
!   if len(extra) > 0
!     var options = {match: 'equal'}
!     if len(extra) > 1
!       extend(options, extra[1])
      endif
!     s:CheckDbgOutput(buf, extra[0], options)
    endif
! enddef
  
  " Debugger tests
! def Test_Debugger()
!   # Create a Vim script with some functions
!   var lines =<< trim END
        func Foo()
          let var1 = 1
          let var2 = Bar(var1) + 9
***************
*** 81,337 ****
            endfor
          enddef
    END
!   call writefile(lines, 'XtestDebug.vim', 'D')
  
!   " Start Vim in a terminal
!   let buf = RunVimInTerminal('-S XtestDebug.vim', {})
  
!   " Start the Vim debugger
!   call RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()'])
  
!   " Create a few stack frames by stepping through functions
!   call RunDbgCmd(buf, 'step', ['line 1: let var1 = 1'])
!   call RunDbgCmd(buf, 'step', ['line 2: let var2 = Bar(var1) + 9'])
!   call RunDbgCmd(buf, 'step', ['line 1: let var1 = 2 + a:var'])
!   call RunDbgCmd(buf, 'step', ['line 2: let var2 = Bazz(var1) + 4'])
!   call RunDbgCmd(buf, 'step', ['line 1: try'])
!   call RunDbgCmd(buf, 'step', ['line 2: let var1 = 3 + a:var'])
!   call RunDbgCmd(buf, 'step', ['line 3: let var3 = "another var"'])
! 
!   " check backtrace
!   call RunDbgCmd(buf, 'backtrace', [
!             \ '  2 function Foo[2]',
!             \ '  1 Bar[2]',
!             \ '->0 Bazz',
!             \ 'line 3: let var3 = "another var"'])
! 
!   " Check variables in different stack frames
!   call RunDbgCmd(buf, 'echo var1', ['6'])
! 
!   call RunDbgCmd(buf, 'up')
!   call RunDbgCmd(buf, 'back', [
!             \ '  2 function Foo[2]',
!             \ '->1 Bar[2]',
!             \ '  0 Bazz',
!             \ 'line 3: let var3 = "another var"'])
!   call RunDbgCmd(buf, 'echo var1', ['3'])
! 
!   call RunDbgCmd(buf, 'u')
!   call RunDbgCmd(buf, 'bt', [
!             \ '->2 function Foo[2]',
!             \ '  1 Bar[2]',
!             \ '  0 Bazz',
!             \ 'line 3: let var3 = "another var"'])
!   call RunDbgCmd(buf, 'echo var1', ['1'])
! 
!   " Undefined variables
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'frame 2')
!   call RunDbgCmd(buf, 'echo var3', [
!       \ 'Error detected while processing function Foo[2]..Bar[2]..Bazz:',
!       \ 'line    4:',
!       \ 'E121: Undefined variable: var3'])
! 
!   " var3 is defined in this level with some other value
!   call RunDbgCmd(buf, 'fr 0')
!   call RunDbgCmd(buf, 'echo var3', ['another var'])
! 
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, '')
!   call RunDbgCmd(buf, '')
!   call RunDbgCmd(buf, '')
!   call RunDbgCmd(buf, '')
!   call RunDbgCmd(buf, 'step', [
!             \ 'function Foo[2]..Bar',
!             \ 'line 3: End of function'])
!   call RunDbgCmd(buf, 'up')
! 
!   " Undefined var2
!   call RunDbgCmd(buf, 'echo var2', [
!             \ 'Error detected while processing function Foo[2]..Bar:',
!             \ 'line    3:',
!             \ 'E121: Undefined variable: var2'])
! 
!   " Var2 is defined with 10
!   call RunDbgCmd(buf, 'down')
!   call RunDbgCmd(buf, 'echo var2', ['10'])
! 
!   " Backtrace movements
!   call RunDbgCmd(buf, 'b', [
!             \ '  1 function Foo[2]',
!             \ '->0 Bar',
!             \ 'line 3: End of function'])
! 
!   " next command cannot go down, we are on bottom
!   call RunDbgCmd(buf, 'down', ['frame is zero'])
!   call RunDbgCmd(buf, 'up')
! 
!   " next command cannot go up, we are on top
!   call RunDbgCmd(buf, 'up', ['frame at highest level: 1'])
!   call RunDbgCmd(buf, 'where', [
!             \ '->1 function Foo[2]',
!             \ '  0 Bar',
!             \ 'line 3: End of function'])
! 
!   " fil is not frame or finish, it is file
!   call RunDbgCmd(buf, 'fil', ['"[No Name]" --No lines in buffer--'])
! 
!   " relative backtrace movement
!   call RunDbgCmd(buf, 'fr -1')
!   call RunDbgCmd(buf, 'frame', [
!             \ '  1 function Foo[2]',
!             \ '->0 Bar',
!             \ 'line 3: End of function'])
! 
!   call RunDbgCmd(buf, 'fr +1')
!   call RunDbgCmd(buf, 'fram', [
!             \ '->1 function Foo[2]',
!             \ '  0 Bar',
!             \ 'line 3: End of function'])
! 
!   " go beyond limits does not crash
!   call RunDbgCmd(buf, 'fr 100', ['frame at highest level: 1'])
!   call RunDbgCmd(buf, 'fra', [
!             \ '->1 function Foo[2]',
!             \ '  0 Bar',
!             \ 'line 3: End of function'])
! 
!   call RunDbgCmd(buf, 'frame -40', ['frame is zero'])
!   call RunDbgCmd(buf, 'fram', [
!             \ '  1 function Foo[2]',
!             \ '->0 Bar',
!             \ 'line 3: End of function'])
! 
!   " final result 19
!   call RunDbgCmd(buf, 'cont', ['19'])
! 
!   " breakpoints tests
! 
!   " Start a debug session, so that reading the last line from the terminal
!   " works properly.
!   call RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()'])
! 
!   " No breakpoints
!   call RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   " Place some breakpoints
!   call RunDbgCmd(buf, 'breaka func Bar')
!   call RunDbgCmd(buf, 'breaklis', ['  1  func Bar  line 1'])
!   call RunDbgCmd(buf, 'breakadd func 3 Bazz')
!   call RunDbgCmd(buf, 'breaklist', ['  1  func Bar  line 1',
!             \ '  2  func Bazz  line 3'])
! 
!   " Check whether the breakpoints are hit
!   call RunDbgCmd(buf, 'cont', [
!             \ 'Breakpoint in "Bar" line 1',
!             \ 'function Foo[2]..Bar',
!             \ 'line 1: let var1 = 2 + a:var'])
!   call RunDbgCmd(buf, 'cont', [
!             \ 'Breakpoint in "Bazz" line 3',
!             \ 'function Foo[2]..Bar[2]..Bazz',
!             \ 'line 3: let var3 = "another var"'])
! 
!   " Delete the breakpoints
!   call RunDbgCmd(buf, 'breakd 1')
!   call RunDbgCmd(buf, 'breakli', ['  2  func Bazz  line 3'])
!   call RunDbgCmd(buf, 'breakdel func 3 Bazz')
!   call RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   call RunDbgCmd(buf, 'cont')
! 
!   " Make sure the breakpoints are removed
!   call RunDbgCmd(buf, ':echo Foo()', ['19'])
! 
!   " Delete a non-existing breakpoint
!   call RunDbgCmd(buf, ':breakdel 2', ['E161: Breakpoint not found: 2'])
! 
!   " Expression breakpoint
!   call RunDbgCmd(buf, ':breakadd func 2 Bazz')
!   call RunDbgCmd(buf, ':echo Bazz(1)', [
!             \ 'Entering Debug mode.  Type "cont" to continue.',
!             \ 'function Bazz',
!             \ 'line 2: let var1 = 3 + a:var'])
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'breaka expr var3')
!   call RunDbgCmd(buf, 'breakl', ['  3  func Bazz  line 2',
              \ '  4  expr var3'])
!   call RunDbgCmd(buf, 'cont', ['Breakpoint in "Bazz" line 5',
!             \ 'Oldval = "''another var''"',
!             \ 'Newval = "''value2''"',
!             \ 'function Bazz',
!             \ 'line 5: catch'])
! 
!   call RunDbgCmd(buf, 'breakdel *')
!   call RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   " Check for error cases
!   call RunDbgCmd(buf, 'breakadd abcd', [
!             \ 'Error detected while processing function Bazz:',
!             \ 'line    5:',
!             \ 'E475: Invalid argument: abcd'])
!   call RunDbgCmd(buf, 'breakadd func', ['E475: Invalid argument: func'])
!   call RunDbgCmd(buf, 'breakadd func 2', ['E475: Invalid argument: func 2'])
!   call RunDbgCmd(buf, 'breaka func a()', ['E475: Invalid argument: func a()'])
!   call RunDbgCmd(buf, 'breakd abcd', ['E475: Invalid argument: abcd'])
!   call RunDbgCmd(buf, 'breakd func', ['E475: Invalid argument: func'])
!   call RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()'])
!   call RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a'])
!   call RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr'])
!   call RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x'])
! 
!   " finish the current function
!   call RunDbgCmd(buf, 'finish', [
!             \ 'function Bazz',
!             \ 'line 8: End of function'])
!   call RunDbgCmd(buf, 'cont')
! 
!   " Test for :next
!   call RunDbgCmd(buf, ':debug echo Bar(1)')
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'next')
!   call RunDbgCmd(buf, '', [
!             \ 'function Bar',
!             \ 'line 3: return var2'])
!   call RunDbgCmd(buf, 'c')
! 
!   " Test for :interrupt
!   call RunDbgCmd(buf, ':debug echo Bazz(1)')
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'step')
!   call RunDbgCmd(buf, 'interrupt', [
!             \ 'Exception thrown: Vim:Interrupt',
!             \ 'function Bazz',
!             \ 'line 5: catch'])
!   call RunDbgCmd(buf, 'c')
! 
!   " Test showing local variable in :def function
!   call RunDbgCmd(buf, ':breakadd func 2 Vim9Func')
!   call RunDbgCmd(buf, ':call Vim9Func()', ['line 2:             for _ in [1, 
2]'])
!   call RunDbgCmd(buf, 'next', ['line 2: for _ in [1, 2]'])
!   call RunDbgCmd(buf, 'echo cmd', ['confirm'])
!   call RunDbgCmd(buf, 'breakdel *')
!   call RunDbgCmd(buf, 'cont')
! 
!   " Test for :quit
!   call RunDbgCmd(buf, ':debug echo Foo()')
!   call RunDbgCmd(buf, 'breakdel *')
!   call RunDbgCmd(buf, 'breakadd func 3 Foo')
!   call RunDbgCmd(buf, 'breakadd func 3 Bazz')
!   call RunDbgCmd(buf, 'cont', [
!             \ 'Breakpoint in "Bazz" line 3',
!             \ 'function Foo[2]..Bar[2]..Bazz',
!             \ 'line 3: let var3 = "another var"'])
!   call RunDbgCmd(buf, 'quit', [
!             \ 'Breakpoint in "Foo" line 3',
!             \ 'function Foo',
!             \ 'line 3: return var2'])
!   call RunDbgCmd(buf, 'breakdel *')
!   call RunDbgCmd(buf, 'quit')
!   call RunDbgCmd(buf, 'enew! | only!')
  
!   call StopVimInTerminal(buf)
! endfunc
  
  func Test_Debugger_breakadd()
    " Tests for :breakadd file and :breakadd here
--- 81,337 ----
            endfor
          enddef
    END
!   writefile(lines, 'XtestDebug.vim', 'D')
  
!   # Start Vim in a terminal
!   var buf = g:RunVimInTerminal('-S XtestDebug.vim', {})
  
!   # Start the Vim debugger
!   s:RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()'])
  
!   # Create a few stack frames by stepping through functions
!   s:RunDbgCmd(buf, 'step', ['line 1: let var1 = 1'])
!   s:RunDbgCmd(buf, 'step', ['line 2: let var2 = Bar(var1) + 9'])
!   s:RunDbgCmd(buf, 'step', ['line 1: let var1 = 2 + a:var'])
!   s:RunDbgCmd(buf, 'step', ['line 2: let var2 = Bazz(var1) + 4'])
!   s:RunDbgCmd(buf, 'step', ['line 1: try'])
!   s:RunDbgCmd(buf, 'step', ['line 2: let var1 = 3 + a:var'])
!   s:RunDbgCmd(buf, 'step', ['line 3: let var3 = "another var"'])
! 
!   # check backtrace
!   s:RunDbgCmd(buf, 'backtrace', [
!             '  2 function Foo[2]',
!             '  1 Bar[2]',
!             '->0 Bazz',
!             'line 3: let var3 = "another var"'])
! 
!   # Check variables in different stack frames
!   s:RunDbgCmd(buf, 'echo var1', ['6'])
! 
!   s:RunDbgCmd(buf, 'up')
!   s:RunDbgCmd(buf, 'back', [
!             '  2 function Foo[2]',
!             '->1 Bar[2]',
!             '  0 Bazz',
!             'line 3: let var3 = "another var"'])
!   s:RunDbgCmd(buf, 'echo var1', ['3'])
! 
!   s:RunDbgCmd(buf, 'u')
!   s:RunDbgCmd(buf, 'bt', [
!             '->2 function Foo[2]',
!             '  1 Bar[2]',
!             '  0 Bazz',
!             'line 3: let var3 = "another var"'])
!   s:RunDbgCmd(buf, 'echo var1', ['1'])
! 
!   # Undefined variables
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'frame 2')
!   s:RunDbgCmd(buf, 'echo var3', [
!       'Error detected while processing function Foo[2]..Bar[2]..Bazz:',
!       'line    4:',
!       'E121: Undefined variable: var3'])
! 
!   # var3 is defined in this level with some other value
!   s:RunDbgCmd(buf, 'fr 0')
!   s:RunDbgCmd(buf, 'echo var3', ['another var'])
! 
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, '')
!   s:RunDbgCmd(buf, '')
!   s:RunDbgCmd(buf, '')
!   s:RunDbgCmd(buf, '')
!   s:RunDbgCmd(buf, 'step', [
!             'function Foo[2]..Bar',
!             'line 3: End of function'])
!   s:RunDbgCmd(buf, 'up')
! 
!   # Undefined var2
!   s:RunDbgCmd(buf, 'echo var2', [
!             'Error detected while processing function Foo[2]..Bar:',
!             'line    3:',
!             'E121: Undefined variable: var2'])
! 
!   # Var2 is defined with 10
!   s:RunDbgCmd(buf, 'down')
!   s:RunDbgCmd(buf, 'echo var2', ['10'])
! 
!   # Backtrace movements
!   s:RunDbgCmd(buf, 'b', [
!             '  1 function Foo[2]',
!             '->0 Bar',
!             'line 3: End of function'])
! 
!   # next command cannot go down, we are on bottom
!   s:RunDbgCmd(buf, 'down', ['frame is zero'])
!   s:RunDbgCmd(buf, 'up')
! 
!   # next command cannot go up, we are on top
!   s:RunDbgCmd(buf, 'up', ['frame at highest level: 1'])
!   s:RunDbgCmd(buf, 'where', [
!             '->1 function Foo[2]',
!             '  0 Bar',
!             'line 3: End of function'])
! 
!   # fil is not frame or finish, it is file
!   s:RunDbgCmd(buf, 'fil', ['"[No Name]" --No lines in buffer--'])
! 
!   # relative backtrace movement
!   s:RunDbgCmd(buf, 'fr -1')
!   s:RunDbgCmd(buf, 'frame', [
!             '  1 function Foo[2]',
!             '->0 Bar',
!             'line 3: End of function'])
! 
!   s:RunDbgCmd(buf, 'fr +1')
!   s:RunDbgCmd(buf, 'fram', [
!             '->1 function Foo[2]',
!             '  0 Bar',
!             'line 3: End of function'])
! 
!   # go beyond limits does not crash
!   s:RunDbgCmd(buf, 'fr 100', ['frame at highest level: 1'])
!   s:RunDbgCmd(buf, 'fra', [
!             '->1 function Foo[2]',
!             '  0 Bar',
!             'line 3: End of function'])
! 
!   s:RunDbgCmd(buf, 'frame -40', ['frame is zero'])
!   s:RunDbgCmd(buf, 'fram', [
!             '  1 function Foo[2]',
!             '->0 Bar',
!             'line 3: End of function'])
! 
!   # final result 19
!   s:RunDbgCmd(buf, 'cont', ['19'])
! 
!   # breakpoints tests
! 
!   # Start a debug session, so that reading the last line from the terminal
!   # works properly.
!   s:RunDbgCmd(buf, ':debug echo Foo()', ['cmd: echo Foo()'])
! 
!   # No breakpoints
!   s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   # Place some breakpoints
!   s:RunDbgCmd(buf, 'breaka func Bar')
!   s:RunDbgCmd(buf, 'breaklis', ['  1  func Bar  line 1'])
!   s:RunDbgCmd(buf, 'breakadd func 3 Bazz')
!   s:RunDbgCmd(buf, 'breaklist', ['  1  func Bar  line 1',
!             '  2  func Bazz  line 3'])
! 
!   # Check whether the breakpoints are hit
!   s:RunDbgCmd(buf, 'cont', [
!             'Breakpoint in "Bar" line 1',
!             'function Foo[2]..Bar',
!             'line 1: let var1 = 2 + a:var'])
!   s:RunDbgCmd(buf, 'cont', [
!             'Breakpoint in "Bazz" line 3',
!             'function Foo[2]..Bar[2]..Bazz',
!             'line 3: let var3 = "another var"'])
! 
!   # Delete the breakpoints
!   s:RunDbgCmd(buf, 'breakd 1')
!   s:RunDbgCmd(buf, 'breakli', ['  2  func Bazz  line 3'])
!   s:RunDbgCmd(buf, 'breakdel func 3 Bazz')
!   s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   s:RunDbgCmd(buf, 'cont')
! 
!   # Make sure the breakpoints are removed
!   s:RunDbgCmd(buf, ':echo Foo()', ['19'])
! 
!   # Delete a non-existing breakpoint
!   s:RunDbgCmd(buf, ':breakdel 2', ['E161: Breakpoint not found: 2'])
! 
!   # Expression breakpoint
!   s:RunDbgCmd(buf, ':breakadd func 2 Bazz')
!   s:RunDbgCmd(buf, ':echo Bazz(1)', [
!             'Entering Debug mode.  Type "cont" to continue.',
!             'function Bazz',
!             'line 2: let var1 = 3 + a:var'])
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'breaka expr var3')
!   s:RunDbgCmd(buf, 'breakl', ['  3  func Bazz  line 2',
              \ '  4  expr var3'])
!   s:RunDbgCmd(buf, 'cont', ['Breakpoint in "Bazz" line 5',
!             'Oldval = "''another var''"',
!             'Newval = "''value2''"',
!             'function Bazz',
!             'line 5: catch'])
! 
!   s:RunDbgCmd(buf, 'breakdel *')
!   s:RunDbgCmd(buf, 'breakl', ['No breakpoints defined'])
! 
!   # Check for error cases
!   s:RunDbgCmd(buf, 'breakadd abcd', [
!             'Error detected while processing function Bazz:',
!             'line    5:',
!             'E475: Invalid argument: abcd'])
!   s:RunDbgCmd(buf, 'breakadd func', ['E475: Invalid argument: func'])
!   s:RunDbgCmd(buf, 'breakadd func 2', ['E475: Invalid argument: func 2'])
!   s:RunDbgCmd(buf, 'breaka func a()', ['E475: Invalid argument: func a()'])
!   s:RunDbgCmd(buf, 'breakd abcd', ['E475: Invalid argument: abcd'])
!   s:RunDbgCmd(buf, 'breakd func', ['E475: Invalid argument: func'])
!   s:RunDbgCmd(buf, 'breakd func a()', ['E475: Invalid argument: func a()'])
!   s:RunDbgCmd(buf, 'breakd func a', ['E161: Breakpoint not found: func a'])
!   s:RunDbgCmd(buf, 'breakd expr', ['E475: Invalid argument: expr'])
!   s:RunDbgCmd(buf, 'breakd expr x', ['E161: Breakpoint not found: expr x'])
! 
!   # finish the current function
!   s:RunDbgCmd(buf, 'finish', [
!             'function Bazz',
!             'line 8: End of function'])
!   s:RunDbgCmd(buf, 'cont')
! 
!   # Test for :next
!   s:RunDbgCmd(buf, ':debug echo Bar(1)')
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'next')
!   s:RunDbgCmd(buf, '', [
!             'function Bar',
!             'line 3: return var2'])
!   s:RunDbgCmd(buf, 'c')
! 
!   # Test for :interrupt
!   s:RunDbgCmd(buf, ':debug echo Bazz(1)')
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'step')
!   s:RunDbgCmd(buf, 'interrupt', [
!             'Exception thrown: Vim:Interrupt',
!             'function Bazz',
!             'line 5: catch'])
!   s:RunDbgCmd(buf, 'c')
! 
!   # Test showing local variable in :def function
!   s:RunDbgCmd(buf, ':breakadd func 2 Vim9Func')
!   s:RunDbgCmd(buf, ':call Vim9Func()', ['line 2:             for _ in [1, 
2]'])
!   s:RunDbgCmd(buf, 'next', ['line 2: for _ in [1, 2]'])
!   s:RunDbgCmd(buf, 'echo cmd', ['confirm'])
!   s:RunDbgCmd(buf, 'breakdel *')
!   s:RunDbgCmd(buf, 'cont')
! 
!   # Test for :quit
!   s:RunDbgCmd(buf, ':debug echo Foo()')
!   s:RunDbgCmd(buf, 'breakdel *')
!   s:RunDbgCmd(buf, 'breakadd func 3 Foo')
!   s:RunDbgCmd(buf, 'breakadd func 3 Bazz')
!   s:RunDbgCmd(buf, 'cont', [
!             'Breakpoint in "Bazz" line 3',
!             'function Foo[2]..Bar[2]..Bazz',
!             'line 3: let var3 = "another var"'])
!   s:RunDbgCmd(buf, 'quit', [
!             'Breakpoint in "Foo" line 3',
!             'function Foo',
!             'line 3: return var2'])
!   s:RunDbgCmd(buf, 'breakdel *')
!   s:RunDbgCmd(buf, 'quit')
!   s:RunDbgCmd(buf, 'enew! | only!')
  
!   g:StopVimInTerminal(buf)
! enddef
  
  func Test_Debugger_breakadd()
    " Tests for :breakadd file and :breakadd here
***************
*** 347,357 ****
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('XdebugBreakadd.vim', {})
!   call RunDbgCmd(buf, ':breakadd file 2 XdebugBreakadd.vim')
!   call RunDbgCmd(buf, ':4 | breakadd here')
!   call RunDbgCmd(buf, ':source XdebugBreakadd.vim', ['line 2: let var2 = 20'])
!   call RunDbgCmd(buf, 'cont', ['line 4: let var4 = 40'])
!   call RunDbgCmd(buf, 'cont')
  
    call StopVimInTerminal(buf)
  
--- 347,357 ----
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('XdebugBreakadd.vim', {})
!   call s:RunDbgCmd(buf, ':breakadd file 2 XdebugBreakadd.vim')
!   call s:RunDbgCmd(buf, ':4 | breakadd here')
!   call s:RunDbgCmd(buf, ':source XdebugBreakadd.vim', ['line 2: let var2 = 
20'])
!   call s:RunDbgCmd(buf, 'cont', ['line 4: let var4 = 40'])
!   call s:RunDbgCmd(buf, 'cont')
  
    call StopVimInTerminal(buf)
  
***************
*** 372,395 ****
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('XdebugBreakExpr.vim', {})
!   call RunDbgCmd(buf, ':let g:Xtest_var = 10')
!   call RunDbgCmd(buf, ':breakadd expr g:Xtest_var')
!   call RunDbgCmd(buf, ':source %')
    let expected =<< trim eval END
      Oldval = "10"
      Newval = "11"
      {fnamemodify('XdebugBreakExpr.vim', ':p')}
      line 1: let g:Xtest_var += 1
    END
!   call RunDbgCmd(buf, ':source %', expected)
!   call RunDbgCmd(buf, 'cont')
    let expected =<< trim eval END
      Oldval = "11"
      Newval = "12"
      {fnamemodify('XdebugBreakExpr.vim', ':p')}
      line 1: let g:Xtest_var += 1
    END
!   call RunDbgCmd(buf, ':source %', expected)
  
    call StopVimInTerminal(buf)
  endfunc
--- 372,395 ----
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('XdebugBreakExpr.vim', {})
!   call s:RunDbgCmd(buf, ':let g:Xtest_var = 10')
!   call s:RunDbgCmd(buf, ':breakadd expr g:Xtest_var')
!   call s:RunDbgCmd(buf, ':source %')
    let expected =<< trim eval END
      Oldval = "10"
      Newval = "11"
      {fnamemodify('XdebugBreakExpr.vim', ':p')}
      line 1: let g:Xtest_var += 1
    END
!   call s:RunDbgCmd(buf, ':source %', expected)
!   call s:RunDbgCmd(buf, 'cont')
    let expected =<< trim eval END
      Oldval = "11"
      Newval = "12"
      {fnamemodify('XdebugBreakExpr.vim', ':p')}
      line 1: let g:Xtest_var += 1
    END
!   call s:RunDbgCmd(buf, ':source %', expected)
  
    call StopVimInTerminal(buf)
  endfunc
***************
*** 411,419 ****
    call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50)
  
    # Despite the failure the functions are defined
!   g:RunDbgCmd(buf, ':function g:EarlyFunc',
       ['function EarlyFunc()', 'endfunction'], {match: 'pattern'})
!   g:RunDbgCmd(buf, ':function g:LaterFunc',
       ['function LaterFunc()', 'endfunction'], {match: 'pattern'})
  
    call g:StopVimInTerminal(buf)
--- 411,419 ----
    call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50)
  
    # Despite the failure the functions are defined
!   s:RunDbgCmd(buf, ':function g:EarlyFunc',
       ['function EarlyFunc()', 'endfunction'], {match: 'pattern'})
!   s:RunDbgCmd(buf, ':function g:LaterFunc',
       ['function LaterFunc()', 'endfunction'], {match: 'pattern'})
  
    call g:StopVimInTerminal(buf)
***************
*** 435,441 ****
    var buf = g:RunVimInTerminal('-S XdebugBreakRet.vim', {wait_for_ruler: 0})
    call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50)
  
!   g:RunDbgCmd(buf, ':call GetNum()',
       ['line 1: return 1  + 2  + 3'], {match: 'pattern'})
  
    call g:StopVimInTerminal(buf)
--- 435,441 ----
    var buf = g:RunVimInTerminal('-S XdebugBreakRet.vim', {wait_for_ruler: 0})
    call g:TermWait(buf, g:RunningWithValgrind() ? 1000 : 50)
  
!   s:RunDbgCmd(buf, ':call GetNum()',
       ['line 1: return 1  + 2  + 3'], {match: 'pattern'})
  
    call g:StopVimInTerminal(buf)
***************
*** 474,492 ****
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call RunDbgCmd(buf,
                  \ ':debug call GlobalFunction()',
                  \ ['cmd: call GlobalFunction()'])
!   call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
  
!   call RunDbgCmd(buf, 'backtrace', ['>backtrace',
                                      \ '->0 function GlobalFunction',
                                      \ 'line 1: call CallAFunction()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()'])
!   call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
  
!   call RunDbgCmd(buf, 'backtrace', ['>backtrace',
                                      \ '  2 function GlobalFunction[1]',
                                      \ '  1 CallAFunction[1]',
                                      \ '->0 SourceAnotherFile',
--- 474,492 ----
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call s:RunDbgCmd(buf,
                  \ ':debug call GlobalFunction()',
                  \ ['cmd: call GlobalFunction()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
  
!   call s:RunDbgCmd(buf, 'backtrace', ['>backtrace',
                                      \ '->0 function GlobalFunction',
                                      \ 'line 1: call CallAFunction()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
  
!   call s:RunDbgCmd(buf, 'backtrace', ['>backtrace',
                                      \ '  2 function GlobalFunction[1]',
                                      \ '  1 CallAFunction[1]',
                                      \ '->0 SourceAnotherFile',
***************
*** 494,501 ****
  
    " Step into the 'source' command. Note that we print the full trace all the
    " way though the source command.
!   call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
--- 494,501 ----
  
    " Step into the 'source' command. Note that we print the full trace all the
    " way though the source command.
!   call s:RunDbgCmd(buf, 'step', ['line 1: func DoAThing()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 503,510 ****
          \ '->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]',
--- 503,510 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()'])
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 512,519 ****
          \ '  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]',
--- 512,519 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '->2 CallAFunction[1]',
***************
*** 521,528 ****
          \ '  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]',
--- 521,528 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 530,537 ****
          \ '  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]',
--- 530,537 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up', [ 'frame at highest level: 3' ] )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 539,546 ****
          \ '  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]',
--- 539,546 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '->2 CallAFunction[1]',
***************
*** 548,555 ****
          \ '  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]',
--- 548,555 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 557,564 ****
          \ '  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]',
--- 557,564 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 566,577 ****
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'down', [ 'frame is zero' ] )
  
    " step until we have another meaningful trace
!   call RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
!   call RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
--- 566,577 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down', [ 'frame is zero' ] )
  
    " step until we have another meaningful trace
!   call s:RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
!   call s:RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 function GlobalFunction[1]',
          \ '  2 CallAFunction[1]',
***************
*** 579,587 ****
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 9: call File2Function()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  5 function GlobalFunction[1]',
          \ '  4 CallAFunction[1]',
--- 579,587 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 9: call File2Function()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  5 function GlobalFunction[1]',
          \ '  4 CallAFunction[1]',
***************
*** 592,610 ****
          \ 'line 1: echo "DoAThing"'])
  
    " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 10: End of sourced file'])
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 2: call File2Function()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: call File2Function()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 function GlobalFunction[1]',
          \ '  1 CallAFunction[2]',
--- 592,610 ----
          \ 'line 1: echo "DoAThing"'])
  
    " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 10: End of sourced file'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: call File2Function()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: call File2Function()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 function GlobalFunction[1]',
          \ '  1 CallAFunction[2]',
***************
*** 649,677 ****
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call RunDbgCmd(buf,
                  \ ':debug doautocmd User TestGlobalFunction',
                  \ ['cmd: doautocmd User TestGlobalFunction'])
!   call RunDbgCmd(buf, 'step', ['cmd: call GlobalFunction() | echo "Done"'])
  
    " At this point the only thing in the stack is the autocommand
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 User Autocommands for "TestGlobalFunction"',
          \ 'cmd: call GlobalFunction() | echo "Done"'])
  
    " And now we're back into the call stack
!   call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 User Autocommands for "TestGlobalFunction"',
          \ '->0 function GlobalFunction',
          \ 'line 1: call CallAFunction()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()'])
!   call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
  
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
--- 649,677 ----
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call s:RunDbgCmd(buf,
                  \ ':debug doautocmd User TestGlobalFunction',
                  \ ['cmd: doautocmd User TestGlobalFunction'])
!   call s:RunDbgCmd(buf, 'step', ['cmd: call GlobalFunction() | echo "Done"'])
  
    " At this point the only thing in the stack is the autocommand
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 User Autocommands for "TestGlobalFunction"',
          \ 'cmd: call GlobalFunction() | echo "Done"'])
  
    " And now we're back into the call stack
!   call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 User Autocommands for "TestGlobalFunction"',
          \ '->0 function GlobalFunction',
          \ 'line 1: call CallAFunction()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
  
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
***************
*** 681,688 ****
  
    " Step into the 'source' command. Note that we print the full trace all the
    " way though the source command.
!   call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 681,688 ----
  
    " Step into the 'source' command. Note that we print the full trace all the
    " way though the source command.
!   call s:RunDbgCmd(buf, 'step', ['line 1: func DoAThing()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 691,698 ****
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()'])
  
!   call RunDbgCmd( buf, 'up' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 691,698 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()'])
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 701,708 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'up' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 701,708 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 711,718 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'up' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '->3 function GlobalFunction[1]',
--- 711,718 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '->3 function GlobalFunction[1]',
***************
*** 721,728 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'up' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 721,728 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 731,738 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'up', [ 'frame at highest level: 4' ] )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 731,738 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'up', [ 'frame at highest level: 4' ] )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '->4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 741,748 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'down' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '->3 function GlobalFunction[1]',
--- 741,748 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '->3 function GlobalFunction[1]',
***************
*** 752,759 ****
          \ 'line 1: func DoAThing()' ] )
  
  
!   call RunDbgCmd( buf, 'down' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 752,759 ----
          \ 'line 1: func DoAThing()' ] )
  
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 762,769 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'down' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 762,769 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 772,779 ****
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'down' )
!   call RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 772,779 ----
          \ '  0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down' )
!   call s:RunDbgCmd( buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 782,793 ****
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call RunDbgCmd( buf, 'down', [ 'frame is zero' ] )
  
    " step until we have another meaningful trace
!   call RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
!   call RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
--- 782,793 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 1: func DoAThing()' ] )
  
!   call s:RunDbgCmd( buf, 'down', [ 'frame is zero' ] )
  
    " step until we have another meaningful trace
!   call s:RunDbgCmd(buf, 'step', ['line 5: func File2Function()'])
!   call s:RunDbgCmd(buf, 'step', ['line 9: call File2Function()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  4 User Autocommands for "TestGlobalFunction"',
          \ '  3 function GlobalFunction[1]',
***************
*** 796,804 ****
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 9: call File2Function()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  6 User Autocommands for "TestGlobalFunction"',
          \ '  5 function GlobalFunction[1]',
--- 796,804 ----
          \ '->0 script ' .. getcwd() .. '/Xtest2.vim',
          \ 'line 9: call File2Function()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  6 User Autocommands for "TestGlobalFunction"',
          \ '  5 function GlobalFunction[1]',
***************
*** 810,829 ****
          \ 'line 1: echo "DoAThing"'])
  
    " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 10: End of sourced file'])
!   call RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'step', ['line 2: call File2Function()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 User Autocommands for "TestGlobalFunction"',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: call File2Function()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
--- 810,829 ----
          \ 'line 1: echo "DoAThing"'])
  
    " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 10: End of sourced file'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: call File2Function()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 User Autocommands for "TestGlobalFunction"',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: call File2Function()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: call DoAThing()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
***************
*** 834,841 ****
  
    " Now unwind so that we get back to the original autocommand (and the second
    " cmd echo "Done")
!   call RunDbgCmd(buf, 'finish', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
--- 834,841 ----
  
    " Now unwind so that we get back to the original autocommand (and the second
    " cmd echo "Done")
!   call s:RunDbgCmd(buf, 'finish', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  3 User Autocommands for "TestGlobalFunction"',
          \ '  2 function GlobalFunction[1]',
***************
*** 843,865 ****
          \ '->0 File2Function',
          \ 'line 1: End of function'])
  
!   call RunDbgCmd(buf, 'finish', ['line 2: End of function'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 User Autocommands for "TestGlobalFunction"',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: End of function'])
  
!   call RunDbgCmd(buf, 'finish', ['line 1: End of function'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 User Autocommands for "TestGlobalFunction"',
          \ '->0 function GlobalFunction',
          \ 'line 1: End of function'])
  
!   call RunDbgCmd(buf, 'step', ['cmd: echo "Done"'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 User Autocommands for "TestGlobalFunction"',
          \ 'cmd: echo "Done"'])
--- 843,865 ----
          \ '->0 File2Function',
          \ 'line 1: End of function'])
  
!   call s:RunDbgCmd(buf, 'finish', ['line 2: End of function'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  2 User Autocommands for "TestGlobalFunction"',
          \ '  1 function GlobalFunction[1]',
          \ '->0 CallAFunction',
          \ 'line 2: End of function'])
  
!   call s:RunDbgCmd(buf, 'finish', ['line 1: End of function'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 User Autocommands for "TestGlobalFunction"',
          \ '->0 function GlobalFunction',
          \ 'line 1: End of function'])
  
!   call s:RunDbgCmd(buf, 'step', ['cmd: echo "Done"'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 User Autocommands for "TestGlobalFunction"',
          \ 'cmd: echo "Done"'])
***************
*** 906,923 ****
  
    " Need to wait for the vim-in-terminal to be ready.
    " With valgrind this can take quite long.
!   call CheckDbgOutput(buf, ['command line',
                              \ 'cmd: call GlobalFunction()'], #{msec: 5000})
  
    " At this point the only thing in the stack is the cmdline
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 command line',
          \ 'cmd: call GlobalFunction()'])
  
    " And now we're back into the call stack
!   call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 command line',
          \ '->0 function GlobalFunction',
--- 906,923 ----
  
    " Need to wait for the vim-in-terminal to be ready.
    " With valgrind this can take quite long.
!   call s:CheckDbgOutput(buf, ['command line',
                              \ 'cmd: call GlobalFunction()'], #{msec: 5000})
  
    " At this point the only thing in the stack is the cmdline
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '->0 command line',
          \ 'cmd: call GlobalFunction()'])
  
    " And now we're back into the call stack
!   call s:RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '>backtrace',
          \ '  1 command line',
          \ '->0 function GlobalFunction',
***************
*** 970,1001 ****
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call RunDbgCmd(buf,
                  \ ':debug call GlobalFunction()',
                  \ ['cmd: call GlobalFunction()'])
  
!   call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
!   call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
!   call RunDbgCmd(buf, 'echo some', ['some var'])
  
!   call RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V->0 function GlobalFunction',
          \ '\Vline 2: CallAFunction()',
          \ ],
          \ #{match: 'pattern'})
  
!   call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
!   call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
    " Repeated line, because we first are in the compiled function before the
    " EXEC and then in do_cmdline() before the :source command.
!   call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
!   call RunDbgCmd(buf, 'step', ['line 1: vim9script'])
!   call RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number'])
!   call RunDbgCmd(buf, 'step', ['line 9: export def File2Function()'])
!   call RunDbgCmd(buf, 'step', ['line 13: defcompile'])
!   call RunDbgCmd(buf, 'step', ['line 14: File2Function()'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V  3 function GlobalFunction[2]',
          \ '\V  2 <SNR>\.\*_CallAFunction[1]',
--- 970,1001 ----
  
    let buf = RunVimInTerminal('-S Xtest1.vim', {})
  
!   call s:RunDbgCmd(buf,
                  \ ':debug call GlobalFunction()',
                  \ ['cmd: call GlobalFunction()'])
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
!   call s:RunDbgCmd(buf, 'echo some', ['some var'])
  
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V->0 function GlobalFunction',
          \ '\Vline 2: CallAFunction()',
          \ ],
          \ #{match: 'pattern'})
  
!   call s:RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
    " Repeated line, because we first are in the compiled function before the
    " EXEC and then in do_cmdline() before the :source command.
!   call s:RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: vim9script'])
!   call s:RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number'])
!   call s:RunDbgCmd(buf, 'step', ['line 9: export def File2Function()'])
!   call s:RunDbgCmd(buf, 'step', ['line 13: defcompile'])
!   call s:RunDbgCmd(buf, 'step', ['line 14: File2Function()'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V  3 function GlobalFunction[2]',
          \ '\V  2 <SNR>\.\*_CallAFunction[1]',
***************
*** 1005,1012 ****
          \ #{match: 'pattern'})
  
    " Don't step into compiled functions...
!   call RunDbgCmd(buf, 'next', ['line 15: End of sourced file'])
!   call RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V  3 function GlobalFunction[2]',
          \ '\V  2 <SNR>\.\*_CallAFunction[1]',
--- 1005,1012 ----
          \ #{match: 'pattern'})
  
    " Don't step into compiled functions...
!   call s:RunDbgCmd(buf, 'next', ['line 15: End of sourced file'])
!   call s:RunDbgCmd(buf, 'backtrace', [
          \ '\V>backtrace',
          \ '\V  3 function GlobalFunction[2]',
          \ '\V  2 <SNR>\.\*_CallAFunction[1]',
***************
*** 1032,1039 ****
    call writefile(file3, 'Xtest3.vim', 'D')
    let buf = RunVimInTerminal('-S Xtest3.vim', {})
  
!   call RunDbgCmd(buf, ':breakadd expr g:someVar')
!   call RunDbgCmd(buf, ':call g:ChangeVar()', ['Oldval = "''foo''"', 'Newval = 
"''bar''"', 'function ChangeVar', 'line 2: echo "changed"'])
  
    call StopVimInTerminal(buf)
  endfunc
--- 1032,1039 ----
    call writefile(file3, 'Xtest3.vim', 'D')
    let buf = RunVimInTerminal('-S Xtest3.vim', {})
  
!   call s:RunDbgCmd(buf, ':breakadd expr g:someVar')
!   call s:RunDbgCmd(buf, ':call g:ChangeVar()', ['Oldval = "''foo''"', 'Newval 
= "''bar''"', 'function ChangeVar', 'line 2: echo "changed"'])
  
    call StopVimInTerminal(buf)
  endfunc
***************
*** 1068,1084 ****
  
    let buf = RunVimInTerminal('-S XtestDebug.vim', {})
  
!   call RunDbgCmd(buf,':call SomeFunc()', ['line 2: echo "and"'])
!   call RunDbgCmd(buf,'next', ['line 3: echo "there"'])
!   call RunDbgCmd(buf,'next', ['line 4: breakadd func 2 LocalFunc'])
  
    " continue, next breakpoint is in LocalFunc()
!   call RunDbgCmd(buf,'cont', ['line 2: echo "second"'])
  
    " continue, next breakpoint is in LegacyFunc()
!   call RunDbgCmd(buf,'cont', ['line 1: echo "legone"'])
  
!   call RunDbgCmd(buf, 'cont')
  
    call StopVimInTerminal(buf)
  endfunc
--- 1068,1084 ----
  
    let buf = RunVimInTerminal('-S XtestDebug.vim', {})
  
!   call s:RunDbgCmd(buf,':call SomeFunc()', ['line 2: echo "and"'])
!   call s:RunDbgCmd(buf,'next', ['line 3: echo "there"'])
!   call s:RunDbgCmd(buf,'next', ['line 4: breakadd func 2 LocalFunc'])
  
    " continue, next breakpoint is in LocalFunc()
!   call s:RunDbgCmd(buf,'cont', ['line 2: echo "second"'])
  
    " continue, next breakpoint is in LegacyFunc()
!   call s:RunDbgCmd(buf,'cont', ['line 1: echo "legone"'])
  
!   call s:RunDbgCmd(buf, 'cont')
  
    call StopVimInTerminal(buf)
  endfunc
***************
*** 1140,1207 ****
  
    let buf = RunVimInTerminal('-S Xtest.vim', {})
  
!   call RunDbgCmd(buf,
                  \ ':debug call Func()',
                  \ ['cmd: call Func()'])
!   call RunDbgCmd(buf, 'next', ['result: 3'])
    call term_sendkeys(buf, "\r")
!   call RunDbgCmd(buf, 'cont')
  
!   call RunDbgCmd(buf,
                  \ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)',
                  \ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)'])
!   call RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
!   call RunDbgCmd(buf, 'echo text', ['asdf'])
!   call RunDbgCmd(buf, 'echo nr', ['42'])
!   call RunDbgCmd(buf, 'echo items', ['[1, 2, 3]'])
!   call RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2:   
for it in items'])
!   call RunDbgCmd(buf, 'step', ['function FuncWithArgs', 'line 2: for it in 
items'])
!   call RunDbgCmd(buf, 'echo it', ['0'])
!   call RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call RunDbgCmd(buf, 'echo it', ['1'])
!   call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call RunDbgCmd(buf, 'echo it', ['1'])
!   call RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call RunDbgCmd(buf, 'echo it', ['2'])
!   call RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
!   call RunDbgCmd(buf, 'cont')
  
!   call RunDbgCmd(buf,
                  \ ':debug call FuncWithDict()',
                  \ ['cmd: call FuncWithDict()'])
!   call RunDbgCmd(buf, 'step', ['line 1: var d = {  a: 1,  b: 2,  }'])
!   call RunDbgCmd(buf, 'step', ['line 6: def Inner()'])
!   call RunDbgCmd(buf, 'cont')
! 
!   call RunDbgCmd(buf, ':breakadd func 1 FuncComment')
!   call RunDbgCmd(buf, ':call FuncComment()', ['function FuncComment', 'line 
2: echo "first"  .. "one"'])
!   call RunDbgCmd(buf, ':breakadd func 3 FuncComment')
!   call RunDbgCmd(buf, 'cont', ['function FuncComment', 'line 5: echo 
"second"'])
!   call RunDbgCmd(buf, 'cont')
! 
!   call RunDbgCmd(buf, ':breakadd func 2 FuncForLoop')
!   call RunDbgCmd(buf, ':call FuncForLoop()', ['function FuncForLoop', 'line 
2:   for i in [11, 22, 33]'])
!   call RunDbgCmd(buf, 'step', ['line 2: for i in [11, 22, 33]'])
!   call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 3: eval i + 2'])
!   call RunDbgCmd(buf, 'echo i', ['11'])
!   call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 4: endfor'])
!   call RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 2: for i in [11, 
22, 33]'])
!   call RunDbgCmd(buf, 'next', ['line 3: eval i + 2'])
!   call RunDbgCmd(buf, 'echo i', ['22'])
  
!   call RunDbgCmd(buf, 'breakdel *')
!   call RunDbgCmd(buf, 'cont')
  
!   call RunDbgCmd(buf, ':breakadd func FuncWithSplitLine')
!   call RunDbgCmd(buf, ':call FuncWithSplitLine()', ['function 
FuncWithSplitLine', 'line 1: eval 1 + 2 | eval 2 + 3'])
  
!   call RunDbgCmd(buf, 'cont')
    call StopVimInTerminal(buf)
  endfunc
  
--- 1140,1207 ----
  
    let buf = RunVimInTerminal('-S Xtest.vim', {})
  
!   call s:RunDbgCmd(buf,
                  \ ':debug call Func()',
                  \ ['cmd: call Func()'])
!   call s:RunDbgCmd(buf, 'next', ['result: 3'])
    call term_sendkeys(buf, "\r")
!   call s:RunDbgCmd(buf, 'cont')
  
!   call s:RunDbgCmd(buf,
                  \ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)',
                  \ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
!   call s:RunDbgCmd(buf, 'echo text', ['asdf'])
!   call s:RunDbgCmd(buf, 'echo nr', ['42'])
!   call s:RunDbgCmd(buf, 'echo items', ['[1, 2, 3]'])
!   call s:RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2:  
 for it in items'])
!   call s:RunDbgCmd(buf, 'step', ['function FuncWithArgs', 'line 2: for it in 
items'])
!   call s:RunDbgCmd(buf, 'echo it', ['0'])
!   call s:RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call s:RunDbgCmd(buf, 'echo it', ['1'])
!   call s:RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call s:RunDbgCmd(buf, 'echo it', ['1'])
!   call s:RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call s:RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call s:RunDbgCmd(buf, 'echo it', ['2'])
!   call s:RunDbgCmd(buf, 'step', ['line 3: echo it'])
!   call s:RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: 
endfor'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: for it in items'])
!   call s:RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
!   call s:RunDbgCmd(buf, 'cont')
  
!   call s:RunDbgCmd(buf,
                  \ ':debug call FuncWithDict()',
                  \ ['cmd: call FuncWithDict()'])
!   call s:RunDbgCmd(buf, 'step', ['line 1: var d = {  a: 1,  b: 2,  }'])
!   call s:RunDbgCmd(buf, 'step', ['line 6: def Inner()'])
!   call s:RunDbgCmd(buf, 'cont')
! 
!   call s:RunDbgCmd(buf, ':breakadd func 1 FuncComment')
!   call s:RunDbgCmd(buf, ':call FuncComment()', ['function FuncComment', 'line 
2: echo "first"  .. "one"'])
!   call s:RunDbgCmd(buf, ':breakadd func 3 FuncComment')
!   call s:RunDbgCmd(buf, 'cont', ['function FuncComment', 'line 5: echo 
"second"'])
!   call s:RunDbgCmd(buf, 'cont')
! 
!   call s:RunDbgCmd(buf, ':breakadd func 2 FuncForLoop')
!   call s:RunDbgCmd(buf, ':call FuncForLoop()', ['function FuncForLoop', 'line 
2:   for i in [11, 22, 33]'])
!   call s:RunDbgCmd(buf, 'step', ['line 2: for i in [11, 22, 33]'])
!   call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 3: eval i + 
2'])
!   call s:RunDbgCmd(buf, 'echo i', ['11'])
!   call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 4: endfor'])
!   call s:RunDbgCmd(buf, 'next', ['function FuncForLoop', 'line 2: for i in 
[11, 22, 33]'])
!   call s:RunDbgCmd(buf, 'next', ['line 3: eval i + 2'])
!   call s:RunDbgCmd(buf, 'echo i', ['22'])
  
!   call s:RunDbgCmd(buf, 'breakdel *')
!   call s:RunDbgCmd(buf, 'cont')
  
!   call s:RunDbgCmd(buf, ':breakadd func FuncWithSplitLine')
!   call s:RunDbgCmd(buf, ':call FuncWithSplitLine()', ['function 
FuncWithSplitLine', 'line 1: eval 1 + 2 | eval 2 + 3'])
  
!   call s:RunDbgCmd(buf, 'cont')
    call StopVimInTerminal(buf)
  endfunc
  
***************
*** 1220,1239 ****
  
    let buf = RunVimInTerminal('-S XtestLambda.vim', {})
  
!   call RunDbgCmd(buf,
                  \ ':call g:Func()',
                  \ ['function Func', 'line 2: [''b'']->map((_, v) => s)'])
!   call RunDbgCmd(buf,
                  \ 'next',
                  \ ['function Func', 'line 3: echo "done"'])
  
!   call RunDbgCmd(buf, 'cont')
    call StopVimInTerminal(buf)
  endfunc
  
! func Test_debug_backtrace_level()
    CheckCWD
!   let lines =<< trim END
      let s:file1_var = 'file1'
      let g:global_var = 'global'
  
--- 1220,1239 ----
  
    let buf = RunVimInTerminal('-S XtestLambda.vim', {})
  
!   call s:RunDbgCmd(buf,
                  \ ':call g:Func()',
                  \ ['function Func', 'line 2: [''b'']->map((_, v) => s)'])
!   call s:RunDbgCmd(buf,
                  \ 'next',
                  \ ['function Func', 'line 3: echo "done"'])
  
!   call s:RunDbgCmd(buf, 'cont')
    call StopVimInTerminal(buf)
  endfunc
  
! def Test_debug_backtrace_level()
    CheckCWD
!   var lines =<< trim END
      let s:file1_var = 'file1'
      let g:global_var = 'global'
  
***************
*** 1246,1254 ****
  
      call s:File1Func( 'arg1' )
    END
!   call writefile(lines, 'Xtest1.vim', 'D')
  
!   let lines =<< trim END
      let s:file2_var = 'file2'
  
      func s:File2Func( arg )
--- 1246,1254 ----
  
      call s:File1Func( 'arg1' )
    END
!   writefile(lines, 'Xtest1.vim', 'D')
  
!   lines =<< trim END
      let s:file2_var = 'file2'
  
      func s:File2Func( arg )
***************
*** 1259,1426 ****
  
      call s:File2Func( 'arg2' )
    END
!   call writefile(lines, 'Xtest2.vim', 'D')
  
!   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'''
!         \ ], #{msec: 5000})
! 
!   " step through 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 visible)
!   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 RunDbgCmd(buf, 'cont')
!   call StopVimInTerminal(buf)
! endfunc
  
  " Test for setting a breakpoint on a :endif where the :if condition is false
  " and then quit the script. This should generate an interrupt.
--- 1259,1426 ----
  
      call s:File2Func( 'arg2' )
    END
!   writefile(lines, 'Xtest2.vim', 'D')
  
!   var file1 = getcwd() .. '/Xtest1.vim'
!   var file2 = getcwd() .. '/Xtest2.vim'
  
!   # set a breakpoint and source file1.vim
!   var buf = g:RunVimInTerminal(
!         '-c "breakadd file 1 Xtest1.vim" -S Xtest1.vim',
!         {wait_for_ruler: 0})
! 
!   s: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'''
!         ], {msec: 5000})
! 
!   # step through the initial declarations
!   s:RunDbgCmd(buf, 'step', [ 'line 2: let g:global_var = ''global''' ] )
!   s:RunDbgCmd(buf, 'step', [ 'line 4: func s:File1Func( arg )' ] )
!   s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
!   s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
!   s:RunDbgCmd(buf, 'echo global_var', [ 'global' ] )
! 
!   # step in to the first function
!   s:RunDbgCmd(buf, 'step', [ 'line 11: call s:File1Func( ''arg1'' )' ] )
!   s:RunDbgCmd(buf, 'step', [ 'line 1: let s:file1_var .= a:arg' ] )
!   s:RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] )
!   s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
!   s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
!   s:RunDbgCmd(buf,
!                 'echo global_var',
!                 [ 'E121: Undefined variable: global_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo local_var',
!                 [ 'E121: Undefined variable: local_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo l:local_var',
!                 [ 'E121: Undefined variable: l:local_var' ] )
! 
!   # backtrace up
!   s: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' } )
!   s:RunDbgCmd(buf, 'up', [ '>up' ] )
! 
!   s: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 visible)
!   s:RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] )
!   s:RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] )
!   s:RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] )
!   # FIXME: Unexpected in this scope (global should be found)
!   s:RunDbgCmd(buf,
!                 'echo global_var',
!                 [ 'E121: Undefined variable: global_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo local_var',
!                 [ 'E121: Undefined variable: local_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo l:local_var',
!                 [ 'E121: Undefined variable: l:local_var' ] )
! 
! 
!   # step while backtraced jumps to the latest frame
!   s:RunDbgCmd(buf, 'step', [
!         'line 2: let local_var = s:file1_var .. '' test1''' ] )
!   s: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' } )
! 
!   s:RunDbgCmd(buf, 'step', [ 'line 3: let g:global_var .= local_var' ] )
!   s:RunDbgCmd(buf, 'echo local_var', [ 'file1arg1 test1' ] )
!   s:RunDbgCmd(buf, 'echo l:local_var', [ 'file1arg1 test1' ] )
! 
!   s:RunDbgCmd(buf, 'step', [ 'line 4: source Xtest2.vim' ] )
!   s:RunDbgCmd(buf, 'step', [ 'line 1: let s:file2_var = ''file2''' ] )
!   s: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)
!   s:RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] )
!   s:RunDbgCmd(buf,
!         'echo s:file1_var',
!         [ 'E121: Undefined variable: s:file1_var' ] )
!   s:RunDbgCmd(buf, 'echo g:global_var', [ 'globalfile1arg1 test1' ] )
!   s:RunDbgCmd(buf, 'echo global_var', [ 'globalfile1arg1 test1' ] )
!   s:RunDbgCmd(buf,
!                 'echo local_var',
!                 [ 'E121: Undefined variable: local_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo l:local_var',
!                 [ 'E121: Undefined variable: l:local_var' ] )
!   s:RunDbgCmd(buf,
!                 'echo s:file2_var',
!                 [ 'E121: Undefined variable: s:file2_var' ] )
! 
!   s:RunDbgCmd(buf, 'step', [ 'line 3: func s:File2Func( arg )' ] )
!   s:RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] )
! 
!   # Up the stack to the other script context
!   s:RunDbgCmd(buf, 'up')
!   s: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
!   s:RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] )
!   s:RunDbgCmd(buf,
!         'echo l:local_var',
!         [ 'E121: Undefined variable: l:local_var' ] )
! 
!   s:RunDbgCmd(buf, 'up')
!   s: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)
!   s:RunDbgCmd(buf,
!         'echo s:file1_var',
!         [ 'E121: Undefined variable: s:file1_var' ] )
!   s:RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] )
  
!   s:RunDbgCmd(buf, 'cont')
!   g:StopVimInTerminal(buf)
! enddef
  
  " Test for setting a breakpoint on a :endif where the :if condition is false
  " and then quit the script. This should generate an interrupt.
*** ../vim-9.0.1569/src/testdir/test_filetype.vim       2023-05-18 
16:42:13.663307704 +0100
--- src/testdir/test_filetype.vim       2023-05-19 21:39:42.698191105 +0100
***************
*** 704,730 ****
      \ 'bzl': ['file.BUILD', 'BUILD'],
      \ }
  
! func CheckItems(checks)
    set noswapfile
!   for [ft, names] in items(a:checks)
      for i in range(0, len(names) - 1)
        new
        try
!         exe 'edit ' . fnameescape(names[i])
        catch
!       call assert_report('cannot edit "' . names[i] . '": ' . v:exception)
        endtry
        if &filetype == '' && &readonly
!       " File exists but not able to edit it (permission denied)
        else
!         let expected = ft == 'none' ? '' : ft
!       call assert_equal(expected, &filetype, 'with file name: ' . names[i])
        endif
        bwipe!
      endfor
    endfor
    set swapfile&
! endfunc
  
  func Test_filetype_detection()
    filetype on
--- 704,732 ----
      \ 'bzl': ['file.BUILD', 'BUILD'],
      \ }
  
! def CheckItems(checks: dict<list<string>>)
    set noswapfile
! 
!   for [ft, names] in items(checks)
      for i in range(0, len(names) - 1)
        new
        try
!         exe 'edit ' .. fnameescape(names[i])
        catch
!       assert_report('cannot edit "' .. names[i] .. '": ' .. v:exception)
        endtry
        if &filetype == '' && &readonly
!       # File exists but not able to edit it (permission denied)
        else
!         var expected = ft == 'none' ? '' : ft
!       assert_equal(expected, &filetype, 'with file name: ' .. names[i])
        endif
        bwipe!
      endfor
    endfor
+ 
    set swapfile&
! enddef
  
  func Test_filetype_detection()
    filetype on
*** ../vim-9.0.1569/src/version.c       2023-05-19 19:01:13.292413300 +0100
--- src/version.c       2023-05-19 20:25:29.017771323 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1570,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
44. Your friends no longer send you e-mail...they just log on to your IRC
    channel.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230519204136.08E6B1C0A8A%40moolenaar.net.

Raspunde prin e-mail lui