All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
1 function! s:test_diags() abort
4 \ 'method': 'textDocument/publishDiagnostics',
7 \ 'uri': 'file:///path/to/dummy.txt',
10 \ 'source': 'compiler',
12 \ 'end': {'character': 4, 'line': 4},
13 \ 'start': {'character': 1, 'line': 4}
15 \ 'message': 'error message 1',
19 \ 'source': 'compiler',
21 \ 'end': {'character': 4, 'line': 4},
22 \ 'start': {'character': 1, 'line': 4}
24 \ 'message': 'warning message 1',
33 function! s:test_locs() abort
38 \ 'filename': '/path/to/dummy.txt',
39 \ 'text': 'compiler:Error:error message 1'
44 \ 'filename': '/path/to/dummy.txt',
45 \ 'text': 'compiler:Warning:warning message 1'
50 function! s:test_diags_all_severities() abort
51 let diags = s:test_diags()
52 let diag = diags.gopls.params.diagnostics[0]
53 let diags.gopls.params.diagnostics = []
54 for [sev, name] in [[1, 'error'], [2, 'warning'], [3, 'info'], [4, 'hint']]
57 let d.message = name . ' message'
58 let diags.gopls.params.diagnostics += [d]
63 function! s:test_locs_all_severities() abort
64 let loc = s:test_locs()[0][0]
66 for [sev, name] in [[1, 'Error'], [2, 'Warning'], [3, 'Info'], [4, 'Hint']]
68 let l.text = 'compiler:' . name . ':' . tolower(name) . ' message'
74 function! s:test_expected_locs_all_severities() abort
75 let loc = s:test_locs()[0][0]
77 for [sev, name, type] in [[1, 'Error', 'E'], [2, 'Warning', 'W'], [3, 'Info', 'I'], [4, 'Hint', 'H']]
80 let l.text = '[gopls] compiler:' . name . ':' . tolower(name) . ' message'
86 function! s:modify_loc_item(item, type) abort
87 let a:item.type = a:type
88 let a:item.text = '[gopls] ' . a:item.text
94 " Set bufffer name to 'foo'
95 file /path/to/dummy.txt
99 call lsp#ale#_reset_prev_num_diags()
100 call lsp#callbag#reset()
101 call ale#other_source#reset()
102 call lsp#ui#vim#utils#reset()
103 call lsp#utils#mock_buf_name('/path/to/dummy.txt')
104 let g:lsp_ale_test_mock_diags = {}
105 let g:lsp_ale_test_mock_bufnr = bufnr('')
106 doautocmd User lsp_setup
107 let g:ale_want_results_buffer = bufnr('')
111 call lsp#ale#disable()
114 It enables vim-lsp's diagnostics and disables to output diagnostics
115 Assert True(g:lsp_diagnostics_enabled)
116 Assert False(g:lsp_diagnostics_highlights_enabled)
117 Assert False(g:lsp_diagnostics_signs_enabled)
118 Assert False(g:lsp_diagnostics_echo_cursor)
119 Assert False(g:lsp_diagnostics_virtual_text_enabled)
122 It disables ALE's LSP support
123 Assert True(g:ale_disable_lsp)
126 It defines plugin-lsp-ale autocmd group
127 Assert True(exists('g:loaded_lsp_ale'))
130 autocmd plugin-lsp-ale
133 Assert True(stridx(autocmds, 'lsp_setup') >= 0, autocmds)
134 Assert True(stridx(autocmds, 'ALEWantResults') >= 0, autocmds)
137 It subscribes notification stream on lsp_setup autocmd event
138 Assert True(lsp#callbag#piped())
141 It stops subscribing stream when lsp#ale#disable() is called
142 call lsp#ale#enable()
143 Assert True(lsp#ale#enabled())
144 call lsp#ale#disable()
145 Assert False(lsp#ale#enabled())
146 Assert True(lsp#callbag#disposed())
147 call lsp#ale#disable()
148 Assert False(lsp#ale#enabled())
151 Context ALEWantResults
152 It does not notify results when vim-lsp-ale is disabled
153 call lsp#ale#disable()
154 doautocmd User ALEWantResults
155 Assert Equals(ale#other_source#last_start_checking(), v:null)
158 It does not notify results when the buffer disables LSP
159 Assert Equals(ale#other_source#last_start_checking(), v:null)
161 let g:lsp_ale_test_mock_bufnr = -1
162 doautocmd User ALEWantResults
164 Assert Equals(ale#other_source#last_start_checking(), v:null)
167 It does not notify on no diagnostics error
168 Assert Equals(ale#other_source#last_start_checking(), v:null)
169 Assert Equals(ale#other_source#last_show_results(), v:null)
171 let g:lsp_ale_test_mock_diags = {}
173 let bufnr = bufnr('')
174 doautocmd User ALEWantResults
176 call ale#other_source#check_show_no_result()
178 Assert Equals(ale#other_source#last_start_checking(), v:null)
179 Assert Equals(ale#other_source#last_show_results(), v:null)
182 It notifies location list items converted from diagnostics results
183 Assert Equals(ale#other_source#last_start_checking(), v:null)
184 Assert Equals(ale#other_source#last_show_results(), v:null)
186 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
187 let g:lsp_ale_test_mock_diags = s:test_diags()
189 let bufnr = bufnr('')
190 doautocmd User ALEWantResults
192 call ale#other_source#wait_until_show_results()
194 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
196 let [show_bufnr, show_name, loclist] = ale#other_source#last_show_results()
197 Assert Equals(show_bufnr, bufnr)
198 Assert Equals(show_name, 'vim-lsp')
200 let expected_locs = s:test_locs()[0]
201 call s:modify_loc_item(expected_locs[0], 'E')
202 call s:modify_loc_item(expected_locs[1], 'W')
204 Assert Equals(loclist, expected_locs)
207 It filters diagnostics results by severity
208 Assert Equals(ale#other_source#last_start_checking(), v:null)
209 Assert Equals(ale#other_source#last_show_results(), v:null)
211 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
212 let actual_diags = s:test_diags()
213 " Set 'hint' severity. Default threshold is 'info'
214 let actual_diags.gopls.params.diagnostics[1].severity = 4
215 let g:lsp_ale_test_mock_diags = actual_diags
217 let bufnr = bufnr('')
218 doautocmd User ALEWantResults
220 call ale#other_source#wait_until_show_results()
222 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
224 let [show_bufnr, show_name, loclist] = ale#other_source#last_show_results()
225 Assert Equals(show_bufnr, bufnr)
226 Assert Equals(show_name, 'vim-lsp')
228 Assert Equals(len(loclist), 1, string(loclist))
231 It skips notifying results to ALE when no error continues to happen
232 let bufnr = bufnr('')
234 " Prepare empty results
235 let diags = s:test_diags()
236 let diags.gopls.params.diagnostics = []
237 let g:lsp_ale_test_mock_diags = diags
240 doautocmd User ALEWantResults
242 call ale#other_source#wait_until_show_results()
243 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
244 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])
246 call ale#other_source#reset()
248 " Second notification
249 doautocmd User ALEWantResults
251 call ale#other_source#check_show_no_result()
252 Assert Equals(ale#other_source#last_start_checking(), v:null)
256 Context textDocument/publishDiagnostics notification
257 It notifies diagnostics results to ALE
258 Assert Equals(ale#other_source#last_start_checking(), v:null)
259 Assert Equals(ale#other_source#last_show_results(), v:null)
261 let bufnr = bufnr('')
262 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
263 let g:lsp_ale_test_mock_diags = s:test_diags()
265 let response = { 'response': s:test_diags()['gopls'], 'server': 'gopls' }
266 call lsp#callbag#mock_receive(response)
268 call ale#other_source#wait_until_show_results()
270 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
272 let [show_bufnr, show_name, loclist] = ale#other_source#last_show_results()
273 Assert Equals(show_bufnr, bufnr)
274 Assert Equals(show_name, 'vim-lsp')
276 let expected_locs = s:test_locs()[0]
277 call s:modify_loc_item(expected_locs[0], 'E')
278 call s:modify_loc_item(expected_locs[1], 'W')
280 Assert Equals(loclist, expected_locs)
283 It does nothing when receiving notification other than textDocument/publishDiagnostics
284 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
285 let g:lsp_ale_test_mock_diags = s:test_diags()
289 \ 'method': 'something/doSomethihg',
294 call lsp#callbag#mock_receive(response)
296 call ale#other_source#check_show_no_result()
297 Assert Equals(ale#other_source#last_start_checking(), v:null)
300 It does nothing when method or server is missing in the notification
301 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
302 let g:lsp_ale_test_mock_diags = s:test_diags()
307 \ 'method': 'something/doSomethihg',
320 call lsp#callbag#mock_receive(response)
323 call ale#other_source#check_show_no_result()
324 Assert Equals(ale#other_source#last_start_checking(), v:null)
327 It does nothing when received notification is for buffer which doesn't exist
328 let bufnr = bufnr('')
329 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
330 let g:lsp_ale_test_mock_diags = s:test_diags()
331 call lsp#utils#mock_buf_name('/path/to/somewhere/else.txt')
333 let response = { 'response': s:test_diags()['gopls'], 'server': 'gopls' }
334 call lsp#callbag#mock_receive(response)
336 call ale#other_source#check_show_no_result()
337 Assert Equals(ale#other_source#last_start_checking(), v:null)
340 It notifies empty list when notification says no lint error was found
341 let bufnr = bufnr('')
342 let response = { 'response': s:test_diags()['gopls'], 'server': 'gopls' }
343 let response.response.params.diagnostics = []
345 call lsp#callbag#mock_receive(response)
347 call ale#other_source#wait_until_show_results()
349 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
350 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])
353 It skips sending results to ALE when no error continues to happen
354 let bufnr = bufnr('')
355 let diags = s:test_diags()
356 let diags.gopls.params.diagnostics = []
359 let response = { 'response': diags.gopls, 'server': 'gopls' }
360 call lsp#callbag#mock_receive(response)
362 call ale#other_source#wait_until_show_results()
363 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
364 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])
366 call ale#other_source#reset()
368 " Second notification
369 call lsp#callbag#mock_receive(response)
371 call ale#other_source#check_show_no_result()
372 Assert Equals(ale#other_source#last_start_checking(), v:null)
376 Describe g:lsp_ale_diagnostics_severity
378 let saved_diagnostics_severity = g:lsp_ale_diagnostics_severity
382 let g:lsp_ale_diagnostics_severity = saved_diagnostics_severity
385 It filters results by severity 'error'
386 let g:lsp_ale_diagnostics_severity = 'error'
388 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs_all_severities())
389 let g:lsp_ale_test_mock_diags = s:test_diags_all_severities()
391 let bufnr = bufnr('')
392 doautocmd User ALEWantResults
393 call ale#other_source#wait_until_show_results()
395 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
396 let expected = s:test_expected_locs_all_severities()
397 call filter(expected, {_, l -> l.type ==# 'E'})
398 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', expected])
401 It filters results by severity 'warning'
402 let g:lsp_ale_diagnostics_severity = 'warning'
404 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs_all_severities())
405 let g:lsp_ale_test_mock_diags = s:test_diags_all_severities()
407 let bufnr = bufnr('')
408 doautocmd User ALEWantResults
409 call ale#other_source#wait_until_show_results()
411 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
412 let expected = s:test_expected_locs_all_severities()
413 call filter(expected, {_, l -> l.type =~# 'E\|W'})
414 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', expected])
417 It filters results by severity 'information'
418 let g:lsp_ale_diagnostics_severity = 'information'
420 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs_all_severities())
421 let g:lsp_ale_test_mock_diags = s:test_diags_all_severities()
423 let bufnr = bufnr('')
424 doautocmd User ALEWantResults
425 call ale#other_source#wait_until_show_results()
427 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
428 let expected = s:test_expected_locs_all_severities()
429 call filter(expected, {_, l -> l.type =~# 'E\|W\|I'})
430 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', expected])
433 It filters results by severity 'hint'
434 let g:lsp_ale_diagnostics_severity = 'hint'
436 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs_all_severities())
437 let g:lsp_ale_test_mock_diags = s:test_diags_all_severities()
439 let bufnr = bufnr('')
440 doautocmd User ALEWantResults
441 call ale#other_source#wait_until_show_results()
443 Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
444 let expected = s:test_expected_locs_all_severities()
445 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', expected])
448 It throws an error when invalid value is set
449 let g:lsp_ale_diagnostics_severity = 'invalid!'
450 let bufnr = bufnr('')
452 call lsp#ui#vim#utils#mock_diagnostics_to_loc_list(s:test_locs())
453 let g:lsp_ale_test_mock_diags = s:test_diags()
455 call lsp#callbag#mock_receive({ 'response': s:test_diags().gopls, 'server': 'gopls' })
458 Throws /^vim-lsp-ale: Unexpected severity/ ale#other_source#wait_until_show_results()
460 " XXX: No way to catch exception thrown while sleeping. Indirectly
461 " check the error was handled correctly by checking the result is
463 call ale#other_source#wait_until_show_results()
464 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])