Before: call ale#test#SetDirectory('/testplugin/test') call ale#test#SetFilename('dummy.txt') let g:Callback = 0 let g:message_list = [] let g:item_list = [] let g:echo_list = [] runtime autoload/ale/linter.vim runtime autoload/ale/lsp.vim runtime autoload/ale/util.vim function! ale#linter#StartLSP(buffer, linter, callback) abort let g:Callback = a:callback return { \ 'connection_id': 347, \ 'project_root': '/foo/bar', \} endfunction function! ale#lsp#Send(conn_id, message, root) abort call add(g:message_list, a:message) return 42 endfunction function! ale#util#ShowMessage(string) abort call add(g:echo_list, a:string) endfunction function! HandleValidLSPResult(result) abort " The cursor is beyond the length of the line. " We will clamp the cursor position with the line length. call setpos('.', [bufnr(''), 1, 5, 0]) call ale#hover#SetMap({3: { \ 'buffer': bufnr(''), \ 'line': 1, \ 'column': 5, \}}) call ale#hover#HandleLSPResponse( \ 1, \ { \ 'id': 3, \ 'result': a:result, \ } \) endfunction After: call ale#hover#SetMap({}) call ale#test#RestoreDirectory() call ale#linter#Reset() unlet! g:Callback unlet! g:message_list unlet! b:ale_linters unlet! g:echo_list delfunction HandleValidLSPResult runtime autoload/ale/linter.vim runtime autoload/ale/lsp.vim runtime autoload/ale/util.vim Given python(Some Python file): foo somelongerline bazxyzxyzxyz Execute(Other messages for the tsserver handler should be ignored): call ale#hover#HandleTSServerResponse(1, {'command': 'foo'}) Execute(Failed hover responses should be handled correctly): call ale#hover#SetMap({3: {}}) call ale#hover#HandleTSServerResponse( \ 1, \ {'command': 'quickinfo', 'request_seq': 3} \) AssertEqual {}, ale#hover#GetMap() Given typescript(Some typescript file): foo somelongerline bazxyzxyzxyz Execute(tsserver quickinfo responses will null missing bodies should be handled): call ale#hover#SetMap({3: {}}) call ale#hover#HandleTSServerResponse( \ 1, \ { \ 'command': 'quickinfo', \ 'request_seq': 3, \ 'success': v:true, \ } \) AssertEqual {}, ale#hover#GetMap() Execute(tsserver quickinfo displayString values should be displayed): call ale#hover#SetMap({3: {}}) call ale#hover#HandleTSServerResponse( \ 1, \ { \ 'command': 'quickinfo', \ 'request_seq': 3, \ 'success': v:true, \ 'body': {'displayString': 'foo bar'}, \ } \) AssertEqual ['foo bar'], g:echo_list AssertEqual {}, ale#hover#GetMap() Execute(LSP hover responses with just a string should be handled): call HandleValidLSPResult({'contents': 'foobar'}) AssertEqual ['foobar'], g:echo_list AssertEqual {}, ale#hover#GetMap() Execute(LSP hover null responses should be handled): call HandleValidLSPResult(v:null) AssertEqual [], g:echo_list AssertEqual {}, ale#hover#GetMap() Execute(LSP hover responses with markup content should be handled): call HandleValidLSPResult({'contents': {'kind': 'something', 'value': 'markup'}}) AssertEqual ['markup'], g:echo_list AssertEqual {}, ale#hover#GetMap() Execute(LSP hover response with lists of strings should be handled): call HandleValidLSPResult({'contents': [ \ "foo\n", \ "bar\n", \]}) AssertEqual ["foo\n\nbar\n"], g:echo_list AssertEqual {}, ale#hover#GetMap() Execute(LSP hover response with lists of strings and marked strings should be handled): call HandleValidLSPResult({'contents': [ \ {'language': 'rust', 'value': 'foo'}, \ "bar\n", \]}) AssertEqual ["foo\nbar\n"], g:echo_list AssertEqual {}, ale#hover#GetMap()