summaryrefslogtreecommitdiff
path: root/test/test_history_saving.vader
blob: d7a307b530ccf167555027e6483ecd61ed2a80ed (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
178
179
180
181
182
Before:
  Save g:ale_max_buffer_history_size
  Save g:ale_history_log_output
  Save g:ale_run_synchronously

  unlet! b:ale_fixers
  unlet! b:ale_enabled
  unlet! b:ale_history

  " Temporarily set the shell to /bin/sh, if it isn't already set that way.
  " This will make it so the test works when running it directly.
  let g:current_shell = &shell

  if !has('win32')
    let &shell = '/bin/sh'
  endif

  let g:history = []
  let g:ale_buffer_info = {}
  let g:ale_max_buffer_history_size = 20
  let g:ale_history_log_output = 0

  function! TestFixer(buffer)
    return {'command': 'echo foo'}
  endfunction

  function! CollectResults(buffer, output)
    return []
  endfunction

  call ale#linter#Define('foobar', {
  \ 'name': 'testlinter',
  \ 'callback': 'CollectResults',
  \ 'executable': has('win32') ? 'cmd' : 'echo',
  \ 'command': has('win32')
  \   ? 'echo command history test'
  \   : '/bin/sh -c ''echo command history test''',
  \ 'read_buffer': 0,
  \})

After:
  Restore

  unlet! g:expected_results
  unlet! b:ale_fixers
  unlet! b:ale_enabled
  " Clear the history we changed.
  unlet! b:ale_history

  " Reset the shell back to what it was before.
  let &shell = g:current_shell
  unlet g:current_shell
  let g:ale_history_enabled = 1
  let g:ale_history_log_output = 0
  unlet g:history

  call ale#engine#Cleanup(bufnr(''))
  call ale#linter#Reset()

  let g:ale_buffer_info = {}
  let g:ale_max_buffer_history_size = 20
  delfunction TestFixer
  delfunction CollectResults

Given foobar (Some imaginary filetype):
  anything

Execute(History should be set when commands are run):
  AssertEqual 'foobar', &filetype

  let g:expected_results = ['command', 'exit_code', 'job_id', 'status']

  " Retry this test until it works. This one can randomly fail.
  for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
    let b:ale_history = []
    call ale#Queue(0)
    call ale#engine#WaitForJobs(2000)

    let g:history = filter(
    \ copy(ale#history#Get(bufnr(''))),
    \ 'v:val.job_id isnot# ''executable''',
    \)

    AssertEqual 1, len(g:history)

    if sort(keys(g:history[0])) == g:expected_results
      break
    endif
  endfor

  AssertEqual g:expected_results, sort(keys(g:history[0]))

  if has('win32')
    AssertEqual 'cmd /s/c "echo command history test"', g:history[0].command
  else
    AssertEqual ['/bin/sh', '-c', '/bin/sh -c ''echo command history test'''], g:history[0].command
  endif

  AssertEqual 'finished', g:history[0].status
  AssertEqual 0, g:history[0].exit_code
  " The Job ID will change each time, but we can check the type.
  AssertEqual type(1), type(g:history[0].job_id)

Execute(History should be not set when disabled):
  AssertEqual 'foobar', &filetype

  let g:ale_history_enabled = 0

  call ale#Queue(0)
  call ale#engine#WaitForJobs(2000)

  AssertEqual [], ale#history#Get(bufnr(''))

Execute(History should include command output if logging is enabled):
  AssertEqual 'foobar', &filetype

  let g:ale_history_log_output = 1
  let g:expected_results = ['command history test']

  " Retry this test until it works. This one can randomly fail.
  for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
    let b:ale_history = []
    call ale#Queue(0)
    call ale#engine#WaitForJobs(2000)

    let g:history = ale#history#Get(bufnr(''))

    AssertEqual 1, len(g:history)

    if get(g:history[0], 'output', []) == g:expected_results
      break
    endif
  endfor

  AssertEqual g:expected_results, get(g:history[0], 'output', [])

Execute(History items should be popped after going over the max):
  let b:ale_history = map(range(20), '{''status'': ''started'', ''job_id'': v:val, ''command'': ''foobar''}')

  call ale#history#Add(bufnr(''), 'started', 347, 'last command')

  AssertEqual
  \ (
  \   map(range(1, 19), '{''status'': ''started'', ''job_id'': v:val, ''command'': ''foobar''}')
  \   + [{'status': 'started', 'job_id': 347, 'command': 'last command'}]
  \ ),
  \ ale#history#Get(bufnr(''))

Execute(Nothing should be added to history if the size is too low):
  let g:ale_max_buffer_history_size = 0

  call ale#history#Add(bufnr(''), 'started', 347, 'last command')

  AssertEqual [], ale#history#Get(bufnr(''))

  let g:ale_max_buffer_history_size = -2

  call ale#history#Add(1, 'started', 347, 'last command')

  AssertEqual [], ale#history#Get(bufnr(''))

Given foobar(Some file with an imaginary filetype):
  a
  b
  c

Execute(The history should be updated when fixers are run):
  call ale#test#SetFilename('dummy.txt')

  let b:ale_fixers = {'foobar': ['TestFixer']}
  let b:ale_enabled = 0
  let g:ale_run_synchronously = 1

  ALEFix

  AssertEqual ['finished'], map(copy(b:ale_history), 'v:val.status')

  if has('win32')
    AssertEqual 'cmd /s/c "echo foo ', split(b:ale_history[0].command, '<')[0]
  else
    AssertEqual '/bin/sh -c echo foo ', split(join(b:ale_history[0].command), '<')[0]
  endif