]> git.madduck.net Git - etc/vim.git/blob - .vim/bundle/ale/test/test_find_references.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 'd49e95aa7ba744f0a7f544aca43afdb6aab41f24' as '.vim/bundle/asyncomplete...
[etc/vim.git] / .vim / bundle / ale / test / test_find_references.vader
1 Before:
2   call ale#test#SetDirectory('/testplugin/test')
3   call ale#test#SetFilename('dummy.txt')
4
5   Save g:ale_default_navigation
6
7   let g:old_filename = expand('%:p')
8   let g:Callback = ''
9   let g:expr_list = []
10   let g:message_list = []
11   let g:preview_called = 0
12   let g:item_list = []
13   let g:options = {}
14   let g:capability_checked = ''
15   let g:conn_id = v:null
16   let g:InitCallback = v:null
17   let g:ale_default_navigation = 'buffer'
18
19   runtime autoload/ale/lsp_linter.vim
20   runtime autoload/ale/lsp.vim
21   runtime autoload/ale/util.vim
22   runtime autoload/ale/preview.vim
23
24   function! ale#lsp_linter#StartLSP(buffer, linter, Callback) abort
25     let g:conn_id = ale#lsp#Register('executable', '/foo/bar', '', {})
26     call ale#lsp#MarkDocumentAsOpen(g:conn_id, a:buffer)
27
28     if a:linter.lsp is# 'tsserver'
29         call ale#lsp#MarkConnectionAsTsserver(g:conn_id)
30     endif
31
32     let l:details = {
33     \ 'command': 'foobar',
34     \ 'buffer': a:buffer,
35     \ 'connection_id': g:conn_id,
36     \ 'project_root': '/foo/bar',
37     \}
38
39     let g:InitCallback = {-> ale#lsp_linter#OnInit(a:linter, l:details, a:Callback)}
40   endfunction
41
42   function! ale#lsp#HasCapability(conn_id, capability) abort
43     let g:capability_checked = a:capability
44
45     return 1
46   endfunction
47
48   function! ale#lsp#RegisterCallback(conn_id, callback) abort
49     let g:Callback = a:callback
50   endfunction
51
52   function! ale#lsp#Send(conn_id, message) abort
53     call add(g:message_list, a:message)
54
55     return 42
56   endfunction
57
58   function! ale#util#Execute(expr) abort
59     call add(g:expr_list, a:expr)
60   endfunction
61
62   function! ale#preview#ShowSelection(item_list, options) abort
63     let g:preview_called = 1
64     let g:item_list = a:item_list
65     let g:options = a:options
66
67     call ale#preview#SetLastSelection(a:item_list, a:options)
68   endfunction
69
70 After:
71   Restore
72
73   if g:conn_id isnot v:null
74     call ale#lsp#RemoveConnectionWithID(g:conn_id)
75   endif
76
77   call ale#references#SetMap({})
78   call ale#test#RestoreDirectory()
79   call ale#linter#Reset()
80
81   unlet! g:capability_checked
82   unlet! g:InitCallback
83   unlet! g:old_filename
84   unlet! g:conn_id
85   unlet! g:Callback
86   unlet! g:message_list
87   unlet! g:expr_list
88   unlet! b:ale_linters
89   unlet! g:options
90   unlet! g:item_list
91   unlet! g:preview_called
92
93   runtime autoload/ale/lsp_linter.vim
94   runtime autoload/ale/lsp.vim
95   runtime autoload/ale/util.vim
96   runtime autoload/ale/preview.vim
97
98 Execute(Other messages for the tsserver handler should be ignored):
99   call ale#references#HandleTSServerResponse(1, {'command': 'foo'})
100
101 Execute(Failed reference responses should be handled correctly):
102   call ale#references#SetMap({3: {}})
103   call ale#references#HandleTSServerResponse(
104   \ 1,
105   \ {'command': 'references', 'request_seq': 3}
106   \)
107   AssertEqual {}, ale#references#GetMap()
108
109 Given typescript(Some typescript file):
110   foo
111   somelongerline
112   bazxyzxyzxyz
113
114 Execute(Results should be shown for tsserver responses):
115   " We should remember these options when we repeat the selection.
116   call ale#references#SetMap(
117   \ {
118   \   3: {
119   \     'ignorethis': 'x',
120   \     'open_in': 'tab',
121   \     'use_relative_paths': 1,
122   \   }
123   \ }
124   \)
125   call ale#references#HandleTSServerResponse(1, {
126   \ 'command': 'references',
127   \ 'request_seq': 3,
128   \ 'success': v:true,
129   \ 'body': {
130   \   'symbolStartOffset': 9,
131   \   'refs': [
132   \     {
133   \       'file': '/foo/bar/app.ts',
134   \       'isWriteAccess': v:true,
135   \       'lineText': 'import {doSomething} from ''./whatever''',
136   \       'end': {'offset': 24, 'line': 9},
137   \       'start': {'offset': 9, 'line': 9},
138   \       'isDefinition': v:true,
139   \     },
140   \     {
141   \       'file': '/foo/bar/app.ts',
142   \       'isWriteAccess': v:false,
143   \       'lineText': '  doSomething()',
144   \       'end': {'offset': 18, 'line': 804},
145   \       'start': {'offset': 3, 'line': 804},
146   \       'isDefinition': v:false,
147   \     },
148   \     {
149   \       'file': '/foo/bar/other/app.ts',
150   \       'isWriteAccess': v:false,
151   \       'lineText': '  doSomething()',
152   \       'end': {'offset': 18, 'line': 51},
153   \       'start': {'offset': 3, 'line': 51},
154   \       'isDefinition': v:false,
155   \     },
156   \   ],
157   \   'symbolDisplayString': 'import doSomething',
158   \   'symbolName': 'doSomething()',
159   \ },
160   \})
161
162   AssertEqual
163   \ [
164   \   {'filename': '/foo/bar/app.ts', 'column': 9, 'line': 9, 'match': 'import {doSomething} from ''./whatever'''},
165   \   {'filename': '/foo/bar/app.ts', 'column': 3, 'line': 804, 'match': 'doSomething()'},
166   \   {'filename': '/foo/bar/other/app.ts', 'column': 3, 'line': 51, 'match': 'doSomething()'},
167   \ ],
168   \ g:item_list
169   AssertEqual {}, ale#references#GetMap()
170
171   " We should be able to repeat selections with ALERepeatSelection
172   let g:item_list = []
173   ALERepeatSelection
174
175   AssertEqual
176   \ [
177   \   {'filename': '/foo/bar/app.ts', 'column': 9, 'line': 9, 'match': 'import {doSomething} from ''./whatever'''},
178   \   {'filename': '/foo/bar/app.ts', 'column': 3, 'line': 804, 'match': 'doSomething()'},
179   \   {'filename': '/foo/bar/other/app.ts', 'column': 3, 'line': 51, 'match': 'doSomething()'},
180   \ ],
181   \ g:item_list
182   AssertEqual {}, ale#references#GetMap()
183   AssertEqual
184   \ {
185   \   'open_in': 'tab',
186   \   'use_relative_paths': 1,
187   \ },
188   \ g:options
189
190 Execute(Results should be put to quickfix for tsserver responses):
191   call ale#references#SetMap(
192   \ {
193   \   3: {
194   \     'ignorethis': 'x',
195   \     'open_in': 'quickfix',
196   \   }
197   \ }
198   \)
199   call ale#references#HandleTSServerResponse(1, {
200   \ 'command': 'references',
201   \ 'request_seq': 3,
202   \ 'success': v:true,
203   \ 'body': {
204   \   'symbolStartOffset': 9,
205   \   'refs': [
206   \     {
207   \       'file': '/foo/bar/app.ts',
208   \       'isWriteAccess': v:true,
209   \       'lineText': 'import {doSomething} from ''./whatever''',
210   \       'end': {'offset': 24, 'line': 9},
211   \       'start': {'offset': 9, 'line': 9},
212   \       'isDefinition': v:true,
213   \     },
214   \     {
215   \       'file': '/foo/bar/app.ts',
216   \       'isWriteAccess': v:false,
217   \       'lineText': '  doSomething()',
218   \       'end': {'offset': 18, 'line': 804},
219   \       'start': {'offset': 3, 'line': 804},
220   \       'isDefinition': v:false,
221   \     },
222   \     {
223   \       'file': '/foo/bar/other/app.ts',
224   \       'isWriteAccess': v:false,
225   \       'lineText': '  doSomething()',
226   \       'end': {'offset': 18, 'line': 51},
227   \       'start': {'offset': 3, 'line': 51},
228   \       'isDefinition': v:false,
229   \     },
230   \   ],
231   \   'symbolDisplayString': 'import doSomething',
232   \   'symbolName': 'doSomething()',
233   \ },
234   \})
235
236   AssertEqual
237   \ 3,
238   \ len(getqflist())
239   AssertEqual {}, ale#references#GetMap()
240
241 Execute(The preview window should not be opened for empty tsserver responses):
242   call ale#references#SetMap({3: {}})
243   call ale#references#HandleTSServerResponse(1, {
244   \ 'command': 'references',
245   \ 'request_seq': 3,
246   \ 'success': v:true,
247   \ 'body': {
248   \   'symbolStartOffset': 9,
249   \   'refs': [
250   \   ],
251   \   'symbolDisplayString': 'import doSomething',
252   \   'symbolName': 'doSomething()',
253   \ },
254   \})
255
256   Assert !g:preview_called
257   AssertEqual {}, ale#references#GetMap()
258   AssertEqual ['echom ''No references found.'''], g:expr_list
259
260 Execute(tsserver reference requests should be sent):
261   call ale#linter#Reset()
262
263   runtime ale_linters/typescript/tsserver.vim
264   call setpos('.', [bufnr(''), 2, 5, 0])
265
266   ALEFindReferences
267
268   " We shouldn't register the callback yet.
269   AssertEqual '''''', string(g:Callback)
270
271   AssertEqual type(function('type')), type(g:InitCallback)
272   call g:InitCallback()
273
274   AssertEqual 'references', g:capability_checked
275   AssertEqual
276   \ 'function(''ale#references#HandleTSServerResponse'')',
277   \ string(g:Callback)
278   AssertEqual
279   \ [
280   \   ale#lsp#tsserver_message#Change(bufnr('')),
281   \   [0, 'ts@references', {'file': expand('%:p'), 'line': 2, 'offset': 5}]
282   \ ],
283   \ g:message_list
284   AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 0}}, ale#references#GetMap()
285
286 Execute('-relative' argument should enable 'use_relative_paths' in HandleTSServerResponse):
287   runtime ale_linters/typescript/tsserver.vim
288   call setpos('.', [bufnr(''), 2, 5, 0])
289
290   ALEFindReferences -relative
291
292   call g:InitCallback()
293
294   AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 1}}, ale#references#GetMap()
295
296 Execute(`-tab` should display results in tabs):
297   runtime ale_linters/typescript/tsserver.vim
298   call setpos('.', [bufnr(''), 2, 5, 0])
299
300   ALEFindReferences -tab
301
302   call g:InitCallback()
303
304   AssertEqual {'42': {'open_in': 'tab', 'use_relative_paths': 0}}, ale#references#GetMap()
305
306 Execute(The default navigation type should be used):
307   runtime ale_linters/typescript/tsserver.vim
308   call setpos('.', [bufnr(''), 2, 5, 0])
309
310   let g:ale_default_navigation = 'tab'
311   ALEFindReferences
312
313   call g:InitCallback()
314
315   AssertEqual {'42': {'open_in': 'tab', 'use_relative_paths': 0}}, ale#references#GetMap()
316
317 Execute(`-split` should display results in splits):
318   runtime ale_linters/typescript/tsserver.vim
319   call setpos('.', [bufnr(''), 2, 5, 0])
320
321   ALEFindReferences -split
322
323   call g:InitCallback()
324
325   AssertEqual {'42': {'open_in': 'split', 'use_relative_paths': 0}}, ale#references#GetMap()
326
327 Execute(`-vsplit` should display results in vsplits):
328   runtime ale_linters/typescript/tsserver.vim
329   call setpos('.', [bufnr(''), 2, 5, 0])
330
331   ALEFindReferences -vsplit
332
333   call g:InitCallback()
334
335   AssertEqual {'42': {'open_in': 'vsplit', 'use_relative_paths': 0}}, ale#references#GetMap()
336
337 Execute(`-quickfix` should display results in quickfix):
338   runtime ale_linters/typescript/tsserver.vim
339   call setpos('.', [bufnr(''), 2, 5, 0])
340
341   ALEFindReferences -quickfix
342
343   call g:InitCallback()
344
345   AssertEqual {'42': {'open_in': 'quickfix', 'use_relative_paths': 0}}, ale#references#GetMap()
346
347 Given python(Some Python file):
348   foo
349   somelongerline
350   bazxyzxyzxyz
351
352 Execute(LSP reference responses should be handled):
353   call ale#references#SetMap({3: {}})
354   call ale#references#HandleLSPResponse(
355   \ 1,
356   \ {
357   \   'id': 3,
358   \   'result': [
359   \     {
360   \       'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/completion_dummy_file')),
361   \       'range': {
362   \         'start': {'line': 2, 'character': 7},
363   \       },
364   \     },
365   \     {
366   \       'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/other_file')),
367   \       'range': {
368   \         'start': {'line': 7, 'character': 15},
369   \       },
370   \     },
371   \   ],
372   \ }
373   \)
374
375   AssertEqual
376   \ [
377   \   {
378   \     'filename': ale#path#Simplify(g:dir . '/completion_dummy_file'),
379   \     'line': 3,
380   \     'column': 8,
381   \   },
382   \   {
383   \     'filename': ale#path#Simplify(g:dir . '/other_file'),
384   \     'line': 8,
385   \     'column': 16,
386   \   },
387   \ ],
388   \ g:item_list
389   AssertEqual {}, ale#references#GetMap()
390
391 Execute(LSP reference responses should be put to quickfix):
392   call ale#references#SetMap({3: { 'open_in': 'quickfix' }})
393   call ale#references#HandleLSPResponse(
394   \ 1,
395   \ {
396   \   'id': 3,
397   \   'result': [
398   \     {
399   \       'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/completion_dummy_file')),
400   \       'range': {
401   \         'start': {'line': 2, 'character': 7},
402   \       },
403   \     },
404   \     {
405   \       'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/other_file')),
406   \       'range': {
407   \         'start': {'line': 7, 'character': 15},
408   \       },
409   \     },
410   \   ],
411   \ }
412   \)
413
414   AssertEqual
415   \ 2,
416   \ len(getqflist())
417
418 Execute(Preview windows should not be opened for empty LSP reference responses):
419   call ale#references#SetMap({3: {}})
420   call ale#references#HandleLSPResponse(1, {'id': 3, 'result': []})
421
422   Assert !g:preview_called
423   AssertEqual {}, ale#references#GetMap()
424   AssertEqual ['echom ''No references found.'''], g:expr_list
425
426 Execute(LSP reference responses with a null result should be handled):
427   call ale#references#SetMap({3: {}})
428   call ale#references#HandleLSPResponse(1, {'id': 3, 'result': v:null})
429
430   Assert !g:preview_called
431   AssertEqual {}, ale#references#GetMap()
432   AssertEqual ['echom ''No references found.'''], g:expr_list
433
434 Execute(LSP reference requests should be sent):
435   runtime ale_linters/python/pylsp.vim
436   let b:ale_linters = ['pylsp']
437   call setpos('.', [bufnr(''), 1, 5, 0])
438
439   ALEFindReferences
440
441   " We shouldn't register the callback yet.
442   AssertEqual '''''', string(g:Callback)
443
444   AssertEqual type(function('type')), type(g:InitCallback)
445   call g:InitCallback()
446
447   AssertEqual 'references', g:capability_checked
448   AssertEqual
449   \ 'function(''ale#references#HandleLSPResponse'')',
450   \ string(g:Callback)
451
452   AssertEqual
453   \ [
454   \   [1, 'textDocument/didChange', {
455   \     'textDocument': {
456   \         'uri': ale#path#ToFileURI(expand('%:p')),
457   \         'version': g:ale_lsp_next_version_id - 1,
458   \     },
459   \     'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}]
460   \   }],
461   \   [0, 'textDocument/references', {
462   \   'textDocument': {'uri': ale#path#ToFileURI(expand('%:p'))},
463   \   'position': {'line': 0, 'character': 2},
464   \   'context': {'includeDeclaration': v:false},
465   \   }],
466   \ ],
467   \ g:message_list
468
469   AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 0}}, ale#references#GetMap()
470
471 Execute('-relative' argument should enable 'use_relative_paths' in HandleLSPResponse):
472   runtime ale_linters/python/pylsp.vim
473   let b:ale_linters = ['pylsp']
474   call setpos('.', [bufnr(''), 1, 5, 0])
475
476   ALEFindReferences -relative
477
478   call g:InitCallback()
479
480   AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 1}}, ale#references#GetMap()