1" Tests for various Ex commands. 2 3source check.vim 4 5func Test_ex_delete() 6 new 7 call setline(1, ['a', 'b', 'c']) 8 2 9 " :dl is :delete with the "l" flag, not :dlist 10 .dl 11 call assert_equal(['a', 'c'], getline(1, 2)) 12endfunc 13 14func Test_range_error() 15 call assert_fails(':.echo 1', 'E481:') 16 call assert_fails(':$echo 1', 'E481:') 17 call assert_fails(':1,2echo 1', 'E481:') 18 call assert_fails(':+1echo 1', 'E481:') 19 call assert_fails(':/1/echo 1', 'E481:') 20 call assert_fails(':\/echo 1', 'E481:') 21 normal vv 22 call assert_fails(":'<,'>echo 1", 'E481:') 23 call assert_fails(":\\xcenter", 'E10:') 24endfunc 25 26func Test_buffers_lastused() 27 call test_settime(localtime() - 2000) " middle 28 edit bufa 29 enew 30 call test_settime(localtime() - 10) " newest 31 edit bufb 32 enew 33 call test_settime(1550010000) " oldest 34 edit bufc 35 enew 36 call test_settime(0) 37 enew 38 39 let ls = split(execute('buffers t', 'silent!'), '\n') 40 let bufs = ls->map({i,v->split(v, '"\s*')[1:2]}) 41 call assert_equal(['bufb', 'bufa', 'bufc'], bufs[1:]->map({i,v->v[0]})) 42 call assert_match('1[0-3] seconds ago', bufs[1][1]) 43 call assert_match('\d\d:\d\d:\d\d', bufs[2][1]) 44 call assert_match('2019/02/1\d \d\d:\d\d:00', bufs[3][1]) 45 46 bwipeout bufa 47 bwipeout bufb 48 bwipeout bufc 49endfunc 50 51" Test for the :copy command 52func Test_copy() 53 new 54 55 call setline(1, ['L1', 'L2', 'L3', 'L4']) 56 " copy lines in a range to inside the range 57 1,3copy 2 58 call assert_equal(['L1', 'L2', 'L1', 'L2', 'L3', 'L3', 'L4'], getline(1, 7)) 59 60 " Specifying a count before using : to run an ex-command 61 exe "normal! gg4:yank\<CR>" 62 call assert_equal("L1\nL2\nL1\nL2\n", @") 63 64 close! 65endfunc 66 67" Test for the :file command 68func Test_file_cmd() 69 call assert_fails('3file', 'E474:') 70 call assert_fails('0,0file', 'E474:') 71 call assert_fails('0file abc', 'E474:') 72endfunc 73 74" Test for the :drop command 75func Test_drop_cmd() 76 call writefile(['L1', 'L2'], 'Xfile') 77 enew | only 78 drop Xfile 79 call assert_equal('L2', getline(2)) 80 " Test for switching to an existing window 81 below new 82 drop Xfile 83 call assert_equal(1, winnr()) 84 " Test for splitting the current window 85 enew | only 86 set modified 87 drop Xfile 88 call assert_equal(2, winnr('$')) 89 " Check for setting the argument list 90 call assert_equal(['Xfile'], argv()) 91 enew | only! 92 call delete('Xfile') 93endfunc 94 95" Test for the :append command 96func Test_append_cmd() 97 new 98 call setline(1, [' L1']) 99 call feedkeys(":append\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 100 call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) 101 %delete _ 102 " append after a specific line 103 call setline(1, [' L1', ' L2', ' L3']) 104 call feedkeys(":2append\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 105 call assert_equal([' L1', ' L2', ' L4', ' L5', ' L3'], getline(1, '$')) 106 %delete _ 107 " append with toggling 'autoindent' 108 call setline(1, [' L1']) 109 call feedkeys(":append!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 110 call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) 111 call assert_false(&autoindent) 112 %delete _ 113 " append with 'autoindent' set and toggling 'autoindent' 114 set autoindent 115 call setline(1, [' L1']) 116 call feedkeys(":append!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 117 call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) 118 call assert_true(&autoindent) 119 set autoindent& 120 close! 121endfunc 122 123" Test for the :insert command 124func Test_insert_cmd() 125 new 126 call setline(1, [' L1']) 127 call feedkeys(":insert\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 128 call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) 129 %delete _ 130 " insert before a specific line 131 call setline(1, [' L1', ' L2', ' L3']) 132 call feedkeys(":2insert\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 133 call assert_equal([' L1', ' L4', ' L5', ' L2', ' L3'], getline(1, '$')) 134 %delete _ 135 " insert with toggling 'autoindent' 136 call setline(1, [' L1']) 137 call feedkeys(":insert!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 138 call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) 139 call assert_false(&autoindent) 140 %delete _ 141 " insert with 'autoindent' set and toggling 'autoindent' 142 set autoindent 143 call setline(1, [' L1']) 144 call feedkeys(":insert!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') 145 call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) 146 call assert_true(&autoindent) 147 set autoindent& 148 close! 149endfunc 150 151" Test for the :change command 152func Test_change_cmd() 153 new 154 call setline(1, [' L1', 'L2', 'L3']) 155 call feedkeys(":change\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 156 call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) 157 %delete _ 158 " change a specific line 159 call setline(1, [' L1', ' L2', ' L3']) 160 call feedkeys(":2change\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 161 call assert_equal([' L1', ' L4', ' L5', ' L3'], getline(1, '$')) 162 %delete _ 163 " change with toggling 'autoindent' 164 call setline(1, [' L1', 'L2', 'L3']) 165 call feedkeys(":change!\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 166 call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) 167 call assert_false(&autoindent) 168 %delete _ 169 " change with 'autoindent' set and toggling 'autoindent' 170 set autoindent 171 call setline(1, [' L1', 'L2', 'L3']) 172 call feedkeys(":change!\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') 173 call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) 174 call assert_true(&autoindent) 175 set autoindent& 176 close! 177endfunc 178 179" Test for the :language command 180func Test_language_cmd() 181 CheckFeature multi_lang 182 183 call assert_fails('language ctype non_existing_lang', 'E197:') 184 call assert_fails('language time non_existing_lang', 'E197:') 185endfunc 186 187" Test for the :confirm command dialog 188func Test_confirm_cmd() 189 CheckNotGui 190 CheckRunVimInTerminal 191 192 call writefile(['foo1'], 'foo') 193 call writefile(['bar1'], 'bar') 194 195 " Test for saving all the modified buffers 196 let buf = RunVimInTerminal('', {'rows': 20}) 197 call term_sendkeys(buf, ":set nomore\n") 198 call term_sendkeys(buf, ":new foo\n") 199 call term_sendkeys(buf, ":call setline(1, 'foo2')\n") 200 call term_sendkeys(buf, ":new bar\n") 201 call term_sendkeys(buf, ":call setline(1, 'bar2')\n") 202 call term_sendkeys(buf, ":wincmd b\n") 203 call term_sendkeys(buf, ":confirm qall\n") 204 call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000) 205 call term_sendkeys(buf, "A") 206 call StopVimInTerminal(buf) 207 208 call assert_equal(['foo2'], readfile('foo')) 209 call assert_equal(['bar2'], readfile('bar')) 210 211 " Test for discarding all the changes to modified buffers 212 let buf = RunVimInTerminal('', {'rows': 20}) 213 call term_sendkeys(buf, ":set nomore\n") 214 call term_sendkeys(buf, ":new foo\n") 215 call term_sendkeys(buf, ":call setline(1, 'foo3')\n") 216 call term_sendkeys(buf, ":new bar\n") 217 call term_sendkeys(buf, ":call setline(1, 'bar3')\n") 218 call term_sendkeys(buf, ":wincmd b\n") 219 call term_sendkeys(buf, ":confirm qall\n") 220 call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000) 221 call term_sendkeys(buf, "D") 222 call StopVimInTerminal(buf) 223 224 call assert_equal(['foo2'], readfile('foo')) 225 call assert_equal(['bar2'], readfile('bar')) 226 227 " Test for saving and discarding changes to some buffers 228 let buf = RunVimInTerminal('', {'rows': 20}) 229 call term_sendkeys(buf, ":set nomore\n") 230 call term_sendkeys(buf, ":new foo\n") 231 call term_sendkeys(buf, ":call setline(1, 'foo4')\n") 232 call term_sendkeys(buf, ":new bar\n") 233 call term_sendkeys(buf, ":call setline(1, 'bar4')\n") 234 call term_sendkeys(buf, ":wincmd b\n") 235 call term_sendkeys(buf, ":confirm qall\n") 236 call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000) 237 call term_sendkeys(buf, "N") 238 call WaitForAssert({-> assert_match('\[Y\]es, (N)o, (C)ancel: ', term_getline(buf, 20))}, 1000) 239 call term_sendkeys(buf, "Y") 240 call StopVimInTerminal(buf) 241 242 call assert_equal(['foo4'], readfile('foo')) 243 call assert_equal(['bar2'], readfile('bar')) 244 245 call delete('foo') 246 call delete('bar') 247endfunc 248 249func Test_confirm_cmd_cancel() 250 " Test for closing a window with a modified buffer 251 let buf = RunVimInTerminal('', {'rows': 20}) 252 call term_sendkeys(buf, ":set nomore\n") 253 call term_sendkeys(buf, ":new\n") 254 call term_sendkeys(buf, ":call setline(1, 'abc')\n") 255 call term_sendkeys(buf, ":confirm close\n") 256 call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$', 257 \ term_getline(buf, 20))}, 1000) 258 call term_sendkeys(buf, "C") 259 call term_wait(buf, 50) 260 call term_sendkeys(buf, ":confirm close\n") 261 call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$', 262 \ term_getline(buf, 20))}, 1000) 263 call term_sendkeys(buf, "N") 264 call StopVimInTerminal(buf) 265endfunc 266 267" Test for the :print command 268func Test_print_cmd() 269 call assert_fails('print', 'E749:') 270endfunc 271 272" Test for the :winsize command 273func Test_winsize_cmd() 274 call assert_fails('winsize 1', 'E465:') 275endfunc 276 277" Test for the :redir command 278func Test_redir_cmd() 279 call assert_fails('redir @@', 'E475:') 280 call assert_fails('redir abc', 'E475:') 281 call assert_fails('redir => 1abc', 'E474:') 282 call assert_fails('redir => a b', 'E488:') 283 call assert_fails('redir => abc[1]', 'E474:') 284 let b=0zFF 285 call assert_fails('redir =>> b', 'E734:') 286 unlet b 287 288 if has('unix') 289 " Redirecting to a directory name 290 call mkdir('Xdir') 291 call assert_fails('redir > Xdir', 'E17:') 292 call delete('Xdir', 'd') 293 endif 294 if !has('bsd') 295 " Redirecting to a read-only file 296 call writefile([], 'Xfile') 297 call setfperm('Xfile', 'r--r--r--') 298 call assert_fails('redir! > Xfile', 'E190:') 299 call delete('Xfile') 300 endif 301 302 " Test for redirecting to a register 303 redir @q> | echon 'clean ' | redir END 304 redir @q>> | echon 'water' | redir END 305 call assert_equal('clean water', @q) 306 307 " Test for redirecting to a variable 308 redir => color | echon 'blue ' | redir END 309 redir =>> color | echon 'sky' | redir END 310 call assert_equal('blue sky', color) 311endfunc 312 313" Test for the :filetype command 314func Test_filetype_cmd() 315 call assert_fails('filetype abc', 'E475:') 316endfunc 317 318" Test for the :mode command 319func Test_mode_cmd() 320 call assert_fails('mode abc', 'E359:') 321endfunc 322 323" Test for the :sleep command 324func Test_sleep_cmd() 325 call assert_fails('sleep x', 'E475:') 326endfunc 327 328" Test for the :read command 329func Test_read_cmd() 330 call writefile(['one'], 'Xfile') 331 new 332 call assert_fails('read', 'E32:') 333 edit Xfile 334 read 335 call assert_equal(['one', 'one'], getline(1, '$')) 336 close! 337 new 338 read Xfile 339 call assert_equal(['', 'one'], getline(1, '$')) 340 call deletebufline('', 1, '$') 341 call feedkeys("Qr Xfile\<CR>visual\<CR>", 'xt') 342 call assert_equal(['one'], getline(1, '$')) 343 close! 344 call delete('Xfile') 345endfunc 346 347" Test for running Ex commands when text is locked. 348" <C-\>e in the command line is used to lock the text 349func Test_run_excmd_with_text_locked() 350 " :quit 351 let cmd = ":\<C-\>eexecute('quit')\<CR>\<C-C>" 352 call assert_fails("call feedkeys(cmd, 'xt')", 'E523:') 353 354 " :qall 355 let cmd = ":\<C-\>eexecute('qall')\<CR>\<C-C>" 356 call assert_fails("call feedkeys(cmd, 'xt')", 'E523:') 357 358 " :exit 359 let cmd = ":\<C-\>eexecute('exit')\<CR>\<C-C>" 360 call assert_fails("call feedkeys(cmd, 'xt')", 'E523:') 361 362 " :close - should be ignored 363 new 364 let cmd = ":\<C-\>eexecute('close')\<CR>\<C-C>" 365 call assert_equal(2, winnr('$')) 366 close 367 368 call assert_fails("call feedkeys(\":\<C-R>=execute('bnext')\<CR>\", 'xt')", 'E523:') 369endfunc 370 371" Test for the :verbose command 372func Test_verbose_cmd() 373 call assert_equal([' verbose=1'], split(execute('verbose set vbs'), "\n")) 374 call assert_equal([' verbose=0'], split(execute('0verbose set vbs'), "\n")) 375 let l = execute("4verbose set verbose | set verbose") 376 call assert_equal([' verbose=4', ' verbose=0'], split(l, "\n")) 377endfunc 378 379" Test for the :delete command and the related abbreviated commands 380func Test_excmd_delete() 381 new 382 call setline(1, ['foo', "\tbar"]) 383 call assert_equal(['^Ibar$'], split(execute('dl'), "\n")) 384 call setline(1, ['foo', "\tbar"]) 385 call assert_equal(['^Ibar$'], split(execute('dell'), "\n")) 386 call setline(1, ['foo', "\tbar"]) 387 call assert_equal(['^Ibar$'], split(execute('delel'), "\n")) 388 call setline(1, ['foo', "\tbar"]) 389 call assert_equal(['^Ibar$'], split(execute('deletl'), "\n")) 390 call setline(1, ['foo', "\tbar"]) 391 call assert_equal(['^Ibar$'], split(execute('deletel'), "\n")) 392 call setline(1, ['foo', "\tbar"]) 393 call assert_equal([' bar'], split(execute('dp'), "\n")) 394 call setline(1, ['foo', "\tbar"]) 395 call assert_equal([' bar'], split(execute('dep'), "\n")) 396 call setline(1, ['foo', "\tbar"]) 397 call assert_equal([' bar'], split(execute('delp'), "\n")) 398 call setline(1, ['foo', "\tbar"]) 399 call assert_equal([' bar'], split(execute('delep'), "\n")) 400 call setline(1, ['foo', "\tbar"]) 401 call assert_equal([' bar'], split(execute('deletp'), "\n")) 402 call setline(1, ['foo', "\tbar"]) 403 call assert_equal([' bar'], split(execute('deletep'), "\n")) 404 close! 405endfunc 406 407" vim: shiftwidth=2 sts=2 expandtab 408