Before: let g:expected_loclist = [{ \ 'bufnr': bufnr('%'), \ 'lnum': 2, \ 'vcol': 0, \ 'col': 3, \ 'text': 'foo bar', \ 'type': 'E', \ 'nr': -1, \ 'pattern': '', \ 'valid': 1, \}] let g:expected_groups = [ \ 'ALECleanupGroup', \ 'ALECursorGroup', \ 'ALEHighlightBufferGroup', \ 'ALERunOnEnterGroup', \ 'ALERunOnFiletypeChangeGroup', \ 'ALERunOnSaveGroup', \ 'ALERunOnTextChangedGroup', \] function! ToggleTestCallback(buffer, output) return [{ \ 'bufnr': a:buffer, \ 'lnum': 2, \ 'vcol': 0, \ 'col': 3, \ 'text': 'foo bar', \ 'type': 'E', \ 'nr': -1, \}] endfunction function! ParseAuGroups() redir => l:output silent exec 'autocmd' redir end let l:results = [] for l:line in split(l:output, "\n") let l:match = matchlist(l:line, '^ALE[a-zA-Z]\+Group') " We don't care about checking for the completion or fixing groups here. if !empty(l:match) \&& l:match[0] !=# 'ALECompletionGroup' \&& l:match[0] !=# 'ALEBufferFixGroup' call add(l:results, l:match[0]) endif endfor call uniq(sort(l:results)) return l:results endfunction call ale#linter#Define('foobar', { \ 'name': 'testlinter', \ 'callback': 'ToggleTestCallback', \ 'executable': 'echo', \ 'command': 'echo', \ 'read_buffer': 0, \}) After: unlet! g:expected_loclist unlet! g:expected_groups let g:ale_buffer_info = {} call ale#linter#Reset() " Toggle ALE back on if we fail when it's disabled. if !g:ale_enabled ALEToggle endif delfunction ToggleTestCallback delfunction ParseAuGroups Given foobar (Some imaginary filetype): foo bar baz Execute(ALEToggle should reset everything and then run again): AssertEqual 'foobar', &filetype call ale#Lint() call ale#engine#WaitForJobs(2000) " First check that everything is there... AssertEqual g:expected_loclist, getloclist(0) AssertEqual [[2, 1000001, 'ALEErrorSign']], ale#sign#FindCurrentSigns(bufnr('%')) AssertEqual \ [{'group': 'ALEError', 'pos1': [2, 3, 1]}], \ map(getmatches(), '{''group'': v:val.group, ''pos1'': v:val.pos1}') AssertEqual g:expected_groups, ParseAuGroups() AssertEqual [{'lnum': 2, 'bufnr': bufnr(''), 'col': 3, 'linter_name': 'testlinter', 'vcol': 0, 'nr': -1, 'type': 'E', 'text': 'foo bar', 'sign_id': 1000001}], g:ale_buffer_info[bufnr('')].loclist " Now Toggle ALE off. ALEToggle " Everything should be cleared. Assert !has_key(g:ale_buffer_info, bufnr('')), 'The g:ale_buffer_info Dictionary was not removed' AssertEqual [], getloclist(0), 'The loclist was not cleared' AssertEqual [], ale#sign#FindCurrentSigns(bufnr('%')), 'The signs were not cleared' AssertEqual [], getmatches(), 'The highlights were not cleared' AssertEqual ['ALECleanupGroup', 'ALEHighlightBufferGroup'], ParseAuGroups() " Toggle ALE on, everything should be set up and run again. ALEToggle call ale#engine#WaitForJobs(2000) AssertEqual g:expected_loclist, getloclist(0) AssertEqual [[2, 1000001, 'ALEErrorSign']], ale#sign#FindCurrentSigns(bufnr('%')) AssertEqual \ [{'group': 'ALEError', 'pos1': [2, 3, 1]}], \ map(getmatches(), '{''group'': v:val.group, ''pos1'': v:val.pos1}') AssertEqual g:expected_groups, ParseAuGroups() AssertEqual [{'lnum': 2, 'bufnr': bufnr(''), 'col': 3, 'linter_name': 'testlinter', 'vcol': 0, 'nr': -1, 'type': 'E', 'text': 'foo bar', 'sign_id': 1000001}], g:ale_buffer_info[bufnr('')].loclist