To: vim_dev@googlegroups.com Subject: Patch 8.2.0301 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0301 Problem: Insufficient testing for exception handling and the "attention" prompt. Solution: Add test cases. (Yegappan Lakshmanan, closes #5681) Files: src/testdir/test_swap.vim, src/testdir/test_trycatch.vim *** ../vim-8.2.0300/src/testdir/test_swap.vim 2020-02-18 21:54:36.982093690 +0100 --- src/testdir/test_swap.vim 2020-02-22 21:19:55.002708355 +0100 *************** *** 1,6 **** --- 1,7 ---- " Tests for the swap feature source shared.vim + source term_util.vim func s:swapname() return trim(execute('swapname')) *************** *** 349,352 **** --- 350,378 ---- augroup! test_swap_splitwin endfunc + " Test for selecting 'q' in the attention prompt + func Test_swap_prompt_splitwin() + if !CanRunVimInTerminal() + throw 'Skipped: cannot run vim in terminal' + endif + call writefile(['foo bar'], 'Xfile1') + edit Xfile1 + let buf = RunVimInTerminal('', {'rows': 20}) + call term_sendkeys(buf, ":set nomore\n") + call term_sendkeys(buf, ":set noruler\n") + call term_sendkeys(buf, ":split Xfile1\n") + call term_wait(buf) + call WaitForAssert({-> assert_match('^\[O\]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort: $', term_getline(buf, 20))}) + call term_sendkeys(buf, "q") + call term_wait(buf) + call term_sendkeys(buf, ":") + call WaitForAssert({-> assert_match('^:$', term_getline(buf, 20))}) + call term_sendkeys(buf, "echomsg winnr('$')\") + call term_wait(buf) + call WaitForAssert({-> assert_match('^1$', term_getline(buf, 20))}) + call StopVimInTerminal(buf) + %bwipe! + call delete('Xfile1') + endfunc + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0300/src/testdir/test_trycatch.vim 2020-02-21 17:54:41.834235694 +0100 --- src/testdir/test_trycatch.vim 2020-02-22 21:19:55.002708355 +0100 *************** *** 2017,2022 **** --- 2017,2024 ---- endif set verbose=14 + + " Test for verbose messages displayed when an exception is caught redir => msg try echo i *************** *** 2025,2039 **** endtry redir END let expected = [ ! \ 'Exception thrown: Vim(echo):E121: Undefined variable: i', ! \ '', ! \ 'Exception caught: Vim(echo):E121: Undefined variable: i', ! \ '', ! \ 'Exception finished: Vim(echo):E121: Undefined variable: i' ! \ ] call assert_equal(expected, split(msg, "\n")) set verbose& endfunc " Modeline {{{1 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker --- 2027,2204 ---- endtry redir END let expected = [ ! \ 'Exception thrown: Vim(echo):E121: Undefined variable: i', '', ! \ 'Exception caught: Vim(echo):E121: Undefined variable: i', '', ! \ 'Exception finished: Vim(echo):E121: Undefined variable: i'] ! call assert_equal(expected, split(msg, "\n")) ! ! " Test for verbose messages displayed when an exception is discarded ! redir => msg ! try ! try ! throw 'abc' ! finally ! throw 'xyz' ! endtry ! catch ! endtry ! redir END ! let expected = [ ! \ 'Exception thrown: abc', '', ! \ 'Exception made pending: abc', '', ! \ 'Exception thrown: xyz', '', ! \ 'Exception discarded: abc', '', ! \ 'Exception caught: xyz', '', ! \ 'Exception finished: xyz'] ! call assert_equal(expected, split(msg, "\n")) ! ! " Test for messages displayed when :throw is resumed after :finally ! redir => msg ! try ! try ! throw 'abc' ! finally ! endtry ! catch ! endtry ! redir END ! let expected = [ ! \ 'Exception thrown: abc', '', ! \ 'Exception made pending: abc', '', ! \ 'Exception resumed: abc', '', ! \ 'Exception caught: abc', '', ! \ 'Exception finished: abc'] call assert_equal(expected, split(msg, "\n")) + + " Test for messages displayed when :break is resumed after :finally + redir => msg + for i in range(1) + try + break + finally + endtry + endfor + redir END + let expected = [':break made pending', '', ':break resumed'] + call assert_equal(expected, split(msg, "\n")) + + " Test for messages displayed when :continue is resumed after :finally + redir => msg + for i in range(1) + try + continue + finally + endtry + endfor + redir END + let expected = [':continue made pending', '', ':continue resumed'] + call assert_equal(expected, split(msg, "\n")) + + " Test for messages displayed when :return is resumed after :finally + func Xtest() + try + return 'vim' + finally + endtry + endfunc + redir => msg + call Xtest() + redir END + let expected = [ + \ 'calling Xtest()', '', + \ ':return vim made pending', '', + \ ':return vim resumed', '', + \ 'Xtest returning ''vim''', '', + \ 'continuing in Test_try_catch_verbose'] + call assert_equal(expected, split(msg, "\n")) + delfunc Xtest + + " Test for messages displayed when :finish is resumed after :finally + call writefile(['try', 'finish', 'finally', 'endtry'], 'Xscript') + redir => msg + source Xscript + redir END + let expected = [ + \ ':finish made pending', '', + \ ':finish resumed', '', + \ 'finished sourcing Xscript', + \ 'continuing in Test_try_catch_verbose'] + call assert_equal(expected, split(msg, "\n")[1:]) + call delete('Xscript') + + " Test for messages displayed when a pending :continue is discarded by an + " exception in a finally handler + redir => msg + try + for i in range(1) + try + continue + finally + throw 'abc' + endtry + endfor + catch + endtry + redir END + let expected = [ + \ ':continue made pending', '', + \ 'Exception thrown: abc', '', + \ ':continue discarded', '', + \ 'Exception caught: abc', '', + \ 'Exception finished: abc'] + call assert_equal(expected, split(msg, "\n")) + set verbose& endfunc + " Test for throwing an exception from a BufEnter autocmd {{{1 + func Test_BufEnter_exception() + augroup bufenter_exception + au! + autocmd BufEnter Xfile1 throw 'abc' + augroup END + + let caught_abc = 0 + try + sp Xfile1 + catch /^abc/ + let caught_abc = 1 + endtry + call assert_equal(1, caught_abc) + call assert_equal(1, winnr('$')) + + augroup bufenter_exception + au! + augroup END + augroup! bufenter_exception + %bwipe! + + " Test for recursively throwing exceptions in autocmds + augroup bufenter_exception + au! + autocmd BufEnter Xfile1 throw 'bufenter' + autocmd BufLeave Xfile1 throw 'bufleave' + augroup END + + let ex_count = 0 + try + try + sp Xfile1 + catch /^bufenter/ + let ex_count += 1 + endtry + catch /^bufleave/ + let ex_count += 10 + endtry + call assert_equal(10, ex_count) + call assert_equal(2, winnr('$')) + + augroup bufenter_exception + au! + augroup END + augroup! bufenter_exception + %bwipe! + endfunc + " Modeline {{{1 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker *** ../vim-8.2.0300/src/version.c 2020-02-22 20:33:05.492008174 +0100 --- src/version.c 2020-02-22 21:20:18.978680467 +0100 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 301, /**/ -- hundred-and-one symptoms of being an internet addict: 94. Now admit it... How many of you have made "modem noises" into the phone just to see if it was possible? :-) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///