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

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 '76265755a1add77121c8f9dabb3e9bb70fe9a972' as '.vim/bundle/ale'
[etc/vim.git] / .vim / bundle / ale / test / lsp / test_engine_lsp_response_handling.vader
1 Before:
2   Save g:ale_set_lists_synchronously
3   Save g:ale_buffer_info
4   Save g:ale_lsp_error_messages
5   Save g:ale_set_loclist
6   Save g:ale_set_signs
7   Save g:ale_set_quickfix
8   Save g:ale_set_highlights
9   Save g:ale_echo_cursor
10   Save g:ale_disable_lsp
11   Save g:ale_history_enabled
12   Save g:ale_history_log_output
13
14   let g:ale_disable_lsp = 0
15   let g:ale_set_lists_synchronously = 1
16   let g:ale_buffer_info = {}
17   let g:ale_set_loclist = 1
18   " Disable features we don't need for these tests.
19   let g:ale_set_signs = 0
20   let g:ale_set_quickfix = 0
21   let g:ale_set_highlights = 0
22   let g:ale_echo_cursor = 0
23   let g:ale_history_enabled = 1
24   let g:ale_history_log_output = 1
25
26   unlet! g:ale_lsp_error_messages
27   unlet! b:ale_linters
28   unlet! b:ale_disable_lsp
29
30   call ale#linter#Reset()
31   call ale#test#SetDirectory('/testplugin/test')
32   call setloclist(0, [])
33
34 After:
35   Restore
36
37   unlet! b:ale_linters
38
39   call setloclist(0, [])
40   call ale#test#RestoreDirectory()
41   call ale#linter#Reset()
42   call ale#lsp_linter#ClearLSPData()
43
44 Given foobar(An empty file):
45 Execute(tsserver syntax error responses should be handled correctly):
46   runtime ale_linters/typescript/tsserver.vim
47
48   if has('win32')
49     call ale#test#SetFilename('filename,[]^$.ts')
50   else
51     call ale#test#SetFilename('filename*?,{}[]^$.ts')
52   endif
53
54   call ale#engine#InitBufferInfo(bufnr(''))
55
56   if has('win32')
57     AssertEqual 'filename,[]^$.ts', expand('%:p:t')
58   else
59     AssertEqual 'filename*?,{}[]^$.ts', expand('%:p:t')
60   endif
61
62   " When we get syntax errors and no semantic errors, we should keep the
63   " syntax errors.
64   call ale#lsp_linter#HandleLSPResponse(1, {
65   \ 'seq': 0,
66   \ 'type': 'event',
67   \ 'event': 'syntaxDiag',
68   \ 'body': {
69   \   'file': expand('%:p'),
70   \   'diagnostics':[
71   \     {
72   \       'start': {
73   \         'line':2,
74   \         'offset':14,
75   \       },
76   \       'end': {
77   \         'line':2,
78   \         'offset':15,
79   \       },
80   \       'text': ''','' expected.',
81   \       "code":1005
82   \     },
83   \   ],
84   \ },
85   \})
86   call ale#lsp_linter#HandleLSPResponse(1, {
87   \ 'seq': 0,
88   \ 'type': 'event',
89   \ 'event': 'semanticDiag',
90   \ 'body': {
91   \   'file': expand('%:p'),
92   \   'diagnostics':[
93   \   ],
94   \ },
95   \})
96
97   AssertEqual
98   \ [
99   \   {
100   \     'lnum': 1,
101   \     'bufnr': bufnr(''),
102   \     'col': 14,
103   \     'vcol': 0,
104   \     'nr': 1005,
105   \     'type': 'E',
106   \     'text': '1005: '','' expected.',
107   \     'valid': 1,
108   \     'pattern': '',
109   \   },
110   \ ],
111   \ ale#test#GetLoclistWithoutNewerKeys()
112
113   " After we get empty syntax errors, we should clear them.
114   call ale#lsp_linter#HandleLSPResponse(1, {
115   \ 'seq': 0,
116   \ 'type': 'event',
117   \ 'event': 'syntaxDiag',
118   \ 'body': {
119   \   'file': expand('%:p'),
120   \   'diagnostics':[
121   \   ],
122   \ },
123   \})
124
125   AssertEqual
126   \ [
127   \ ],
128   \ ale#test#GetLoclistWithoutNewerKeys()
129
130   " Syntax errors on the project root should not populate the LocList.
131   call ale#lsp_linter#HandleLSPResponse(1, {
132   \ 'seq': 0,
133   \ 'type': 'event',
134   \ 'event': 'syntaxDiag',
135   \ 'body': {
136   \   'file': g:dir,
137   \   'diagnostics':[
138   \     {
139   \       'start': {
140   \         'line':2,
141   \         'offset':14,
142   \       },
143   \       'end': {
144   \         'line':2,
145   \         'offset':15,
146   \       },
147   \       'text': ''','' expected.',
148   \       "code":1005
149   \     },
150   \   ],
151   \ },
152   \})
153
154   AssertEqual
155   \ [
156   \ ],
157   \ ale#test#GetLoclistWithoutNewerKeys()
158
159 Execute(tsserver semantic error responses should be handled correctly):
160   runtime ale_linters/typescript/tsserver.vim
161
162   if has('win32')
163     call ale#test#SetFilename('filename,[]^$.ts')
164   else
165     call ale#test#SetFilename('filename*?,{}[]^$.ts')
166   endif
167
168   call ale#engine#InitBufferInfo(bufnr(''))
169
170   if has('win32')
171     AssertEqual 'filename,[]^$.ts', expand('%:p:t')
172   else
173     AssertEqual 'filename*?,{}[]^$.ts', expand('%:p:t')
174   endif
175
176   " When we get syntax errors and no semantic errors, we should keep the
177   " syntax errors.
178   call ale#lsp_linter#HandleLSPResponse(1, {
179   \ 'seq': 0,
180   \ 'type': 'event',
181   \ 'event': 'syntaxDiag',
182   \ 'body': {
183   \   'file': expand('%:p'),
184   \   'diagnostics':[
185   \   ],
186   \ },
187   \})
188   call ale#lsp_linter#HandleLSPResponse(1, {
189   \ 'seq': 0,
190   \ 'type': 'event',
191   \ 'event': 'semanticDiag',
192   \ 'body': {
193   \   'file': expand('%:p'),
194   \   'diagnostics':[
195   \     {
196   \       'start': {
197   \         'line':2,
198   \         'offset':14,
199   \       },
200   \       'end': {
201   \         'line':2,
202   \         'offset':15,
203   \       },
204   \       'text': 'Some semantic error',
205   \       "code":1005
206   \     },
207   \   ],
208   \ },
209   \})
210
211   AssertEqual
212   \ [
213   \   {
214   \     'lnum': 1,
215   \     'bufnr': bufnr(''),
216   \     'col': 14,
217   \     'vcol': 0,
218   \     'nr': 1005,
219   \     'type': 'E',
220   \     'text': '1005: Some semantic error',
221   \     'valid': 1,
222   \     'pattern': '',
223   \   },
224   \ ],
225   \ ale#test#GetLoclistWithoutNewerKeys()
226
227   " After we get empty syntax errors, we should clear them.
228   call ale#lsp_linter#HandleLSPResponse(1, {
229   \ 'seq': 0,
230   \ 'type': 'event',
231   \ 'event': 'semanticDiag',
232   \ 'body': {
233   \   'file': expand('%:p'),
234   \   'diagnostics':[
235   \   ],
236   \ },
237   \})
238
239   AssertEqual
240   \ [
241   \ ],
242   \ ale#test#GetLoclistWithoutNewerKeys()
243
244   " Semantic errors on the project root should not populate the LocList.
245   call ale#lsp_linter#HandleLSPResponse(1, {
246   \ 'seq': 0,
247   \ 'type': 'event',
248   \ 'event': 'semanticDiag',
249   \ 'body': {
250   \   'file': g:dir,
251   \   'diagnostics':[
252   \     {
253   \       'start': {
254   \         'line':2,
255   \         'offset':14,
256   \       },
257   \       'end': {
258   \         'line':2,
259   \         'offset':15,
260   \       },
261   \       'text': 'Some semantic error',
262   \       "code":1005
263   \     },
264   \   ],
265   \ },
266   \})
267
268   AssertEqual
269   \ [
270   \ ],
271   \ ale#test#GetLoclistWithoutNewerKeys()
272
273 Execute(tsserver errors should mark tsserver no longer active):
274   let b:ale_linters = ['tsserver']
275   runtime ale_linters/typescript/tsserver.vim
276   call ale#test#SetFilename('filename.ts')
277   call ale#engine#InitBufferInfo(bufnr(''))
278
279   let g:ale_buffer_info[bufnr('')].active_linter_list = ale#linter#Get('typescript')
280   Assert !empty(g:ale_buffer_info[bufnr('')].active_linter_list)
281
282   call ale#lsp_linter#HandleLSPResponse(1, {
283   \ 'seq': 0,
284   \ 'type': 'event',
285   \ 'event': 'semanticDiag',
286   \ 'body': {
287   \   'file': g:dir . '/filename.ts',
288   \   'diagnostics':[],
289   \ },
290   \})
291
292   AssertEqual [], g:ale_buffer_info[bufnr('')].active_linter_list
293
294 Execute(LSP diagnostics responses should be handled correctly):
295   let b:ale_linters = ['eclipselsp']
296   runtime ale_linters/java/eclipselsp.vim
297
298   if has('win32')
299     call ale#test#SetFilename('filename,[]^$.ts')
300   else
301     call ale#test#SetFilename('filename*?,{}[]^$.java')
302   endif
303
304   call ale#engine#InitBufferInfo(bufnr(''))
305   call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'eclipselsp', 'aliases': [], 'lsp': 'stdio'}})
306
307   if has('win32')
308     AssertEqual 'filename,[]^$.ts', expand('%:p:t')
309   else
310     AssertEqual 'filename*?,{}[]^$.java', expand('%:p:t')
311   endif
312
313   call ale#lsp_linter#HandleLSPResponse(1, {
314   \ 'jsonrpc':'2.0',
315   \ 'method':'textDocument/publishDiagnostics',
316   \ 'params': {
317   \     'uri': ale#path#ToFileURI(expand('%:p')),
318   \     'diagnostics': [
319   \        {
320   \          'range': {
321   \             'start': {
322   \               'line': 0,
323   \               'character':0
324   \             },
325   \             'end': {
326   \               'line': 0,
327   \               'character':0
328   \             }
329   \          },
330   \          'severity': 2,
331   \          'code': "",
332   \          'source': 'Java',
333   \          'message': 'Missing JRE 1-8'
334   \       }
335   \     ]
336   \  }
337   \})
338
339   AssertEqual
340   \ [
341   \   {
342   \     'lnum': 1,
343   \     'bufnr': bufnr(''),
344   \     'col': 1,
345   \     'pattern': '',
346   \     'valid': 1,
347   \     'vcol': 0,
348   \     'nr': -1,
349   \     'type': 'W',
350   \     'text': 'Missing JRE 1-8'
351   \    }
352   \ ],
353   \ ale#test#GetLoclistWithoutNewerKeys()
354
355 Execute(LSP diagnostics responses on project root should not populate loclist):
356   let b:ale_linters = ['eclipselsp']
357   runtime ale_linters/java/eclipselsp.vim
358   call ale#test#SetFilename('filename.java')
359   call ale#engine#InitBufferInfo(bufnr(''))
360   call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'eclipselsp', 'aliases': [], 'lsp': 'stdio'}})
361
362   call ale#lsp_linter#HandleLSPResponse(1, {
363   \ 'jsonrpc':'2.0',
364   \ 'method':'textDocument/publishDiagnostics',
365   \ 'params': {
366   \     'uri':'file://' . g:dir,
367   \     'diagnostics': [
368   \        {
369   \          'range': {
370   \             'start': {
371   \               'line': 0,
372   \               'character':0
373   \             },
374   \             'end': {
375   \               'line': 0,
376   \               'character':0
377   \             }
378   \          },
379   \          'severity': 2,
380   \          'code': "",
381   \          'source': 'Java',
382   \          'message': 'Missing JRE 1-8'
383   \       }
384   \     ]
385   \  }
386   \})
387
388   AssertEqual
389   \ [
390   \ ],
391   \ ale#test#GetLoclistWithoutNewerKeys()
392
393 Execute(LSP errors should mark linters no longer active):
394   let b:ale_linters = ['pylsp']
395   runtime ale_linters/python/pylsp.vim
396   call ale#test#SetFilename('filename.py')
397   call ale#engine#InitBufferInfo(bufnr(''))
398   call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'pylsp', 'aliases': [], 'lsp': 'stdio'}})
399
400   let g:ale_buffer_info[bufnr('')].active_linter_list = ale#linter#Get('python')
401   Assert !empty(g:ale_buffer_info[bufnr('')].active_linter_list)
402
403   call ale#lsp_linter#HandleLSPResponse(1, {
404   \ 'method': 'textDocument/publishDiagnostics',
405   \ 'params': {
406   \   'uri': ale#path#ToFileURI(g:dir . '/filename.py'),
407   \   'diagnostics': [],
408   \ },
409   \})
410
411   AssertEqual [], g:ale_buffer_info[bufnr('')].active_linter_list
412
413 Execute(LSP pull model diagnostic responses should be handled):
414   let b:ale_linters = ['eclipselsp']
415   runtime ale_linters/java/eclipselsp.vim
416
417   if has('win32')
418     call ale#test#SetFilename('filename,[]^$.ts')
419   else
420     call ale#test#SetFilename('filename*?,{}[]^$.java')
421   endif
422
423   call ale#engine#InitBufferInfo(bufnr(''))
424   let g:ale_buffer_info[bufnr('')].active_linter_list = ale#linter#Get('eclipselsp')
425   call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'eclipselsp', 'aliases': [], 'lsp': 'stdio'}})
426   call ale#lsp_linter#SetDiagnosticURIMap({'347': ale#util#ToURI(expand('%:p'))})
427
428   if has('win32')
429     AssertEqual 'filename,[]^$.ts', expand('%:p:t')
430   else
431     AssertEqual 'filename*?,{}[]^$.java', expand('%:p:t')
432   endif
433
434   call ale#lsp_linter#HandleLSPResponse(1, {
435   \ 'jsonrpc':'2.0',
436   \ 'id': 347,
437   \ 'result': {
438   \   'kind': 'full',
439   \   'items': [
440   \     {
441   \       'range': {
442   \         'start': {
443   \           'line': 0,
444   \           'character':0
445   \         },
446   \         'end': {
447   \           'line': 0,
448   \           'character':0
449   \         }
450   \       },
451   \       'severity': 2,
452   \       'code': "",
453   \       'source': 'Java',
454   \       'message': 'Missing JRE 1-8'
455   \     }
456   \   ]
457   \ },
458   \})
459
460   AssertEqual
461   \ [
462   \   {
463   \     'lnum': 1,
464   \     'bufnr': bufnr(''),
465   \     'col': 1,
466   \     'pattern': '',
467   \     'valid': 1,
468   \     'vcol': 0,
469   \     'nr': -1,
470   \     'type': 'W',
471   \     'text': 'Missing JRE 1-8'
472   \    }
473   \ ],
474   \ ale#test#GetLoclistWithoutNewerKeys()
475   AssertEqual [], g:ale_buffer_info[bufnr('')].active_linter_list
476
477 Execute(LSP pull model diagnostic responses that are 'unchanged' should be handled):
478   let b:ale_linters = ['eclipselsp']
479   runtime ale_linters/java/eclipselsp.vim
480
481   if has('win32')
482     call ale#test#SetFilename('filename,[]^$.ts')
483   else
484     call ale#test#SetFilename('filename*?,{}[]^$.java')
485   endif
486
487   call ale#engine#InitBufferInfo(bufnr(''))
488   let g:ale_buffer_info[bufnr('')].active_linter_list = ale#linter#Get('eclipselsp')
489   let g:ale_buffer_info[bufnr('')].loclist = [
490   \ {
491   \   'lnum': 1,
492   \   'bufnr': bufnr(''),
493   \   'col': 1,
494   \   'pattern': '',
495   \   'valid': 1,
496   \   'vcol': 0,
497   \   'nr': -1,
498   \   'type': 'W',
499   \   'text': 'Missing JRE 1-8'
500   \ },
501   \]
502
503   call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'eclipselsp', 'aliases': [], 'lsp': 'stdio'}})
504   call ale#lsp_linter#SetDiagnosticURIMap({'347': ale#util#ToURI(expand('%:p'))})
505
506   if has('win32')
507     AssertEqual 'filename,[]^$.ts', expand('%:p:t')
508   else
509     AssertEqual 'filename*?,{}[]^$.java', expand('%:p:t')
510   endif
511
512   call ale#lsp_linter#HandleLSPResponse(1, {
513   \ 'jsonrpc':'2.0',
514   \ 'id': 347,
515   \ 'result': {
516   \     'kind': 'unchanged',
517   \ },
518   \})
519
520   AssertEqual
521   \ [
522   \   {
523   \     'lnum': 1,
524   \     'bufnr': bufnr(''),
525   \     'col': 1,
526   \     'pattern': '',
527   \     'valid': 1,
528   \     'vcol': 0,
529   \     'nr': -1,
530   \     'type': 'W',
531   \     'text': 'Missing JRE 1-8'
532   \    }
533   \ ],
534   \ g:ale_buffer_info[bufnr('')].loclist
535   AssertEqual [], g:ale_buffer_info[bufnr('')].active_linter_list
536
537 Execute(LSP errors should be logged in the history):
538   call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'foobar', 'aliases': [], 'lsp': 'stdio'}})
539   call ale#lsp_linter#HandleLSPResponse(347, {
540   \ 'jsonrpc': '2.0',
541   \ 'error': {
542   \   'code': -32602,
543   \   'message': 'xyz',
544   \   'data': {
545   \     'traceback': ['123', '456'],
546   \   },
547   \ },
548   \})
549
550   AssertEqual
551   \ {'foobar': ["xyz\n123\n456"]},
552   \ get(g:, 'ale_lsp_error_messages', {})