Mercurial > vim
view src/testdir/test_let.vim @ 33353:b59205d0567e v9.0.1939
patch 9.0.1939: still a problem when processing LSP RPC requests
Commit: https://github.com/vim/vim/commit/b80ae6cec34639abfb1a7080fb633346a81a5770
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sun Sep 24 23:38:46 2023 +0200
patch 9.0.1939: still a problem when processing LSP RPC requests
Problem: still a problem when processing LSP RPC requests
Solution: When processing async LSP RPC requests, compare sequence
numbers only in response messages
A LSP request message can be sent to the language server either
synchronously (ch_evalexpr) or asynchronously (ch_sendexpr). In both
cases, when looking for response messages by using the sequence number,
LSP requests messages from the language server with the same sequence
number should not be used. Patch 9.0.1927 fixed this issue for
synchronous requests. This PR fixes the issue for asynchronous requests
and adds additional tests.
closes: #13158
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 24 Sep 2023 23:45:08 +0200 |
parents | 695b50472e85 |
children | 3b0c98b3a7b5 |
line wrap: on
line source
" Tests for the :let command. import './vim9.vim' as v9 func Test_let() " Test to not autoload when assigning. It causes internal error. set runtimepath+=./sautest let Test104#numvar = function('tr') call assert_equal("function('tr')", string(Test104#numvar)) let foo#tr = function('tr') call assert_equal("function('tr')", string(foo#tr)) unlet foo#tr let a = 1 let b = 2 let out = execute('let a b') let s = "\na #1\nb #2" call assert_equal(s, out) let out = execute('let {0 == 1 ? "a" : "b"}') let s = "\nb #2" call assert_equal(s, out) let out = execute('let {0 == 1 ? "a" : "b"} a') let s = "\nb #2\na #1" call assert_equal(s, out) let out = execute('let a {0 == 1 ? "a" : "b"}') let s = "\na #1\nb #2" call assert_equal(s, out) " Test for displaying a string variable let s = 'vim' let out = execute('let s') let s = "\ns vim" call assert_equal(s, out) " Test for displaying a list variable let l = [1, 2] let out = execute('let l') let s = "\nl [1, 2]" call assert_equal(s, out) " Test for displaying a dict variable let d = {'k' : 'v'} let out = execute('let d') let s = "\nd {'k': 'v'}" call assert_equal(s, out) " Test for displaying a function reference variable let F = function('min') let out = execute('let F') let s = "\nF *min()" call assert_equal(s, out) let x = 0 if 0 | let x = 1 | endif call assert_equal(0, x) " Display a list item using an out of range index let l = [10] call assert_fails('let l[1]', 'E684:') " List special variable dictionaries let g:Test_Global_Var = 5 call assert_match("\nTest_Global_Var #5", execute('let g:')) unlet g:Test_Global_Var let b:Test_Buf_Var = 8 call assert_match("\nb:Test_Buf_Var #8", execute('let b:')) unlet b:Test_Buf_Var let w:Test_Win_Var = 'foo' call assert_equal("\nw:Test_Win_Var foo", execute('let w:')) unlet w:Test_Win_Var let t:Test_Tab_Var = 'bar' call assert_equal("\nt:Test_Tab_Var bar", execute('let t:')) unlet t:Test_Tab_Var let s:Test_Script_Var = [7] call assert_match("\ns:Test_Script_Var \\[7]", execute('let s:')) unlet s:Test_Script_Var let l:Test_Local_Var = {'k' : 5} call assert_match("\nl:Test_Local_Var {'k': 5}", execute('let l:')) call assert_match("v:errors []", execute('let v:')) " Test for assigning multiple list items let l = [1, 2, 3] let [l[0], l[1]] = [10, 20] call assert_equal([10, 20, 3], l) " Test for errors in conditional expression call assert_fails('let val = [] ? 1 : 2', 'E745:') call assert_fails('let val = 1 ? 5+ : 6', 'E121:') call assert_fails('let val = 1 ? 0 : 5+', 'E15:') call assert_false(exists('val')) " Test for errors in logical operators let @a = 'if [] || 0 | let val = 2 | endif' call assert_fails('exe @a', 'E745:') call assert_fails('call feedkeys(":let val = 0 || []\<cr>", "xt")', 'E745:') call assert_fails('exe "let val = [] && 5"', 'E745:') call assert_fails('exe "let val = 6 && []"', 'E745:') endfunc func s:set_arg1(a) abort let a:a = 1 endfunction func s:set_arg2(a) abort let a:b = 1 endfunction func s:set_arg3(a) abort let b = a: let b['a'] = 1 endfunction func s:set_arg4(a) abort let b = a: let b['a'] = 1 endfunction func s:set_arg5(a) abort let b = a: let b['a'][0] = 1 endfunction func s:set_arg6(a) abort let a:a[0] = 1 endfunction func s:set_arg7(a) abort call extend(a:, {'a': 1}) endfunction func s:set_arg8(a) abort call extend(a:, {'b': 1}) endfunction func s:set_arg9(a) abort let a:['b'] = 1 endfunction func s:set_arg10(a) abort let b = a: call extend(b, {'a': 1}) endfunction func s:set_arg11(a) abort let b = a: call extend(b, {'b': 1}) endfunction func s:set_arg12(a) abort let b = a: let b['b'] = 1 endfunction func Test_let_arg_fail() call assert_fails('call s:set_arg1(1)', 'E46:') call assert_fails('call s:set_arg2(1)', 'E461:') call assert_fails('call s:set_arg3(1)', 'E46:') call assert_fails('call s:set_arg4(1)', 'E46:') call assert_fails('call s:set_arg5(1)', 'E46:') call s:set_arg6([0]) call assert_fails('call s:set_arg7(1)', 'E742:') call assert_fails('call s:set_arg8(1)', 'E742:') call assert_fails('call s:set_arg9(1)', 'E461:') call assert_fails('call s:set_arg10(1)', 'E742:') call assert_fails('call s:set_arg11(1)', 'E742:') call assert_fails('call s:set_arg12(1)', 'E461:') endfunction func s:set_varg1(...) abort let a:000 = [] endfunction func s:set_varg2(...) abort let a:000[0] = 1 endfunction func s:set_varg3(...) abort let a:000 += [1] endfunction func s:set_varg4(...) abort call add(a:000, 1) endfunction func s:set_varg5(...) abort let a:000[0][0] = 1 endfunction func s:set_varg6(...) abort let b = a:000 let b[0] = 1 endfunction func s:set_varg7(...) abort let b = a:000 let b += [1] endfunction func s:set_varg8(...) abort let b = a:000 call add(b, 1) endfunction func s:set_varg9(...) abort let b = a:000 let b[0][0] = 1 endfunction func Test_let_varg_fail() call assert_fails('call s:set_varg1(1)', 'E46:') call assert_fails('call s:set_varg2(1)', 'E742:') call assert_fails('call s:set_varg3(1)', 'E46:') call assert_fails('call s:set_varg4(1)', 'E742:') call s:set_varg5([0]) call assert_fails('call s:set_varg6(1)', 'E742:') call assert_fails('call s:set_varg7(1)', 'E742:') call assert_fails('call s:set_varg8(1)', 'E742:') call s:set_varg9([0]) endfunction func Test_let_utf8_environment() let $a = 'ĀĒĪŌŪあいうえお' call assert_equal('ĀĒĪŌŪあいうえお', $a) endfunc func Test_let_no_type_checking() let v = 1 let v = [1,2,3] let v = {'a': 1, 'b': 2} let v = 3.4 let v = 'hello' endfunc func Test_let_termcap() " Terminal code let old_t_te = &t_te let &t_te = "\<Esc>[yes;" call assert_match('t_te.*^[[yes;', execute("set termcap")) let &t_te = old_t_te if exists("+t_k1") " Key code let old_t_k1 = &t_k1 let &t_k1 = "that" call assert_match('t_k1.*that', execute("set termcap")) let &t_k1 = old_t_k1 endif call assert_fails('let x = &t_xx', 'E113:') let &t_xx = "yes" call assert_equal("yes", &t_xx) let &t_xx = "" call assert_fails('let x = &t_xx', 'E113:') endfunc func Test_let_option_error() let _w = &tw let &tw = 80 call assert_fails('let &tw .= 1', ['E734:', 'E734:']) call assert_fails('let &tw .= []', ['E734:', 'E734:']) call assert_fails('let &tw = []', ['E745:', 'E745:']) call assert_fails('let &tw += []', ['E745:', 'E745:']) call assert_equal(80, &tw) let &tw = _w let _w = &autoread let &autoread = 1 call assert_fails('let &autoread .= 1', ['E734:', 'E734:']) call assert_fails('let &autoread .= []', ['E734:', 'E734:']) call assert_fails('let &autoread = []', ['E745:', 'E745:']) call assert_fails('let &autoread += []', ['E745:', 'E745:']) call assert_equal(1, &autoread) let &autoread = _w let _w = &fillchars let &fillchars = "vert:|" call assert_fails('let &fillchars += "diff:-"', ['E734:', 'E734:']) call assert_fails('let &fillchars += []', ['E734:', 'E734:']) call assert_fails('let &fillchars = []', ['E730:', 'E730:']) call assert_fails('let &fillchars .= []', ['E730:', 'E730:']) call assert_equal("vert:|", &fillchars) let &fillchars = _w call assert_fails('let &nosuchoption = 1', ['E355:', 'E355:']) call assert_fails('let &nosuchoption = ""', ['E355:', 'E355:']) call assert_fails('let &nosuchoption = []', ['E355:', 'E355:']) call assert_fails('let &t_xx = []', ['E730:', 'E730:']) endfunc " Errors with the :let statement func Test_let_errors() let s = 'abcd' call assert_fails('let s[1] = 5', 'E689:') let l = [1, 2, 3] call assert_fails('let l[:] = 5', 'E709:') call assert_fails('let x:lnum=5', ['E121:', 'E121:']) call assert_fails('let v:=5', 'E461:') call assert_fails('let [a]', 'E474:') call assert_fails('let [a, b] = [', 'E697:') call assert_fails('let [a, b] = [10, 20', 'E696:') call assert_fails('let [a, b] = 10', 'E714:') call assert_fails('let [a, , b] = [10, 20]', 'E475:') call assert_fails('let [a, b&] = [10, 20]', 'E475:') call assert_fails('let $ = 10', 'E475:') call assert_fails('let $FOO[1] = "abc"', 'E18:') call assert_fails('let &buftype[1] = "nofile"', 'E18:') let s = "var" let var = 1 call assert_fails('let var += [1,2]', 'E734:') call assert_fails('let {s}.1 = 2', 'E1203:') call assert_fails('let a[1] = 5', 'E121:') let l = [[1,2]] call assert_fails('let l[:][0] = [5]', 'E708:') let d = {'k' : 4} call assert_fails('let d.# = 5', 'E488:') call assert_fails('let d.m += 5', 'E716:') call assert_fails('let m = d[{]', 'E15:') let l = [1, 2] call assert_fails('let l[2] = 0', 'E684:') call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:') call assert_fails('let l[-2:-3] = [3, 4]', 'E684:') call assert_fails('let l[0:4] = [5, 6]', 'E711:') call assert_fails('let l -= 2', 'E734:') call assert_fails('let l += 2', 'E734:') call assert_fails('let g:["a;b"] = 10', 'E461:') call assert_fails('let g:.min = function("max")', 'E704:') call assert_fails('let g:cos = "" | let g:.cos = {-> 42}', 'E704:') if has('channel') let ch = test_null_channel() call assert_fails('let ch += 1', 'E734:') endif call assert_fails('let name = "a" .. "b",', 'E488: Trailing characters: ,') " This test works only when the language is English if v:lang == "C" || v:lang =~ '^[Ee]n' call assert_fails('let [a ; b;] = [10, 20]', \ 'Double ; in list of variables') endif endfunc func Test_let_heredoc_fails() call assert_fails('let v =<< marker', 'E991:') try exe "let v =<< TEXT | abc | TEXT" call assert_report('No exception thrown') catch /E488:/ catch call assert_report('Caught exception: ' .. v:exception) endtry try let &commentstring =<< trim TEXT change insert append TEXT call assert_report('No exception thrown') catch /E730:/ catch call assert_report('Caught exception: ' .. v:exception) endtry try let $SOME_ENV_VAR =<< trim TEXT change insert append TEXT call assert_report('No exception thrown') catch /E730:/ catch call assert_report('Caught exception: ' .. v:exception) endtry try let @r =<< trim TEXT change insert append TEXT call assert_report('No exception thrown') catch /E730:/ catch call assert_report('Caught exception: ' .. v:exception) endtry let text =<< trim END func WrongSyntax() let v =<< that there endfunc END call writefile(text, 'XheredocFail', 'D') call assert_fails('source XheredocFail', 'E1145:') let text =<< trim CodeEnd func MissingEnd() let v =<< END endfunc CodeEnd call writefile(text, 'XheredocWrong', 'D') call assert_fails('source XheredocWrong', 'E1145:') let text =<< trim TEXTend let v =<< " comment TEXTend call writefile(text, 'XheredocNoMarker', 'D') call assert_fails('source XheredocNoMarker', 'E172:') let text =<< trim TEXTend let v =<< text TEXTend call writefile(text, 'XheredocBadMarker', 'D') call assert_fails('source XheredocBadMarker', 'E221:') call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker', 'D') call assert_fails('source XheredocMissingMarker', 'E990:') endfunc func Test_let_heredoc_trim_no_indent_marker() let text =<< trim END Text with indent END call assert_equal(['Text', 'with', 'indent'], text) endfunc func Test_let_interpolated() call assert_equal('{text}', $'{{text}}') call assert_equal('{{text}}', $'{{{{text}}}}') let text = 'text' call assert_equal('text{{', $'{text .. "{{"}') call assert_equal('text{{', $"{text .. '{{'}") call assert_equal('text{{', $'{text .. '{{'}') call assert_equal('text{{', $"{text .. "{{"}") endfunc " Test for the setting a variable using the heredoc syntax. " Keep near the end, this messes up highlighting. func Test_let_heredoc() let var1 =<< END Some sample text Text with indent !@#$%^&*()-+_={}|[]\~`:";'<>?,./ END call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1) let var2 =<< XXX Editor XXX call assert_equal(['Editor'], var2) let var3 =<<END END call assert_equal([], var3) let var3 =<<END vim end END END END call assert_equal(['vim', '', 'end', ' END', 'END '], var3) let var1 =<< trim END Line1 Line2 Line3 END END call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1) let var1 =<< trim !!! Line1 line2 Line3 !!! !!! call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1) let var1 =<< trim XX Line1 XX call assert_equal(['Line1'], var1) " ignore "endfunc" let var1 =<< END something endfunc END call assert_equal(['something', 'endfunc'], var1) " ignore "endfunc" with trim let var1 =<< trim END something endfunc END call assert_equal(['something', 'endfunc'], var1) " not concatenate lines let var1 =<< END some \thing \ else END call assert_equal(['some', ' \thing', ' \ else'], var1) " ignore "python << xx" let var1 =<<END something python << xx END call assert_equal(['something', 'python << xx'], var1) " ignore "python << xx" with trim let var1 =<< trim END something python << xx END call assert_equal(['something', 'python << xx'], var1) " ignore "append" let var1 =<< E something app E call assert_equal(['something', 'app'], var1) " ignore "append" with trim let var1 =<< trim END something app END call assert_equal(['something', 'app'], var1) let check = [] if 0 let check =<< trim END from heredoc END endif call assert_equal([], check) " unpack assignment let [a, b, c] =<< END x \y z END call assert_equal([' x', ' \y', ' z'], [a, b, c]) " unpack assignment without whitespace let[a,b,c]=<<END change insert append END call assert_equal(['change', 'insert', 'append'], [a, b, c]) " curly braces name and list slice assignment let foo_3_bar = ['', '', ''] let foo_{1 + 2}_bar[ : ] =<< END change insert append END call assert_equal(['change', 'insert', 'append'], foo_3_bar) " dictionary key containing brackets and spaces let d = {'abc] 123': 'baz'} let d[d['abc] 123'] .. '{'] =<< END change insert append END call assert_equal(['change', 'insert', 'append'], d['baz{']) endfunc " Test for evaluating Vim expressions in a heredoc using {expr} " Keep near the end, this messes up highlighting. func Test_let_heredoc_eval() let str = '' let code =<< trim eval END let a = {5 + 10} let b = {min([10, 6])} + {max([4, 6])} {str} let c = "abc{str}d" END call assert_equal(['let a = 15', 'let b = 6 + 6', '', 'let c = "abcd"'], code) let $TESTVAR = "Hello" let code =<< eval trim END let s = "{$TESTVAR}" END call assert_equal(['let s = "Hello"'], code) let code =<< eval END let s = "{$TESTVAR}" END call assert_equal([' let s = "Hello"'], code) let a = 10 let data =<< eval END {a} END call assert_equal(['10'], data) let x = 'X' let code =<< eval trim END let a = {{abc}} let b = {x} let c = {{ END call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code) let code = 'xxx' let code =<< eval trim END let n = {5 + 6} END call assert_equal('xxx', code) let code =<< eval trim END let n = {min([1, 2]} + {max([3, 4])} END call assert_equal('xxx', code) let lines =<< trim LINES let text =<< eval trim END let b = { END LINES call v9.CheckScriptFailure(lines, 'E1279:') let lines =<< trim LINES let text =<< eval trim END let b = {abc END LINES call v9.CheckScriptFailure(lines, 'E1279:') let lines =<< trim LINES let text =<< eval trim END let b = {} END LINES call v9.CheckScriptFailure(lines, 'E15:') " skipped heredoc if 0 let msg =<< trim eval END n is: {n} END endif " Test for sourcing a script containing a heredoc with invalid expression. " Variable assignment should fail, if expression evaluation fails new let g:Xvar = 'test' let g:b = 10 let lines =<< trim END let Xvar =<< eval CODE let a = 1 let b = {5+} let c = 2 CODE let g:Count += 1 END call setline(1, lines) let g:Count = 0 call assert_fails('source', 'E15:') call assert_equal(1, g:Count) call setline(3, 'let b = {abc}') call assert_fails('source', 'E121:') call assert_equal(2, g:Count) call setline(3, 'let b = {abc} + {min([9, 4])} + 2') call assert_fails('source', 'E121:') call assert_equal(3, g:Count) call assert_equal('test', g:Xvar) call assert_equal(10, g:b) bw! endfunc " vim: shiftwidth=2 sts=2 expandtab