ale/test/test_lint_file_linters.vader
w0rp 81c73da3b9
#2132 - lint and fix with ale#command#Run
A new function is added here which will later be modified for public use
in linter and fixer callbacks. All linting and fixing now goes through
this new function, to prove that it works in all cases.
2019-02-06 22:00:11 +00:00

318 lines
6.6 KiB
Plaintext

Before:
Save g:ale_fix_on_save
Save g:ale_enabled
Save g:ale_run_synchronously
Save g:ale_set_lists_synchronously
Save g:ale_buffer_info
Save g:ale_linters
let g:ale_buffer_info = {}
let g:ale_run_synchronously = 1
unlet! g:ale_run_synchronously_callbacks
let g:ale_set_lists_synchronously = 1
let b:ale_save_event_fired = 0
let g:buffer_result = [
\ {
\ 'lnum': 1,
\ 'col': 1,
\ 'text': 'buffer error',
\ 'type': 'E',
\ },
\ {
\ 'lnum': 2,
\ 'col': 1,
\ 'text': 'buffer warning',
\ 'type': 'W',
\ },
\]
function! LintFileCallback(buffer, output)
return [
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\]
endfunction
function! BufferCallback(buffer, output)
return deepcopy(g:buffer_result)
endfunction
function! GetSimplerLoclist()
let l:loclist = []
for l:item in ale#test#GetLoclistWithoutModule()
call add(l:loclist, {
\ 'lnum': l:item.lnum,
\ 'col': l:item.col,
\ 'text': l:item.text,
\ 'type': l:item.type,
\})
endfor
return l:loclist
endfunction
call ale#linter#Define('foobar', {
\ 'name': 'lint_file_linter',
\ 'callback': 'LintFileCallback',
\ 'executable': has('win32') ? 'cmd' : 'echo',
\ 'command': 'echo',
\ 'lint_file': 1,
\})
call ale#linter#Define('foobar', {
\ 'name': 'buffer_linter',
\ 'callback': 'BufferCallback',
\ 'executable': has('win32') ? 'cmd' : 'echo',
\ 'command': 'echo',
\ 'read_buffer': 0,
\})
let g:filename = tempname()
call writefile([], g:filename)
call ale#test#SetFilename(g:filename)
After:
if !g:ale_run_synchronously
call ale#engine#Cleanup(bufnr(''))
endif
Restore
unlet! g:ale_run_synchronously_callbacks
unlet! b:ale_save_event_fired
unlet! b:ale_enabled
unlet g:buffer_result
let g:ale_buffer_info = {}
call ale#linter#Reset()
call setloclist(0, [])
delfunction LintFileCallback
delfunction BufferCallback
if filereadable(g:filename)
call delete(g:filename)
endif
unlet g:filename
Given foobar (Some imaginary filetype):
foo
bar
baz
Execute(Running linters without 'lint_file' should run only buffer linters):
call ale#Queue(0)
call ale#test#FlushJobs()
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 1,
\ 'text': 'buffer error',
\ 'type': 'E',
\ },
\ {
\ 'lnum': 2,
\ 'col': 1,
\ 'text': 'buffer warning',
\ 'type': 'W',
\ },
\], GetSimplerLoclist()
Execute(Running linters with 'lint_file' should run all linters):
Assert filereadable(expand('%:p')), 'The file was not readable'
call ale#Queue(0, 'lint_file')
call ale#test#FlushJobs()
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 1,
\ 'text': 'buffer error',
\ 'type': 'E',
\ },
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 1,
\ 'text': 'buffer warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\], GetSimplerLoclist()
Execute(Linter errors from files should be kept):
Assert filereadable(expand('%:p')), 'The file was not readable'
call ale#Queue(0, 'lint_file')
call ale#test#FlushJobs()
" Change the results for the buffer callback.
let g:buffer_result = [
\ {
\ 'lnum': 1,
\ 'col': 1,
\ 'text': 'new buffer error',
\ 'type': 'E',
\ },
\]
call ale#Queue(0)
call ale#test#FlushJobs()
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 1,
\ 'text': 'new buffer error',
\ 'type': 'E',
\ },
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\], GetSimplerLoclist()
Execute(Linter errors from files should be kept when no other linters are run):
let g:ale_linters = {'foobar': ['lint_file_linter']}
Assert filereadable(expand('%:p')), 'The file was not readable'
call ale#Queue(0, 'lint_file')
call ale#test#FlushJobs()
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\], GetSimplerLoclist()
call ale#Queue(0)
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\], GetSimplerLoclist()
Execute(The Save event should respect the buffer number):
let g:ale_linters = {'foobar': ['lint_file_linter']}
Assert filereadable(expand('%:p')), 'The file was not readable'
call ale#events#SaveEvent(bufnr('') + 1)
call ale#test#FlushJobs()
" We shouldn't get any prblems yet.
AssertEqual [], GetSimplerLoclist()
call ale#events#SaveEvent(bufnr(''))
call ale#test#FlushJobs()
" We should get them now we used the right buffer number.
AssertEqual [
\ {
\ 'lnum': 1,
\ 'col': 3,
\ 'text': 'file warning',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 2,
\ 'col': 3,
\ 'text': 'file error',
\ 'type': 'E',
\ },
\], GetSimplerLoclist()
Execute(The Save event should set b:ale_save_event_fired to 1):
let g:ale_lint_on_save = 1
let b:ale_enabled = 1
call ale#linter#Reset()
call ale#events#SaveEvent(bufnr(''))
call ale#test#FlushJobs()
" This flag needs to be set so windows can be opened, etc.
AssertEqual 1, b:ale_save_event_fired
Execute(b:ale_save_event_fired should be set to 0 when results are set):
let b:ale_save_event_fired = 1
call ale#engine#SetResults(bufnr(''), [])
call ale#test#FlushJobs()
AssertEqual 0, b:ale_save_event_fired
Execute(lint_file linters should stay running after checking without them):
let g:ale_run_synchronously = 0
" Run all linters, then just the buffer linters.
call ale#Queue(0, 'lint_file')
call ale#Queue(0)
" The lint_file linter should still be running.
AssertEqual
\ ['lint_file_linter', 'buffer_linter'],
\ map(copy(g:ale_buffer_info[bufnr('')].active_linter_list), 'v:val.name')
" We should have 1 job for each linter.
AssertEqual
\ 2,
\ len(keys(get(get(ale#command#GetData(), bufnr(''), {}), 'jobs', {})))
call ale#test#WaitForJobs(2000)
Execute(The save event should not lint the buffer when ALE is disabled):
let g:ale_enabled = 0
call ale#events#SaveEvent(bufnr(''))
call ale#test#FlushJobs()
AssertEqual [], GetSimplerLoclist()
AssertEqual 0, b:ale_save_event_fired