summaryrefslogtreecommitdiff
path: root/test/test_ale_toggle.vader
blob: f3dbf102745111b0ddbd0473652a1d5b703b578f (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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
Before:
  Save g:ale_buffer_info
  Save g:ale_set_signs
  Save g:ale_set_lists_synchronously

  let g:ale_set_signs = 1
  let g:ale_set_lists_synchronously = 1

  let g:ale_buffer_info = {}
  let g:expected_loclist = [{
  \ 'bufnr': bufnr('%'),
  \ 'lnum': 2,
  \ 'vcol': 0,
  \ 'col': 3,
  \ 'text': 'foo bar',
  \ 'type': 'E',
  \ 'nr': -1,
  \ 'pattern': '',
  \ 'valid': 1,
  \}]
  let g:expected_groups = [
  \ 'ALECleanupGroup',
  \ 'ALECursorGroup',
  \ 'ALEHighlightBufferGroup',
  \ 'ALERunOnEnterGroup',
  \ 'ALERunOnFiletypeChangeGroup',
  \ 'ALERunOnSaveGroup',
  \ 'ALERunOnTextChangedGroup',
  \]

  function! ToggleTestCallback(buffer, output)
    return [{
    \ 'bufnr': a:buffer,
    \ 'lnum': 2,
    \ 'vcol': 0,
    \ 'col': 3,
    \ 'text': 'foo bar',
    \ 'type': 'E',
    \ 'nr': -1,
    \}]
  endfunction

  function! ParseAuGroups()
    redir => l:output
       silent exec 'autocmd'
    redir end

    let l:results = []

    for l:line in split(l:output, "\n")
      let l:match = matchlist(l:line, '^ALE[a-zA-Z]\+Group')

      " We don't care about some groups here.
      if !empty(l:match)
      \&& l:match[0] !=# 'ALECompletionGroup'
      \&& l:match[0] !=# 'ALEBufferFixGroup'
      \&& l:match[0] !=# 'ALEPatternOptionsGroup'
        call add(l:results, l:match[0])
      endif
    endfor

    call uniq(sort(l:results))

    return l:results
  endfunction

  call ale#linter#Define('foobar', {
  \ 'name': 'testlinter',
  \ 'callback': 'ToggleTestCallback',
  \ 'executable': has('win32') ? 'cmd' : 'echo',
  \ 'command': 'echo',
  \ 'read_buffer': 0,
  \})

  sign unplace *

After:
  Restore

  unlet! g:expected_loclist
  unlet! g:expected_groups

  call ale#linter#Reset()

  " Toggle ALE back on if we fail when it's disabled.
  if !g:ale_enabled
    ALEToggle
  endif

  delfunction ToggleTestCallback
  delfunction ParseAuGroups

Given foobar (Some imaginary filetype):
  foo
  bar
  baz

Execute(ALEToggle should reset everything and then run again):
  AssertEqual 'foobar', &filetype

  call ale#Lint()
  call ale#engine#WaitForJobs(2000)

  " First check that everything is there...
  AssertEqual g:expected_loclist, getloclist(0)
  AssertEqual [0, [[2, 1000001, 'ALEErrorSign']]], ale#sign#FindCurrentSigns(bufnr('%'))
  AssertEqual
  \ [{'group': 'ALEError', 'pos1': [2, 3, 1]}],
  \ map(getmatches(), '{''group'': v:val.group, ''pos1'': v:val.pos1}')
  AssertEqual g:expected_groups, ParseAuGroups()
  AssertEqual [{'lnum': 2, 'bufnr': bufnr(''), 'col': 3, 'linter_name': 'testlinter', 'vcol': 0, 'nr': -1, 'type': 'E', 'text': 'foo bar', 'sign_id': 1000001}], g:ale_buffer_info[bufnr('')].loclist

  " Now Toggle ALE off.
  ALEToggle

  " Everything should be cleared.
  Assert !has_key(g:ale_buffer_info, bufnr('')), 'The g:ale_buffer_info Dictionary was not removed'
  AssertEqual [], getloclist(0), 'The loclist was not cleared'
  AssertEqual [0, []], ale#sign#FindCurrentSigns(bufnr('%')), 'The signs were not cleared'
  AssertEqual [], getmatches(), 'The highlights were not cleared'
  AssertEqual ['ALECleanupGroup', 'ALEHighlightBufferGroup'], ParseAuGroups()

  " Toggle ALE on, everything should be set up and run again.
  ALEToggle
  call ale#engine#WaitForJobs(2000)

  AssertEqual g:expected_loclist, getloclist(0)
  AssertEqual [0, [[2, 1000001, 'ALEErrorSign']]], ale#sign#FindCurrentSigns(bufnr('%'))
  AssertEqual
  \ [{'group': 'ALEError', 'pos1': [2, 3, 1]}],
  \ map(getmatches(), '{''group'': v:val.group, ''pos1'': v:val.pos1}')
  AssertEqual g:expected_groups, ParseAuGroups()
  AssertEqual [{'lnum': 2, 'bufnr': bufnr(''), 'col': 3, 'linter_name': 'testlinter', 'vcol': 0, 'nr': -1, 'type': 'E', 'text': 'foo bar', 'sign_id': 1000001}], g:ale_buffer_info[bufnr('')].loclist

Execute(ALEToggle should skip filename keys and preserve them):
  AssertEqual 'foobar', &filetype

  let g:ale_buffer_info['/foo/bar/baz.txt'] = {
  \ 'job_list': [],
  \ 'active_linter_list': [],
  \ 'loclist': [],
  \ 'temporary_file_list': [],
  \ 'temporary_directory_list': [],
  \ 'history': [],
  \}

  call ale#Lint()
  call ale#engine#WaitForJobs(2000)

  " Now Toggle ALE off.
  ALEToggle

  AssertEqual
  \ {
  \   'job_list': [],
  \   'active_linter_list': [],
  \   'loclist': [],
  \   'temporary_file_list': [],
  \   'temporary_directory_list': [],
  \   'history': [],
  \ },
  \ get(g:ale_buffer_info, '/foo/bar/baz.txt', {})

  " Toggle ALE on again.
  ALEToggle
  call ale#engine#WaitForJobs(2000)

  AssertEqual
  \ {
  \   'job_list': [],
  \   'active_linter_list': [],
  \   'loclist': [],
  \   'temporary_file_list': [],
  \   'temporary_directory_list': [],
  \   'history': [],
  \ },
  \ get(g:ale_buffer_info, '/foo/bar/baz.txt', {})