summaryrefslogtreecommitdiff
path: root/test/lsp/test_did_save_event.vader
blob: fc73c4d66290c84da079c1532a3fcbfd948e8590 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
Before:
  Save g:ale_lint_on_save
  Save g:ale_enabled
  Save g:ale_linters
  Save g:ale_run_synchronously
  Save g:ale_disable_lsp

  call ale#test#SetDirectory('/testplugin/test/completion')
  call ale#test#SetFilename('dummy.txt')

  runtime autoload/ale/lsp.vim
  runtime autoload/ale/lsp_linter.vim

  let g:ale_disable_lsp = 0
  unlet! b:ale_disable_lsp
  let g:ale_lint_on_save = 1
  let b:ale_enabled = 1
  let g:ale_lsp_next_message_id = 1
  let g:ale_run_synchronously = 1
  let g:conn_id = v:null
  let g:message_list = []

  function! LanguageCallback() abort
    return 'foobar'
  endfunction

  function! ProjectRootCallback() abort
    return expand('.')
  endfunction

  call ale#linter#Define('foobar', {
  \ 'name': 'dummy_linter',
  \ 'lsp': 'stdio',
  \ 'command': 'cat - > /dev/null',
  \ 'executable': has('win32') ? 'cmd' : 'echo',
  \ 'language': function('LanguageCallback'),
  \ 'project_root': function('ProjectRootCallback'),
  \ })
  let g:ale_linters = {'foobar': ['dummy_linter']}

  function! ale#lsp_linter#StartLSP(buffer, linter, Callback) abort
    let g:conn_id = ale#lsp#Register('executable', '/foo/bar', {})
    call ale#lsp#MarkDocumentAsOpen(g:conn_id, a:buffer)
    let l:details = {
    \ 'command': 'foobar',
    \ 'buffer': a:buffer,
    \ 'connection_id': g:conn_id,
    \ 'project_root': '/foo/bar',
    \}

    call a:Callback(a:linter, l:details)

    return 1
  endfunction

  " Replace the Send function for LSP, so we can monitor calls to it.
  function! ale#lsp#Send(conn_id, message) abort
    call add(g:message_list, a:message)
  endfunction

After:
  Restore

  if g:conn_id isnot v:null
    call ale#lsp#RemoveConnectionWithID(g:conn_id)
  endif

  unlet! b:ale_enabled
  unlet! b:ale_linters
  unlet! g:message_list
  unlet! b:ale_save_event_fired

  delfunction LanguageCallback
  delfunction ProjectRootCallback

  call ale#test#RestoreDirectory()
  call ale#linter#Reset()

  " Stop any timers we left behind.
  " This stops the tests from failing randomly.
  call ale#completion#StopTimer()

  runtime autoload/ale/completion.vim
  runtime autoload/ale/lsp.vim
  runtime autoload/ale/lsp_linter.vim

Given foobar (Some imaginary filetype):
  <contents>

Execute(Server should be notified on save):
  call ale#events#SaveEvent(bufnr(''))

  AssertEqual
  \ [
  \   [1, 'textDocument/didChange', {
  \     'textDocument': {
  \       'uri': ale#path#ToFileURI(expand('%:p')),
  \       'version': g:ale_lsp_next_version_id - 1,
  \     },
  \     'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}],
  \   }],
  \ ],
  \ g:message_list

Execute(Server should be notified on save with didSave is supported by server):

  " Replace has capability function to simulate didSave server capability
  function! ale#lsp#HasCapability(conn_id, capability) abort
      if a:capability == 'did_save'
          return 1
      endif
      return 0
  endfunction

  call ale#events#SaveEvent(bufnr(''))

  AssertEqual
  \ [
  \   [1, 'textDocument/didChange', {
  \     'textDocument': {
  \       'uri': ale#path#ToFileURI(expand('%:p')),
  \       'version': g:ale_lsp_next_version_id - 1,
  \     },
  \     'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}],
  \   }],
  \   [1, 'textDocument/didSave', {
  \     'textDocument': {
  \       'uri': ale#path#ToFileURI(expand('%:p')),
  \     },
  \   }],
  \ ],
  \ g:message_list

Execute(Server should be notified on change):
  call ale#events#FileChangedEvent(bufnr(''))

  AssertEqual
  \ [
  \   [1, 'textDocument/didChange', {
  \     'textDocument': {
  \       'uri': ale#path#ToFileURI(expand('%:p')),
  \       'version': g:ale_lsp_next_version_id - 1,
  \     },
  \     'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}],
  \   }],
  \ ],
  \ g:message_list