]> git.madduck.net Git - etc/vim.git/blob - .vim/bundle/vim-lsp-ale/test/unit/test.vimspec

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

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.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge commit '56df844d3c39ec494dacc69eae34272b27db185a' as '.vim/bundle/asyncomplete'
[etc/vim.git] / .vim / bundle / vim-lsp-ale / test / unit / test.vimspec
1 function! s:test_diags() abort
2     return {
3         \ 'gopls': {
4         \   'method': 'textDocument/publishDiagnostics',
5         \   'jsonrpc': '2.0',
6         \   'params': {
7         \       'uri': 'file:///path/to/dummy.txt',
8         \       'diagnostics': [
9         \           {
10         \               'source': 'compiler',
11         \               'range': {
12         \                   'end': {'character': 4, 'line': 4},
13         \                   'start': {'character': 1, 'line': 4}
14         \               },
15         \               'message': 'error message 1',
16         \               'severity': 1
17         \           },
18         \           {
19         \               'source': 'compiler',
20         \               'range': {
21         \                   'end': {'character': 4, 'line': 4},
22         \                   'start': {'character': 1, 'line': 4}
23         \               },
24         \               'message': 'warning message 1',
25         \               'severity': 2
26         \           }
27         \       ]
28         \   }
29         \ }
30         \}
31 endfunction
32
33 function! s:test_locs() abort
34     return [[
35         \   {
36         \       'lnum': 5,
37         \       'col': 2,
38         \       'filename': '/path/to/dummy.txt',
39         \       'text': 'compiler:Error:error message 1'
40         \   },
41         \   {
42         \       'lnum': 5,
43         \       'col': 2,
44         \       'filename': '/path/to/dummy.txt',
45         \       'text': 'compiler:Warning:warning message 1'
46         \   }
47         \ ]]
48 endfunction
49
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']]
55         let d = copy(diag)
56         let d.severity = sev
57         let d.message = name . ' message'
58         let diags.gopls.params.diagnostics += [d]
59     endfor
60     return diags
61 endfunction
62
63 function! s:test_locs_all_severities() abort
64     let loc = s:test_locs()[0][0]
65     let locs = []
66     for [sev, name] in [[1, 'Error'], [2, 'Warning'], [3, 'Info'], [4, 'Hint']]
67         let l = copy(loc)
68         let l.text = 'compiler:' . name . ':' . tolower(name) . ' message'
69         let locs += [l]
70     endfor
71     return [locs]
72 endfunction
73
74 function! s:test_expected_locs_all_severities() abort
75     let loc = s:test_locs()[0][0]
76     let locs = []
77     for [sev, name, type] in [[1, 'Error', 'E'], [2, 'Warning', 'W'], [3, 'Info', 'I'], [4, 'Hint', 'H']]
78         let l = copy(loc)
79         let l.type = type
80         let l.text = '[gopls] compiler:' . name . ':' . tolower(name) . ' message'
81         let locs += [l]
82     endfor
83     return locs
84 endfunction
85
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
89     return a:item
90 endfunction
91
92 Describe vim-lsp-ale
93     Before all
94         " Set bufffer name to 'foo'
95         file /path/to/dummy.txt
96     End
97
98     Before each
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('')
108     End
109
110     After each
111         call lsp#ale#disable()
112     End
113
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)
120     End
121
122     It disables ALE's LSP support
123         Assert True(g:ale_disable_lsp)
124     End
125
126     It defines plugin-lsp-ale autocmd group
127         Assert True(exists('g:loaded_lsp_ale'))
128
129         redir => autocmds
130             autocmd plugin-lsp-ale
131         redir END
132
133         Assert True(stridx(autocmds, 'lsp_setup') >= 0, autocmds)
134         Assert True(stridx(autocmds, 'ALEWantResults') >= 0, autocmds)
135     End
136
137     It subscribes notification stream on lsp_setup autocmd event
138         Assert True(lsp#callbag#piped())
139     End
140
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())
149     End
150
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)
156         End
157
158         It does not notify results when the buffer disables LSP
159             Assert Equals(ale#other_source#last_start_checking(), v:null)
160
161             let g:lsp_ale_test_mock_bufnr = -1
162             doautocmd User ALEWantResults
163
164             Assert Equals(ale#other_source#last_start_checking(), v:null)
165         End
166
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)
170
171             let g:lsp_ale_test_mock_diags = {}
172
173             let bufnr = bufnr('')
174             doautocmd User ALEWantResults
175
176             call ale#other_source#check_show_no_result()
177
178             Assert Equals(ale#other_source#last_start_checking(), v:null)
179             Assert Equals(ale#other_source#last_show_results(), v:null)
180         End
181
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)
185
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()
188
189             let bufnr = bufnr('')
190             doautocmd User ALEWantResults
191
192             call ale#other_source#wait_until_show_results()
193
194             Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
195
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')
199
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')
203
204             Assert Equals(loclist, expected_locs)
205         End
206
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)
210
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
216
217             let bufnr = bufnr('')
218             doautocmd User ALEWantResults
219
220             call ale#other_source#wait_until_show_results()
221
222             Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
223
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')
227
228             Assert Equals(len(loclist), 1, string(loclist))
229         End
230
231         It skips notifying results to ALE when no error continues to happen
232             let bufnr = bufnr('')
233
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
238
239             " First notification
240             doautocmd User ALEWantResults
241
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', []])
245
246             call ale#other_source#reset()
247
248             " Second notification
249             doautocmd User ALEWantResults
250
251             call ale#other_source#check_show_no_result()
252             Assert Equals(ale#other_source#last_start_checking(), v:null)
253         End
254     End
255
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)
260
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()
264
265             let response = { 'response': s:test_diags()['gopls'], 'server': 'gopls' }
266             call lsp#callbag#mock_receive(response)
267
268             call ale#other_source#wait_until_show_results()
269
270             Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
271
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')
275
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')
279
280             Assert Equals(loclist, expected_locs)
281         End
282
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()
286             let response = {
287                 \   'server': 'gopls',
288                 \   'response': {
289                 \       'method': 'something/doSomethihg',
290                 \       'jsonrpc': '2.0',
291                 \       'params': {},
292                 \   }
293                 \ }
294             call lsp#callbag#mock_receive(response)
295
296             call ale#other_source#check_show_no_result()
297             Assert Equals(ale#other_source#last_start_checking(), v:null)
298         End
299
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()
303
304             for response in [
305                     \   {
306                     \       'response': {
307                     \           'method': 'something/doSomethihg',
308                     \           'jsonrpc': '2.0',
309                     \           'params': {},
310                     \       }
311                     \   },
312                     \   {
313                     \       'server': 'gopls',
314                     \       'response': {
315                     \           'jsonrpc': '2.0',
316                     \           'params': {},
317                     \       }
318                     \   }
319                     \ ]
320                 call lsp#callbag#mock_receive(response)
321             endfor
322
323             call ale#other_source#check_show_no_result()
324             Assert Equals(ale#other_source#last_start_checking(), v:null)
325         End
326
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')
332
333             let response = { 'response': s:test_diags()['gopls'], 'server': 'gopls' }
334             call lsp#callbag#mock_receive(response)
335
336             call ale#other_source#check_show_no_result()
337             Assert Equals(ale#other_source#last_start_checking(), v:null)
338         End
339
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 = []
344
345             call lsp#callbag#mock_receive(response)
346
347             call ale#other_source#wait_until_show_results()
348
349             Assert Equals(ale#other_source#last_start_checking(), [bufnr, 'vim-lsp'])
350             Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])
351         End
352
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 = []
357
358             " First notification
359             let response = { 'response': diags.gopls, 'server': 'gopls' }
360             call lsp#callbag#mock_receive(response)
361
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', []])
365
366             call ale#other_source#reset()
367
368             " Second notification
369             call lsp#callbag#mock_receive(response)
370
371             call ale#other_source#check_show_no_result()
372             Assert Equals(ale#other_source#last_start_checking(), v:null)
373         End
374     End
375
376     Describe g:lsp_ale_diagnostics_severity
377         Before
378             let saved_diagnostics_severity = g:lsp_ale_diagnostics_severity
379         End
380
381         After
382             let g:lsp_ale_diagnostics_severity = saved_diagnostics_severity
383         End
384
385         It filters results by severity 'error'
386             let g:lsp_ale_diagnostics_severity = 'error'
387
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()
390
391             let bufnr = bufnr('')
392             doautocmd User ALEWantResults
393             call ale#other_source#wait_until_show_results()
394
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])
399         End
400
401         It filters results by severity 'warning'
402             let g:lsp_ale_diagnostics_severity = 'warning'
403
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()
406
407             let bufnr = bufnr('')
408             doautocmd User ALEWantResults
409             call ale#other_source#wait_until_show_results()
410
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])
415         End
416
417         It filters results by severity 'information'
418             let g:lsp_ale_diagnostics_severity = 'information'
419
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()
422
423             let bufnr = bufnr('')
424             doautocmd User ALEWantResults
425             call ale#other_source#wait_until_show_results()
426
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])
431         End
432
433         It filters results by severity 'hint'
434             let g:lsp_ale_diagnostics_severity = 'hint'
435
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()
438
439             let bufnr = bufnr('')
440             doautocmd User ALEWantResults
441             call ale#other_source#wait_until_show_results()
442
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])
446         End
447
448         It throws an error when invalid value is set
449             let g:lsp_ale_diagnostics_severity = 'invalid!'
450             let bufnr = bufnr('')
451
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()
454
455             call lsp#callbag#mock_receive({ 'response': s:test_diags().gopls, 'server': 'gopls' })
456
457             if has('nvim')
458                 Throws /^vim-lsp-ale: Unexpected severity/ ale#other_source#wait_until_show_results()
459             else
460                 " XXX: No way to catch exception thrown while sleeping. Indirectly
461                 " check the error was handled correctly by checking the result is
462                 " set to empty.
463                 call ale#other_source#wait_until_show_results()
464                 Assert Equals(ale#other_source#last_show_results(), [bufnr, 'vim-lsp', []])
465             endif
466         End
467     End
468
469 End
470
471 " vim: set ft=vim: