]> granicus.if.org Git - vim/commitdiff
patch 8.2.1440: debugger code insufficiently tested v8.2.1440
authorBram Moolenaar <Bram@vim.org>
Thu, 13 Aug 2020 17:20:04 +0000 (19:20 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 13 Aug 2020 17:20:04 +0000 (19:20 +0200)
Problem:    Debugger code insufficiently tested.
Solution:   Add a few more tests. (Yegappan Lakshmanan, closes #6700)

src/testdir/test_debugger.vim
src/testdir/test_vimscript.vim
src/version.c

index 27826429ea1166c4db9d9017c48854f2f1d63702..fb2700754c67d4edc83cc7d18f708b313a740ca6 100644 (file)
@@ -337,6 +337,8 @@ func Test_Debugger()
   call StopVimInTerminal(buf)
 
   call delete('Xtest.vim')
+  %bw!
+  call assert_fails('breakadd here', 'E32:')
 endfunc
 
 func Test_Backtrace_Through_Source()
@@ -1037,7 +1039,6 @@ func Test_breakpt_endif_intr()
     let caught_intr = 0
     debuggreedy
     call feedkeys(":call F()\<CR>quit\<CR>", "xt")
-    call F()
   catch /^Vim:Interrupt$/
     call assert_match('\.F, line 4', v:throwpoint)
     let caught_intr = 1
@@ -1068,7 +1069,6 @@ func Test_breakpt_else_intr()
     let caught_intr = 0
     debuggreedy
     call feedkeys(":call F()\<CR>quit\<CR>", "xt")
-    call F()
   catch /^Vim:Interrupt$/
     call assert_match('\.F, line 4', v:throwpoint)
     let caught_intr = 1
@@ -1097,7 +1097,6 @@ func Test_breakpt_endwhile_intr()
     let caught_intr = 0
     debuggreedy
     call feedkeys(":call F()\<CR>quit\<CR>", "xt")
-    call F()
   catch /^Vim:Interrupt$/
     call assert_match('\.F, line 4', v:throwpoint)
     let caught_intr = 1
@@ -1109,38 +1108,24 @@ func Test_breakpt_endwhile_intr()
   delfunc F
 endfunc
 
-" Test for setting a breakpoint on an :endtry where an exception is pending to
-" be processed and then quit the script. This should generate an interrupt and
-" the thrown exception should be ignored.
-func Test_breakpt_endtry_intr()
-  func F()
-    try
-      let g:Xpath ..= 'a'
-      throw "abc"
-    endtry
-    invalid_command
+" Test for setting a breakpoint on a script local function
+func Test_breakpt_scriptlocal_func()
+  let g:Xpath = ''
+  func s:G()
+    let g:Xpath ..= 'a'
   endfunc
 
-  let g:Xpath = ''
-  breakadd func 4 F
-  try
-    let caught_intr = 0
-    let caught_abc = 0
-    debuggreedy
-    call feedkeys(":call F()\<CR>quit\<CR>", "xt")
-    call F()
-  catch /abc/
-    let caught_abc = 1
-  catch /^Vim:Interrupt$/
-    call assert_match('\.F, line 4', v:throwpoint)
-    let caught_intr = 1
-  endtry
+  let funcname = expand("<SID>") .. "G"
+  exe "breakadd func 1 " .. funcname
+  debuggreedy
+  redir => output
+  call feedkeys(":call " .. funcname .. "()\<CR>c\<CR>", "xt")
+  redir END
   0debuggreedy
-  call assert_equal(1, caught_intr)
-  call assert_equal(0, caught_abc)
+  call assert_match('Breakpoint in "' .. funcname .. '" line 1', output)
   call assert_equal('a', g:Xpath)
   breakdel *
-  delfunc F
+  exe "delfunc " .. funcname
 endfunc
 
 " vim: shiftwidth=2 sts=2 expandtab
index 1b00fc9e78c454366d2df5366783df88ad3d6540..9dd5fc7ffc2aa2c38c5438537d252aeb0855691a 100644 (file)
@@ -5869,27 +5869,39 @@ func Test_discard_exception_after_error_1()
   call RunInNewVim(test, verify)
 endfunc
 
-" TODO: Need to interrupt the code before the endtry is invoked
-func Disable_Test_discard_exception_after_error_2()
-  let test =<< trim [CODE]
+" interrupt the code before the endtry is invoked
+func Test_discard_exception_after_error_2()
+  XpathINIT
+  let lines =<< trim [CODE]
     try
       Xpath 'a'
       try
         Xpath 'b'
         throw "arrgh"
-        call interrupt()    " FIXME: throw is not interrupted here
         call assert_report('should not get here')
-      endtry
+      endtry                      " interrupt here
       call assert_report('should not get here')
     catch /arrgh/
       call assert_report('should not get here')
     endtry
     call assert_report('should not get here')
   [CODE]
-  let verify =<< trim [CODE]
-    call assert_equal('ab', g:Xpath)
-  [CODE]
-  call RunInNewVim(test, verify)
+  call writefile(lines, 'Xscript')
+
+  breakadd file 7 Xscript
+  try
+    let caught_intr = 0
+    debuggreedy
+    call feedkeys(":source Xscript\<CR>quit\<CR>", "xt")
+  catch /^Vim:Interrupt$/
+    call assert_match('Xscript, line 7', v:throwpoint)
+    let caught_intr = 1
+  endtry
+  0debuggreedy
+  call assert_equal(1, caught_intr)
+  call assert_equal('ab', g:Xpath)
+  breakdel *
+  call delete('Xscript')
 endfunc
 
 "-------------------------------------------------------------------------------
@@ -5959,16 +5971,16 @@ func Test_ignore_catch_after_error_2()
   call RunInNewVim(test, verify)
 endfunc
 
-" TODO: Need to interrupt the code right before the catch is invoked
-func FIXME_Test_ignore_catch_after_intr_1()
-  let test =<< trim [CODE]
+" interrupt right before a catch is invoked in a script
+func Test_ignore_catch_after_intr_1()
+  XpathINIT
+  let lines =<< trim [CODE]
     try
       try
         Xpath 'a'
         throw "arrgh"
         call assert_report('should not get here')
-      catch /.*/              " TODO: Need to interrupt before this catch is
-        call interrupt()      " invoked
+      catch /.*/              " interrupt here
         call assert_report('should not get here')
       catch /.*/
         call assert_report('should not get here')
@@ -5979,41 +5991,59 @@ func FIXME_Test_ignore_catch_after_intr_1()
     endtry
     call assert_report('should not get here')
   [CODE]
-  let verify =<< trim [CODE]
-    call assert_equal('a', g:Xpath)
-  [CODE]
-  call RunInNewVim(test, verify)
+  call writefile(lines, 'Xscript')
+
+  breakadd file 6 Xscript
+  try
+    let caught_intr = 0
+    debuggreedy
+    call feedkeys(":source Xscript\<CR>quit\<CR>", "xt")
+  catch /^Vim:Interrupt$/
+    call assert_match('Xscript, line 6', v:throwpoint)
+    let caught_intr = 1
+  endtry
+  0debuggreedy
+  call assert_equal(1, caught_intr)
+  call assert_equal('a', g:Xpath)
+  breakdel *
+  call delete('Xscript')
 endfunc
 
-" TODO: Need to interrupt the code right before the catch is invoked
-func FIXME_Test_ignore_catch_after_intr_2()
-  let test =<< trim [CODE]
-    func I()
+" interrupt right before a catch is invoked inside a function.
+func Test_ignore_catch_after_intr_2()
+  XpathINIT
+  func F()
+    try
       try
-        try
-          Xpath 'a'
-          throw "arrgh"
-          call assert_report('should not get here')
-        catch /.*/              " TODO: Need to interrupt before this catch is
-                                " invoked
-          call interrupt()
-          call assert_report('should not get here')
-        catch /.*/
-          call assert_report('should not get here')
-        endtry
+        Xpath 'a'
+        throw "arrgh"
         call assert_report('should not get here')
-      catch /arrgh/
+      catch /.*/              " interrupt here
+        call assert_report('should not get here')
+      catch /.*/
         call assert_report('should not get here')
       endtry
-    endfunc
-
-    call I()
+      call assert_report('should not get here')
+    catch /arrgh/
+      call assert_report('should not get here')
+    endtry
     call assert_report('should not get here')
-  [CODE]
-  let verify =<< trim [CODE]
-    call assert_equal('a', g:Xpath)
-  [CODE]
-  call RunInNewVim(test, verify)
+  endfunc
+
+  breakadd func 6 F
+  try
+    let caught_intr = 0
+    debuggreedy
+    call feedkeys(":call F()\<CR>quit\<CR>", "xt")
+  catch /^Vim:Interrupt$/
+    call assert_match('\.F, line 6', v:throwpoint)
+    let caught_intr = 1
+  endtry
+  0debuggreedy
+  call assert_equal(1, caught_intr)
+  call assert_equal('a', g:Xpath)
+  breakdel *
+  delfunc F
 endfunc
 
 "-------------------------------------------------------------------------------
@@ -6050,16 +6080,17 @@ func Test_finally_after_error()
   call RunInNewVim(test, verify)
 endfunc
 
-" TODO: Need to interrupt the code right before the finally is invoked
-func FIXME_Test_finally_after_intr()
-  let test =<< trim [CODE]
+" interrupt the code right before the finally is invoked
+func Test_finally_after_intr()
+  XpathINIT
+  let lines =<< trim [CODE]
     try
       Xpath 'a'
       try
         Xpath 'b'
         throw "arrgh"
         call assert_report('should not get here')
-      finally          " TODO: Need to interrupt before the finally is invoked
+      finally          " interrupt here
         Xpath 'c'
       endtry
       call assert_report('should not get here')
@@ -6068,10 +6099,22 @@ func FIXME_Test_finally_after_intr()
     endtry
     call assert_report('should not get here')
   [CODE]
-  let verify =<< trim [CODE]
-    call assert_equal('abc', g:Xpath)
-  [CODE]
-  call RunInNewVim(test, verify)
+  call writefile(lines, 'Xscript')
+
+  breakadd file 7 Xscript
+  try
+    let caught_intr = 0
+    debuggreedy
+    call feedkeys(":source Xscript\<CR>quit\<CR>", "xt")
+  catch /^Vim:Interrupt$/
+    call assert_match('Xscript, line 7', v:throwpoint)
+    let caught_intr = 1
+  endtry
+  0debuggreedy
+  call assert_equal(1, caught_intr)
+  call assert_equal('abc', g:Xpath)
+  breakdel *
+  call delete('Xscript')
 endfunc
 
 "-------------------------------------------------------------------------------
index 2955eb0e3b05ea763a4085f74146f5015c369834..dc72eb1dd2ea8b14ee730b21fcffc764c3773bb1 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1440,
 /**/
     1439,
 /**/