1" Test for options 2 3func Test_whichwrap() 4 set whichwrap=b,s 5 call assert_equal('b,s', &whichwrap) 6 7 set whichwrap+=h,l 8 call assert_equal('b,s,h,l', &whichwrap) 9 10 set whichwrap+=h,l 11 call assert_equal('b,s,h,l', &whichwrap) 12 13 set whichwrap+=h,l 14 call assert_equal('b,s,h,l', &whichwrap) 15 16 set whichwrap=h,h 17 call assert_equal('h', &whichwrap) 18 19 set whichwrap=h,h,h 20 call assert_equal('h', &whichwrap) 21 22 set whichwrap& 23endfunc 24 25func Test_isfname() 26 " This used to cause Vim to access uninitialized memory. 27 set isfname= 28 call assert_equal("~X", expand("~X")) 29 set isfname& 30endfunc 31 32func Test_wildchar() 33 " Empty 'wildchar' used to access invalid memory. 34 call assert_fails('set wildchar=', 'E521:') 35 call assert_fails('set wildchar=abc', 'E521:') 36 set wildchar=<Esc> 37 let a=execute('set wildchar?') 38 call assert_equal("\n wildchar=<Esc>", a) 39 set wildchar=27 40 let a=execute('set wildchar?') 41 call assert_equal("\n wildchar=<Esc>", a) 42 set wildchar& 43endfunc 44 45func Test_options() 46 let caught = 'ok' 47 try 48 options 49 catch 50 let caught = v:throwpoint . "\n" . v:exception 51 endtry 52 call assert_equal('ok', caught) 53 54 " close option-window 55 close 56endfunc 57 58func Test_path_keep_commas() 59 " Test that changing 'path' keeps two commas. 60 set path=foo,,bar 61 set path-=bar 62 set path+=bar 63 call assert_equal('foo,,bar', &path) 64 65 set path& 66endfunc 67 68func Test_signcolumn() 69 if has('signs') 70 call assert_equal("auto", &signcolumn) 71 set signcolumn=yes 72 set signcolumn=no 73 call assert_fails('set signcolumn=nope') 74 endif 75endfunc 76 77func Test_filetype_valid() 78 if !has('autocmd') 79 return 80 endif 81 set ft=valid_name 82 call assert_equal("valid_name", &filetype) 83 set ft=valid-name 84 call assert_equal("valid-name", &filetype) 85 86 call assert_fails(":set ft=wrong;name", "E474:") 87 call assert_fails(":set ft=wrong\\\\name", "E474:") 88 call assert_fails(":set ft=wrong\\|name", "E474:") 89 call assert_fails(":set ft=wrong/name", "E474:") 90 call assert_fails(":set ft=wrong\\\nname", "E474:") 91 call assert_equal("valid-name", &filetype) 92 93 exe "set ft=trunc\x00name" 94 call assert_equal("trunc", &filetype) 95endfunc 96 97func Test_syntax_valid() 98 if !has('syntax') 99 return 100 endif 101 set syn=valid_name 102 call assert_equal("valid_name", &syntax) 103 set syn=valid-name 104 call assert_equal("valid-name", &syntax) 105 106 call assert_fails(":set syn=wrong;name", "E474:") 107 call assert_fails(":set syn=wrong\\\\name", "E474:") 108 call assert_fails(":set syn=wrong\\|name", "E474:") 109 call assert_fails(":set syn=wrong/name", "E474:") 110 call assert_fails(":set syn=wrong\\\nname", "E474:") 111 call assert_equal("valid-name", &syntax) 112 113 exe "set syn=trunc\x00name" 114 call assert_equal("trunc", &syntax) 115endfunc 116 117func Test_keymap_valid() 118 if !has('keymap') 119 return 120 endif 121 call assert_fails(":set kmp=valid_name", "E544:") 122 call assert_fails(":set kmp=valid_name", "valid_name") 123 call assert_fails(":set kmp=valid-name", "E544:") 124 call assert_fails(":set kmp=valid-name", "valid-name") 125 126 call assert_fails(":set kmp=wrong;name", "E474:") 127 call assert_fails(":set kmp=wrong\\\\name", "E474:") 128 call assert_fails(":set kmp=wrong\\|name", "E474:") 129 call assert_fails(":set kmp=wrong/name", "E474:") 130 call assert_fails(":set kmp=wrong\\\nname", "E474:") 131 132 call assert_fails(":set kmp=trunc\x00name", "E544:") 133 call assert_fails(":set kmp=trunc\x00name", "trunc") 134endfunc 135 136func Check_dir_option(name) 137 " Check that it's possible to set the option. 138 exe 'set ' . a:name . '=/usr/share/dict/words' 139 call assert_equal('/usr/share/dict/words', eval('&' . a:name)) 140 exe 'set ' . a:name . '=/usr/share/dict/words,/and/there' 141 call assert_equal('/usr/share/dict/words,/and/there', eval('&' . a:name)) 142 exe 'set ' . a:name . '=/usr/share/dict\ words' 143 call assert_equal('/usr/share/dict words', eval('&' . a:name)) 144 145 " Check rejecting weird characters. 146 call assert_fails("set " . a:name . "=/not&there", "E474:") 147 call assert_fails("set " . a:name . "=/not>there", "E474:") 148 call assert_fails("set " . a:name . "=/not.*there", "E474:") 149endfunc 150 151func Test_cinkeys() 152 " This used to cause invalid memory access 153 set cindent cinkeys=0 154 norm a 155 set cindent& cinkeys& 156endfunc 157 158func Test_dictionary() 159 call Check_dir_option('dictionary') 160endfunc 161 162func Test_thesaurus() 163 call Check_dir_option('thesaurus') 164endfun 165 166func Test_complete() 167 " Trailing single backslash used to cause invalid memory access. 168 set complete=s\ 169 new 170 call feedkeys("i\<C-N>\<Esc>", 'xt') 171 bwipe! 172 set complete& 173endfun 174 175func Test_set_completion() 176 call feedkeys(":set di\<C-A>\<C-B>\"\<CR>", 'tx') 177 call assert_equal('"set dictionary diff diffexpr diffopt digraph directory display', @:) 178 179 " Expand boolan options. When doing :set no<Tab> 180 " vim displays the options names without "no" but completion uses "no...". 181 call feedkeys(":set nodi\<C-A>\<C-B>\"\<CR>", 'tx') 182 call assert_equal('"set nodiff digraph', @:) 183 184 call feedkeys(":set invdi\<C-A>\<C-B>\"\<CR>", 'tx') 185 call assert_equal('"set invdiff digraph', @:) 186 187 " Expand abbreviation of options. 188 call feedkeys(":set ts\<C-A>\<C-B>\"\<CR>", 'tx') 189 call assert_equal('"set tabstop thesaurus ttyscroll', @:) 190 191 " Expand current value 192 call feedkeys(":set fileencodings=\<C-A>\<C-B>\"\<CR>", 'tx') 193 call assert_equal('"set fileencodings=ucs-bom,utf-8,default,latin1', @:) 194 195 call feedkeys(":set fileencodings:\<C-A>\<C-B>\"\<CR>", 'tx') 196 call assert_equal('"set fileencodings:ucs-bom,utf-8,default,latin1', @:) 197 198 " Expand key codes. 199 call feedkeys(":set <H\<C-A>\<C-B>\"\<CR>", 'tx') 200 call assert_equal('"set <Help> <Home>', @:) 201 202 " Expand terminal options. 203 call feedkeys(":set t_A\<C-A>\<C-B>\"\<CR>", 'tx') 204 call assert_equal('"set t_AB t_AF t_AL', @:) 205 206 " Expand directories. 207 call feedkeys(":set cdpath=./\<C-A>\<C-B>\"\<CR>", 'tx') 208 call assert_match(' ./samples/ ', @:) 209 call assert_notmatch(' ./small.vim ', @:) 210 211 " Expand files and directories. 212 call feedkeys(":set tags=./\<C-A>\<C-B>\"\<CR>", 'tx') 213 call assert_match(' ./samples/.* ./small.vim', @:) 214 215 call feedkeys(":set tags=./\\\\ dif\<C-A>\<C-B>\"\<CR>", 'tx') 216 call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:) 217endfunc 218 219func Test_set_errors() 220 call assert_fails('set scroll=-1', 'E49:') 221 call assert_fails('set backupcopy=', 'E474:') 222 call assert_fails('set regexpengine=3', 'E474:') 223 call assert_fails('set history=10001', 'E474:') 224 call assert_fails('set numberwidth=11', 'E474:') 225 call assert_fails('set colorcolumn=-a') 226 call assert_fails('set colorcolumn=a') 227 call assert_fails('set colorcolumn=1,') 228 call assert_fails('set cmdheight=-1', 'E487:') 229 call assert_fails('set cmdwinheight=-1', 'E487:') 230 if has('conceal') 231 call assert_fails('set conceallevel=-1', 'E487:') 232 call assert_fails('set conceallevel=4', 'E474:') 233 endif 234 call assert_fails('set helpheight=-1', 'E487:') 235 call assert_fails('set history=-1', 'E487:') 236 call assert_fails('set report=-1', 'E487:') 237 call assert_fails('set shiftwidth=-1', 'E487:') 238 call assert_fails('set sidescroll=-1', 'E487:') 239 call assert_fails('set tabstop=-1', 'E487:') 240 call assert_fails('set textwidth=-1', 'E487:') 241 call assert_fails('set timeoutlen=-1', 'E487:') 242 call assert_fails('set updatecount=-1', 'E487:') 243 call assert_fails('set updatetime=-1', 'E487:') 244 call assert_fails('set winheight=-1', 'E487:') 245 call assert_fails('set tabstop!', 'E488:') 246 call assert_fails('set xxx', 'E518:') 247 call assert_fails('set beautify?', 'E519:') 248 call assert_fails('set undolevels=x', 'E521:') 249 call assert_fails('set tabstop=', 'E521:') 250 call assert_fails('set comments=-', 'E524:') 251 call assert_fails('set comments=a', 'E525:') 252 call assert_fails('set foldmarker=x', 'E536:') 253 call assert_fails('set commentstring=x', 'E537:') 254 call assert_fails('set complete=x', 'E539:') 255 call assert_fails('set statusline=%{', 'E540:') 256 call assert_fails('set statusline=' . repeat("%p", 81), 'E541:') 257 call assert_fails('set statusline=%(', 'E542:') 258 if has('cursorshape') 259 " This invalid value for 'guicursor' used to cause Vim to crash. 260 call assert_fails('set guicursor=i-ci,r-cr:h', 'E545:') 261 call assert_fails('set guicursor=i-ci', 'E545:') 262 call assert_fails('set guicursor=x', 'E545:') 263 call assert_fails('set guicursor=r-cr:horx', 'E548:') 264 call assert_fails('set guicursor=r-cr:hor0', 'E549:') 265 endif 266 call assert_fails('set backupext=~ patchmode=~', 'E589:') 267 call assert_fails('set winminheight=10 winheight=9', 'E591:') 268 call assert_fails('set winminwidth=10 winwidth=9', 'E592:') 269 call assert_fails("set showbreak=\x01", 'E595:') 270 call assert_fails('set t_foo=', 'E846:') 271endfunc 272 273" Must be executed before other tests that set 'term'. 274func Test_000_term_option_verbose() 275 if has('gui_running') 276 return 277 endif 278 let verb_cm = execute('verbose set t_cm') 279 call assert_notmatch('Last set from', verb_cm) 280 281 let term_save = &term 282 set term=ansi 283 let verb_cm = execute('verbose set t_cm') 284 call assert_match('Last set from.*test_options.vim', verb_cm) 285 let &term = term_save 286endfunc 287 288func Test_set_ttytype() 289 if !has('gui_running') && has('unix') 290 " Setting 'ttytype' used to cause a double-free when exiting vim and 291 " when vim is compiled with -DEXITFREE. 292 set ttytype=ansi 293 call assert_equal('ansi', &ttytype) 294 call assert_equal(&ttytype, &term) 295 set ttytype=xterm 296 call assert_equal('xterm', &ttytype) 297 call assert_equal(&ttytype, &term) 298 " "set ttytype=" gives E522 instead of E529 299 " in travis on some builds. Why? Catch both for now 300 try 301 set ttytype= 302 call assert_report('set ttytype= did not fail') 303 catch /E529\|E522/ 304 endtry 305 306 " Some systems accept any terminal name and return dumb settings, 307 " check for failure of finding the entry and for missing 'cm' entry. 308 try 309 set ttytype=xxx 310 call assert_report('set ttytype=xxx did not fail') 311 catch /E522\|E437/ 312 endtry 313 314 set ttytype& 315 call assert_equal(&ttytype, &term) 316 endif 317endfunc 318 319func Test_set_all() 320 set tw=75 321 set iskeyword=a-z,A-Z 322 set nosplitbelow 323 let out = execute('set all') 324 call assert_match('textwidth=75', out) 325 call assert_match('iskeyword=a-z,A-Z', out) 326 call assert_match('nosplitbelow', out) 327 set tw& iskeyword& splitbelow& 328endfunc 329 330func Test_set_values() 331 if filereadable('opt_test.vim') 332 source opt_test.vim 333 else 334 throw 'Skipped: opt_test.vim does not exist' 335 endif 336endfunc 337 338func ResetIndentexpr() 339 set indentexpr= 340endfunc 341 342func Test_set_indentexpr() 343 " this was causing usage of freed memory 344 set indentexpr=ResetIndentexpr() 345 new 346 call feedkeys("i\<c-f>", 'x') 347 call assert_equal('', &indentexpr) 348 bwipe! 349endfunc 350 351func Test_backupskip() 352 if has("mac") 353 call assert_match('/private/tmp/\*', &bsk) 354 elseif has("unix") 355 call assert_match('/tmp/\*', &bsk) 356 endif 357 358 let bskvalue = substitute(&bsk, '\\', '/', 'g') 359 for var in ['$TEMPDIR', '$TMP', '$TEMP'] 360 if exists(var) 361 let varvalue = substitute(expand(var), '\\', '/', 'g') 362 call assert_match(varvalue . '/\=\*', bskvalue) 363 endif 364 endfor 365endfunc 366 367func Test_copy_winopt() 368 set hidden 369 370 " Test copy option from current buffer in window 371 split 372 enew 373 setlocal numberwidth=5 374 wincmd w 375 call assert_equal(4,&numberwidth) 376 bnext 377 call assert_equal(5,&numberwidth) 378 bw! 379 call assert_equal(4,&numberwidth) 380 381 " Test copy value from window that used to be display the buffer 382 split 383 enew 384 setlocal numberwidth=6 385 bnext 386 wincmd w 387 call assert_equal(4,&numberwidth) 388 bnext 389 call assert_equal(6,&numberwidth) 390 bw! 391 392 " Test that if buffer is current, don't use the stale cached value 393 " from the last time the buffer was displayed. 394 split 395 enew 396 setlocal numberwidth=7 397 bnext 398 bnext 399 setlocal numberwidth=8 400 wincmd w 401 call assert_equal(4,&numberwidth) 402 bnext 403 call assert_equal(8,&numberwidth) 404 bw! 405 406 " Test value is not copied if window already has seen the buffer 407 enew 408 split 409 setlocal numberwidth=9 410 bnext 411 setlocal numberwidth=10 412 wincmd w 413 call assert_equal(4,&numberwidth) 414 bnext 415 call assert_equal(4,&numberwidth) 416 bw! 417 418 set hidden& 419endfunc 420 421func Test_shortmess_F() 422 new 423 call assert_match('\[No Name\]', execute('file')) 424 set shortmess+=F 425 call assert_match('\[No Name\]', execute('file')) 426 call assert_match('^\s*$', execute('file foo')) 427 call assert_match('foo', execute('file')) 428 set shortmess-=F 429 call assert_match('bar', execute('file bar')) 430 call assert_match('bar', execute('file')) 431 set shortmess& 432 bwipe 433endfunc 434 435func Test_shortmess_F2() 436 e file1 437 e file2 438 call assert_match('file1', execute('bn', '')) 439 call assert_match('file2', execute('bn', '')) 440 set shortmess+=F 441 call assert_true(empty(execute('bn', ''))) 442 call assert_true(empty(execute('bn', ''))) 443 set hidden 444 call assert_true(empty(execute('bn', ''))) 445 call assert_true(empty(execute('bn', ''))) 446 set nohidden 447 call assert_true(empty(execute('bn', ''))) 448 call assert_true(empty(execute('bn', ''))) 449 set shortmess& 450 call assert_match('file1', execute('bn', '')) 451 call assert_match('file2', execute('bn', '')) 452 bwipe 453 bwipe 454endfunc 455