summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBartek thindil Jasicki <thindil@laeran.pl>2020-09-11 10:38:36 +0200
committerBartek thindil Jasicki <thindil@laeran.pl>2020-09-11 10:38:36 +0200
commit1781b1eab0f9c8e6dd5beca302bd9cd430d7f7b2 (patch)
tree877345d38bc61e2b492e5f04336f1cdb564d7c7e /test
parentc78be861035765d268a5533cf583803e22d56d1c (diff)
parent08295ce17405cb5f6c80d2f726262493bfd21210 (diff)
downloadale-1781b1eab0f9c8e6dd5beca302bd9cd430d7f7b2.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'test')
-rw-r--r--test/command_callback/test_embertemplatelint_command_callbacks.vader17
-rw-r--r--test/command_callback/test_pylint_command_callback.vader31
-rw-r--r--test/command_callback/test_vint_command_callback.vader23
-rw-r--r--test/completion/test_ale_import_command.vader562
-rw-r--r--test/completion/test_complete_events.vader35
-rw-r--r--test/completion/test_completion_events.vader48
-rw-r--r--test/completion/test_completion_filtering.vader50
-rw-r--r--test/completion/test_lsp_completion_parsing.vader76
-rw-r--r--test/completion/test_tsserver_completion_parsing.vader11
-rw-r--r--test/fix/test_ale_fix.vader24
-rw-r--r--test/lsp/test_engine_lsp_response_handling.vader56
-rw-r--r--test/test_ale_has.vader1
-rw-r--r--test/test_ale_info.vader27
-rw-r--r--test/test_ale_lint_stop_command.vader27
-rw-r--r--test/test_computed_lint_file_values.vader16
-rw-r--r--test/test_embertemplatelint_executable_detection.vader22
16 files changed, 914 insertions, 112 deletions
diff --git a/test/command_callback/test_embertemplatelint_command_callbacks.vader b/test/command_callback/test_embertemplatelint_command_callbacks.vader
new file mode 100644
index 00000000..97687d29
--- /dev/null
+++ b/test/command_callback/test_embertemplatelint_command_callbacks.vader
@@ -0,0 +1,17 @@
+Before:
+ call ale#assert#SetUpLinterTest('handlebars', 'embertemplatelint')
+
+ GivenCommandOutput ['1.6.0']
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(ember-template-lint executables runs the right command):
+ AssertLinter 'ember-template-lint',
+ \ ale#Escape('ember-template-lint') . ' --json --filename %s'
+
+Execute(old ember-template-lint executables runs the right command):
+ GivenCommandOutput []
+
+ AssertLinter 'ember-template-lint',
+ \ ale#Escape('ember-template-lint') . ' --json %t'
diff --git a/test/command_callback/test_pylint_command_callback.vader b/test/command_callback/test_pylint_command_callback.vader
index 755dd292..15f004b6 100644
--- a/test/command_callback/test_pylint_command_callback.vader
+++ b/test/command_callback/test_pylint_command_callback.vader
@@ -8,6 +8,8 @@ Before:
let b:bin_dir = has('win32') ? 'Scripts' : 'bin'
let b:command_tail = ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n %s'
+ GivenCommandOutput ['pylint 2.3.0']
+
After:
unlet! b:bin_dir
unlet! b:executable
@@ -17,26 +19,33 @@ After:
Execute(The pylint callbacks should return the correct default values):
AssertLinter 'pylint',
- \ ale#path#CdString(expand('#' . bufnr('') . ':p:h'))
- \ . ale#Escape('pylint') . ' ' . b:command_tail
+ \ ale#path#CdString(expand('%:p:h'))
+ \ . ale#Escape('pylint') . b:command_tail
+
+Execute(Pylint should run with the --from-stdin in new enough versions):
+ GivenCommandOutput ['pylint 2.4.0']
+
+ AssertLinter 'pylint',
+ \ ale#path#CdString(expand('%:p:h'))
+ \ . ale#Escape('pylint') . b:command_tail[:-3] . '--from-stdin %s'
Execute(The option for disabling changing directories should work):
let g:ale_python_pylint_change_directory = 0
- AssertLinter 'pylint', ale#Escape('pylint') . ' ' . b:command_tail
+ AssertLinter 'pylint', ale#Escape('pylint') . b:command_tail
Execute(The pylint executable should be configurable, and escaped properly):
let g:ale_python_pylint_executable = 'executable with spaces'
AssertLinter 'executable with spaces',
- \ ale#path#CdString(expand('#' . bufnr('') . ':p:h'))
- \ . ale#Escape('executable with spaces') . ' ' . b:command_tail
+ \ ale#path#CdString(expand('%:p:h'))
+ \ . ale#Escape('executable with spaces') . b:command_tail
Execute(The pylint command callback should let you set options):
let g:ale_python_pylint_options = '--some-option'
AssertLinter 'pylint',
- \ ale#path#CdString(expand('#' . bufnr('') . ':p:h'))
+ \ ale#path#CdString(expand('%:p:h'))
\ . ale#Escape('pylint') . ' --some-option' . b:command_tail
Execute(The pylint callbacks shouldn't detect virtualenv directories where they don't exist):
@@ -44,7 +53,7 @@ Execute(The pylint callbacks shouldn't detect virtualenv directories where they
AssertLinter 'pylint',
\ ale#path#CdString(ale#path#Simplify(g:dir . '/python_paths/no_virtualenv/subdir'))
- \ . ale#Escape('pylint') . ' ' . b:command_tail
+ \ . ale#Escape('pylint') . b:command_tail
Execute(The pylint callbacks should detect virtualenv directories):
silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py')
@@ -55,7 +64,7 @@ Execute(The pylint callbacks should detect virtualenv directories):
AssertLinter b:executable,
\ ale#path#CdString(ale#path#Simplify(g:dir . '/python_paths/with_virtualenv/subdir'))
- \ . ale#Escape(b:executable) . ' ' . b:command_tail
+ \ . ale#Escape(b:executable) . b:command_tail
Execute(You should able able to use the global pylint instead):
silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py')
@@ -63,7 +72,7 @@ Execute(You should able able to use the global pylint instead):
AssertLinter 'pylint',
\ ale#path#CdString(ale#path#Simplify(g:dir . '/python_paths/with_virtualenv/subdir'))
- \ . ale#Escape('pylint') . ' ' . b:command_tail
+ \ . ale#Escape('pylint') . b:command_tail
Execute(Setting executable to 'pipenv' appends 'run pylint'):
let g:ale_python_pylint_executable = 'path/to/pipenv'
@@ -71,7 +80,7 @@ Execute(Setting executable to 'pipenv' appends 'run pylint'):
AssertLinter 'path/to/pipenv',
\ ale#path#CdString(expand('#' . bufnr('') . ':p:h'))
\ . ale#Escape('path/to/pipenv') . ' run pylint'
- \ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n %s'
+ \ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n %s'
Execute(Pipenv is detected when python_pylint_auto_pipenv is set):
let g:ale_python_pylint_auto_pipenv = 1
@@ -80,4 +89,4 @@ Execute(Pipenv is detected when python_pylint_auto_pipenv is set):
AssertLinter 'pipenv',
\ ale#path#CdString(expand('#' . bufnr('') . ':p:h'))
\ . ale#Escape('pipenv') . ' run pylint'
- \ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n %s'
+ \ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n %s'
diff --git a/test/command_callback/test_vint_command_callback.vader b/test/command_callback/test_vint_command_callback.vader
index 4ce277e8..4a224d01 100644
--- a/test/command_callback/test_vint_command_callback.vader
+++ b/test/command_callback/test_vint_command_callback.vader
@@ -1,17 +1,17 @@
Before:
call ale#assert#SetUpLinterTest('vim', 'vint')
- let b:command_tail = (has('nvim') ? ' --enable-neovim' : '')
- \ . ' -f "{file_path}:{line_number}:{column_number}: {severity}: {policy_name} - {description} (see {reference})" %t'
+ let b:common_flags = (has('nvim') ? ' --enable-neovim' : '')
+ \ . ' -f "{file_path}:{line_number}:{column_number}: {severity}: {policy_name} - {description} (see {reference})"'
After:
- unlet! b:bin_dir
- unlet! b:executable
+ unlet! b:common_flags
+
call ale#assert#TearDownLinterTest()
Execute(The default command should be correct):
AssertLinter 'vint', [
\ ale#Escape('vint') .' --version',
- \ ale#Escape('vint') .' -s --no-color' . b:command_tail,
+ \ ale#Escape('vint') .' -s --no-color' . b:common_flags . ' %t',
\]
Execute(The executable should be configurable):
@@ -19,5 +19,16 @@ Execute(The executable should be configurable):
AssertLinter 'foobar', [
\ ale#Escape('foobar') .' --version',
- \ ale#Escape('foobar') .' -s --no-color' . b:command_tail,
+ \ ale#Escape('foobar') .' -s --no-color' . b:common_flags . ' %t',
\]
+
+Execute(The --no-color flag should not be used for older Vint versions):
+ GivenCommandOutput ['v0.3.5']
+
+ AssertLinter 'vint', ale#Escape('vint') .' -s' . b:common_flags . ' %t'
+
+Execute(--stdin-display-name should be used in newer versions):
+ GivenCommandOutput ['v0.4.0']
+
+ AssertLinter 'vint', ale#Escape('vint') .' -s --no-color' . b:common_flags
+ \ . ' --stdin-display-name %s -'
diff --git a/test/completion/test_ale_import_command.vader b/test/completion/test_ale_import_command.vader
new file mode 100644
index 00000000..2ba9b8d7
--- /dev/null
+++ b/test/completion/test_ale_import_command.vader
@@ -0,0 +1,562 @@
+Before:
+ Save g:ale_enabled
+ Save b:ale_enabled
+ Save g:ale_lint_on_text_changed
+ Save g:ale_completion_enabled
+ Save g:ale_completion_autoimport
+ Save g:ale_completion_max_suggestions
+ Save g:ale_linters
+ Save b:ale_linters
+
+ let g:ale_enabled = 0
+ let b:ale_enabled = 0
+ let g:ale_lint_on_text_changed = 'always'
+ let g:ale_completion_enabled = 0
+ let g:ale_completion_autoimport = 0
+ let g:ale_completion_max_suggestions = 50
+ let g:ale_linters = {'typescript': ['tsserver'], 'python': ['pyre']}
+ unlet! b:ale_linters
+
+ let g:server_started_value = 1
+ let g:request_id = 0
+ let g:LastCallback = v:null
+ let g:LastHandleCallback = v:null
+ let g:sent_message_list = []
+ let g:code_action_list = []
+ let g:execute_list = []
+ let g:ale_queue_call_list = []
+
+ runtime autoload/ale.vim
+ runtime autoload/ale/util.vim
+ runtime autoload/ale/code_action.vim
+ runtime autoload/ale/lsp.vim
+ runtime autoload/ale/lsp_linter.vim
+
+ function! ale#util#Execute(expr) abort
+ call add(g:execute_list, a:expr)
+ endfunction
+
+ function! ale#Queue(...) abort
+ call add(g:ale_queue_call_list, a:000)
+ endfunction
+
+ function! ale#lsp#RegisterCallback(id, Callback) abort
+ let g:LastHandleCallback = a:Callback
+ endfunction
+
+ function! ale#lsp#NotifyForChanges(id, buffer) abort
+ endfunction
+
+ function! ale#lsp#HasCapability(id, capability) abort
+ return 1
+ endfunction
+
+ function! ale#lsp#Send(id, message) abort
+ let g:request_id += 1
+
+ call add(g:sent_message_list, a:message)
+
+ return g:request_id
+ endfunction
+
+ function! ale#lsp_linter#StartLSP(buffer, linter, Callback) abort
+ let g:LastCallback = a:Callback
+
+ return g:server_started_value
+ endfunction
+
+ function! ale#code_action#HandleCodeAction(code_action, should_save) abort
+ Assert !a:should_save
+
+ call add(g:code_action_list, a:code_action)
+ endfunction
+
+ function GetLastMessage()
+ return get(g:execute_list, -1, '')
+ endfunction
+
+ function CheckLintStates(conn_id, message)
+ " Check that we request more linter results after adding completions.
+ AssertEqual [[0, '']], g:ale_queue_call_list
+
+ let g:ale_enabled = 0
+
+ let g:ale_queue_call_list = []
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [], g:ale_queue_call_list
+
+ let g:ale_enabled = 1
+ let g:ale_lint_on_text_changed = 1
+
+ let g:ale_queue_call_list = []
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [[0, '']], g:ale_queue_call_list
+
+ let g:ale_lint_on_text_changed = 'normal'
+
+ let g:ale_queue_call_list = []
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [[0, '']], g:ale_queue_call_list
+
+ let g:ale_lint_on_text_changed = 'insert'
+
+ let g:ale_queue_call_list = []
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [[0, '']], g:ale_queue_call_list
+
+ let g:ale_queue_call_list = []
+ let g:ale_lint_on_text_changed = 'never'
+
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [], g:ale_queue_call_list
+
+ let g:ale_lint_on_text_changed = '0'
+
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [], g:ale_queue_call_list
+
+ let g:ale_lint_on_text_changed = 0
+
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [], g:ale_queue_call_list
+
+ let g:ale_lint_on_text_changed = 'xxx'
+
+ call g:LastHandleCallback(a:conn_id, a:message)
+ AssertEqual [], g:ale_queue_call_list
+ endfunction
+
+After:
+ call ale#linter#Reset()
+
+ Restore
+
+ delfunction GetLastMessage
+ delfunction CheckLintStates
+
+ unlet! g:LastCallback
+ unlet! g:LastHandleCallback
+ unlet! g:request_id
+ unlet! g:server_started_value
+ unlet! g:sent_message_list
+ unlet! g:code_action_list
+ unlet! g:ale_queue_call_list
+ unlet! g:execute_list
+ unlet! g:received_message
+ unlet! b:ale_old_omnifunc
+ unlet! b:ale_old_completeopt
+ unlet! b:ale_completion_info
+ unlet! b:ale_completion_result
+ unlet! b:ale_complete_done_time
+
+ runtime autoload/ale.vim
+ runtime autoload/ale/util.vim
+ runtime autoload/ale/code_action.vim
+ runtime autoload/ale/lsp.vim
+ runtime autoload/ale/lsp_linter.vim
+
+Given typescript(Some example TypeScript code):
+ let xyz = 123
+ let foo = missingword
+
+ let abc = 456
+
+Execute(ALEImport should complain when there's no word at the cursor):
+ call setpos('.', [bufnr(''), 3, 1, 0])
+ ALEImport
+
+ AssertEqual 'echom ''Nothing to complete at cursor!''', GetLastMessage()
+
+Execute(ALEImport should tell the user if no LSP is available):
+ let g:server_started_value = 0
+
+ call setpos('.', [bufnr(''), 2, 16, 0])
+ ALEImport
+
+ AssertEqual
+ \ 'echom ''No completion providers are available.''',
+ \ GetLastMessage()
+
+Execute(ALEImport should request imports correctly for tsserver):
+ call setpos('.', [bufnr(''), 2, 16, 0])
+
+ ALEImport
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 0,
+ \ 'request_id': 0,
+ \ 'source': 'ale-import',
+ \ 'column': 11,
+ \ 'line': 2,
+ \ 'line_length': 21,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastCallback isnot v:null
+
+ call g:LastCallback(ale#linter#Get(&filetype)[0], {
+ \ 'connection_id': 347,
+ \ 'buffer': bufnr(''),
+ \})
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 347,
+ \ 'request_id': 1,
+ \ 'source': 'ale-import',
+ \ 'column': 11,
+ \ 'line': 2,
+ \ 'line_length': 21,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastHandleCallback isnot v:null
+
+ call g:LastHandleCallback(347, {
+ \ 'request_seq': 1,
+ \ 'command': 'completions',
+ \ 'body': [
+ \ {'name': 'missingwordIgnoreMe'},
+ \ {'name': 'missingword'},
+ \ ],
+ \})
+
+ AssertEqual
+ \ [
+ \ [0, 'ts@completions', {
+ \ 'file': expand('%:p'),
+ \ 'includeExternalModuleExports': 1,
+ \ 'offset': 11,
+ \ 'line': 2,
+ \ 'prefix': 'missingword',
+ \ }],
+ \ [0, 'ts@completionEntryDetails', {
+ \ 'file': expand('%:p'),
+ \ 'entryNames': [{'name': 'missingword'}],
+ \ 'offset': 11,
+ \ 'line': 2,
+ \ }]
+ \ ],
+ \ g:sent_message_list
+ AssertEqual 2, b:ale_completion_info.request_id
+
+ let g:ale_enabled = 1
+ let g:received_message = {
+ \ 'request_seq': 2,
+ \ 'command': 'completionEntryDetails',
+ \ 'body': [
+ \ {
+ \ 'name': 'missingword',
+ \ 'kind': 'className',
+ \ 'displayParts': [],
+ \ 'codeActions': [{
+ \ 'description': 'import { missingword } from "./Something";',
+ \ 'changes': [],
+ \ }],
+ \ },
+ \ ],
+ \}
+ call g:LastHandleCallback(347, g:received_message)
+
+ AssertEqual
+ \ [
+ \ {
+ \ 'description': 'import { missingword } from "./Something";',
+ \ 'changes': [],
+ \ },
+ \ ],
+ \ g:code_action_list
+
+ call CheckLintStates(347, g:received_message)
+
+Execute(ALEImport should tell the user when no completions were found from tsserver):
+ call setpos('.', [bufnr(''), 2, 16, 0])
+
+ ALEImport
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 0,
+ \ 'request_id': 0,
+ \ 'source': 'ale-import',
+ \ 'column': 11,
+ \ 'line': 2,
+ \ 'line_length': 21,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastCallback isnot v:null
+
+ call g:LastCallback(ale#linter#Get(&filetype)[0], {
+ \ 'connection_id': 347,
+ \ 'buffer': bufnr(''),
+ \})
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 347,
+ \ 'request_id': 1,
+ \ 'source': 'ale-import',
+ \ 'column': 11,
+ \ 'line': 2,
+ \ 'line_length': 21,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastHandleCallback isnot v:null
+
+ call g:LastHandleCallback(347, {
+ \ 'request_seq': 1,
+ \ 'command': 'completions',
+ \ 'body': [
+ \ {'name': 'missingwordIgnoreMe'},
+ \ ],
+ \})
+
+ AssertEqual 'echom ''No possible imports found.''', GetLastMessage()
+
+Given python(Some example Python code):
+ xyz = 123
+ foo = missingword
+
+ abc = 456
+
+Execute(ALEImport should request imports correctly for language servers):
+ call setpos('.', [bufnr(''), 2, 12, 0])
+
+ ALEImport
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 0,
+ \ 'request_id': 0,
+ \ 'source': 'ale-import',
+ \ 'column': 7,
+ \ 'line': 2,
+ \ 'line_length': 17,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastCallback isnot v:null
+
+ call g:LastCallback(ale#linter#Get(&filetype)[0], {
+ \ 'connection_id': 347,
+ \ 'buffer': bufnr(''),
+ \})
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 347,
+ \ 'request_id': 1,
+ \ 'source': 'ale-import',
+ \ 'column': 7,
+ \ 'line': 2,
+ \ 'line_length': 17,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastHandleCallback isnot v:null
+
+ AssertEqual
+ \ [
+ \ [0, 'textDocument/completion', {
+ \ 'textDocument': {'uri': ale#path#ToURI(expand('%:p'))},
+ \ 'position': {'character': 6, 'line': 1}
+ \ }],
+ \ ],
+ \ g:sent_message_list
+ AssertEqual 1, b:ale_completion_info.request_id
+
+ let g:ale_enabled = 1
+ let g:received_message = {
+ \ 'id': 1,
+ \ 'jsonrpc': '2.0',
+ \ 'result': {
+ \ 'isIncomplete': v:false,
+ \ 'items': [
+ \ {
+ \ 'detail': 'Some other word we should ignore',
+ \ 'filterText': 'missingwordIgnoreMe',
+ \ 'insertText': 'missingwordIgnoreMe',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingwordIgnoreMe',
+ \ 'sortText': '3ee19999missingword',
+ \ 'additionalTextEdits': [
+ \ {
+ \ 'range': {
+ \ 'start': {'line': 1, 'character': 1},
+ \ 'end': {'line': 2, 'character': 1},
+ \ },
+ \ 'newText': 'from something import missingwordIgnoreMe',
+ \ },
+ \ ],
+ \ },
+ \ {
+ \ 'detail': 'Some word without text edits',
+ \ 'filterText': 'missingword',
+ \ 'insertText': 'missingword',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingword',
+ \ 'sortText': '3ee19999missingword',
+ \ },
+ \ {
+ \ 'detail': 'The word we should use',
+ \ 'filterText': 'missingword',
+ \ 'insertText': 'missingword',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingword',
+ \ 'sortText': '3ee19999missingword',
+ \ 'additionalTextEdits': [
+ \ {
+ \ 'range': {
+ \ 'start': {'line': 1, 'character': 1},
+ \ 'end': {'line': 2, 'character': 1},
+ \ },
+ \ 'newText': 'from something import missingword',
+ \ },
+ \ ],
+ \ },
+ \ {
+ \ 'detail': 'The other word we should not use',
+ \ 'filterText': 'missingword',
+ \ 'insertText': 'missingword',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingword',
+ \ 'sortText': '3ee19999missingword',
+ \ 'additionalTextEdits': [
+ \ {
+ \ 'range': {
+ \ 'start': {'line': 1, 'character': 1},
+ \ 'end': {'line': 2, 'character': 1},
+ \ },
+ \ 'newText': 'from something_else import missingword',
+ \ },
+ \ ],
+ \ },
+ \ ],
+ \ },
+ \}
+ call g:LastHandleCallback(347, g:received_message)
+
+ AssertEqual
+ \ [
+ \ {
+ \ 'description': 'completion',
+ \ 'changes': [
+ \ {
+ \ 'fileName': expand('%:p'),
+ \ 'textChanges': [
+ \ {
+ \ 'start': {'line': 2, 'offset': 2},
+ \ 'end': {'line': 3, 'offset': 2},
+ \ 'newText': 'from something import missingword',
+ \ },
+ \ ],
+ \ },
+ \ ],
+ \ },
+ \ ],
+ \ g:code_action_list
+
+ call CheckLintStates(347, g:received_message)
+
+Execute(ALEImport should tell the user when no completions were found from a language server):
+ call setpos('.', [bufnr(''), 2, 12, 0])
+
+ ALEImport
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 0,
+ \ 'request_id': 0,
+ \ 'source': 'ale-import',
+ \ 'column': 7,
+ \ 'line': 2,
+ \ 'line_length': 17,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastCallback isnot v:null
+
+ call g:LastCallback(ale#linter#Get(&filetype)[0], {
+ \ 'connection_id': 347,
+ \ 'buffer': bufnr(''),
+ \})
+
+ AssertEqual
+ \ {
+ \ 'conn_id': 347,
+ \ 'request_id': 1,
+ \ 'source': 'ale-import',
+ \ 'column': 7,
+ \ 'line': 2,
+ \ 'line_length': 17,
+ \ 'prefix': 'missingword',
+ \ 'additional_edits_only': 1,
+ \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
+ \ },
+ \ b:ale_completion_info
+ Assert g:LastHandleCallback isnot v:null
+
+ AssertEqual
+ \ [
+ \ [0, 'textDocument/completion', {
+ \ 'textDocument': {'uri': ale#path#ToURI(expand('%:p'))},
+ \ 'position': {'character': 6, 'line': 1}
+ \ }],
+ \ ],
+ \ g:sent_message_list
+ AssertEqual 1, b:ale_completion_info.request_id
+
+ let g:received_message = {
+ \ 'id': 1,
+ \ 'jsonrpc': '2.0',
+ \ 'result': {
+ \ 'isIncomplete': v:false,
+ \ 'items': [
+ \ {
+ \ 'detail': 'Some other word we should ignore',
+ \ 'filterText': 'missingwordIgnoreMe',
+ \ 'insertText': 'missingwordIgnoreMe',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingwordIgnoreMe',
+ \ 'sortText': '3ee19999missingword',
+ \ 'additionalTextEdits': [
+ \ {
+ \ 'range': {
+ \ 'start': {'line': 1, 'character': 1},
+ \ 'end': {'line': 2, 'character': 1},
+ \ },
+ \ 'newText': 'from something import missingwordIgnoreMe',
+ \ },
+ \ ],
+ \ },
+ \ {
+ \ 'detail': 'Some word without text edits',
+ \ 'filterText': 'missingword',
+ \ 'insertText': 'missingword',
+ \ 'insertTextFormat': 1,
+ \ 'kind': 6,
+ \ 'label': ' missingword',
+ \ 'sortText': '3ee19999missingword',
+ \ },
+ \ ],
+ \ },
+ \}
+ call g:LastHandleCallback(347, g:received_message)
+
+ AssertEqual 'echom ''No possible imports found.''', GetLastMessage()
diff --git a/test/completion/test_complete_events.vader b/test/completion/test_complete_events.vader
new file mode 100644
index 00000000..cee15985
--- /dev/null
+++ b/test/completion/test_complete_events.vader
@@ -0,0 +1,35 @@
+Before:
+ let g:complete_post_triggered = 0
+
+ augroup VaderTest
+ autocmd!
+ autocmd User ALECompletePost let g:complete_post_triggered = 1
+ augroup END
+
+After:
+ unlet! b:ale_completion_info
+ unlet! g:complete_post_triggered
+
+ augroup VaderTest
+ autocmd!
+ augroup END
+
+ augroup! VaderTest
+
+Execute(ALECompletePost should not be triggered when completion is cancelled):
+ call ale#completion#HandleUserData({})
+
+ Assert !g:complete_post_triggered
+
+Execute(ALECompletePost should not be triggered when tools other than ALE insert completions):
+ call ale#completion#HandleUserData({'user_data': ''})
+ call ale#completion#HandleUserData({'user_data': '{}'})
+
+ Assert !g:complete_post_triggered
+
+Execute(ALECompletePost should be triggered when ALE inserts completions):
+ call ale#completion#HandleUserData({
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
+ \})
+
+ Assert g:complete_post_triggered
diff --git a/test/completion/test_completion_events.vader b/test/completion/test_completion_events.vader
index 87bd10ad..f678e773 100644
--- a/test/completion/test_completion_events.vader
+++ b/test/completion/test_completion_events.vader
@@ -407,41 +407,75 @@ Execute(HandleUserData should call ale#code_action#HandleCodeAction):
AssertEqual g:handle_code_action_called, 0
call ale#completion#HandleUserData({
- \ 'user_data': ''
+ \ 'user_data': ''
\})
AssertEqual g:handle_code_action_called, 0
call ale#completion#HandleUserData({
- \ 'user_data': '{}'
+ \ 'user_data': json_encode({}),
\})
AssertEqual g:handle_code_action_called, 0
call ale#completion#HandleUserData({
- \ 'user_data': '{"codeActions": []}'
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [],
+ \ }),
\})
AssertEqual g:handle_code_action_called, 0
call ale#completion#HandleUserData({
- \ 'user_data': '{"codeActions": [{"description":"", "changes": []}]}'
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
+ \ {'description': '', 'changes': []},
+ \ ],
+ \ }),
\})
AssertEqual g:handle_code_action_called, 1
let b:ale_completion_info = {'source': 'ale-automatic'}
call ale#completion#HandleUserData({
- \ 'user_data': '{"codeActions": [{"description":"", "changes": []}]}'
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
+ \ {'description': '', 'changes': []},
+ \ ],
+ \ }),
\})
AssertEqual g:handle_code_action_called, 2
let b:ale_completion_info = {'source': 'ale-callback'}
call ale#completion#HandleUserData({
- \ 'user_data': '{"codeActions": [{"description":"", "changes": []}]}'
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
+ \ {'description': '', 'changes': []},
+ \ ],
+ \ }),
\})
AssertEqual g:handle_code_action_called, 3
+ let b:ale_completion_info = {'source': 'ale-omnifunc'}
+ call ale#completion#HandleUserData({
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
+ \ {'description': '', 'changes': []},
+ \ ],
+ \ }),
+ \})
+ AssertEqual g:handle_code_action_called, 4
+
Execute(ale#code_action#HandleCodeAction should not be called when when source is not ALE):
call MockHandleCodeAction()
let b:ale_completion_info = {'source': 'syntastic'}
call ale#completion#HandleUserData({
- \ 'user_data': '{"codeActions": [{"description":"", "changes": []}]}'
+ \ 'user_data': json_encode({
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
+ \ {'description': '', 'changes': []},
+ \ ],
+ \ }),
\})
AssertEqual g:handle_code_action_called, 0
diff --git a/test/completion/test_completion_filtering.vader b/test/completion/test_completion_filtering.vader
index c5f14266..172203a4 100644
--- a/test/completion/test_completion_filtering.vader
+++ b/test/completion/test_completion_filtering.vader
@@ -12,13 +12,24 @@ After:
Execute(Prefix filtering should work for Lists of strings):
AssertEqual
\ ['FooBar', 'foo'],
- \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], 'foo')
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], 'foo', 0)
AssertEqual
\ ['FooBar', 'FongBar', 'baz', 'foo'],
- \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '.')
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '.', 0)
AssertEqual
\ ['FooBar', 'FongBar', 'baz', 'foo'],
- \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '')
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '', 0)
+
+Execute(Exact filtering should work):
+ AssertEqual
+ \ ['foo'],
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], 'foo', 1)
+ AssertEqual
+ \ ['FooBar', 'FongBar', 'baz', 'foo'],
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '.', 1)
+ AssertEqual
+ \ ['Foo'],
+ \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'Foo', 'foo'], 'Foo', 1)
Execute(Prefix filtering should work for completion items):
AssertEqual
@@ -32,7 +43,8 @@ Execute(Prefix filtering should work for completion items):
\ {'word': 'baz'},
\ {'word': 'foo'},
\ ],
- \ 'foo'
+ \ 'foo',
+ \ 0,
\ )
AssertEqual
@@ -51,7 +63,8 @@ Execute(Prefix filtering should work for completion items):
\ {'word': 'baz'},
\ {'word': 'foo'},
\ ],
- \ '.'
+ \ '.',
+ \ 0,
\ )
Execute(Excluding words from completion results should work):
@@ -66,7 +79,8 @@ Execute(Excluding words from completion results should work):
\ {'word': 'Italian'},
\ {'word': 'it'},
\ ],
- \ 'it'
+ \ 'it',
+ \ 0,
\ )
AssertEqual
@@ -78,7 +92,8 @@ Execute(Excluding words from completion results should work):
\ {'word': 'describe'},
\ {'word': 'Deutsch'},
\ ],
- \ 'de'
+ \ 'de',
+ \ 0,
\ )
AssertEqual
@@ -90,7 +105,8 @@ Execute(Excluding words from completion results should work):
\ {'word': 'describe'},
\ {'word': 'Deutsch'},
\ ],
- \ '.'
+ \ '.',
+ \ 0,
\ )
Execute(Excluding words from completion results should work with lists of Strings):
@@ -98,29 +114,29 @@ Execute(Excluding words from completion results should work with lists of String
AssertEqual
\ ['Italian'],
- \ ale#completion#Filter(bufnr(''), '', ['Italian', 'it'], 'it')
+ \ ale#completion#Filter(bufnr(''), '', ['Italian', 'it'], 'it', 0)
AssertEqual
\ ['Deutsch'],
- \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], 'de')
+ \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], 'de', 0)
AssertEqual
\ ['Deutsch'],
- \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], '.')
+ \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], '.', 0)
AssertEqual
\ ['Deutsch'],
- \ ale#completion#Filter(bufnr(''), '', ['Deutsch'], '')
+ \ ale#completion#Filter(bufnr(''), '', ['Deutsch'], '', 0)
Execute(Filtering shouldn't modify the original list):
let b:ale_completion_excluded_words = ['it', 'describe']
let b:suggestions = [{'word': 'describe'}]
- AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, '.')
+ AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, '.', 0)
AssertEqual b:suggestions, [{'word': 'describe'}]
- AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, 'de')
+ AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, 'de', 0)
AssertEqual b:suggestions, [{'word': 'describe'}]
Execute(Filtering should respect filetype triggers):
let b:suggestions = [{'word': 'describe'}]
- AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), '', b:suggestions, '.')
- AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '.')
- AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '::')
+ AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), '', b:suggestions, '.', 0)
+ AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '.', 0)
+ AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '::', 0)
diff --git a/test/completion/test_lsp_completion_parsing.vader b/test/completion/test_lsp_completion_parsing.vader
index b8e71320..d989aefe 100644
--- a/test/completion/test_lsp_completion_parsing.vader
+++ b/test/completion/test_lsp_completion_parsing.vader
@@ -12,34 +12,34 @@ After:
Execute(Should handle Rust completion results correctly):
AssertEqual
\ [
- \ {'word': 'new', 'menu': 'pub fn new() -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'with_capacity', 'menu': 'pub fn with_capacity(capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_utf8', 'menu': 'pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error>', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_utf8_lossy', 'menu': 'pub fn from_utf8_lossy<''a>(v: &''a [u8]) -> Cow<''a, str>', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_utf16', 'menu': 'pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error>', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_utf16_lossy', 'menu': 'pub fn from_utf16_lossy(v: &[u16]) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_raw_parts', 'menu': 'pub unsafe fn from_raw_parts(buf: *mut u8, length: usize, capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_utf8_unchecked', 'menu': 'pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a str>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = Cow<''a, str>>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'Searcher', 'menu': 'type Searcher = <&''b str as Pattern<''a>>::Searcher;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'default', 'menu': 'fn default() -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = String;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Target', 'menu': 'type Target = str;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'Err', 'menu': 'type Err = ParseError;', 'info': '', 'kind': 't', 'icase': 1},
- \ {'word': 'from_str', 'menu': 'fn from_str(s: &str) -> Result<String, ParseError>', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from', 'menu': 'fn from(s: &''a str) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from', 'menu': 'fn from(s: Box<str>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
- \ {'word': 'from', 'menu': 'fn from(s: Cow<''a, str>) -> String', 'info': '', 'kind': 'f', 'icase': 1},
+ \ {'word': 'new', 'menu': 'pub fn new() -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'with_capacity', 'menu': 'pub fn with_capacity(capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_utf8', 'menu': 'pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error>', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_utf8_lossy', 'menu': 'pub fn from_utf8_lossy<''a>(v: &''a [u8]) -> Cow<''a, str>', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_utf16', 'menu': 'pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error>', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_utf16_lossy', 'menu': 'pub fn from_utf16_lossy(v: &[u16]) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_raw_parts', 'menu': 'pub unsafe fn from_raw_parts(buf: *mut u8, length: usize, capacity: usize) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_utf8_unchecked', 'menu': 'pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a char>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = &''a str>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_iter', 'menu': 'fn from_iter<I: IntoIterator<Item = Cow<''a, str>>>(iter: I) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Searcher', 'menu': 'type Searcher = <&''b str as Pattern<''a>>::Searcher;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'default', 'menu': 'fn default() -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = String;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Output', 'menu': 'type Output = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Target', 'menu': 'type Target = str;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'Err', 'menu': 'type Err = ParseError;', 'info': '', 'kind': 't', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from_str', 'menu': 'fn from_str(s: &str) -> Result<String, ParseError>', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from', 'menu': 'fn from(s: &''a str) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from', 'menu': 'fn from(s: Box<str>) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'from', 'menu': 'fn from(s: Cow<''a, str>) -> String', 'info': '', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\],
\ ale#completion#ParseLSPCompletions({
\ "jsonrpc":"2.0",
@@ -195,7 +195,7 @@ Execute(Should handle Python completion results correctly):
AssertEqual
\ [
- \ {'word': 'what', 'menu': 'example-python-project.bar.Bar', 'info': "what()\n\n", 'kind': 'f', 'icase': 1},
+ \ {'word': 'what', 'menu': 'example-python-project.bar.Bar', 'info': "what()\n\n", 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ "jsonrpc":"2.0",
@@ -399,7 +399,7 @@ Execute(Should handle Python completion results correctly):
\ }
\ })
-Execute(Should handle Python completion results correctly):
+Execute(Should handle extra Python completion results correctly):
let b:ale_completion_info = {
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
\ 'prefix': 'mig',
@@ -407,8 +407,8 @@ Execute(Should handle Python completion results correctly):
AssertEqual
\ [
- \ {'word': 'migrations', 'menu': 'xxx', 'info': 'migrations', 'kind': 'f', 'icase': 1},
- \ {'word': 'MigEngine', 'menu': 'xxx', 'info': 'mig engine', 'kind': 'f', 'icase': 1},
+ \ {'word': 'migrations', 'menu': 'xxx', 'info': 'migrations', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
+ \ {'word': 'MigEngine', 'menu': 'xxx', 'info': 'mig engine', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ 'jsonrpc': '2.0',
@@ -441,7 +441,7 @@ Execute(Should handle Python completion results correctly):
Execute(Should handle missing keys):
AssertEqual
\ [
- \ {'word': 'x', 'menu': '', 'info': '', 'kind': 'v', 'icase': 1},
+ \ {'word': 'x', 'menu': '', 'info': '', 'kind': 'v', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ 'jsonrpc': '2.0',
@@ -459,7 +459,7 @@ Execute(Should handle missing keys):
Execute(Should handle documentation in the markdown format):
AssertEqual
\ [
- \ {'word': 'migrations', 'menu': 'xxx', 'info': 'Markdown documentation', 'kind': 'f', 'icase': 1},
+ \ {'word': 'migrations', 'menu': 'xxx', 'info': 'Markdown documentation', 'kind': 'f', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ 'jsonrpc': '2.0',
@@ -483,7 +483,7 @@ Execute(Should handle documentation in the markdown format):
Execute(Should handle completion messages with textEdit objects):
AssertEqual
\ [
- \ {'word': 'next_callback', 'menu': 'PlayTimeCallback', 'info': '', 'kind': 'v', 'icase': 1},
+ \ {'word': 'next_callback', 'menu': 'PlayTimeCallback', 'info': '', 'kind': 'v', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ 'id': 226,
@@ -514,7 +514,7 @@ Execute(Should handle completion messages with textEdit objects):
Execute(Should handle completion messages with the deprecated insertText attribute):
AssertEqual
\ [
- \ {'word': 'next_callback', 'menu': 'PlayTimeCallback', 'info': '', 'kind': 'v', 'icase': 1},
+ \ {'word': 'next_callback', 'menu': 'PlayTimeCallback', 'info': '', 'kind': 'v', 'icase': 1, 'user_data': json_encode({'_ale_completion_item': 1})},
\ ],
\ ale#completion#ParseLSPCompletions({
\ 'id': 226,
@@ -547,7 +547,8 @@ Execute(Should handle completion messages with additionalTextEdits when ale_comp
\ 'kind': 'v',
\ 'icase': 1,
\ 'user_data': json_encode({
- \ 'codeActions': [
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [
\ {
\ 'description': 'completion',
\ 'changes': [
@@ -658,6 +659,7 @@ Execute(Should still handle completion messages with empty additionalTextEdits w
\ 'info': '',
\ 'kind': 'v',
\ 'icase': 1,
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ }
\ ],
\ ale#completion#ParseLSPCompletions({
diff --git a/test/completion/test_tsserver_completion_parsing.vader b/test/completion/test_tsserver_completion_parsing.vader
index aaaaae95..231c0f95 100644
--- a/test/completion/test_tsserver_completion_parsing.vader
+++ b/test/completion/test_tsserver_completion_parsing.vader
@@ -90,6 +90,7 @@ Execute(TypeScript completion details responses should be parsed correctly):
\ 'info': '',
\ 'kind': 'v',
\ 'icase': 1,
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ 'dup': g:ale_completion_autoimport,
\ },
\ {
@@ -98,6 +99,7 @@ Execute(TypeScript completion details responses should be parsed correctly):
\ 'info': 'foo bar baz',
\ 'kind': 'v',
\ 'icase': 1,
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ 'dup': g:ale_completion_autoimport,
\ },
\ {
@@ -106,6 +108,7 @@ Execute(TypeScript completion details responses should be parsed correctly):
\ 'info': '',
\ 'kind': 'v',
\ 'icase': 1,
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ 'dup': g:ale_completion_autoimport,
\ },
\ ],
@@ -179,7 +182,8 @@ Execute(Entries without details should be included in the responses):
\ 'kind': 'v',
\ 'icase': 1,
\ 'user_data': json_encode({
- \ 'codeActions': [{
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [{
\ 'description': 'import { def } from "./Foo";',
\ 'changes': [],
\ }],
@@ -192,6 +196,7 @@ Execute(Entries without details should be included in the responses):
\ 'info': 'foo bar baz',
\ 'kind': 'v',
\ 'icase': 1,
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ 'dup': g:ale_completion_autoimport,
\ },
\ {
@@ -199,6 +204,7 @@ Execute(Entries without details should be included in the responses):
\ 'menu': '',
\ 'info': '',
\ 'kind': 'v',
+ \ 'user_data': json_encode({'_ale_completion_item': 1}),
\ 'icase': 1,
\ },
\ ],
@@ -260,7 +266,8 @@ Execute(Default imports should be handled correctly):
\ 'kind': 't',
\ 'icase': 1,
\ 'user_data': json_encode({
- \ 'codeActions': [{
+ \ '_ale_completion_item': 1,
+ \ 'code_actions': [{
\ 'description': 'Import default ''abcd'' from module "./foo"',
\ 'changes': [],
\ }],
diff --git a/test/fix/test_ale_fix.vader b/test/fix/test_ale_fix.vader
index a51a5a53..128e3a14 100644
--- a/test/fix/test_ale_fix.vader
+++ b/test/fix/test_ale_fix.vader
@@ -196,6 +196,10 @@ After:
" Clear the messages between tests.
echomsg ''
+ if !exists('g:ale_command_wrapper')
+ let g:ale_command_wrapper = ''
+ endif
+
Given testft (A file with three lines):
a
b
@@ -206,6 +210,13 @@ Execute(ALEFix should complain when there are no functions to call):
call ale#test#FlushJobs()
AssertEqual 'No fixers have been defined. Try :ALEFixSuggest', GetLastMessage()
+Execute(ALEFix should not complain when the command is run with a bang):
+ echom 'none'
+
+ ALEFix!
+ call ale#test#FlushJobs()
+ AssertEqual 'none', GetLastMessage()
+
Execute(ALEFix should apply simple functions):
let g:ale_fixers.testft = ['AddCarets']
ALEFix
@@ -715,6 +726,19 @@ Execute(ale#fix#InitBufferData() should set up the correct data):
\ 'done': 0,
\ 'lines_before': ['a', 'b', 'c'],
\ 'should_save': 1,
+ \ 'ignore_file_changed_errors': 0,
+ \ },
+ \}, g:ale_fix_buffer_data
+
+ call ale#fix#InitBufferData(bufnr(''), '!')
+
+ AssertEqual {
+ \ bufnr(''): {
+ \ 'temporary_directory_list': [],
+ \ 'done': 0,
+ \ 'lines_before': ['a', 'b', 'c'],
+ \ 'should_save': 0,
+ \ 'ignore_file_changed_errors': 1,
\ },
\}, g:ale_fix_buffer_data
diff --git a/test/lsp/test_engine_lsp_response_handling.vader b/test/lsp/test_engine_lsp_response_handling.vader
index 9abfa087..8261f1da 100644
--- a/test/lsp/test_engine_lsp_response_handling.vader
+++ b/test/lsp/test_engine_lsp_response_handling.vader
@@ -44,9 +44,21 @@ After:
Given foobar(An empty file):
Execute(tsserver syntax error responses should be handled correctly):
runtime ale_linters/typescript/tsserver.vim
- call ale#test#SetFilename('filename.ts')
+
+ if has('win32')
+ call ale#test#SetFilename('filename,[]^$.ts')
+ else
+ call ale#test#SetFilename('filename*?,{}[]^$.ts')
+ endif
+
call ale#engine#InitBufferInfo(bufnr(''))
+ if has('win32')
+ AssertEqual 'filename,[]^$.ts', expand('%:p:t')
+ else
+ AssertEqual 'filename*?,{}[]^$.ts', expand('%:p:t')
+ endif
+
" When we get syntax errors and no semantic errors, we should keep the
" syntax errors.
call ale#lsp_linter#HandleLSPResponse(1, {
@@ -54,7 +66,7 @@ Execute(tsserver syntax error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'syntaxDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ {
\ 'start': {
@@ -76,7 +88,7 @@ Execute(tsserver syntax error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'semanticDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ ],
\ },
@@ -104,7 +116,7 @@ Execute(tsserver syntax error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'syntaxDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ ],
\ },
@@ -146,9 +158,21 @@ Execute(tsserver syntax error responses should be handled correctly):
Execute(tsserver semantic error responses should be handled correctly):
runtime ale_linters/typescript/tsserver.vim
- call ale#test#SetFilename('filename.ts')
+
+ if has('win32')
+ call ale#test#SetFilename('filename,[]^$.ts')
+ else
+ call ale#test#SetFilename('filename*?,{}[]^$.ts')
+ endif
+
call ale#engine#InitBufferInfo(bufnr(''))
+ if has('win32')
+ AssertEqual 'filename,[]^$.ts', expand('%:p:t')
+ else
+ AssertEqual 'filename*?,{}[]^$.ts', expand('%:p:t')
+ endif
+
" When we get syntax errors and no semantic errors, we should keep the
" syntax errors.
call ale#lsp_linter#HandleLSPResponse(1, {
@@ -156,7 +180,7 @@ Execute(tsserver semantic error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'syntaxDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ ],
\ },
@@ -166,7 +190,7 @@ Execute(tsserver semantic error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'semanticDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ {
\ 'start': {
@@ -206,7 +230,7 @@ Execute(tsserver semantic error responses should be handled correctly):
\ 'type': 'event',
\ 'event': 'semanticDiag',
\ 'body': {
- \ 'file': g:dir . '/filename.ts',
+ \ 'file': expand('%:p'),
\ 'diagnostics':[
\ ],
\ },
@@ -270,15 +294,27 @@ Execute(tsserver errors should mark tsserver no longer active):
Execute(LSP diagnostics responses should be handled correctly):
let b:ale_linters = ['eclipselsp']
runtime ale_linters/java/eclipselsp.vim
- call ale#test#SetFilename('filename.java')
+
+ if has('win32')
+ call ale#test#SetFilename('filename,[]^$.ts')
+ else
+ call ale#test#SetFilename('filename*?,{}[]^$.java')
+ endif
+
call ale#engine#InitBufferInfo(bufnr(''))
call ale#lsp_linter#SetLSPLinterMap({'1': 'eclipselsp'})
+ if has('win32')
+ AssertEqual 'filename,[]^$.ts', expand('%:p:t')
+ else
+ AssertEqual 'filename*?,{}[]^$.java', expand('%:p:t')
+ endif
+
call ale#lsp_linter#HandleLSPResponse(1, {
\ 'jsonrpc':'2.0',
\ 'method':'textDocument/publishDiagnostics',
\ 'params': {
- \ 'uri':'file://' . g:dir . '/filename.java',
+ \ 'uri': ale#path#ToURI(expand('%:p')),
\ 'diagnostics': [
\ {
\ 'range': {
diff --git a/test/test_ale_has.vader b/test/test_ale_has.vader
index 633c7186..6e73641d 100644
--- a/test/test_ale_has.vader
+++ b/test/test_ale_has.vader
@@ -1,4 +1,5 @@
Execute(Checks for versions below the current version should succeed):
+ AssertEqual 1, ale#Has('ale-3.0.0')
AssertEqual 1, ale#Has('ale-2.7.0')
AssertEqual 1, ale#Has('ale-2.6.0')
AssertEqual 1, ale#Has('ale-2.5.0')
diff --git a/test/test_ale_info.vader b/test/test_ale_info.vader
index 2bc8c635..895ed2a7 100644
--- a/test/test_ale_info.vader
+++ b/test/test_ale_info.vader
@@ -6,6 +6,7 @@ Before:
Save g:ale_completion_delay
Save g:ale_completion_enabled
Save g:ale_completion_max_suggestions
+ Save g:ale_disable_lsp
Save g:ale_echo_cursor
Save g:ale_echo_msg_error_str
Save g:ale_echo_msg_format
@@ -24,6 +25,7 @@ Before:
Save g:ale_lint_on_text_changed
Save g:ale_linters
Save g:ale_linters_explicit
+ Save g:ale_linters_ignore
Save g:ale_list_vertical
Save g:ale_list_window_size
Save g:ale_loclist_msg_format
@@ -64,6 +66,7 @@ Before:
let g:ale_completion_delay = 100
let g:ale_completion_enabled = 0
let g:ale_completion_max_suggestions = 50
+ let g:ale_disable_lsp = 0
let g:ale_echo_cursor = 1
let g:ale_echo_msg_error_str = 'Error'
let g:ale_echo_msg_format = '%code: %%s'
@@ -80,6 +83,7 @@ Before:
let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 'normal'
let g:ale_linters_explicit = 0
+ let g:ale_linters_ignore = {'python': ['pyright']}
let g:ale_list_vertical = 0
let g:ale_list_window_size = 10
let g:ale_loclist_msg_format = '%code: %%s'
@@ -138,6 +142,7 @@ Before:
\ 'let g:ale_completion_delay = 100',
\ 'let g:ale_completion_enabled = 0',
\ 'let g:ale_completion_max_suggestions = 50',
+ \ 'let g:ale_disable_lsp = 0',
\ 'let g:ale_echo_cursor = 1',
\ 'let g:ale_echo_msg_error_str = ''Error''',
\ 'let g:ale_echo_msg_format = ''%code: %%s''',
@@ -158,6 +163,7 @@ Before:
\ 'let g:ale_linter_aliases = {}',
\ 'let g:ale_linters = {}',
\ 'let g:ale_linters_explicit = 0',
+ \ 'let g:ale_linters_ignore = {''python'': [''pyright'']}',
\ 'let g:ale_list_vertical = 0',
\ 'let g:ale_list_window_size = 10',
\ 'let g:ale_loclist_msg_format = ''%code: %%s''',
@@ -243,6 +249,7 @@ Execute (ALEInfo with no linters should return the right output):
\ ' Current Filetype: nolintersft',
\ 'Available Linters: []',
\ ' Enabled Linters: []',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -265,6 +272,7 @@ Execute (ALEInfo should return buffer-local global ALE settings):
\ ' Current Filetype: ',
\ 'Available Linters: []',
\ ' Enabled Linters: []',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -279,6 +287,7 @@ Execute (ALEInfo with no filetype should return the right output):
\ ' Current Filetype: ',
\ 'Available Linters: []',
\ ' Enabled Linters: []',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -295,6 +304,7 @@ Execute (ALEInfo with a single linter should return the right output):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -312,6 +322,7 @@ Execute (ALEInfo with two linters should return the right output):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -333,6 +344,7 @@ Execute (ALEInfo should calculate enabled linters correctly):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -350,6 +362,7 @@ Execute (ALEInfo should only return linters for current filetype):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -367,6 +380,7 @@ Execute (ALEInfo with compound filetypes should return linters for both of them)
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -389,6 +403,7 @@ Execute (ALEInfo should return appropriately named global variables):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + [
@@ -420,6 +435,7 @@ Execute (ALEInfoToFile should write to a file correctly):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + [
@@ -447,6 +463,7 @@ Execute (ALEInfo should buffer-local linter variables):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + [
@@ -478,6 +495,7 @@ Execute (ALEInfo should output linter aliases):
\ '''testlinter1'' -> [''testftalias1'', ''testftalias2'']',
\ '''testlinter2'' -> [''testftalias3'', ''testftalias4'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + [
@@ -505,6 +523,7 @@ Execute (ALEInfo should return command history):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -532,6 +551,7 @@ Execute (ALEInfo command history should print exit codes correctly):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -580,6 +600,7 @@ Execute (ALEInfo command history should print command output if logging is on):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -618,6 +639,7 @@ Execute (ALEInfo should include executable checks in the history):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -647,6 +669,7 @@ Execute (The option for caching failing executable checks should work):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -669,6 +692,7 @@ Execute (LSP errors for a linter should be outputted):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -693,6 +717,7 @@ Execute (LSP errors for other linters shouldn't appear):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -715,6 +740,7 @@ Execute (ALEInfo should include linter global options):
\ ' Current Filetype: testft.testft2',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
@@ -740,6 +766,7 @@ Execute (ALEInfo should include linter global options for enabled linters):
\ ' Current Filetype: testft',
\ 'Available Linters: [''testlinter1'', ''testlinter2'']',
\ ' Enabled Linters: [''testlinter1'']',
+ \ ' Ignored Linters: []',
\ ]
\ + g:fixer_lines
\ + g:variables_lines
diff --git a/test/test_ale_lint_stop_command.vader b/test/test_ale_lint_stop_command.vader
new file mode 100644
index 00000000..c50db5a8
--- /dev/null
+++ b/test/test_ale_lint_stop_command.vader
@@ -0,0 +1,27 @@
+Before:
+ Save g:ale_buffer_info
+
+ let g:ale_buffer_info = {}
+
+ call ale#linter#PreventLoading('testft')
+ call ale#linter#Define('testft', {
+ \ 'name': 'testlinter',
+ \ 'callback': {-> []},
+ \ 'executable': has('win32') ? 'cmd' : 'true',
+ \ 'command': 'sleep 9001',
+ \})
+
+After:
+ Restore
+
+ call ale#linter#Reset()
+
+Given testft (An empty file):
+Execute(ALELintStop should stop ALE from linting):
+ ALELint
+
+ Assert ale#engine#IsCheckingBuffer(bufnr('')), 'ALE did not start checking the buffer'
+
+ ALELintStop
+
+ Assert !ale#engine#IsCheckingBuffer(bufnr('')), 'ALELintStop didn''t work'
diff --git a/test/test_computed_lint_file_values.vader b/test/test_computed_lint_file_values.vader
index 399e96fe..ed0d4c0c 100644
--- a/test/test_computed_lint_file_values.vader
+++ b/test/test_computed_lint_file_values.vader
@@ -132,3 +132,19 @@ Execute(Linters where lint_file eventually evaluates to 1 shouldn't be run if we
call ale#test#FlushJobs()
AssertEqual [], ale#test#GetLoclistWithoutModule()
+
+Execute(Keeping computed lint_file jobs running should work):
+ AssertEqual 'testlinter2', ale#linter#Get('foobar')[1].name
+
+ call ale#engine#InitBufferInfo(bufnr(''))
+
+ call ale#engine#MarkLinterActive(
+ \ g:ale_buffer_info[bufnr('')],
+ \ ale#linter#Get('foobar')[1]
+ \)
+ call ale#engine#RunLinters(bufnr(''), ale#linter#Get('foobar'), 0)
+
+ Assert !empty(g:ale_buffer_info[bufnr('')].active_linter_list),
+ \ 'The active linter list was empty'
+ Assert ale#engine#IsCheckingBuffer(bufnr('')),
+ \ 'The IsCheckingBuffer function returned 0'
diff --git a/test/test_embertemplatelint_executable_detection.vader b/test/test_embertemplatelint_executable_detection.vader
deleted file mode 100644
index bd0f5dd9..00000000
--- a/test/test_embertemplatelint_executable_detection.vader
+++ /dev/null
@@ -1,22 +0,0 @@
-Before:
- call ale#test#SetDirectory('/testplugin/test')
-
- runtime ale_linters/handlebars/embertemplatelint.vim
-
-After:
- call ale#test#RestoreDirectory()
- call ale#linter#Reset()
-
-Execute(ember-template-lint executables runs the right command):
- call ale#test#SetFilename('ember-template-lint-test-files/app/template.hbs')
-
- AssertEqual
- \ ale_linters#handlebars#embertemplatelint#GetCommand(bufnr(''), [2, 0, 0]),
- \ '%e --json --filename %s'
-
-Execute(old ember-template-lint executables runs the right command):
- call ale#test#SetFilename('ember-template-lint-test-files/app/template.hbs')
-
- AssertEqual
- \ ale_linters#handlebars#embertemplatelint#GetCommand(bufnr(''), [1, 5, 0]),
- \ '%e --json %t'