]> git.madduck.net Git - etc/vim.git/blob - .vim/bundle/ale/test/test_ignoring_linters.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 '56df844d3c39ec494dacc69eae34272b27db185a' as '.vim/bundle/asyncomplete'
[etc/vim.git] / .vim / bundle / ale / test / test_ignoring_linters.vader
1 Before:
2   Save g:lspconfig
3   Save g:ale_linters_ignore
4   Save g:ale_buffer_info
5   Save g:ale_disable_lsp
6
7   let g:lspconfig = 0
8   let g:lspconfig_names = {}
9   let g:ale_disable_lsp = 0
10   let g:linters = []
11   let g:loclist = []
12   let g:run_linters_called = 0
13
14   runtime autoload/ale/engine.vim
15   runtime autoload/ale/engine/ignore.vim
16
17   " Mock the engine function so we can set it up.
18   function! ale#engine#RunLinters(buffer, linters, should_lint_file) abort
19     let g:linters = a:linters
20     let g:run_linters_called = 1
21   endfunction
22
23   function! ale#engine#HandleLoclist(linter_name, buffer, loclist, from_other_source) abort
24     let g:loclist = a:loclist
25   endfunction
26
27   function! ale#engine#ignore#GetLSPConfigNames() abort
28     return g:lspconfig_names
29   endfunction
30
31   call ale#linter#Define('foobar', {
32   \ 'name': 'testlinter',
33   \ 'callback': 'TestCallback',
34   \ 'executable': has('win32') ? 'cmd' : 'true',
35   \ 'command': has('win32') ? 'echo' : 'true',
36   \})
37   call ale#test#SetDirectory('/testplugin/test')
38
39 After:
40   unlet! b:ale_linted
41   unlet! b:ale_linters_ignore
42   unlet! b:ale_quitting
43   unlet! b:ale_save_event_fired
44   unlet! b:ale_disable_lsp
45   unlet! g:linters
46   unlet! g:loclist
47   unlet! g:lsp_message
48   unlet! g:lspconfig_names
49
50   Restore
51
52   call ale#test#RestoreDirectory()
53   call ale#linter#Reset()
54   call ale#lsp_linter#ClearLSPData()
55
56   runtime autoload/ale/engine.vim
57   runtime autoload/ale/engine/ignore.vim
58
59 Execute(GetList should ignore some invalid values):
60   AssertEqual [], ale#engine#ignore#GetList('', 'foo')
61   AssertEqual [], ale#engine#ignore#GetList('', 0)
62   AssertEqual [], ale#engine#ignore#GetList('', v:null)
63
64 Execute(GetList should handle Lists):
65   AssertEqual ['foo', 'bar'], ale#engine#ignore#GetList('', ['foo', 'bar'])
66
67 Execute(GetList should handle Dictionaries):
68   AssertEqual
69   \ ['linter1', 'linter2'],
70   \ uniq(sort(ale#engine#ignore#GetList('x.y.z', {
71   \   'x': ['linter1'],
72   \   'abc': ['linter3'],
73   \   'z': ['linter2'],
74   \ })))
75
76 Execute(Exclude should ignore some invalid values):
77   AssertEqual
78   \ [
79   \   {'name': 'linter1', 'aliases': []},
80   \   {'name': 'linter2', 'aliases': ['alias1']},
81   \   {'name': 'linter3', 'aliases': []},
82   \ ],
83   \ ale#engine#ignore#Exclude(
84   \   'foo.bar',
85   \   [
86   \     {'name': 'linter1', 'aliases': []},
87   \     {'name': 'linter2', 'aliases': ['alias1']},
88   \     {'name': 'linter3', 'aliases': []},
89   \   ],
90   \   'foo',
91   \   0,
92   \ )
93   AssertEqual
94   \ [
95   \   {'name': 'linter1', 'aliases': []},
96   \   {'name': 'linter2', 'aliases': ['alias1']},
97   \   {'name': 'linter3', 'aliases': []},
98   \ ],
99   \ ale#engine#ignore#Exclude(
100   \   'foo.bar',
101   \   [
102   \     {'name': 'linter1', 'aliases': []},
103   \     {'name': 'linter2', 'aliases': ['alias1']},
104   \     {'name': 'linter3', 'aliases': []},
105   \   ],
106   \   0,
107   \   0,
108   \ )
109   AssertEqual
110   \ [
111   \   {'name': 'linter1', 'aliases': []},
112   \   {'name': 'linter2', 'aliases': ['alias1']},
113   \   {'name': 'linter3', 'aliases': []},
114   \ ],
115   \ ale#engine#ignore#Exclude(
116   \   'foo.bar',
117   \   [
118   \     {'name': 'linter1', 'aliases': []},
119   \     {'name': 'linter2', 'aliases': ['alias1']},
120   \     {'name': 'linter3', 'aliases': []},
121   \   ],
122   \   v:null,
123   \   0,
124   \ )
125
126 Execute(Exclude should handle Lists):
127   AssertEqual
128   \ [
129   \   {'name': 'linter3', 'aliases': []},
130   \ ],
131   \ ale#engine#ignore#Exclude(
132   \   'foo.bar',
133   \   [
134   \     {'name': 'linter1', 'aliases': []},
135   \     {'name': 'linter2', 'aliases': ['alias1']},
136   \     {'name': 'linter3', 'aliases': []},
137   \   ],
138   \   ['linter1', 'alias1'],
139   \   0,
140   \ )
141
142 Execute(Exclude should handle Dictionaries):
143   AssertEqual
144   \ [
145   \   {'name': 'linter3', 'aliases': []},
146   \ ],
147   \ ale#engine#ignore#Exclude(
148   \   'foo.bar',
149   \   [
150   \     {'name': 'linter1', 'aliases': []},
151   \     {'name': 'linter2', 'aliases': ['alias1']},
152   \     {'name': 'linter3', 'aliases': []},
153   \   ],
154   \   {'foo': ['linter1'], 'bar': ['alias1']},
155   \   0,
156   \ )
157
158 Execute(Exclude should filter LSP linters when ale_disable_lsp is set to 1):
159   AssertEqual
160   \ [
161   \   {'name': 'linter1', 'aliases': [], 'lsp': ''},
162   \   {'name': 'linter2', 'aliases': []},
163   \ ],
164   \ ale#engine#ignore#Exclude(
165   \   'foo',
166   \   [
167   \       {'name': 'linter1', 'aliases': [], 'lsp': ''},
168   \       {'name': 'linter2', 'aliases': []},
169   \       {'name': 'linter3', 'aliases': [], 'lsp': 'stdio'},
170   \   ],
171   \   [],
172   \   1,
173   \ )
174
175 Execute(Exclude should remove lspconfig linters with ale_disable_lsp = 'auto'):
176   let g:lspconfig = 1
177   " A map is used here so you can easily see what the ignore mapping should be
178   " remapping the nvim-lspconfig names to.
179   let g:lspconfig_names = keys({
180   \   'als': 'adals',
181   \   'ansiblels': 'ansible-language-server',
182   \   'bicep': 'bicep_language_server',
183   \   'cmake': 'cmake_language_server',
184   \   'denols': 'deno',
185   \   'erlangls': 'erlang_ls',
186   \   'html': 'vscodehtml',
187   \   'ocamlls': 'ocaml-language-server',
188   \   'puppet': 'puppet_languageserver',
189   \   'pyright': 'pyright',
190   \})
191
192   " We should keep bicep, as it's different tool.
193   AssertEqual
194   \ [
195   \   {'name': 'bicep', 'aliases': []},
196   \ ],
197   \ ale#engine#ignore#Exclude(
198   \   'foo',
199   \   [
200   \       {'name': 'adals', 'aliases': []},
201   \       {'name': 'language_server', 'aliases': ['ansible-language-server']},
202   \       {'name': 'cmake_language_server', 'aliases': []},
203   \       {'name': 'deno', 'aliases': []},
204   \       {'name': 'erlang_ls', 'aliases': []},
205   \       {'name': 'vscodehtml', 'aliases': []},
206   \       {'name': 'bicep', 'aliases': []},
207   \       {'name': 'ols', 'aliases': ['ocaml-language-server']},
208   \       {'name': 'languageserver', 'aliases': ['puppet_languageserver']},
209   \       {'name': 'pyright', 'aliases': []},
210   \   ],
211   \   [],
212   \   'auto',
213   \ )
214
215 Execute(Exclude should check that the nvim-lspconfig plugin is installed with ale_disable_lsp = 'auto'):
216   let g:lspconfig = 0
217   let g:lspconfig_names = ['pyright']
218
219   " We should keep pyright here, because g:lspconfig is 0.
220   AssertEqual
221   \ [
222   \   {'name': 'pyright', 'aliases': []},
223   \ ],
224   \ ale#engine#ignore#Exclude(
225   \   'foo',
226   \   [
227   \       {'name': 'pyright', 'aliases': []},
228   \   ],
229   \   [],
230   \   'auto',
231   \ )
232
233 Execute(Exclude should handle the lspconfig result being a Dictionary):
234   let g:lspconfig = 1
235   let g:lspconfig_names = {}
236
237   " We should keep pyright here, because the configuration is empty.
238   AssertEqual
239   \ [
240   \   {'name': 'pyright', 'aliases': []},
241   \ ],
242   \ ale#engine#ignore#Exclude(
243   \   'foo',
244   \   [
245   \       {'name': 'pyright', 'aliases': []},
246   \   ],
247   \   [],
248   \   'auto',
249   \ )
250
251 Given foobar(An empty file):
252 Execute(Global ignore lists should be applied for linters):
253   " We have to set up buffer info so RunLinters is called.
254   let g:ale_buffer_info = {bufnr(''): {}}
255
256   ALELint
257   Assert g:run_linters_called, "The mock callback wasn't called"
258   AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
259
260   let g:ale_linters_ignore = ['testlinter']
261   ALELint
262   AssertEqual [], g:linters
263
264 Execute(buffer ignore lists should be applied for linters):
265   " We have to set up buffer info so RunLinters is called.
266   let g:ale_buffer_info = {bufnr(''): {}}
267
268   ALELint
269   Assert g:run_linters_called, "The mock callback wasn't called"
270   AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
271
272   let b:ale_linters_ignore = ['testlinter']
273   ALELint
274   AssertEqual [], g:linters
275
276 Execute(Buffer ignore lists should be applied for tsserver):
277   call ale#test#SetFilename('filename.ts')
278   call ale#engine#InitBufferInfo(bufnr(''))
279
280   let g:lsp_message = {
281   \ 'seq': 0,
282   \ 'type': 'event',
283   \ 'event': 'syntaxDiag',
284   \ 'body': {
285   \   'file': g:dir . '/filename.ts',
286   \   'diagnostics':[
287   \     {
288   \       'start': {
289   \         'line':2,
290   \         'offset':14,
291   \       },
292   \       'end': {
293   \         'line':2,
294   \         'offset':15,
295   \       },
296   \       'text': ''','' expected.',
297   \       "code":1005
298   \     },
299   \   ],
300   \ },
301   \}
302
303   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
304
305   AssertEqual
306   \ [
307   \   {
308   \     'lnum': 2,
309   \     'col': 14,
310   \     'nr': 1005,
311   \     'code': '1005',
312   \     'type': 'E',
313   \     'end_col': 14,
314   \     'end_lnum': 2,
315   \     'text': ''','' expected.',
316   \   },
317   \ ],
318   \ g:loclist
319
320   let g:loclist = []
321   let b:ale_linters_ignore = ['tsserver']
322   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
323
324   AssertEqual [], g:loclist
325
326 Execute(Buffer ignore lists should be applied for LSP linters):
327   call ale#test#SetFilename('filename.py')
328   call ale#engine#InitBufferInfo(bufnr(''))
329   call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
330
331   let g:lsp_message = {
332   \ 'jsonrpc': '2.0',
333   \ 'method': 'textDocument/publishDiagnostics',
334   \ 'params': {
335   \   'uri': ale#path#ToFileURI(expand('%:p')),
336   \   'diagnostics': [
337   \     {
338   \       'severity': 1,
339   \       'message': 'x',
340   \       'range': {
341   \         'start': {'line': 0, 'character': 9},
342   \         'end': {'line': 0, 'character': 9},
343   \       },
344   \     }
345   \   ],
346   \ },
347   \}
348
349   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
350
351   AssertEqual
352   \ [
353   \   {
354   \     'lnum': 1,
355   \     'col': 10,
356   \     'type': 'E',
357   \     'end_col': 9,
358   \     'end_lnum': 1,
359   \     'text': 'x',
360   \   }
361   \ ],
362   \ g:loclist
363
364   let b:ale_linters_ignore = ['lsplinter']
365   let g:loclist = []
366
367   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
368
369   AssertEqual [], g:loclist
370
371 Execute(ale_disable_lsp should be applied for tsserver):
372   call ale#test#SetFilename('filename.ts')
373   call ale#engine#InitBufferInfo(bufnr(''))
374
375   let g:lsp_message = {
376   \ 'seq': 0,
377   \ 'type': 'event',
378   \ 'event': 'syntaxDiag',
379   \ 'body': {
380   \   'file': g:dir . '/filename.ts',
381   \   'diagnostics':[
382   \     {
383   \       'start': {
384   \         'line':2,
385   \         'offset':14,
386   \       },
387   \       'end': {
388   \         'line':2,
389   \         'offset':15,
390   \       },
391   \       'text': ''','' expected.',
392   \       "code":1005
393   \     },
394   \   ],
395   \ },
396   \}
397
398   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
399
400   AssertEqual
401   \ [
402   \   {
403   \     'lnum': 2,
404   \     'col': 14,
405   \     'nr': 1005,
406   \     'code': '1005',
407   \     'type': 'E',
408   \     'end_col': 14,
409   \     'end_lnum': 2,
410   \     'text': ''','' expected.',
411   \   },
412   \ ],
413   \ g:loclist
414
415   let g:loclist = []
416   let b:ale_disable_lsp = 1
417   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
418
419   AssertEqual [], g:loclist
420
421 Execute(ale_disable_lsp = 'auto' should be applied for tsserver):
422   let g:lspconfig = 1
423   let g:lspconfig_names = ['tsserver']
424
425   call ale#test#SetFilename('filename.ts')
426   call ale#engine#InitBufferInfo(bufnr(''))
427
428   let g:lsp_message = {
429   \ 'seq': 0,
430   \ 'type': 'event',
431   \ 'event': 'syntaxDiag',
432   \ 'body': {
433   \   'file': g:dir . '/filename.ts',
434   \   'diagnostics':[
435   \     {
436   \       'start': {
437   \         'line':2,
438   \         'offset':14,
439   \       },
440   \       'end': {
441   \         'line':2,
442   \         'offset':15,
443   \       },
444   \       'text': ''','' expected.',
445   \       "code":1005
446   \     },
447   \   ],
448   \ },
449   \}
450
451   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
452
453   AssertEqual
454   \ [
455   \   {
456   \     'lnum': 2,
457   \     'col': 14,
458   \     'nr': 1005,
459   \     'code': '1005',
460   \     'type': 'E',
461   \     'end_col': 14,
462   \     'end_lnum': 2,
463   \     'text': ''','' expected.',
464   \   },
465   \ ],
466   \ g:loclist
467
468   let g:loclist = []
469   let g:ale_disable_lsp = 'auto'
470   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
471
472   AssertEqual [], g:loclist
473
474 Execute(ale_disable_lsp should be applied for LSP linters):
475   call ale#test#SetFilename('filename.py')
476   call ale#engine#InitBufferInfo(bufnr(''))
477   call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
478
479   let g:lsp_message = {
480   \ 'jsonrpc': '2.0',
481   \ 'method': 'textDocument/publishDiagnostics',
482   \ 'params': {
483   \   'uri': ale#path#ToFileURI(expand('%:p')),
484   \   'diagnostics': [
485   \     {
486   \       'severity': 1,
487   \       'message': 'x',
488   \       'range': {
489   \         'start': {'line': 0, 'character': 9},
490   \         'end': {'line': 0, 'character': 9},
491   \       },
492   \     }
493   \   ],
494   \ },
495   \}
496
497   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
498
499   AssertEqual
500   \ [
501   \   {
502   \     'lnum': 1,
503   \     'col': 10,
504   \     'type': 'E',
505   \     'end_col': 9,
506   \     'end_lnum': 1,
507   \     'text': 'x',
508   \   }
509   \ ],
510   \ g:loclist
511
512   let b:ale_disable_lsp = 1
513   let g:loclist = []
514
515   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
516
517   AssertEqual [], g:loclist
518
519 Execute(ale_disable_lsp = 'auto' should be applied for LSP linters):
520   let g:lspconfig = 1
521   let g:lspconfig_names = ['lsplinter']
522
523   call ale#test#SetFilename('filename.py')
524   call ale#engine#InitBufferInfo(bufnr(''))
525   call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
526
527   let g:lsp_message = {
528   \ 'jsonrpc': '2.0',
529   \ 'method': 'textDocument/publishDiagnostics',
530   \ 'params': {
531   \   'uri': ale#path#ToFileURI(expand('%:p')),
532   \   'diagnostics': [
533   \     {
534   \       'severity': 1,
535   \       'message': 'x',
536   \       'range': {
537   \         'start': {'line': 0, 'character': 9},
538   \         'end': {'line': 0, 'character': 9},
539   \       },
540   \     }
541   \   ],
542   \ },
543   \}
544
545   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
546
547   AssertEqual
548   \ [
549   \   {
550   \     'lnum': 1,
551   \     'col': 10,
552   \     'type': 'E',
553   \     'end_col': 9,
554   \     'end_lnum': 1,
555   \     'text': 'x',
556   \   }
557   \ ],
558   \ g:loclist
559
560   let g:ale_disable_lsp = 'auto'
561   let g:loclist = []
562
563   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
564
565   AssertEqual [], g:loclist
566
567 Execute(ale_disable_lsp = 'auto' should ignore LSP linters by alias too):
568   let g:lspconfig = 1
569   let g:lspconfig_names = ['lsplinter']
570
571   call ale#test#SetFilename('filename.py')
572   call ale#engine#InitBufferInfo(bufnr(''))
573   call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'notthis', 'aliases': ['lsplinter'], 'lsp': 'stdio'}})
574
575   let g:lsp_message = {
576   \ 'jsonrpc': '2.0',
577   \ 'method': 'textDocument/publishDiagnostics',
578   \ 'params': {
579   \   'uri': ale#path#ToFileURI(expand('%:p')),
580   \   'diagnostics': [
581   \     {
582   \       'severity': 1,
583   \       'message': 'x',
584   \       'range': {
585   \         'start': {'line': 0, 'character': 9},
586   \         'end': {'line': 0, 'character': 9},
587   \       },
588   \     }
589   \   ],
590   \ },
591   \}
592
593   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
594
595   AssertEqual
596   \ [
597   \   {
598   \     'lnum': 1,
599   \     'col': 10,
600   \     'type': 'E',
601   \     'end_col': 9,
602   \     'end_lnum': 1,
603   \     'text': 'x',
604   \   }
605   \ ],
606   \ g:loclist
607
608   let g:ale_disable_lsp = 'auto'
609   let g:loclist = []
610
611   call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
612
613   AssertEqual [], g:loclist