test_eval_stuff.vim (15280B)
1 " Tests for various eval things. 2 3 source view_util.vim 4 source shared.vim 5 6 function s:foo() abort 7 try 8 return [] == 0 9 catch 10 return 1 11 endtry 12 endfunction 13 14 func Test_catch_return_with_error() 15 call assert_equal(1, s:foo()) 16 endfunc 17 18 func Test_nocatch_restore_silent_emsg() 19 silent! try 20 throw 1 21 catch 22 endtry 23 echoerr 'wrong again' 24 call assert_equal('wrong again', ScreenLine(&lines)) 25 endfunc 26 27 func Test_mkdir_p() 28 call mkdir('Xmkdir/nested', 'p') 29 call assert_true(isdirectory('Xmkdir/nested')) 30 try 31 " Trying to make existing directories doesn't error 32 call mkdir('Xmkdir', 'p') 33 call mkdir('Xmkdir/nested', 'p') 34 catch /E739:/ 35 call assert_report('mkdir(..., "p") failed for an existing directory') 36 endtry 37 " 'p' doesn't suppress real errors 38 call writefile([], 'Xfile') 39 call assert_fails('call mkdir("Xfile", "p")', 'E739:') 40 call delete('Xfile') 41 call delete('Xmkdir', 'rf') 42 call assert_equal(0, mkdir(v:_null_string)) 43 call assert_fails('call mkdir([])', 'E730:') 44 call assert_fails('call mkdir("abc", [], [])', 'E745:') 45 endfunc 46 47 func DoMkdirDel(name) 48 call mkdir(a:name, 'pD') 49 call assert_true(isdirectory(a:name)) 50 endfunc 51 52 func DoMkdirDelAddFile(name) 53 call mkdir(a:name, 'pD') 54 call assert_true(isdirectory(a:name)) 55 call writefile(['text'], a:name .. '/file') 56 endfunc 57 58 func DoMkdirDelRec(name) 59 call mkdir(a:name, 'pR') 60 call assert_true(isdirectory(a:name)) 61 endfunc 62 63 func DoMkdirDelRecAddFile(name) 64 call mkdir(a:name, 'pR') 65 call assert_true(isdirectory(a:name)) 66 call writefile(['text'], a:name .. '/file') 67 endfunc 68 69 func Test_mkdir_defer_del() 70 " Xtopdir/tmp is created thus deleted, not Xtopdir itself 71 call mkdir('Xtopdir', 'R') 72 call DoMkdirDel('Xtopdir/tmp') 73 call assert_true(isdirectory('Xtopdir')) 74 call assert_false(isdirectory('Xtopdir/tmp')) 75 76 " Deletion fails because "tmp" contains "sub" 77 call DoMkdirDel('Xtopdir/tmp/sub') 78 call assert_true(isdirectory('Xtopdir')) 79 call assert_true(isdirectory('Xtopdir/tmp')) 80 call delete('Xtopdir/tmp', 'rf') 81 82 " Deletion fails because "tmp" contains "file" 83 call DoMkdirDelAddFile('Xtopdir/tmp') 84 call assert_true(isdirectory('Xtopdir')) 85 call assert_true(isdirectory('Xtopdir/tmp')) 86 call assert_true(filereadable('Xtopdir/tmp/file')) 87 call delete('Xtopdir/tmp', 'rf') 88 89 " Xtopdir/tmp is created thus deleted, not Xtopdir itself 90 call DoMkdirDelRec('Xtopdir/tmp') 91 call assert_true(isdirectory('Xtopdir')) 92 call assert_false(isdirectory('Xtopdir/tmp')) 93 94 " Deletion works even though "tmp" contains "sub" 95 call DoMkdirDelRec('Xtopdir/tmp/sub') 96 call assert_true(isdirectory('Xtopdir')) 97 call assert_false(isdirectory('Xtopdir/tmp')) 98 99 " Deletion works even though "tmp" contains "file" 100 call DoMkdirDelRecAddFile('Xtopdir/tmp') 101 call assert_true(isdirectory('Xtopdir')) 102 call assert_false(isdirectory('Xtopdir/tmp')) 103 endfunc 104 105 func Test_line_continuation() 106 let array = [5, 107 "\ ignore this 108 \ 6, 109 "\ more to ignore 110 "\ more moreto ignore 111 \ ] 112 "\ and some more 113 call assert_equal([5, 6], array) 114 endfunc 115 116 func Test_E963() 117 " These commands used to cause an internal error prior to vim 8.1.0563 118 let v_e = v:errors 119 let v_o = v:oldfiles 120 call assert_fails("let v:errors=''", 'E963:') 121 call assert_equal(v_e, v:errors) 122 call assert_fails("let v:oldfiles=''", 'E963:') 123 call assert_equal(v_o, v:oldfiles) 124 endfunc 125 126 func Test_for_invalid() 127 call assert_fails("for x in 99", 'E1098:') 128 call assert_fails("for x in function('winnr')", 'E1098:') 129 call assert_fails("for x in {'a': 9}", 'E1098:') 130 131 if 0 132 /1/5/2/s/\n 133 endif 134 redraw 135 endfunc 136 137 func Test_for_over_null_string() 138 let save_enc = &enc 139 " set enc=iso8859 140 let cnt = 0 141 for c in v:_null_string 142 let cnt += 1 143 endfor 144 call assert_equal(0, cnt) 145 146 let &enc = save_enc 147 endfunc 148 149 func Test_for_with_modifier() 150 " this checks has_loop_cmd() works with a modifier 151 let result = [] 152 horizontal for i in range(3) 153 call extend(result, [i]) 154 endfor 155 call assert_equal([0, 1, 2], result) 156 endfunc 157 158 func Test_for_invalid_line_count() 159 let lines =<< trim END 160 111111111111111111111111 for line in ['one'] 161 endfor 162 END 163 call writefile(lines, 'XinvalidFor') 164 " only test that this doesn't crash 165 call RunVim([], [], '-u NONE -e -s -S XinvalidFor -c qa') 166 167 call delete('XinvalidFor') 168 endfunc 169 170 func Test_readfile_binary() 171 new 172 call setline(1, ['one', 'two', 'three']) 173 setlocal ff=dos 174 silent write XReadfile_bin 175 let lines = 'XReadfile_bin'->readfile() 176 call assert_equal(['one', 'two', 'three'], lines) 177 let lines = readfile('XReadfile_bin', '', 2) 178 call assert_equal(['one', 'two'], lines) 179 let lines = readfile('XReadfile_bin', 'b') 180 call assert_equal(["one\r", "two\r", "three\r", ""], lines) 181 let lines = readfile('XReadfile_bin', 'b', 2) 182 call assert_equal(["one\r", "two\r"], lines) 183 184 bwipe! 185 call delete('XReadfile_bin') 186 endfunc 187 188 func Test_readfile_binary_empty() 189 call writefile([], 'Xempty-file') 190 " This used to compare uninitialized memory in Vim <= 8.2.4065 191 call assert_equal([''], readfile('Xempty-file', 'b')) 192 call delete('Xempty-file') 193 endfunc 194 195 func Test_readfile_bom() 196 call writefile(["\ufeffFOO", "FOO\ufeffBAR"], 'XReadfile_bom') 197 call assert_equal(['FOO', 'FOOBAR'], readfile('XReadfile_bom')) 198 call delete('XReadfile_bom') 199 endfunc 200 201 func Test_readfile_max() 202 call writefile(range(1, 4), 'XReadfile_max') 203 call assert_equal(['1', '2'], readfile('XReadfile_max', '', 2)) 204 call assert_equal(['3', '4'], readfile('XReadfile_max', '', -2)) 205 call delete('XReadfile_max') 206 endfunc 207 208 func Test_let_errmsg() 209 call assert_fails('let v:errmsg = []', 'E730:') 210 let v:errmsg = '' 211 call assert_fails('let v:errmsg = []', 'E730:') 212 let v:errmsg = '' 213 endfunc 214 215 func Test_string_concatenation() 216 call assert_equal('ab', 'a'.'b') 217 call assert_equal('ab', 'a' .'b') 218 call assert_equal('ab', 'a'. 'b') 219 call assert_equal('ab', 'a' . 'b') 220 221 call assert_equal('ab', 'a'..'b') 222 call assert_equal('ab', 'a' ..'b') 223 call assert_equal('ab', 'a'.. 'b') 224 call assert_equal('ab', 'a' .. 'b') 225 226 let a = 'a' 227 let b = 'b' 228 let a .= b 229 call assert_equal('ab', a) 230 231 let a = 'a' 232 let a.=b 233 call assert_equal('ab', a) 234 235 let a = 'a' 236 let a ..= b 237 call assert_equal('ab', a) 238 239 let a = 'a' 240 let a..=b 241 call assert_equal('ab', a) 242 243 if has('float') 244 let a = 'A' 245 let b = 1.234 246 call assert_equal('A1.234', a .. b) 247 endif 248 endfunc 249 250 " Test fix for issue #4507 251 func Test_skip_after_throw() 252 try 253 throw 'something' 254 let x = wincol() || &ts 255 catch /something/ 256 endtry 257 endfunc 258 259 " scriptversion 1 260 func Test_string_concat_scriptversion1() 261 call assert_true(has('vimscript-1')) 262 let a = 'a' 263 let b = 'b' 264 265 echo a . b 266 let a .= b 267 let vers = 1.2.3 268 call assert_equal('123', vers) 269 270 if has('float') 271 call assert_fails('let f = .5', 'E15:') 272 endif 273 endfunc 274 275 " scriptversion 2 276 func Test_vvar_scriptversion2() 277 call assert_true(exists('version')) 278 echo version 279 call assert_fails('let version = 1', 'E46:') 280 call assert_equal(v:version, version) 281 282 call assert_equal(v:version, v:versionlong / 10000) 283 call assert_true(v:versionlong > 8011525) 284 endfunc 285 286 " scriptversion 1 287 func Test_vvar_scriptversion1() 288 call assert_equal(15, 017) 289 call assert_equal(15, 0o17) 290 call assert_equal(15, 0O17) 291 call assert_equal(18, 018) 292 call assert_equal(511, 0o777) 293 endfunc 294 295 func Test_execute_cmd_with_null() 296 call assert_fails('execute v:_null_list', 'E730:') 297 call assert_fails('execute v:_null_dict', 'E731:') 298 call assert_fails('execute v:_null_blob', 'E976:') 299 execute v:_null_string 300 " Nvim doesn't have null partials 301 " call assert_fails('execute test_null_partial()', 'E729:') 302 " Nvim doesn't have test_unknown() 303 " call assert_fails('execute test_unknown()', 'E908:') 304 if has('job') 305 call assert_fails('execute test_null_job()', 'E908:') 306 call assert_fails('execute test_null_channel()', 'E908:') 307 endif 308 endfunc 309 310 func Test_number_max_min_size() 311 " This will fail on systems without 64 bit number support or when not 312 " configured correctly. 313 call assert_equal(64, v:numbersize) 314 315 call assert_true(v:numbermin < -9999999) 316 call assert_true(v:numbermax > 9999999) 317 endfunc 318 319 func Assert_reg(name, type, value, valuestr, expr, exprstr) 320 call assert_equal(a:type, getregtype(a:name)) 321 call assert_equal(a:value, getreg(a:name)) 322 call assert_equal(a:valuestr, string(getreg(a:name, 0, 1))) 323 call assert_equal(a:expr, getreg(a:name, 1)) 324 call assert_equal(a:exprstr, string(getreg(a:name, 1, 1))) 325 endfunc 326 327 func Test_let_register() 328 let @" = 'abc' 329 call Assert_reg('"', 'v', "abc", "['abc']", "abc", "['abc']") 330 let @" = "abc\n" 331 call Assert_reg('"', 'V', "abc\n", "['abc']", "abc\n", "['abc']") 332 let @" = "abc\<C-m>" 333 call Assert_reg('"', 'V', "abc\r\n", "['abc\r']", "abc\r\n", "['abc\r']") 334 let @= = '"abc"' 335 call Assert_reg('=', 'v', "abc", "['abc']", '"abc"', "['\"abc\"']") 336 endfunc 337 338 func Assert_regput(name, result) 339 new 340 execute "silent normal! o==\n==\e\"" . a:name . "P" 341 call assert_equal(a:result, getline(2, line('$'))) 342 bwipe! 343 endfunc 344 345 func Test_setreg_basic() 346 call setreg('a', 'abcA', 'c') 347 call Assert_reg('a', 'v', "abcA", "['abcA']", "abcA", "['abcA']") 348 call Assert_regput('a', ['==', '=abcA=']) 349 350 call setreg('A', 'abcAc', 'c') 351 call Assert_reg('A', 'v', "abcAabcAc", "['abcAabcAc']", "abcAabcAc", "['abcAabcAc']") 352 call Assert_regput('a', ['==', '=abcAabcAc=']) 353 354 call setreg('A', 'abcAl', 'l') 355 call Assert_reg('A', 'V', "abcAabcAcabcAl\n", "['abcAabcAcabcAl']", "abcAabcAcabcAl\n", "['abcAabcAcabcAl']") 356 call Assert_regput('a', ['==', 'abcAabcAcabcAl', '==']) 357 358 call setreg('A', 'abcAc2','c') 359 call Assert_reg('A', 'v', "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']", "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']") 360 call Assert_regput('a', ['==', '=abcAabcAcabcAl', 'abcAc2=']) 361 362 call setreg('b', 'abcB', 'v') 363 call Assert_reg('b', 'v', "abcB", "['abcB']", "abcB", "['abcB']") 364 call Assert_regput('b', ['==', '=abcB=']) 365 366 call setreg('b', 'abcBc', 'ca') 367 call Assert_reg('b', 'v', "abcBabcBc", "['abcBabcBc']", "abcBabcBc", "['abcBabcBc']") 368 call Assert_regput('b', ['==', '=abcBabcBc=']) 369 370 call setreg('b', 'abcBb', 'ba') 371 call Assert_reg('b', "\<C-V>5", "abcBabcBcabcBb", "['abcBabcBcabcBb']", "abcBabcBcabcBb", "['abcBabcBcabcBb']") 372 call Assert_regput('b', ['==', '=abcBabcBcabcBb=']) 373 374 call setreg('b', 'abcBc2','ca') 375 call Assert_reg('b', "v", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']") 376 call Assert_regput('b', ['==', '=abcBabcBcabcBb', 'abcBc2=']) 377 378 call setreg('b', 'abcBb2','b50a') 379 call Assert_reg('b', "\<C-V>50", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']") 380 call Assert_regput('b', ['==', '=abcBabcBcabcBb =', ' abcBc2abcBb2']) 381 382 call setreg('c', 'abcC', 'l') 383 call Assert_reg('c', 'V', "abcC\n", "['abcC']", "abcC\n", "['abcC']") 384 call Assert_regput('c', ['==', 'abcC', '==']) 385 386 call setreg('C', 'abcCl', 'l') 387 call Assert_reg('C', 'V', "abcC\nabcCl\n", "['abcC', 'abcCl']", "abcC\nabcCl\n", "['abcC', 'abcCl']") 388 call Assert_regput('c', ['==', 'abcC', 'abcCl', '==']) 389 390 call setreg('C', 'abcCc', 'c') 391 call Assert_reg('C', 'v', "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']", "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']") 392 call Assert_regput('c', ['==', '=abcC', 'abcCl', 'abcCc=']) 393 394 call setreg('d', 'abcD', 'V') 395 call Assert_reg('d', 'V', "abcD\n", "['abcD']", "abcD\n", "['abcD']") 396 call Assert_regput('d', ['==', 'abcD', '==']) 397 398 call setreg('D', 'abcDb', 'b') 399 call Assert_reg('d', "\<C-V>5", "abcD\nabcDb", "['abcD', 'abcDb']", "abcD\nabcDb", "['abcD', 'abcDb']") 400 call Assert_regput('d', ['==', '=abcD =', ' abcDb']) 401 402 call setreg('e', 'abcE', 'b') 403 call Assert_reg('e', "\<C-V>4", "abcE", "['abcE']", "abcE", "['abcE']") 404 call Assert_regput('e', ['==', '=abcE=']) 405 406 call setreg('E', 'abcEb', 'b') 407 call Assert_reg('E', "\<C-V>5", "abcE\nabcEb", "['abcE', 'abcEb']", "abcE\nabcEb", "['abcE', 'abcEb']") 408 call Assert_regput('e', ['==', '=abcE =', ' abcEb']) 409 410 call setreg('E', 'abcEl', 'l') 411 call Assert_reg('E', "V", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']") 412 call Assert_regput('e', ['==', 'abcE', 'abcEb', 'abcEl', '==']) 413 414 call setreg('f', 'abcF', "\<C-v>") 415 call Assert_reg('f', "\<C-V>4", "abcF", "['abcF']", "abcF", "['abcF']") 416 call Assert_regput('f', ['==', '=abcF=']) 417 418 call setreg('F', 'abcFc', 'c') 419 call Assert_reg('F', "v", "abcF\nabcFc", "['abcF', 'abcFc']", "abcF\nabcFc", "['abcF', 'abcFc']") 420 call Assert_regput('f', ['==', '=abcF', 'abcFc=']) 421 422 call setreg('g', 'abcG', 'b10') 423 call Assert_reg('g', "\<C-V>10", "abcG", "['abcG']", "abcG", "['abcG']") 424 call Assert_regput('g', ['==', '=abcG =']) 425 426 call setreg('h', 'abcH', "\<C-v>10") 427 call Assert_reg('h', "\<C-V>10", "abcH", "['abcH']", "abcH", "['abcH']") 428 call Assert_regput('h', ['==', '=abcH =']) 429 430 call setreg('I', 'abcI') 431 call Assert_reg('I', "v", "abcI", "['abcI']", "abcI", "['abcI']") 432 call Assert_regput('I', ['==', '=abcI=']) 433 434 " Error cases 435 call assert_fails('call setreg()', 'E119:') 436 call assert_fails('call setreg(1)', 'E119:') 437 call assert_fails('call setreg(1, 2, 3, 4)', 'E118:') 438 call assert_fails('call setreg([], 2)', 'E730:') 439 call assert_fails('call setreg(1, 2, [])', 'E730:') 440 call assert_fails('call setreg("/", ["1", "2"])', 'E883:') 441 call assert_fails('call setreg("=", ["1", "2"])', 'E883:') 442 call assert_fails('call setreg(1, ["", "", [], ""])', 'E730:') 443 endfunc 444 445 func Test_curly_assignment() 446 let s:svar = 'svar' 447 let g:gvar = 'gvar' 448 let lname = 'gvar' 449 let gname = 'gvar' 450 let {'s:'.lname} = {'g:'.gname} 451 call assert_equal('gvar', s:gvar) 452 let s:gvar = '' 453 let { 's:'.lname } = { 'g:'.gname } 454 call assert_equal('gvar', s:gvar) 455 let s:gvar = '' 456 let { 's:' . lname } = { 'g:' . gname } 457 call assert_equal('gvar', s:gvar) 458 let s:gvar = '' 459 let { 's:' .. lname } = { 'g:' .. gname } 460 call assert_equal('gvar', s:gvar) 461 462 unlet s:svar 463 unlet s:gvar 464 unlet g:gvar 465 endfunc 466 467 func Test_deep_recursion() 468 " this was running out of stack 469 call assert_fails("exe 'if ' .. repeat('(', 1002)", 'E1169: Expression too recursive: ((') 470 endfunc 471 472 " K_SPECIAL in the modified character used be escaped, which causes 473 " double-escaping with feedkeys() or as the return value of an <expr> mapping, 474 " and doesn't match what getchar() returns, 475 func Test_modified_char_no_escape_special() 476 nnoremap <M-…> <Cmd>let g:got_m_ellipsis += 1<CR> 477 call feedkeys("\<M-…>", 't') 478 call assert_equal("\<M-…>", getchar()) 479 let g:got_m_ellipsis = 0 480 call feedkeys("\<M-…>", 'xt') 481 call assert_equal(1, g:got_m_ellipsis) 482 func Func() 483 return "\<M-…>" 484 endfunc 485 nmap <expr> <F2> Func() 486 call feedkeys("\<F2>", 'xt') 487 call assert_equal(2, g:got_m_ellipsis) 488 delfunc Func 489 nunmap <F2> 490 unlet g:got_m_ellipsis 491 nunmap <M-…> 492 endfunc 493 494 func Test_eval_string_in_special_key() 495 " this was using the '{' inside <> as the start of an interpolated string 496 silent! echo 0{1-$"\<S--{>n|nö% 497 endfunc 498 499 " vim: shiftwidth=2 sts=2 expandtab