Before: Save g:ale_lint_on_save Save g:ale_enabled Save g:ale_linters Save g:ale_run_synchronously call ale#test#SetDirectory('/testplugin/test/completion') call ale#test#SetFilename('dummy.txt') runtime autoload/ale/lsp.vim let g:ale_lint_on_save = 1 let b:ale_enabled = 1 let g:ale_lsp_next_message_id = 1 let g:ale_run_synchronously = 1 let g:message_list = [] let g:Callback = '' function! LanguageCallback() abort return 'foobar' endfunction function! ProjectRootCallback() abort return expand('.') endfunction call ale#linter#Define('foobar', { \ 'name': 'dummy_linter', \ 'lsp': 'stdio', \ 'command': 'cat - > /dev/null', \ 'executable': has('win32') ? 'cmd' : 'echo', \ 'language_callback': 'LanguageCallback', \ 'project_root_callback': 'ProjectRootCallback', \ }) let g:ale_linters = {'foobar': ['dummy_linter']} function! ale#linter#StartLSP(buffer, linter, callback) abort let g:Callback = a:callback return { \ 'connection_id': 347, \ 'project_root': '/foo/bar', \} endfunction " Replace the Send function for LSP, so we can monitor calls to it. function! ale#lsp#Send(conn_id, message, ...) abort call add(g:message_list, a:message) endfunction After: Restore unlet! b:ale_enabled unlet! b:ale_linters unlet! g:Callback unlet! g:message_list delfunction LanguageCallback delfunction ProjectRootCallback call ale#test#RestoreDirectory() call ale#linter#Reset() " Stop any timers we left behind. " This stops the tests from failing randomly. call ale#completion#StopTimer() runtime autoload/ale/completion.vim runtime autoload/ale/lsp.vim Given foobar (Some imaginary filetype): Execute(Server should be notified on save): call ale#events#SaveEvent(bufnr('')) AssertEqual \ [ \ [1, 'textDocument/didChange', { \ 'textDocument': { \ 'uri': ale#path#ToURI(expand('%:p')), \ 'version': g:ale_lsp_next_version_id - 1, \ }, \ 'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}], \ }], \ [1, 'textDocument/didSave', { \ 'textDocument': { \ 'uri': ale#path#ToURI(expand('%:p')), \ }, \ }], \ ], \ g:message_list Execute(Server should be notified on change): call ale#events#FileChangedEvent(bufnr('')) AssertEqual \ [ \ [1, 'textDocument/didChange', { \ 'textDocument': { \ 'uri': ale#path#ToURI(expand('%:p')), \ 'version': g:ale_lsp_next_version_id - 1, \ }, \ 'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}], \ }], \ ], \ g:message_list