To: vim_dev@googlegroups.com Subject: Patch 8.2.0866 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0866 Problem: Not enough tests for buffer writing. Solution: Add more tests. Use CheckRunVimInTerminal in more places. (Yegappan Lakshmanan, closes #6167) Files: src/testdir/test_arglist.vim, src/testdir/test_match.vim, src/testdir/test_messages.vim, src/testdir/test_netbeans.py, src/testdir/test_netbeans.vim, src/testdir/test_search.vim, src/testdir/test_signals.vim, src/testdir/test_signs.vim, src/testdir/test_startup.vim, src/testdir/test_startup_utf8.vim, src/testdir/test_syntax.vim, src/testdir/test_tabpage.vim, src/testdir/test_timers.vim, src/testdir/test_vimscript.vim, src/testdir/test_writefile.vim *** ../vim-8.2.0865/src/testdir/test_arglist.vim 2020-04-08 21:50:18.872619665 +0200 --- src/testdir/test_arglist.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 1,5 **** --- 1,6 ---- " Test argument list commands + source check.vim source shared.vim source term_util.vim *************** *** 511,519 **** " Test for quiting Vim with unedited files in the argument list func Test_quit_with_arglist() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":set nomore\n") call term_sendkeys(buf, ":args a b c\n") --- 512,518 ---- " Test for quiting Vim with unedited files in the argument list func Test_quit_with_arglist() ! CheckRunVimInTerminal let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":set nomore\n") call term_sendkeys(buf, ":args a b c\n") *** ../vim-8.2.0865/src/testdir/test_match.vim 2020-04-26 15:59:51.206952132 +0200 --- src/testdir/test_match.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 313,321 **** endfunc func Test_matchclear_other_window() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif let buf = OtherWindowCommon() call term_sendkeys(buf, ":call clearmatches(winid)\") call VerifyScreenDump(buf, 'Test_matchclear_1', {}) --- 313,319 ---- endfunc func Test_matchclear_other_window() ! CheckRunVimInTerminal let buf = OtherWindowCommon() call term_sendkeys(buf, ":call clearmatches(winid)\") call VerifyScreenDump(buf, 'Test_matchclear_1', {}) *************** *** 325,333 **** endfunc func Test_matchadd_other_window() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif let buf = OtherWindowCommon() call term_sendkeys(buf, ":call matchadd('Search', 'Hello', 1, -1, #{window: winid})\") call term_sendkeys(buf, ":\") --- 323,329 ---- endfunc func Test_matchadd_other_window() ! CheckRunVimInTerminal let buf = OtherWindowCommon() call term_sendkeys(buf, ":call matchadd('Search', 'Hello', 1, -1, #{window: winid})\") call term_sendkeys(buf, ":\") *** ../vim-8.2.0865/src/testdir/test_messages.vim 2020-05-30 21:52:49.242816719 +0200 --- src/testdir/test_messages.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 1,5 **** --- 1,6 ---- " Tests for :messages, :echomsg, :echoerr + source check.vim source shared.vim source term_util.vim source view_util.vim *************** *** 172,180 **** " Test more-prompt (see :help more-prompt). func Test_message_more() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") --- 173,179 ---- " Test more-prompt (see :help more-prompt). func Test_message_more() ! CheckRunVimInTerminal let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") *************** *** 265,273 **** endfunc func Test_ask_yesno() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 2))\n") --- 264,270 ---- endfunc func Test_ask_yesno() ! CheckRunVimInTerminal let buf = RunVimInTerminal('', {'rows': 6}) call term_sendkeys(buf, ":call setline(1, range(1, 2))\n") *** ../vim-8.2.0865/src/testdir/test_netbeans.py 2020-04-19 14:02:22.427687032 +0200 --- src/testdir/test_netbeans.py 2020-05-31 21:18:31.637533919 +0200 *************** *** 102,108 **** 'setReadOnly_Test' : '3:setReadOnly!87\n', 'close_Test' : '3:close!88\n', 'specialKeys_Test' : '0:specialKeys!89 "F12 F13"\n', ! 'detach_Test' : '2:close!90\n1:close!91\nDETACH\n' } # execute the specified test if cmd not in testmap: --- 102,109 ---- 'setReadOnly_Test' : '3:setReadOnly!87\n', 'close_Test' : '3:close!88\n', 'specialKeys_Test' : '0:specialKeys!89 "F12 F13"\n', ! 'nbbufwrite_Test' : '4:editFile!90 "XnbBuffer"\n4:netbeansBuffer!91 T\n', ! 'detach_Test' : '2:close!92\n1:close!93\nDETACH\n' } # execute the specified test if cmd not in testmap: *************** *** 120,126 **** if len(response) > 0: self.request.sendall(response.encode('utf-8')) ! # Write the respoinse into the file, so that the test can knows # the command was sent. with open("Xnetbeans", "a") as myfile: myfile.write('send: ' + response) --- 121,127 ---- if len(response) > 0: self.request.sendall(response.encode('utf-8')) ! # Write the response into the file, so that the test can knows # the command was sent. with open("Xnetbeans", "a") as myfile: myfile.write('send: ' + response) *** ../vim-8.2.0865/src/testdir/test_netbeans.vim 2020-05-17 22:33:49.943137285 +0200 --- src/testdir/test_netbeans.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 607,616 **** call assert_equal('0:fileOpened=0 "" T F', l[-1]) let g:last += 1 " detach call appendbufline(cmdbufnr, '$', 'detach_Test') call WaitFor('len(readfile("Xnetbeans")) >= (g:last + 8)') ! call WaitForAssert({-> assert_equal('0:disconnect=91', readfile("Xnetbeans")[-1])}) " the connection was closed call assert_false(has("netbeans_enabled")) --- 607,626 ---- call assert_equal('0:fileOpened=0 "" T F', l[-1]) let g:last += 1 + " Test for writing a netbeans buffer + call appendbufline(cmdbufnr, '$', 'nbbufwrite_Test') + call WaitFor('len(readfile("Xnetbeans")) >= (g:last + 5)') + call assert_fails('write', 'E656:') + call setline(1, ['one', 'two']) + call assert_fails('1write!', 'E657:') + write + call WaitFor('len(readfile("Xnetbeans")) >= (g:last + 10)') + let g:last += 10 + " detach call appendbufline(cmdbufnr, '$', 'detach_Test') call WaitFor('len(readfile("Xnetbeans")) >= (g:last + 8)') ! call WaitForAssert({-> assert_equal('0:disconnect=93', readfile("Xnetbeans")[-1])}) " the connection was closed call assert_false(has("netbeans_enabled")) *** ../vim-8.2.0865/src/testdir/test_search.vim 2020-04-28 20:29:04.237851565 +0200 --- src/testdir/test_search.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 886,894 **** endfunc func Test_incsearch_scrolling() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif call assert_equal(0, &scrolloff) call writefile([ \ 'let dots = repeat(".", 120)', --- 886,892 ---- endfunc func Test_incsearch_scrolling() ! CheckRunVimInTerminal call assert_equal(0, &scrolloff) call writefile([ \ 'let dots = repeat(".", 120)', *** ../vim-8.2.0865/src/testdir/test_signals.vim 2020-05-16 16:08:30.098714978 +0200 --- src/testdir/test_signals.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 80,85 **** --- 80,86 ---- " Test signal INT. Handler sets got_int. It should be like typing CTRL-C. func Test_signal_INT() + CheckRunVimInTerminal if !HasSignal('INT') throw 'Skipped: INT signal not supported' endif *************** *** 91,99 **** throw 'Skipped: cannot test signal INT with valgrind' endif - if !CanRunVimInTerminal() - throw 'Skipped: cannot run vim in terminal' - endif let buf = RunVimInTerminal('', {'rows': 6}) let pid_vim = term_getjob(buf)->job_info().process --- 92,97 ---- *************** *** 120,128 **** if !HasSignal('TERM') throw 'Skipped: TERM signal not supported' endif ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let cmd = GetVimCommand() if cmd =~ 'valgrind' throw 'Skipped: cannot test signal TERM with valgrind' --- 118,124 ---- if !HasSignal('TERM') throw 'Skipped: TERM signal not supported' endif ! CheckRunVimInTerminal let cmd = GetVimCommand() if cmd =~ 'valgrind' throw 'Skipped: cannot test signal TERM with valgrind' *** ../vim-8.2.0865/src/testdir/test_signs.vim 2020-02-19 17:12:48.911095268 +0100 --- src/testdir/test_signs.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 1734,1742 **** " Test for correct cursor position after the sign column appears or disappears. func Test_sign_cursor_position() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif let lines =<< trim END call setline(1, [repeat('x', 75), 'mmmm', 'yyyy']) --- 1734,1740 ---- " Test for correct cursor position after the sign column appears or disappears. func Test_sign_cursor_position() ! CheckRunVimInTerminal let lines =<< trim END call setline(1, [repeat('x', 75), 'mmmm', 'yyyy']) *** ../vim-8.2.0865/src/testdir/test_startup.vim 2020-05-03 18:21:00.849749313 +0200 --- src/testdir/test_startup.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 673,681 **** endfunc func Test_start_with_tabs() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif let buf = RunVimInTerminal('-p a b c', {}) call VerifyScreenDump(buf, 'Test_start_with_tabs', {}) --- 673,679 ---- endfunc func Test_start_with_tabs() ! CheckRunVimInTerminal let buf = RunVimInTerminal('-p a b c', {}) call VerifyScreenDump(buf, 'Test_start_with_tabs', {}) *************** *** 783,791 **** " Test for specifying a non-existing vimrc file using "-u" func Test_missing_vimrc() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let after =<< trim [CODE] call assert_match('^E282:', v:errmsg) call writefile(v:errors, 'Xtestout') --- 781,787 ---- " Test for specifying a non-existing vimrc file using "-u" func Test_missing_vimrc() ! CheckRunVimInTerminal let after =<< trim [CODE] call assert_match('^E282:', v:errmsg) call writefile(v:errors, 'Xtestout') *** ../vim-8.2.0865/src/testdir/test_startup_utf8.vim 2020-04-08 21:50:18.876619651 +0200 --- src/testdir/test_startup_utf8.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 62,70 **** endfunc func Test_detect_ambiwidth() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run Vim in a terminal window' ! endif " Use the title termcap entries to output the escape sequence. call writefile([ --- 62,68 ---- endfunc func Test_detect_ambiwidth() ! CheckRunVimInTerminal " Use the title termcap entries to output the escape sequence. call writefile([ *** ../vim-8.2.0865/src/testdir/test_syntax.vim 2020-05-31 19:48:49.318871077 +0200 --- src/testdir/test_syntax.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 597,605 **** " Check highlighting for a small piece of C code with a screen dump. func Test_syntax_c() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif call writefile([ \ '/* comment line at the top */', \ 'int main(int argc, char **argv) { // another comment', --- 597,603 ---- " Check highlighting for a small piece of C code with a screen dump. func Test_syntax_c() ! CheckRunVimInTerminal call writefile([ \ '/* comment line at the top */', \ 'int main(int argc, char **argv) { // another comment', *** ../vim-8.2.0865/src/testdir/test_tabpage.vim 2020-04-25 15:24:40.551354115 +0200 --- src/testdir/test_tabpage.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 593,601 **** endfunc func Test_tabpage_cmdheight() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot make screendumps' ! endif call writefile([ \ 'set laststatus=2', \ 'set cmdheight=2', --- 593,599 ---- endfunc func Test_tabpage_cmdheight() ! CheckRunVimInTerminal call writefile([ \ 'set laststatus=2', \ 'set cmdheight=2', *** ../vim-8.2.0865/src/testdir/test_timers.vim 2020-04-08 21:50:18.876619651 +0200 --- src/testdir/test_timers.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 324,332 **** endfunc func Test_timer_restore_count() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run Vim in a terminal window' ! endif " Check that v:count is saved and restored, not changed by a timer. call writefile([ \ 'nnoremap L v:count ? v:count . "l" : "l"', --- 324,330 ---- endfunc func Test_timer_restore_count() ! CheckRunVimInTerminal " Check that v:count is saved and restored, not changed by a timer. call writefile([ \ 'nnoremap L v:count ? v:count . "l" : "l"', *** ../vim-8.2.0865/src/testdir/test_vimscript.vim 2020-04-25 15:24:40.551354115 +0200 --- src/testdir/test_vimscript.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 1904,1912 **** " Test for deep nesting of if/for/while/try statements {{{1 func Test_deep_nest() ! if !CanRunVimInTerminal() ! throw 'Skipped: cannot run vim in terminal' ! endif let lines =<< trim [SCRIPT] " Deep nesting of if ... endif --- 1904,1910 ---- " Test for deep nesting of if/for/while/try statements {{{1 func Test_deep_nest() ! CheckRunVimInTerminal let lines =<< trim [SCRIPT] " Deep nesting of if ... endif *** ../vim-8.2.0865/src/testdir/test_writefile.vim 2020-04-26 15:59:51.206952132 +0200 --- src/testdir/test_writefile.vim 2020-05-31 21:18:31.637533919 +0200 *************** *** 1,6 **** --- 1,7 ---- " Tests for the writefile() function and some :write commands. source check.vim + source term_util.vim func Test_writefile() let f = tempname() *************** *** 207,218 **** close! enew | only call delete('Xfile') - - call writefile(test_null_list(), 'Xfile') - call assert_false(filereadable('Xfile')) - call writefile(test_null_blob(), 'Xfile') - call assert_false(filereadable('Xfile')) - call assert_fails('call writefile([], "")', 'E482:') endfunc func Test_write_errors() --- 208,213 ---- *************** *** 257,262 **** --- 252,389 ---- call writefile(test_null_blob(), 'Xfile') call assert_false(filereadable('Xfile')) call assert_fails('call writefile([], "")', 'E482:') + + " very long file name + let long_fname = repeat('n', 5000) + call assert_fails('exe "w " .. long_fname', 'E75:') + call assert_fails('call writefile([], long_fname)', 'E482:') + endfunc + + " Test for writing to a file which is modified after Vim read it + func Test_write_file_mtime() + CheckEnglish + CheckRunVimInTerminal + + " First read the file into a buffer + call writefile(["Line1", "Line2"], 'Xfile') + let old_ftime = getftime('Xfile') + let buf = RunVimInTerminal('Xfile', #{rows : 10}) + call term_wait(buf) + call term_sendkeys(buf, ":set noswapfile\") + call term_wait(buf) + + " Modify the file directly. Make sure the file modification time is + " different. Note that on Linux/Unix, the file is considered modified + " outside, only if the difference is 2 seconds or more + sleep 1 + call writefile(["Line3", "Line4"], 'Xfile') + let new_ftime = getftime('Xfile') + while new_ftime - old_ftime < 2 + sleep 100m + call writefile(["Line3", "Line4"], 'Xfile') + let new_ftime = getftime('Xfile') + endwhile + + " Try to overwrite the file and check for the prompt + call term_sendkeys(buf, ":w\") + call term_wait(buf) + call WaitForAssert({-> assert_equal("WARNING: The file has been changed since reading it!!!", term_getline(buf, 9))}) + call assert_equal("Do you really want to write to it (y/n)?", + \ term_getline(buf, 10)) + call term_sendkeys(buf, "n\") + call term_wait(buf) + call assert_equal(new_ftime, getftime('Xfile')) + call term_sendkeys(buf, ":w\") + call term_wait(buf) + call term_sendkeys(buf, "y\") + call term_wait(buf) + call WaitForAssert({-> assert_equal('Line2', readfile('Xfile')[1])}) + + " clean up + call StopVimInTerminal(buf) + call delete('Xfile') + endfunc + + " Test for an autocmd unloading a buffer during a write command + func Test_write_autocmd_unloadbuf_lockmark() + augroup WriteTest + autocmd BufWritePre Xfile enew | write + augroup END + e Xfile + call assert_fails('lockmarks write', 'E203:') + augroup WriteTest + au! + augroup END + augroup! WriteTest + endfunc + + " Test for writing a buffer with 'acwrite' but without autocmds + func Test_write_acwrite_error() + new Xfile + call setline(1, ['line1', 'line2', 'line3']) + set buftype=acwrite + call assert_fails('write', 'E676:') + call assert_fails('1,2write!', 'E676:') + call assert_fails('w >>', 'E676:') + close! + endfunc + + " Test for adding and removing lines from an autocmd when writing a buffer + func Test_write_autocmd_add_remove_lines() + new Xfile + call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) + + " Autocmd deleting lines from the file when writing a partial file + augroup WriteTest2 + au! + autocmd FileWritePre Xfile 1,2d + augroup END + call assert_fails('2,3w!', 'E204:') + + " Autocmd adding lines to a file when writing a partial file + augroup WriteTest2 + au! + autocmd FileWritePre Xfile call append(0, ['xxx', 'yyy']) + augroup END + %d + call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) + 1,2w! + call assert_equal(['xxx', 'yyy', 'aaa', 'bbb'], readfile('Xfile')) + + " Autocmd deleting lines from the file when writing the whole file + augroup WriteTest2 + au! + autocmd BufWritePre Xfile 1,2d + augroup END + %d + call setline(1, ['aaa', 'bbb', 'ccc', 'ddd']) + w + call assert_equal(['ccc', 'ddd'], readfile('Xfile')) + + augroup WriteTest2 + au! + augroup END + augroup! WriteTest2 + + close! + call delete('Xfile') + endfunc + + " Test for writing to a readonly file + func Test_write_readonly() + " In Cirrus-CI, the freebsd tests are run under a root account. So this test + " doesn't fail. + CheckNotBSD + call writefile([], 'Xfile') + call setfperm('Xfile', "r--------") + edit Xfile + set noreadonly + call assert_fails('write', 'E505:') + let save_cpo = &cpo + set cpo+=W + call assert_fails('write!', 'E504:') + let &cpo = save_cpo + call delete('Xfile') endfunc " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.0865/src/version.c 2020-05-31 19:48:49.318871077 +0200 --- src/version.c 2020-05-31 21:20:37.237010288 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 866, /**/ -- You are Dead. Do you wish to restart, load, or quit? /// 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 ///