1" Tests for :messages, :echomsg, :echoerr 2 3source check.vim 4source shared.vim 5source term_util.vim 6source view_util.vim 7source screendump.vim 8 9func Test_messages() 10 let oldmore = &more 11 try 12 set nomore 13 14 let arr = map(range(10), '"hello" . v:val') 15 for s in arr 16 echomsg s | redraw 17 endfor 18 19 " get last two messages 20 redir => result 21 2messages | redraw 22 redir END 23 let msg_list = split(result, "\n") 24 call assert_equal(["hello8", "hello9"], msg_list) 25 26 " clear messages without last one 27 1messages clear 28 let msg_list = GetMessages() 29 call assert_equal(['hello9'], msg_list) 30 31 " clear all messages 32 messages clear 33 let msg_list = GetMessages() 34 call assert_equal([], msg_list) 35 finally 36 let &more = oldmore 37 endtry 38 39 call assert_fails('message 1', 'E474:') 40endfunc 41 42" Patch 7.4.1696 defined the "clearmode()" function for clearing the mode 43" indicator (e.g., "-- INSERT --") when ":stopinsert" is invoked. Message 44" output could then be disturbed when 'cmdheight' was greater than one. 45" This test ensures that the bugfix for this issue remains in place. 46func Test_stopinsert_does_not_break_message_output() 47 set cmdheight=2 48 redraw! 49 50 stopinsert | echo 'test echo' 51 call assert_equal(116, screenchar(&lines - 1, 1)) 52 call assert_equal(32, screenchar(&lines, 1)) 53 redraw! 54 55 stopinsert | echomsg 'test echomsg' 56 call assert_equal(116, screenchar(&lines - 1, 1)) 57 call assert_equal(32, screenchar(&lines, 1)) 58 redraw! 59 60 set cmdheight& 61endfunc 62 63func Test_message_completion() 64 call feedkeys(":message \<C-A>\<C-B>\"\<CR>", 'tx') 65 call assert_equal('"message clear', @:) 66endfunc 67 68func Test_echomsg() 69 call assert_equal("\nhello", execute(':echomsg "hello"')) 70 call assert_equal("\n", execute(':echomsg ""')) 71 call assert_equal("\n12345", execute(':echomsg 12345')) 72 call assert_equal("\n[]", execute(':echomsg []')) 73 call assert_equal("\n[1, 2, 3]", execute(':echomsg [1, 2, 3]')) 74 call assert_equal("\n[1, 2, []]", execute(':echomsg [1, 2, test_null_list()]')) 75 call assert_equal("\n{}", execute(':echomsg {}')) 76 call assert_equal("\n{'a': 1, 'b': 2}", execute(':echomsg {"a": 1, "b": 2}')) 77 if has('float') 78 call assert_equal("\n1.23", execute(':echomsg 1.23')) 79 endif 80 call assert_match("function('<lambda>\\d*')", execute(':echomsg {-> 1234}')) 81endfunc 82 83func Test_echoerr() 84 call test_ignore_error('IgNoRe') 85 call assert_equal("\nIgNoRe hello", execute(':echoerr "IgNoRe hello"')) 86 call assert_equal("\n12345 IgNoRe", execute(':echoerr 12345 "IgNoRe"')) 87 call assert_equal("\n[1, 2, 'IgNoRe']", execute(':echoerr [1, 2, "IgNoRe"]')) 88 call assert_equal("\n{'IgNoRe': 2, 'a': 1}", execute(':echoerr {"a": 1, "IgNoRe": 2}')) 89 if has('float') 90 call assert_equal("\n1.23 IgNoRe", execute(':echoerr 1.23 "IgNoRe"')) 91 endif 92 eval '<lambda>'->test_ignore_error() 93 call assert_match("function('<lambda>\\d*')", execute(':echoerr {-> 1234}')) 94 call test_ignore_error('RESET') 95endfunc 96 97func Test_mode_message_at_leaving_insert_by_ctrl_c() 98 CheckFeature terminal 99 CheckNotGui 100 101 " Set custom statusline built by user-defined function. 102 let testfile = 'Xtest.vim' 103 let lines =<< trim END 104 func StatusLine() abort 105 return "" 106 endfunc 107 set statusline=%!StatusLine() 108 set laststatus=2 109 END 110 call writefile(lines, testfile) 111 112 let rows = 10 113 let buf = term_start([GetVimProg(), '--clean', '-S', testfile], {'term_rows': rows}) 114 call TermWait(buf, 100) 115 call assert_equal('run', job_status(term_getjob(buf))) 116 117 call term_sendkeys(buf, "i") 118 call WaitForAssert({-> assert_match('^-- INSERT --\s*$', term_getline(buf, rows))}) 119 call term_sendkeys(buf, "\<C-C>") 120 call WaitForAssert({-> assert_match('^\s*$', term_getline(buf, rows))}) 121 122 call term_sendkeys(buf, ":qall!\<CR>") 123 call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))}) 124 exe buf . 'bwipe!' 125 call delete(testfile) 126endfunc 127 128func Test_mode_message_at_leaving_insert_with_esc_mapped() 129 CheckFeature terminal 130 CheckNotGui 131 132 " Set custom statusline built by user-defined function. 133 let testfile = 'Xtest.vim' 134 let lines =<< trim END 135 set laststatus=2 136 inoremap <Esc> <Esc>00 137 END 138 call writefile(lines, testfile) 139 140 let rows = 10 141 let buf = term_start([GetVimProg(), '--clean', '-S', testfile], {'term_rows': rows}) 142 call WaitForAssert({-> assert_match('0,0-1\s*All$', term_getline(buf, rows - 1))}) 143 call assert_equal('run', job_status(term_getjob(buf))) 144 145 call term_sendkeys(buf, "i") 146 call WaitForAssert({-> assert_match('^-- INSERT --\s*$', term_getline(buf, rows))}) 147 call term_sendkeys(buf, "\<Esc>") 148 call WaitForAssert({-> assert_match('^\s*$', term_getline(buf, rows))}) 149 150 call term_sendkeys(buf, ":qall!\<CR>") 151 call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))}) 152 exe buf . 'bwipe!' 153 call delete(testfile) 154endfunc 155 156func Test_echospace() 157 set noruler noshowcmd laststatus=1 158 call assert_equal(&columns - 1, v:echospace) 159 split 160 call assert_equal(&columns - 1, v:echospace) 161 set ruler 162 call assert_equal(&columns - 1, v:echospace) 163 close 164 call assert_equal(&columns - 19, v:echospace) 165 set showcmd noruler 166 call assert_equal(&columns - 12, v:echospace) 167 set showcmd ruler 168 call assert_equal(&columns - 29, v:echospace) 169 170 set ruler& showcmd& 171endfunc 172 173" Test more-prompt (see :help more-prompt). 174func Test_message_more() 175 CheckRunVimInTerminal 176 let buf = RunVimInTerminal('', {'rows': 6}) 177 call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") 178 179 call term_sendkeys(buf, ":%p#\n") 180 call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) 181 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 182 183 call term_sendkeys(buf, '?') 184 call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) 185 call WaitForAssert({-> assert_equal('-- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit ', term_getline(buf, 6))}) 186 187 " Down a line with j, <CR>, <NL> or <Down>. 188 call term_sendkeys(buf, "j") 189 call WaitForAssert({-> assert_equal(' 6 6', term_getline(buf, 5))}) 190 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 191 call term_sendkeys(buf, "\<NL>") 192 call WaitForAssert({-> assert_equal(' 7 7', term_getline(buf, 5))}) 193 call term_sendkeys(buf, "\<CR>") 194 call WaitForAssert({-> assert_equal(' 8 8', term_getline(buf, 5))}) 195 call term_sendkeys(buf, "\<Down>") 196 call WaitForAssert({-> assert_equal(' 9 9', term_getline(buf, 5))}) 197 198 " Down a screen with <Space>, f, or <PageDown>. 199 call term_sendkeys(buf, 'f') 200 call WaitForAssert({-> assert_equal(' 14 14', term_getline(buf, 5))}) 201 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 202 call term_sendkeys(buf, ' ') 203 call WaitForAssert({-> assert_equal(' 19 19', term_getline(buf, 5))}) 204 call term_sendkeys(buf, "\<PageDown>") 205 call WaitForAssert({-> assert_equal(' 24 24', term_getline(buf, 5))}) 206 207 " Down a page (half a screen) with d. 208 call term_sendkeys(buf, 'd') 209 call WaitForAssert({-> assert_equal(' 27 27', term_getline(buf, 5))}) 210 211 " Down all the way with 'G'. 212 call term_sendkeys(buf, 'G') 213 call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 5))}) 214 call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) 215 216 " Up a line k, <BS> or <Up>. 217 call term_sendkeys(buf, 'k') 218 call WaitForAssert({-> assert_equal(' 99 99', term_getline(buf, 5))}) 219 call term_sendkeys(buf, "\<BS>") 220 call WaitForAssert({-> assert_equal(' 98 98', term_getline(buf, 5))}) 221 call term_sendkeys(buf, "\<Up>") 222 call WaitForAssert({-> assert_equal(' 97 97', term_getline(buf, 5))}) 223 224 " Up a screen with b or <PageUp>. 225 call term_sendkeys(buf, 'b') 226 call WaitForAssert({-> assert_equal(' 92 92', term_getline(buf, 5))}) 227 call term_sendkeys(buf, "\<PageUp>") 228 call WaitForAssert({-> assert_equal(' 87 87', term_getline(buf, 5))}) 229 230 " Up a page (half a screen) with u. 231 call term_sendkeys(buf, 'u') 232 call WaitForAssert({-> assert_equal(' 84 84', term_getline(buf, 5))}) 233 234 " Up all the way with 'g'. 235 call term_sendkeys(buf, 'g') 236 call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) 237 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 238 239 " All the way down. Pressing f should do nothing but pressing 240 " space should end the more prompt. 241 call term_sendkeys(buf, 'G') 242 call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 5))}) 243 call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) 244 call term_sendkeys(buf, 'f') 245 call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 5))}) 246 call term_sendkeys(buf, ' ') 247 call WaitForAssert({-> assert_equal('100', term_getline(buf, 5))}) 248 249 " Pressing g< shows the previous command output. 250 call term_sendkeys(buf, 'g<') 251 call WaitForAssert({-> assert_equal('100 100', term_getline(buf, 5))}) 252 call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) 253 254 call term_sendkeys(buf, ":%p#\n") 255 call WaitForAssert({-> assert_equal(' 5 5', term_getline(buf, 5))}) 256 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 257 258 " Stop command output with q, <Esc> or CTRL-C. 259 call term_sendkeys(buf, 'q') 260 call WaitForAssert({-> assert_equal('100', term_getline(buf, 5))}) 261 262 " Execute a : command from the more prompt 263 call term_sendkeys(buf, ":%p#\n") 264 call term_wait(buf) 265 call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) 266 call term_sendkeys(buf, ":") 267 call term_wait(buf) 268 call WaitForAssert({-> assert_equal(':', term_getline(buf, 6))}) 269 call term_sendkeys(buf, "echo 'Hello'\n") 270 call term_wait(buf) 271 call WaitForAssert({-> assert_equal('Hello ', term_getline(buf, 5))}) 272 273 call StopVimInTerminal(buf) 274endfunc 275 276func Test_ask_yesno() 277 CheckRunVimInTerminal 278 let buf = RunVimInTerminal('', {'rows': 6}) 279 call term_sendkeys(buf, ":call setline(1, range(1, 2))\n") 280 281 call term_sendkeys(buf, ":2,1s/^/n/\n") 282 call WaitForAssert({-> assert_equal('Backwards range given, OK to swap (y/n)?', term_getline(buf, 6))}) 283 call term_sendkeys(buf, "n") 284 call WaitForAssert({-> assert_match('^Backwards range given, OK to swap (y/n)?n *1,1 *All$', term_getline(buf, 6))}) 285 call WaitForAssert({-> assert_equal('1', term_getline(buf, 1))}) 286 287 call term_sendkeys(buf, ":2,1s/^/Esc/\n") 288 call WaitForAssert({-> assert_equal('Backwards range given, OK to swap (y/n)?', term_getline(buf, 6))}) 289 call term_sendkeys(buf, "\<Esc>") 290 call WaitForAssert({-> assert_match('^Backwards range given, OK to swap (y/n)?n *1,1 *All$', term_getline(buf, 6))}) 291 call WaitForAssert({-> assert_equal('1', term_getline(buf, 1))}) 292 293 call term_sendkeys(buf, ":2,1s/^/y/\n") 294 call WaitForAssert({-> assert_equal('Backwards range given, OK to swap (y/n)?', term_getline(buf, 6))}) 295 call term_sendkeys(buf, "y") 296 call WaitForAssert({-> assert_match('^Backwards range given, OK to swap (y/n)?y *2,1 *All$', term_getline(buf, 6))}) 297 call WaitForAssert({-> assert_equal('y1', term_getline(buf, 1))}) 298 call WaitForAssert({-> assert_equal('y2', term_getline(buf, 2))}) 299 300 call StopVimInTerminal(buf) 301endfunc 302 303func Test_null() 304 echom test_null_list() 305 echom test_null_dict() 306 echom test_null_blob() 307 echom test_null_string() 308 echom test_null_function() 309 echom test_null_partial() 310 if has('job') 311 echom test_null_job() 312 echom test_null_channel() 313 endif 314endfunc 315 316func Test_mapping_at_hit_return_prompt() 317 nnoremap <C-B> :echo "hit ctrl-b"<CR> 318 call feedkeys(":ls\<CR>", "xt") 319 call feedkeys("\<*C-B>", "xt") 320 call assert_match('hit ctrl-b', Screenline(&lines - 1)) 321 nunmap <C-B> 322endfunc 323 324func Test_quit_long_message() 325 CheckScreendump 326 327 let content =<< trim END 328 echom range(9999)->join("\x01") 329 END 330 call writefile(content, 'Xtest_quit_message') 331 let buf = RunVimInTerminal('-S Xtest_quit_message', #{rows: 6}) 332 call term_sendkeys(buf, "q") 333 call VerifyScreenDump(buf, 'Test_quit_long_message', {}) 334 335 " clean up 336 call StopVimInTerminal(buf) 337 call delete('Xtest_quit_message') 338endfunc 339 340" vim: shiftwidth=2 sts=2 expandtab 341