mirror of
https://github.com/dense-analysis/ale.git
synced 2026-02-04 09:02:52 +08:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
55
test/command_callback/test_c_cc_command_callbacks.vader
Normal file
55
test/command_callback/test_c_cc_command_callbacks.vader
Normal file
@@ -0,0 +1,55 @@
|
||||
Before:
|
||||
Save g:ale_c_parse_makefile
|
||||
Save g:ale_history_enabled
|
||||
|
||||
let g:ale_c_parse_makefile = 0
|
||||
let g:ale_history_enabled = 0
|
||||
|
||||
let g:get_cflags_return_value = ''
|
||||
let g:executable_map = {}
|
||||
|
||||
runtime autoload/ale/c.vim
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
function! ale#engine#IsExecutable(buffer, executable) abort
|
||||
return has_key(g:executable_map, a:executable)
|
||||
endfunction
|
||||
|
||||
function! ale#c#GetCFlags(buffer, output) abort
|
||||
return g:get_cflags_return_value
|
||||
endfunction
|
||||
|
||||
call ale#assert#SetUpLinterTest('c', 'cc')
|
||||
|
||||
let b:command_tail = ' -S -x c'
|
||||
\ . ' -o ' . (has('win32') ? 'nul': '/dev/null')
|
||||
\ . ' -iquote ' . ale#Escape(getcwd())
|
||||
\ . ' -std=c11 -Wall -'
|
||||
|
||||
After:
|
||||
unlet! g:get_cflags_return_value
|
||||
unlet! g:executable_map
|
||||
unlet! b:command_tail
|
||||
|
||||
runtime autoload/ale/c.vim
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(clang should be used instead of gcc, if available):
|
||||
let g:executable_map = {'clang': 1}
|
||||
|
||||
AssertLinter 'clang', [ale#Escape('clang') . b:command_tail]
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'gcc', [ale#Escape('gcc') . b:command_tail]
|
||||
|
||||
let b:ale_c_cc_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', [ale#Escape('foobar') . b:command_tail]
|
||||
|
||||
Execute(The -std flag should be replaced by parsed C flags):
|
||||
let b:command_tail = substitute(b:command_tail, 'c11', 'c99 ', '')
|
||||
let g:get_cflags_return_value = '-std=c99'
|
||||
|
||||
AssertLinter 'gcc', ale#Escape('gcc') . b:command_tail
|
||||
@@ -1,20 +0,0 @@
|
||||
Before:
|
||||
Save g:ale_c_parse_makefile
|
||||
let g:ale_c_parse_makefile = 0
|
||||
|
||||
call ale#assert#SetUpLinterTest('c', 'clang')
|
||||
let b:command_tail = ' -S -x c -fsyntax-only -iquote'
|
||||
\ . ' ' . ale#Escape(getcwd())
|
||||
\ . ' -std=c11 -Wall -'
|
||||
|
||||
After:
|
||||
unlet! b:command_tail
|
||||
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'clang', [ale#Escape('clang') . b:command_tail]
|
||||
|
||||
let b:ale_c_clang_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', [ale#Escape('foobar') . b:command_tail]
|
||||
@@ -1,22 +0,0 @@
|
||||
Before:
|
||||
Save g:ale_c_parse_makefile
|
||||
let g:ale_c_parse_makefile = 0
|
||||
|
||||
call ale#assert#SetUpLinterTest('c', 'gcc')
|
||||
|
||||
let b:command_tail = ' -S -x c'
|
||||
\ . ' -o ' . (has('win32') ? 'nul': '/dev/null')
|
||||
\ . ' -iquote ' . ale#Escape(getcwd())
|
||||
\ . ' -std=c11 -Wall -'
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
unlet! b:command_tail
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'gcc', [ale#Escape('gcc') . b:command_tail]
|
||||
|
||||
let b:ale_c_gcc_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', [ale#Escape('foobar') . b:command_tail]
|
||||
@@ -7,6 +7,7 @@ Before:
|
||||
Save g:__ale_c_project_filenames
|
||||
|
||||
let g:original_project_filenames = g:__ale_c_project_filenames
|
||||
let g:executable_map = {}
|
||||
|
||||
" Remove the .git/HEAD dir for C import paths for these tests.
|
||||
" The tests run inside of a git repo.
|
||||
@@ -18,17 +19,26 @@ Before:
|
||||
let g:ale_c_parse_compile_commands = 0
|
||||
let g:ale_c_parse_makefile = 0
|
||||
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
function! ale#engine#IsExecutable(buffer, executable) abort
|
||||
return has_key(g:executable_map, a:executable)
|
||||
endfunction
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
unlet! g:original_project_filenames
|
||||
unlet! g:executable_map
|
||||
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The C GCC handler should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('c', 'gcc')
|
||||
Execute(The C cc linter should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('c', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.c')
|
||||
let g:ale_c_gcc_options = ''
|
||||
let g:ale_c_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -37,10 +47,10 @@ Execute(The C GCC handler should include 'include' directories for projects with
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C GCC handler should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('c', 'gcc')
|
||||
Execute(The C cc linter should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('c', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/configure_project/subdir/file.c')
|
||||
let g:ale_c_gcc_options = ''
|
||||
let g:ale_c_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -49,10 +59,10 @@ Execute(The C GCC handler should include 'include' directories for projects with
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/configure_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C GCC handler should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'gcc')
|
||||
Execute(The C cc linter should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/h_file_project/subdir/file.c')
|
||||
let g:ale_c_gcc_options = ''
|
||||
let g:ale_c_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -61,10 +71,10 @@ Execute(The C GCC handler should include root directories for projects with .h f
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C GCC handler should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'gcc')
|
||||
Execute(The C cc linter should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/hpp_file_project/subdir/file.c')
|
||||
let g:ale_c_gcc_options = ''
|
||||
let g:ale_c_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -73,54 +83,6 @@ Execute(The C GCC handler should include root directories for projects with .hpp
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C Clang handler should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('c', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.c')
|
||||
let g:ale_c_clang_options = ''
|
||||
|
||||
AssertLinter 'clang',
|
||||
\ ale#Escape('clang')
|
||||
\ . ' -S -x c -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C Clang handler should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('c', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/h_file_project/subdir/file.c')
|
||||
let g:ale_c_clang_options = ''
|
||||
|
||||
AssertLinter 'clang',
|
||||
\ ale#Escape('clang')
|
||||
\ . ' -S -x c -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C Clang handler should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/h_file_project/subdir/file.c')
|
||||
let g:ale_c_clang_options = ''
|
||||
|
||||
AssertLinter 'clang',
|
||||
\ ale#Escape('clang')
|
||||
\ . ' -S -x c -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C Clang handler should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('c', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/hpp_file_project/subdir/file.c')
|
||||
let g:ale_c_clang_options = ''
|
||||
|
||||
AssertLinter 'clang',
|
||||
\ ale#Escape('clang')
|
||||
\ . ' -S -x c -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C ClangTidy handler should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('c', 'clangtidy')
|
||||
call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.cpp')
|
||||
@@ -131,10 +93,10 @@ Execute(The C ClangTidy handler should include 'include' directories for project
|
||||
\ . ' %s '
|
||||
\ . '-- -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/include'))
|
||||
|
||||
Execute(The C++ GCC handler should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'gcc')
|
||||
Execute(The C++ cc linter should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.cpp')
|
||||
let g:ale_cpp_gcc_options = ''
|
||||
let g:ale_cpp_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -143,10 +105,10 @@ Execute(The C++ GCC handler should include 'include' directories for projects wi
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ GCC handler should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'gcc')
|
||||
Execute(The C++ cc linter should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/configure_project/subdir/file.cpp')
|
||||
let g:ale_cpp_gcc_options = ''
|
||||
let g:ale_cpp_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -155,10 +117,10 @@ Execute(The C++ GCC handler should include 'include' directories for projects wi
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/configure_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ GCC handler should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'gcc')
|
||||
Execute(The C++ cc linter should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/h_file_project/subdir/file.cpp')
|
||||
let g:ale_cpp_gcc_options = ''
|
||||
let g:ale_cpp_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -167,10 +129,10 @@ Execute(The C++ GCC handler should include root directories for projects with .h
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ GCC handler should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'gcc')
|
||||
Execute(The C++ cc linter should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'cc')
|
||||
call ale#test#SetFilename('../test_c_projects/hpp_file_project/subdir/file.cpp')
|
||||
let g:ale_cpp_gcc_options = ''
|
||||
let g:ale_cpp_cc_options = ''
|
||||
|
||||
AssertLinter 'gcc',
|
||||
\ ale#Escape('gcc')
|
||||
@@ -179,54 +141,6 @@ Execute(The C++ GCC handler should include root directories for projects with .h
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ Clang handler should include 'include' directories for projects with a Makefile):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/makefile_project/subdir/file.cpp')
|
||||
let g:ale_cpp_clang_options = ''
|
||||
|
||||
AssertLinter 'clang++',
|
||||
\ ale#Escape('clang++')
|
||||
\ . ' -S -x c++ -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/makefile_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ Clang handler should include 'include' directories for projects with a configure file):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/configure_project/subdir/file.cpp')
|
||||
let g:ale_cpp_clang_options = ''
|
||||
|
||||
AssertLinter 'clang++',
|
||||
\ ale#Escape('clang++')
|
||||
\ . ' -S -x c++ -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/configure_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/configure_project/include'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ Clang handler should include root directories for projects with .h files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/h_file_project/subdir/file.cpp')
|
||||
let g:ale_cpp_clang_options = ''
|
||||
|
||||
AssertLinter 'clang++',
|
||||
\ ale#Escape('clang++')
|
||||
\ . ' -S -x c++ -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/h_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ Clang handler should include root directories for projects with .hpp files in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clang')
|
||||
call ale#test#SetFilename('../test_c_projects/hpp_file_project/subdir/file.cpp')
|
||||
let g:ale_cpp_clang_options = ''
|
||||
|
||||
AssertLinter 'clang++',
|
||||
\ ale#Escape('clang++')
|
||||
\ . ' -S -x c++ -fsyntax-only'
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project/subdir'))
|
||||
\ . ' -I' . ale#Escape(ale#path#Simplify(g:dir . '/../test_c_projects/hpp_file_project'))
|
||||
\ . ' -'
|
||||
|
||||
Execute(The C++ ClangTidy handler should include json folders for projects with suitable build directory in them):
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clangtidy')
|
||||
call ale#test#SetFilename('../test_c_projects/json_project/subdir/file.cpp')
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
Before:
|
||||
Save g:ale_c_parse_makefile
|
||||
let g:ale_c_parse_makefile = 0
|
||||
|
||||
call ale#assert#SetUpLinterTest('cpp', 'clang')
|
||||
let b:command_tail = ' -S -x c++ -fsyntax-only -iquote'
|
||||
\ . ' ' . ale#Escape(getcwd())
|
||||
\ . ' -std=c++14 -Wall -'
|
||||
|
||||
After:
|
||||
unlet! b:command_tail
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'clang++', ale#Escape('clang++') . b:command_tail
|
||||
|
||||
let b:ale_cpp_clang_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . b:command_tail
|
||||
@@ -1,20 +1,55 @@
|
||||
Before:
|
||||
Save g:ale_c_parse_makefile
|
||||
let g:ale_c_parse_makefile = 0
|
||||
Save g:ale_history_enabled
|
||||
|
||||
let g:ale_c_parse_makefile = 0
|
||||
let g:ale_history_enabled = 0
|
||||
|
||||
let g:get_cflags_return_value = ''
|
||||
let g:executable_map = {}
|
||||
|
||||
runtime autoload/ale/c.vim
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
function! ale#engine#IsExecutable(buffer, executable) abort
|
||||
return has_key(g:executable_map, a:executable)
|
||||
endfunction
|
||||
|
||||
function! ale#c#GetCFlags(buffer, output) abort
|
||||
return g:get_cflags_return_value
|
||||
endfunction
|
||||
|
||||
call ale#assert#SetUpLinterTest('cpp', 'cc')
|
||||
|
||||
call ale#assert#SetUpLinterTest('cpp', 'gcc')
|
||||
let b:command_tail = ' -S -x c++'
|
||||
\ . ' -o ' . (has('win32') ? 'nul': '/dev/null')
|
||||
\ . ' -iquote ' . ale#Escape(getcwd())
|
||||
\ . ' -std=c++14 -Wall -'
|
||||
|
||||
After:
|
||||
unlet! g:get_cflags_return_value
|
||||
unlet! g:executable_map
|
||||
unlet! b:command_tail
|
||||
|
||||
runtime autoload/ale/c.vim
|
||||
runtime autoload/ale/engine.vim
|
||||
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(clang++ should be used instead of gcc, if available):
|
||||
let g:executable_map = {'clang++': 1}
|
||||
|
||||
AssertLinter 'clang++', [ale#Escape('clang++') . b:command_tail]
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'gcc', [ale#Escape('gcc') . b:command_tail]
|
||||
|
||||
let b:ale_cpp_cc_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', [ale#Escape('foobar') . b:command_tail]
|
||||
|
||||
Execute(The -std flag should be replaced by parsed C flags):
|
||||
let b:command_tail = substitute(b:command_tail, 'c++14', 'c++11 ', '')
|
||||
let g:get_cflags_return_value = '-std=c++11'
|
||||
|
||||
AssertLinter 'gcc', ale#Escape('gcc') . b:command_tail
|
||||
|
||||
let b:ale_cpp_gcc_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . b:command_tail
|
||||
|
||||
@@ -8,6 +8,18 @@ After:
|
||||
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(Builds credo command with normal project):
|
||||
AssertLinter 'mix',
|
||||
\ ale#path#CdString(ale#path#Simplify(g:dir . '/elixir_paths/mix_project'))
|
||||
\ . 'mix help credo && mix credo suggest --format=flycheck --read-from-stdin %s'
|
||||
|
||||
Execute(Builds credo command with umbrella project):
|
||||
call ale#test#SetFilename('elixir_paths/umbrella_project/apps/mix_project/lib/app.ex')
|
||||
|
||||
AssertLinter 'mix',
|
||||
\ ale#path#CdString(ale#path#Simplify(g:dir . '/elixir_paths/umbrella_project'))
|
||||
\ . 'mix help credo && mix credo suggest --format=flycheck --read-from-stdin %s'
|
||||
|
||||
Execute(Builds credo command with --strict mode when set to 1):
|
||||
let g:ale_elixir_credo_strict = 1
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
Before:
|
||||
call ale#assert#SetUpLinterTest('markdown', 'markdownlint')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The default command should be correct):
|
||||
AssertLinter 'markdownlint', ale#Escape('markdownlint') . ' %s'
|
||||
|
||||
Execute(The options should be configurable):
|
||||
let g:ale_markdown_markdownlint_options = '--config ~/custom/.markdownlintrc'
|
||||
|
||||
AssertLinter 'markdownlint', ale#Escape('markdownlint') . ' --config ~/custom/.markdownlintrc %s'
|
||||
@@ -0,0 +1,25 @@
|
||||
Before:
|
||||
call ale#assert#SetUpLinterTest('swift', 'swiftformat')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(Should use default command when not in a swift package):
|
||||
call ale#test#SetFilename('../swift-test-files/non-swift-package-project/src/folder/dummy.swift')
|
||||
|
||||
AssertLinter 'swift-format',
|
||||
\ ale#Escape('swift-format') . ' --mode lint %t'
|
||||
|
||||
Execute(Should use swift run when in a swift package):
|
||||
call ale#test#SetFilename('../swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||
|
||||
AssertLinter 'swift',
|
||||
\ ale#Escape('swift') . ' run swift-format --mode lint %t'
|
||||
|
||||
Execute(Should let users configure a global executable and override local paths):
|
||||
call ale#test#SetFilename('../swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||
|
||||
let g:ale_swift_swiftformat_executable = '/path/to/custom/swift-format'
|
||||
|
||||
AssertLinter '/path/to/custom/swift-format',
|
||||
\ ale#Escape('/path/to/custom/swift-format') . ' --mode lint %t'
|
||||
@@ -5,12 +5,14 @@ Before:
|
||||
Save g:ale_fix_on_save
|
||||
Save g:ale_lint_on_save
|
||||
Save g:ale_echo_cursor
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
silent! cd /testplugin/test/fix
|
||||
|
||||
unlet! b:ale_lint_on_save
|
||||
let g:ale_enabled = 0
|
||||
let g:ale_echo_cursor = 0
|
||||
let g:ale_command_wrapper = ''
|
||||
let g:ale_run_synchronously = 1
|
||||
let g:ale_set_lists_synchronously = 1
|
||||
let g:ale_fix_buffer_data = {}
|
||||
@@ -82,56 +84,6 @@ Before:
|
||||
return [{'lnum': 1, 'col': 1, 'text': 'xxx'}]
|
||||
endfunction
|
||||
|
||||
function! FirstChainCallback(buffer)
|
||||
return {'command': 'echo echoline', 'chain_with': 'SecondChainCallback'}
|
||||
endfunction
|
||||
|
||||
function! FirstChainCallbackSkipped(buffer)
|
||||
let l:ChainWith = 'SecondChainCallback'
|
||||
|
||||
" Test with lambdas where support is available.
|
||||
if has('lambda')
|
||||
let l:ChainWith = {buffer, output -> SecondChainCallback(buffer, output)}
|
||||
endif
|
||||
|
||||
return {'command': '', 'chain_with': l:ChainWith}
|
||||
endfunction
|
||||
|
||||
function! FirstChainCallbackSecondSkipped(buffer)
|
||||
return {'command': 'echo skipit', 'chain_with': 'SecondChainCallback'}
|
||||
endfunction
|
||||
|
||||
function! SecondChainCallback(buffer, output)
|
||||
let l:previous_line = empty(a:output)
|
||||
\ ? 'emptydefault'
|
||||
\ : join(split(a:output[0]))
|
||||
|
||||
if l:previous_line is# 'skipit'
|
||||
return {'command': '', 'chain_with': 'ThirdChainCallback'}
|
||||
endif
|
||||
|
||||
return {
|
||||
\ 'command': 'echo ' . l:previous_line,
|
||||
\ 'chain_with': 'ThirdChainCallback',
|
||||
\}
|
||||
endfunction
|
||||
|
||||
function! ThirdChainCallback(buffer, output, input)
|
||||
let l:previous_line = empty(a:output)
|
||||
\ ? 'thirddefault'
|
||||
\ : join(split(a:output[0]))
|
||||
|
||||
return a:input + [l:previous_line]
|
||||
endfunction
|
||||
|
||||
function! ChainWhereLastIsSkipped(buffer)
|
||||
return {'command': 'echo echoline', 'chain_with': 'ChainEndSkipped'}
|
||||
endfunction
|
||||
|
||||
function! ChainEndSkipped(buffer, output)
|
||||
return {'command': ''}
|
||||
endfunction
|
||||
|
||||
" echo will output a single blank line, and we should ingore it.
|
||||
function! IgnoredEmptyOutput(buffer, output)
|
||||
return {'command': has('win32') ? 'echo(' : 'echo'}
|
||||
@@ -206,13 +158,6 @@ After:
|
||||
delfunction RemoveLastLine
|
||||
delfunction RemoveLastLineOneArg
|
||||
delfunction TestCallback
|
||||
delfunction FirstChainCallback
|
||||
delfunction FirstChainCallbackSkipped
|
||||
delfunction FirstChainCallbackSecondSkipped
|
||||
delfunction SecondChainCallback
|
||||
delfunction ThirdChainCallback
|
||||
delfunction ChainWhereLastIsSkipped
|
||||
delfunction ChainEndSkipped
|
||||
delfunction SetUpLinters
|
||||
delfunction GetLastMessage
|
||||
delfunction IgnoredEmptyOutput
|
||||
@@ -814,57 +759,6 @@ Execute(ALE should tolerate valid fixers with minuses in the name):
|
||||
ALEFix
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
Execute(Test fixing with chained callbacks):
|
||||
let g:ale_fixers.testft = ['FirstChainCallback']
|
||||
ALEFix
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
" The buffer shouldn't be piped in for earlier commands in the chain.
|
||||
AssertEqual
|
||||
\ [
|
||||
\ string(ale#job#PrepareCommand(bufnr(''), 'echo echoline')),
|
||||
\ string(ale#job#PrepareCommand(bufnr(''), 'echo echoline')),
|
||||
\ ],
|
||||
\ map(ale#history#Get(bufnr(''))[-2:-1], 'string(v:val.command)')
|
||||
|
||||
Expect(The echoed line should be added):
|
||||
a
|
||||
b
|
||||
c
|
||||
echoline
|
||||
|
||||
Execute(Test fixing with chained callback where the first command is skipped):
|
||||
let g:ale_fixers.testft = ['FirstChainCallbackSkipped']
|
||||
ALEFix
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
Expect(The default line should be added):
|
||||
a
|
||||
b
|
||||
c
|
||||
emptydefault
|
||||
|
||||
Execute(Test fixing with chained callback where the second command is skipped):
|
||||
let g:ale_fixers.testft = ['FirstChainCallbackSecondSkipped']
|
||||
ALEFix
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
Expect(The default line should be added):
|
||||
a
|
||||
b
|
||||
c
|
||||
thirddefault
|
||||
|
||||
Execute(Test fixing with chained callback where the final callback is skipped):
|
||||
let g:ale_fixers.testft = ['ChainWhereLastIsSkipped']
|
||||
ALEFix
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
Expect(The lines should be the same):
|
||||
a
|
||||
b
|
||||
c
|
||||
|
||||
Execute(Empty output should be ignored):
|
||||
let g:ale_fixers.testft = ['IgnoredEmptyOutput']
|
||||
ALEFix
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
Before:
|
||||
Save g:ale_c_build_dir
|
||||
Save g:ale_c_clangtidy_executable
|
||||
Save g:ale_c_clangtidy_checks
|
||||
Save g:ale_c_clangtidy_extra_options
|
||||
Save g:ale_cpp_clangtidy_executable
|
||||
Save g:ale_cpp_clangtidy_checks
|
||||
Save g:ale_cpp_clangtidy_extra_options
|
||||
|
||||
" Use an invalid global executable, so we don't match it.
|
||||
let g:ale_c_clangtidy_executable = 'xxxinvalid'
|
||||
let g:ale_c_clangtidy_checks = []
|
||||
let g:ale_c_clangtidy_extra_options = ''
|
||||
let g:ale_cpp_clangtidy_executable = 'xxxinvalidpp'
|
||||
let g:ale_cpp_clangtidy_checks = []
|
||||
let g:ale_cpp_clangtidy_extra_options = ''
|
||||
let g:ale_c_build_dir = ''
|
||||
|
||||
call ale#test#SetDirectory('/testplugin/test/fixers')
|
||||
@@ -36,16 +47,3 @@ Execute(The clangtidy callback should include any additional options):
|
||||
\ . ' -fix -fix-errors --some-option %t',
|
||||
\ },
|
||||
\ ale#fixers#clangtidy#Fix(bufnr(''))
|
||||
|
||||
Execute(The clangtidy callback should support cpp files):
|
||||
call ale#test#SetFilename('c_paths/dummy.cpp')
|
||||
let g:ale_cpp_clangtidy_executable = 'invalidpp'
|
||||
set filetype=cpp " The test fails without this
|
||||
|
||||
AssertEqual
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': ale#Escape(g:ale_cpp_clangtidy_executable)
|
||||
\ . ' -fix -fix-errors %t',
|
||||
\ },
|
||||
\ ale#fixers#clangtidy#Fix(bufnr(''))
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
Before:
|
||||
call ale#assert#SetUpFixerTest('javascript', 'eslint')
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
runtime autoload/ale/handlers/eslint.vim
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownFixerTest()
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
Before:
|
||||
call ale#assert#SetUpFixerTest('javascript', 'prettier_eslint')
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownFixerTest()
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
Before:
|
||||
call ale#assert#SetUpFixerTest('javascript', 'prettier')
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
|
||||
silent cd ..
|
||||
silent cd command_callback
|
||||
|
||||
24
test/fixers/test_remark_lint_fixer_callback.vader
Normal file
24
test/fixers/test_remark_lint_fixer_callback.vader
Normal file
@@ -0,0 +1,24 @@
|
||||
Before:
|
||||
Save g:ale_markdown_remark_lint_executable
|
||||
Save g:ale_markdown_remark_lint_options
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
Execute(The remark callback should return the correct default values):
|
||||
AssertEqual
|
||||
\ {
|
||||
\ 'command': ale#Escape('remark')
|
||||
\ },
|
||||
\ ale#fixers#remark_lint#Fix(bufnr(''))
|
||||
|
||||
Execute(The remark executable and options should be configurable):
|
||||
let g:ale_markdown_remark_lint_executable = '/path/to/remark'
|
||||
let g:ale_markdown_remark_lint_options = '-h'
|
||||
|
||||
AssertEqual
|
||||
\ {
|
||||
\ 'command': ale#Escape('/path/to/remark')
|
||||
\ . ' -h',
|
||||
\ },
|
||||
\ ale#fixers#remark_lint#Fix(bufnr(''))
|
||||
@@ -15,7 +15,7 @@ Execute(The executable path should be correct):
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/standard/bin/cmd.js'))
|
||||
\ . ' --fix %t',
|
||||
\ . ' --fix --stdin < %s > %t',
|
||||
\ },
|
||||
\ ale#fixers#standard#Fix(bufnr(''))
|
||||
|
||||
@@ -26,6 +26,6 @@ Execute(Custom options should be supported):
|
||||
AssertEqual
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': ale#Escape('standard') . ' --foo-bar --fix %t',
|
||||
\ 'command': ale#Escape('standard') . ' --foo-bar --fix --stdin < %s > %t',
|
||||
\ },
|
||||
\ ale#fixers#standard#Fix(bufnr(''))
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
Before:
|
||||
runtime ale_linters/glsl/glslang.vim
|
||||
|
||||
Execute(The glsl glslang handler should parse lines correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
Before:
|
||||
Save g:ale_javascript_eslint_suppress_eslintignore
|
||||
|
||||
let g:ale_javascript_eslint_suppress_eslintignore = 0
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
Execute(The standard handler should parse lines correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
|
||||
28
test/handler/test_swiftformat_handler.vader
Normal file
28
test/handler/test_swiftformat_handler.vader
Normal file
@@ -0,0 +1,28 @@
|
||||
Before:
|
||||
runtime ale_linters/swift/swiftformat.vim
|
||||
|
||||
After:
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(The swiftformat handler should parse lines correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 4,
|
||||
\ 'col': 21,
|
||||
\ 'type': 'W',
|
||||
\ 'code': 'DoNotUseSemicolons',
|
||||
\ 'text': 'remove '';'' and move the next statement to the new line',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 3,
|
||||
\ 'col': 12,
|
||||
\ 'type': 'W',
|
||||
\ 'code': 'Spacing',
|
||||
\ 'text': 'remove 1 space'
|
||||
\ },
|
||||
\ ],
|
||||
\ ale_linters#swift#swiftformat#Handle(bufnr(''), [
|
||||
\ 'Sources/main.swift:4:21: warning: [DoNotUseSemicolons]: remove '';'' and move the next statement to the new line',
|
||||
\ 'Sources/main.swift:3:12: warning: [Spacing]: remove 1 space',
|
||||
\ ])
|
||||
@@ -33,8 +33,8 @@ Before:
|
||||
\ 'lsp': 'stdio',
|
||||
\ 'command': 'cat - > /dev/null',
|
||||
\ 'executable': has('win32') ? 'cmd' : 'echo',
|
||||
\ 'language_callback': 'LanguageCallback',
|
||||
\ 'project_root_callback': 'ProjectRootCallback',
|
||||
\ 'language': function('LanguageCallback'),
|
||||
\ 'project_root': function('ProjectRootCallback'),
|
||||
\ })
|
||||
let g:ale_linters = {'foobar': ['dummy_linter']}
|
||||
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
Before:
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
runtime autoload/ale/lsp.vim
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
|
||||
let g:args = []
|
||||
|
||||
" Mock the StartProgram function so we can just capture the arguments.
|
||||
@@ -9,6 +13,8 @@ Before:
|
||||
endfunction
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
unlet! g:args
|
||||
|
||||
runtime autoload/ale/lsp.vim
|
||||
@@ -18,8 +24,8 @@ Execute(Command formatting should be applied correctly for LSP linters):
|
||||
\ bufnr(''),
|
||||
\ {
|
||||
\ 'name': 'linter',
|
||||
\ 'language_callback': {-> 'x'},
|
||||
\ 'project_root_callback': {-> '/foo/bar'},
|
||||
\ 'language': {-> 'x'},
|
||||
\ 'project_root': {-> '/foo/bar'},
|
||||
\ 'lsp': 'stdio',
|
||||
\ 'executable': has('win32') ? 'cmd': 'true',
|
||||
\ 'command': '%e --foo',
|
||||
|
||||
@@ -25,7 +25,6 @@ Before:
|
||||
\ 'name': g:linter_name,
|
||||
\ 'project_root': {b -> g:project_root},
|
||||
\ 'aliases': [],
|
||||
\ 'language_callback': {b -> 'cpp'},
|
||||
\ 'read_buffer': 1,
|
||||
\ 'command': '%e'
|
||||
\ }]
|
||||
|
||||
@@ -422,3 +422,13 @@ Execute(Deferred addresses should be handled correctly):
|
||||
Assert Start()
|
||||
call ale#test#FlushJobs()
|
||||
call AssertInitSuccess('foo', 'localhost:1234', 'foobar', '/foo/bar', '')
|
||||
|
||||
Execute(Servers that have crashed should be restarted):
|
||||
call ale#lsp#Register('foo', '/foo/bar', {})
|
||||
call extend(ale#lsp#GetConnections()['foo:/foo/bar'], {'initialized': 1})
|
||||
|
||||
" Starting the program again should reset initialized to `0`.
|
||||
call ale#lsp#StartProgram('foo:/foo/bar', 'foobar', 'foobar --start')
|
||||
|
||||
AssertEqual 0, ale#lsp#GetConnections()['foo:/foo/bar']['initialized']
|
||||
AssertEqual ['initialize'], map(PopMessages(), 'v:val[''method'']')
|
||||
|
||||
@@ -10,7 +10,9 @@ Before:
|
||||
Save g:ale_set_loclist
|
||||
Save g:ale_set_quickfix
|
||||
Save g:ale_set_signs
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
let g:ale_buffer_info = {}
|
||||
let g:ale_run_synchronously = 1
|
||||
unlet! g:ale_run_synchronously_callbacks
|
||||
|
||||
@@ -6,7 +6,9 @@ Before:
|
||||
Save g:ale_set_loclist
|
||||
Save g:ale_set_quickfix
|
||||
Save g:ale_set_signs
|
||||
Save g:ale_command_wrapper
|
||||
|
||||
let g:ale_command_wrapper = ''
|
||||
let g:ale_buffer_info = {}
|
||||
let g:ale_run_synchronously = 1
|
||||
let g:ale_set_signs = 1
|
||||
|
||||
@@ -340,6 +340,7 @@ Execute(CFlags we want to pass):
|
||||
\ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incquote'))
|
||||
\ . ' -isystem ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incsystem'))
|
||||
\ . ' -idirafter ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incafter'))
|
||||
\ . ' -iframework ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incframework'))
|
||||
\ . ' -Dmacro=value -D macro2 -Bbdir -B bdir2'
|
||||
\ . ' -iprefix prefix -iwithprefix prefix2 -iwithprefixbefore prefix3'
|
||||
\ . ' -isysroot sysroot --sysroot=test --no-sysroot-suffix -imultilib multidir'
|
||||
@@ -349,7 +350,7 @@ Execute(CFlags we want to pass):
|
||||
\ ale#c#ParseCFlags(
|
||||
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
|
||||
\ 'gcc'
|
||||
\ . ' -Iinc -I include -iquote incquote -isystem incsystem -idirafter incafter'
|
||||
\ . ' -Iinc -I include -iquote incquote -isystem incsystem -idirafter incafter -iframework incframework'
|
||||
\ . ' -Dmacro=value -D macro2 -Bbdir -B bdir2'
|
||||
\ . ' -iprefix prefix -iwithprefix prefix2 -iwithprefixbefore prefix3'
|
||||
\ . ' -isysroot sysroot --sysroot=test --no-sysroot-suffix -imultilib multidir'
|
||||
@@ -364,5 +365,16 @@ Execute(CFlags we dont want to pass):
|
||||
\ ale#c#ParseCFlags(
|
||||
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
|
||||
\ 'gcc -Wl,option -Wa,option -Wp,option filename.c somelib.a '
|
||||
\ . '-fdump-file=name -fdiagnostics-arg -fno-show-column'
|
||||
\ . '-fdump-file=name -fdiagnostics-arg -fno-show-column -fstack-usage'
|
||||
\ )
|
||||
|
||||
Execute(Expanding @file in CFlags):
|
||||
AssertEqual
|
||||
\ '-DARGS1 -DARGS2 -O2',
|
||||
\ ale#c#ParseCFlags(
|
||||
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
|
||||
\ 'gcc'
|
||||
\ . ' -g'
|
||||
\ . ' @./args'
|
||||
\ . ' -O2',
|
||||
\ )
|
||||
|
||||
3
test/test_c_projects/makefile_project/args
Normal file
3
test/test_c_projects/makefile_project/args
Normal file
@@ -0,0 +1,3 @@
|
||||
foolib.a
|
||||
-DARGS1
|
||||
@subdir/args
|
||||
1
test/test_c_projects/makefile_project/subdir/args
Normal file
1
test/test_c_projects/makefile_project/subdir/args
Normal file
@@ -0,0 +1 @@
|
||||
-DARGS2
|
||||
@@ -1,73 +0,0 @@
|
||||
Before:
|
||||
Save &shell, g:ale_run_synchronously
|
||||
let g:ale_run_synchronously = 1
|
||||
unlet! g:ale_run_synchronously_callbacks
|
||||
|
||||
if !has('win32')
|
||||
set shell=/bin/sh
|
||||
endif
|
||||
|
||||
let g:linter_output = []
|
||||
let g:first_echo_called = 0
|
||||
let g:second_echo_called = 0
|
||||
let g:final_callback_called = 0
|
||||
|
||||
function! CollectResults(buffer, output)
|
||||
let g:final_callback_called = 1
|
||||
let g:linter_output = map(copy(a:output), 'join(split(v:val))')
|
||||
return []
|
||||
endfunction
|
||||
function! RunFirstEcho(buffer)
|
||||
let g:first_echo_called = 1
|
||||
|
||||
return 'echo foo'
|
||||
endfunction
|
||||
function! RunSecondEcho(buffer, output)
|
||||
let g:second_echo_called = 1
|
||||
|
||||
return 'echo bar'
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('foobar', {
|
||||
\ 'name': 'testlinter',
|
||||
\ 'callback': 'CollectResults',
|
||||
\ 'executable': has('win32') ? 'cmd' : 'echo',
|
||||
\ 'command_chain': [
|
||||
\ {
|
||||
\ 'callback': 'RunFirstEcho',
|
||||
\ 'output_stream': 'stdout',
|
||||
\ 'read_buffer': 0,
|
||||
\ },
|
||||
\ {
|
||||
\ 'callback': 'RunSecondEcho',
|
||||
\ 'output_stream': 'stdout',
|
||||
\ 'read_buffer': 0,
|
||||
\ },
|
||||
\ ],
|
||||
\})
|
||||
|
||||
After:
|
||||
Restore
|
||||
unlet! g:ale_run_synchronously_callbacks
|
||||
unlet! g:first_echo_called
|
||||
unlet! g:second_echo_called
|
||||
unlet! g:final_callback_called
|
||||
unlet! g:linter_output
|
||||
let g:ale_buffer_info = {}
|
||||
call ale#linter#Reset()
|
||||
delfunction CollectResults
|
||||
delfunction RunFirstEcho
|
||||
delfunction RunSecondEcho
|
||||
|
||||
Given foobar (Some imaginary filetype):
|
||||
anything
|
||||
|
||||
Execute(Check the results of running the chain):
|
||||
AssertEqual 'foobar', &filetype
|
||||
call ale#Queue(0)
|
||||
call ale#test#FlushJobs()
|
||||
|
||||
Assert g:first_echo_called, 'The first chain item was not called'
|
||||
Assert g:second_echo_called, 'The second chain item was not called'
|
||||
Assert g:final_callback_called, 'The final callback was not called'
|
||||
AssertEqual ['bar'], g:linter_output
|
||||
@@ -1,108 +0,0 @@
|
||||
Before:
|
||||
function! CollectResults(buffer, output)
|
||||
return []
|
||||
endfunction
|
||||
|
||||
function! FirstChainFunction(buffer)
|
||||
return 'first'
|
||||
endfunction
|
||||
|
||||
function! SecondChainFunction(buffer, output)
|
||||
" We'll skip this command
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! ThirdChainFunction(buffer, output)
|
||||
return 'third'
|
||||
endfunction
|
||||
|
||||
function! FourthChainFunction(buffer, output)
|
||||
return 'fourth'
|
||||
endfunction
|
||||
|
||||
let g:linter = {
|
||||
\ 'name': 'testlinter',
|
||||
\ 'callback': 'CollectResults',
|
||||
\ 'executable': 'echo',
|
||||
\ 'command_chain': [
|
||||
\ {'callback': 'FirstChainFunction'},
|
||||
\ {'callback': 'SecondChainFunction'},
|
||||
\ {'callback': 'ThirdChainFunction'},
|
||||
\ {'callback': 'FourthChainFunction'},
|
||||
\ ],
|
||||
\ 'read_buffer': 1,
|
||||
\}
|
||||
|
||||
function! ProcessIndex(chain_index)
|
||||
let [l:command, l:options] = ale#engine#ProcessChain(347, '', g:linter, a:chain_index, [])
|
||||
let l:options.command = l:command
|
||||
|
||||
return l:options
|
||||
endfunction
|
||||
|
||||
After:
|
||||
delfunction CollectResults
|
||||
delfunction FirstChainFunction
|
||||
delfunction SecondChainFunction
|
||||
delfunction ThirdChainFunction
|
||||
delfunction ProcessIndex
|
||||
unlet! g:linter
|
||||
unlet! g:result
|
||||
|
||||
Execute(Engine invocation should return the command for the first item correctly):
|
||||
let g:result = ProcessIndex(0)
|
||||
|
||||
AssertEqual 'first', g:result.command
|
||||
AssertEqual 1, g:result.next_chain_index
|
||||
|
||||
Execute(Engine invocation should return the command for the second item correctly):
|
||||
let g:result = ProcessIndex(1)
|
||||
|
||||
AssertEqual 'third', g:result.command
|
||||
AssertEqual 3, g:result.next_chain_index
|
||||
|
||||
Execute(Engine invocation should return the command for the fourth item correctly):
|
||||
let g:result = ProcessIndex(3)
|
||||
|
||||
AssertEqual 'fourth', g:result.command
|
||||
AssertEqual 4, g:result.next_chain_index
|
||||
|
||||
Execute(Engine invocation should allow read_buffer to be enabled for a command in the middle of a chain):
|
||||
let g:linter.command_chain[2].read_buffer = 1
|
||||
|
||||
let g:result = ProcessIndex(2)
|
||||
|
||||
AssertEqual g:result.command, 'third'
|
||||
AssertEqual g:result.read_buffer, 1
|
||||
|
||||
Execute(Engine invocation should allow read_buffer to be disabled for the end of a chain):
|
||||
let g:linter.command_chain[3].read_buffer = 0
|
||||
|
||||
let g:result = ProcessIndex(3)
|
||||
|
||||
AssertEqual g:result.command, 'fourth'
|
||||
AssertEqual g:result.read_buffer, 0
|
||||
|
||||
Execute(Engine invocation should not use read_buffer from earlier items in a chain):
|
||||
let g:linter.command_chain[1].read_buffer = 1
|
||||
|
||||
let g:result = ProcessIndex(1)
|
||||
|
||||
AssertEqual g:result.command, 'third'
|
||||
AssertEqual g:result.read_buffer, 0
|
||||
|
||||
Execute(Engine invocation should allow the output_stream setting to be changed in the middle of a chain):
|
||||
let g:linter.command_chain[2].output_stream = 'both'
|
||||
|
||||
let g:result = ProcessIndex(2)
|
||||
|
||||
AssertEqual g:result.command, 'third'
|
||||
AssertEqual g:result.output_stream, 'both'
|
||||
|
||||
Execute(Engine invocation should not use output_stream from earlier items in a chain):
|
||||
let g:linter.command_chain[1].output_stream = 'both'
|
||||
|
||||
let g:result = ProcessIndex(1)
|
||||
|
||||
AssertEqual g:result.command, 'third'
|
||||
AssertEqual g:result.output_stream, 'stdout'
|
||||
@@ -514,7 +514,7 @@ Execute(LSP tab type definition requests should be sent):
|
||||
let b:ale_linters = ['pyls']
|
||||
call setpos('.', [bufnr(''), 1, 5, 0])
|
||||
|
||||
ALEGoToTypeDefinitionInTab
|
||||
ALEGoToTypeDefinition -tab
|
||||
|
||||
" We shouldn't register the callback yet.
|
||||
AssertEqual '''''', string(g:Callback)
|
||||
|
||||
@@ -39,13 +39,13 @@ Execute (PreProcess should throw when then callback is not a function):
|
||||
\})
|
||||
AssertEqual '`callback` must be defined with a callback to accept output', g:vader_exception
|
||||
|
||||
Execute (PreProcess should throw when there is no executable or executable_callback):
|
||||
Execute (PreProcess should throw when there is no executable):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'callback': 'SomeFunction',
|
||||
\ 'command': 'echo',
|
||||
\})
|
||||
AssertEqual 'Either `executable` or `executable_callback` must be defined', g:vader_exception
|
||||
AssertEqual '`executable` must be defined', g:vader_exception
|
||||
|
||||
Execute (PreProcess should throw when executable is not a string):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
@@ -56,15 +56,6 @@ Execute (PreProcess should throw when executable is not a string):
|
||||
\})
|
||||
AssertEqual '`executable` must be a String or Function if defined', g:vader_exception
|
||||
|
||||
Execute (PreProcess should throw when executable_callback is not a callback):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'callback': 'SomeFunction',
|
||||
\ 'executable_callback': 123,
|
||||
\ 'command': 'echo',
|
||||
\})
|
||||
AssertEqual '`executable_callback` must be a callback if defined', g:vader_exception
|
||||
|
||||
Execute (PreProcess should allow executable to be a callback):
|
||||
call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
@@ -79,7 +70,7 @@ Execute (PreProcess should throw when there is no command):
|
||||
\ 'callback': 'SomeFunction',
|
||||
\ 'executable': 'echo',
|
||||
\})
|
||||
AssertEqual 'Either `command`, `executable_callback`, `command_chain` must be defined', g:vader_exception
|
||||
AssertEqual '`command` must be defined', g:vader_exception
|
||||
|
||||
Execute (PreProcess should throw when command is not a string):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
@@ -98,15 +89,6 @@ Execute (PreProcess should allow command to be a callback):
|
||||
\ 'command': function('type'),
|
||||
\})
|
||||
|
||||
Execute (PreProcess should throw when command_callback is not a callback):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'callback': 'SomeFunction',
|
||||
\ 'executable': 'echo',
|
||||
\ 'command_callback': 123,
|
||||
\})
|
||||
AssertEqual '`command_callback` must be a callback if defined', g:vader_exception
|
||||
|
||||
Execute (PreProcess should when the output stream isn't a valid string):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
@@ -152,117 +134,12 @@ Execute (PreProcess should accept a 'both' output_stream):
|
||||
\ 'output_stream': 'both',
|
||||
\})
|
||||
|
||||
Execute(PreProcess should complain if the command_chain is not a List):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': 'x',
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual '`command_chain` must be a List', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain if the command_chain is empty):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual '`command_chain` must contain at least one item', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain if the command_chain has no callback):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{}],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain if the command_chain callback is not a function):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 2}],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception
|
||||
|
||||
Execute(PreProcess should accept a chain with one callback):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 'foo'}],
|
||||
\}
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
Execute(PreProcess should complain about invalid output_stream values in the chain):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 'foo', 'output_stream': ''}],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual "The `command_chain` item 0 `output_stream` flag must be 'stdout', 'stderr', or 'both'", g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain about valid output_stream values in the chain):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 'foo', 'output_stream': 'stdout'}],
|
||||
\}
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
let g:linter.command_chain[0].output_stream = 'stderr'
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
let g:linter.command_chain[0].output_stream = 'both'
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
Execute(PreProcess should complain about invalid chain items at higher indices):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 'foo'}, {'callback': 123}],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'The `command_chain` item 1 must define a `callback` function', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain when conflicting command options are used):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command': 'foo',
|
||||
\ 'command_chain': [{'callback': 'foo'}],
|
||||
\}
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
|
||||
|
||||
unlet g:linter.command
|
||||
let g:linter.command_callback = 'foo'
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
|
||||
|
||||
let g:linter.command = 'foo'
|
||||
unlet g:linter.command_chain
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
|
||||
|
||||
Execute(PreProcess should process the read_buffer option correctly):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command_chain': [{'callback': 'foo'}, {'callback': 'bar'}],
|
||||
\ 'command': 'x',
|
||||
\ 'read_buffer': '0',
|
||||
\}
|
||||
|
||||
@@ -277,25 +154,6 @@ Execute(PreProcess should process the read_buffer option correctly):
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
unlet g:linter.read_buffer
|
||||
let g:linter.command_chain[0].read_buffer = '0'
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'The `command_chain` item 0 value for `read_buffer` must be `0` or `1`', g:vader_exception
|
||||
|
||||
let g:linter.command_chain[0].read_buffer = 0
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
let g:linter.command_chain[1].read_buffer = '0'
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'The `command_chain` item 1 value for `read_buffer` must be `0` or `1`', g:vader_exception
|
||||
|
||||
let g:linter.command_chain[1].read_buffer = 1
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
Execute(PreProcess should set a default value for read_buffer):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
@@ -394,151 +252,96 @@ Execute(PreProcess should accept tsserver LSP configuration):
|
||||
\ 'executable': 'x',
|
||||
\ 'command': 'x',
|
||||
\ 'lsp': 'tsserver',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'tsserver', ale#linter#PreProcess('testft', g:linter).lsp
|
||||
|
||||
call remove(g:linter, 'executable')
|
||||
let g:linter.executable_callback = 'X'
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
call remove(g:linter, 'command')
|
||||
let g:linter.command_callback = 'X'
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
Execute(PreProcess should accept stdio LSP configuration):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'executable': 'x',
|
||||
\ 'command': 'x',
|
||||
\ 'lsp': 'stdio',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'stdio', ale#linter#PreProcess('testft', g:linter).lsp
|
||||
|
||||
call remove(g:linter, 'executable')
|
||||
let g:linter.executable_callback = 'X'
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
call remove(g:linter, 'command')
|
||||
let g:linter.command_callback = 'X'
|
||||
|
||||
call ale#linter#PreProcess('testft', g:linter)
|
||||
|
||||
Execute(PreProcess should accept LSP server configurations):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'foobar',
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'socket', ale#linter#PreProcess('testft', g:linter).lsp
|
||||
|
||||
Execute(PreProcess should accept let you specify the language as just a string):
|
||||
Execute(PreProcess should accept let you specify the `language` as a Function):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': 'foobar',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'address': 'X',
|
||||
\ 'language': {-> 'foobar'},
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'foobar', ale#linter#PreProcess('testft', g:linter).language_callback(0)
|
||||
|
||||
Execute(PreProcess should complain about using language and language_callback together):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `language` or `language_callback` should be set', g:vader_exception
|
||||
AssertEqual 'foobar', ale#linter#PreProcess('testft', g:linter).language(bufnr(''))
|
||||
|
||||
Execute(PreProcess should complain about invalid language values):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 0,
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual '`language` must be a String or Funcref', g:vader_exception
|
||||
AssertEqual '`language` must be a String or Funcref if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should use the filetype as the language string by default):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'address': 'X',
|
||||
\ 'project_root': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'testft', ale#linter#PreProcess('testft', g:linter).language_callback(0)
|
||||
AssertEqual 'testft', ale#linter#PreProcess('testft', g:linter).language
|
||||
|
||||
Execute(PreProcess should allow language to be set to a callback):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': {-> 'foo'},
|
||||
\ 'project_root_callback': 'x',
|
||||
\}
|
||||
|
||||
AssertEqual 'foo', ale#linter#PreProcess('testft', g:linter).language_callback(0)
|
||||
|
||||
Execute(PreProcess should require an address_callback for LSP socket configurations):
|
||||
Execute(PreProcess should require an `address` for LSP socket configurations):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual '`address` or `address_callback` must be defined for getting the LSP address', g:vader_exception
|
||||
AssertEqual '`address` must be defined for getting the LSP address', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain about address_callback for non-LSP linters):
|
||||
Execute(PreProcess should complain about `address` for non-LSP linters):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'callback': 'SomeFunction',
|
||||
\ 'executable': 'echo',
|
||||
\ 'command': 'echo',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual '`address` or `address_callback` cannot be used when lsp != ''socket''', g:vader_exception
|
||||
AssertEqual '`address` cannot be used when lsp != ''socket''', g:vader_exception
|
||||
|
||||
Execute(PreProcess accept valid address_callback values):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': {-> 'foo:123'},
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\})
|
||||
|
||||
AssertEqual 'foo:123', ale#linter#GetAddress(0, g:linter)
|
||||
|
||||
Execute(PreProcess accept address as a String):
|
||||
Execute(PreProcess accept `address` as a String):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': 'foo:123',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\})
|
||||
|
||||
AssertEqual 'foo:123', ale#linter#GetAddress(0, g:linter)
|
||||
@@ -549,7 +352,7 @@ Execute(PreProcess accept address as a Function):
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': {-> 'foo:123'},
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\})
|
||||
|
||||
AssertEqual 'foo:123', ale#linter#GetAddress(0, g:linter)
|
||||
@@ -560,11 +363,11 @@ Execute(PreProcess should complain about invalid address values):
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': 0,
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\})
|
||||
AssertEqual '`address` must be a String or Function if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should accept allow the project root be set as a String):
|
||||
Execute(PreProcess should allow the `project_root` to be set as a String):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
@@ -575,7 +378,7 @@ Execute(PreProcess should accept allow the project root be set as a String):
|
||||
|
||||
AssertEqual '/foo/bar', ale#lsp_linter#FindProjectRoot(0, g:linter)
|
||||
|
||||
Execute(PreProcess should accept allow the project root be set as a Function):
|
||||
Execute(PreProcess should `project_root` be set as a Function):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
@@ -586,7 +389,7 @@ Execute(PreProcess should accept allow the project root be set as a Function):
|
||||
|
||||
AssertEqual '/foo/bar', ale#lsp_linter#FindProjectRoot(0, g:linter)
|
||||
|
||||
Execute(PreProcess should complain when the project_root valid is invalid):
|
||||
Execute(PreProcess should complain when `project_root` is invalid):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
@@ -594,154 +397,74 @@ Execute(PreProcess should complain when the project_root valid is invalid):
|
||||
\ 'language': 'x',
|
||||
\ 'project_root': 0,
|
||||
\})
|
||||
AssertEqual '`project_root` must be a String or Function if defined', g:vader_exception
|
||||
AssertEqual '`project_root` must be a String or Function', g:vader_exception
|
||||
|
||||
Execute(PreProcess should accept project_root_callback as a String):
|
||||
call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': 'foo:123',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'Foobar',
|
||||
\})
|
||||
|
||||
Execute(PreProcess should accept project_root_callback as a Function):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': 'foo:123',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': {-> '/foo/bar'},
|
||||
\})
|
||||
|
||||
AssertEqual '/foo/bar', ale#lsp_linter#FindProjectRoot(0, g:linter)
|
||||
|
||||
Execute(PreProcess should complain when the project_root_callback valid is invalid):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address': 'foo:123',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 0,
|
||||
\})
|
||||
AssertEqual '`project_root_callback` must be a callback if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should complain about using initialization_options and initialization_options_callback together):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'initialization_options': 'x',
|
||||
\ 'initialization_options_callback': 'x',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `initialization_options` or `initialization_options_callback` should be set', g:vader_exception
|
||||
|
||||
Execute(PreProcess should throw when initialization_options_callback is not a callback):
|
||||
Execute(PreProcess should throw when `initialization_options` is not a Dictionary or callback):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'initialization_options_callback': {},
|
||||
\})
|
||||
AssertEqual '`initialization_options_callback` must be a callback if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should throw when initialization_options is not a Dictionary or callback):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'initialization_options': 0,
|
||||
\})
|
||||
AssertEqual '`initialization_options` must be a String or Function if defined', g:vader_exception
|
||||
AssertEqual '`initialization_options` must be a Dictionary or Function if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should accept initialization_options as a Dictionary):
|
||||
Execute(PreProcess should accept `initialization_options` as a Dictionary):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'initialization_options': {'foo': v:true},
|
||||
\})
|
||||
|
||||
AssertEqual {'foo': v:true}, ale#lsp_linter#GetOptions(0, g:linter)
|
||||
|
||||
Execute(PreProcess should accept initialization_options as a Funcref):
|
||||
Execute(PreProcess should accept `initialization_options` as a Function):
|
||||
let g:linter = ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'initialization_options': {-> {'foo': v:true}},
|
||||
\})
|
||||
|
||||
AssertEqual {'foo': v:true}, ale#lsp_linter#GetOptions(0, g:linter)
|
||||
|
||||
Execute(PreProcess should complain about using lsp_config and lsp_config_callback together):
|
||||
Execute(PreProcess should accept `lsp_config` as a Dictionary):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'lsp_config': 'x',
|
||||
\ 'lsp_config_callback': 'x',
|
||||
\}
|
||||
|
||||
AssertThrows call ale#linter#PreProcess('testft', g:linter)
|
||||
AssertEqual 'Only one of `lsp_config` or `lsp_config_callback` should be set', g:vader_exception
|
||||
|
||||
Execute(PreProcess should throw when lsp_config_callback is not a callback):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'lsp_config_callback': {},
|
||||
\})
|
||||
AssertEqual '`lsp_config_callback` must be a callback if defined', g:vader_exception
|
||||
|
||||
Execute(PreProcess should accept LSP configuration options via lsp_config):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'lsp_config': {'foo': 'bar'},
|
||||
\}
|
||||
|
||||
AssertEqual {'foo': 'bar'}, ale#lsp_linter#GetConfig(0, g:linter)
|
||||
|
||||
Execute(PreProcess should accept LSP configuration options via lsp_config as a function):
|
||||
Execute(PreProcess should accept `lsp_config` as a Function):
|
||||
let g:linter = {
|
||||
\ 'name': 'x',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'language_callback': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'lsp_config': {-> {'foo': 'bar'}},
|
||||
\}
|
||||
|
||||
AssertEqual {'foo': 'bar'}, ale#lsp_linter#GetConfig(0, g:linter)
|
||||
|
||||
Execute(PreProcess should throw when lsp_config is not a Dictionary or Function):
|
||||
Execute(PreProcess should throw when `lsp_config` is not a Dictionary or Function):
|
||||
AssertThrows call ale#linter#PreProcess('testft', {
|
||||
\ 'name': 'foo',
|
||||
\ 'lsp': 'socket',
|
||||
\ 'address_callback': 'X',
|
||||
\ 'address': 'X',
|
||||
\ 'language': 'x',
|
||||
\ 'project_root_callback': 'x',
|
||||
\ 'project_root': 'x',
|
||||
\ 'lsp_config': 'x',
|
||||
\})
|
||||
AssertEqual '`lsp_config` must be a Dictionary or Function if defined', g:vader_exception
|
||||
|
||||
@@ -98,6 +98,16 @@ Execute(The ksh dialect should be used for shellcheck if b:is_kornshell is 1):
|
||||
|
||||
AssertEqual 'ksh', ale#handlers#shellcheck#GetDialectArgument(bufnr(''))
|
||||
|
||||
Execute(The filetype should be used as the default shell type when there is no hashbang line):
|
||||
set filetype=zsh
|
||||
AssertEqual 'zsh', ale#handlers#sh#GetShellType(bufnr(''))
|
||||
|
||||
set filetype=tcsh
|
||||
AssertEqual 'tcsh', ale#handlers#sh#GetShellType(bufnr(''))
|
||||
|
||||
set filetype=python
|
||||
AssertEqual '', ale#handlers#sh#GetShellType(bufnr(''))
|
||||
|
||||
Given(A file with /bin/ash):
|
||||
#!/bin/ash
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ Before:
|
||||
\ 'name': 'testlinter',
|
||||
\ 'executable': has('win32') ? 'cmd' : 'echo',
|
||||
\ 'callback': 'TestCallback',
|
||||
\ 'command_callback': 'TestCommandCallback',
|
||||
\ 'command': function('TestCommandCallback'),
|
||||
\})
|
||||
call ale#command#ClearData()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user