neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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