Before: function! GenerateResults(buffer, output) return [ \ { \ 'lnum': 1, \ 'col': 1, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'nr': -1, \ 'type': 'E', \ 'text': 'foo', \ }, \ { \ 'lnum': 2, \ 'col': 1, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'nr': -1, \ 'type': 'W', \ 'text': 'bar', \ }, \ { \ 'lnum': 3, \ 'col': 1, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'nr': -1, \ 'type': 'E', \ 'text': 'baz', \ }, \] endfunction call ale#linter#Define('testft', { \ 'name': 'x', \ 'executable': 'echo', \ 'command': 'echo', \ 'callback': 'GenerateResults', \}) After: call ale#linter#Reset() delfunction GenerateResults unlet! g:output Given testft(A Javscript file with warnings/errors): foo bar baz Execute: call ale#Lint() call ale#engine#WaitForJobs(2000) redir => g:output :sign place redir END AssertEqual \ [ \ ['1', '1000001', 'ALEErrorSign'], \ ['2', '1000002', 'ALEWarningSign'], \ ['3', '1000003', 'ALEErrorSign'], \ ], \ map( \ split(g:output, '\n')[2:], \ 'matchlist(v:val, "[^=]*=\\(\\d\\+\\)[^=]*=\\(\\d\\+\\).*\\(ALE.*\\)$")[1:3]' \ )