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': 5, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'nr': -1, \ 'type': 'E', \ 'text': 'wat', \ }, \] endfunction call ale#linter#Define('testft', { \ 'name': 'x', \ 'executable': 'echo', \ 'command': 'echo', \ 'callback': 'GenerateResults', \}) After: delfunction GenerateResults call ale#linter#Reset() let g:ale_buffer_info = {} Given testft(A Javscript file with warnings/errors): foo bar baz wat Execute(Highlights should be set when a linter runs): call ale#Lint() call ale#engine#WaitForJobs(2000) AssertEqual \ [ \ {'group': 'ALEError', 'id': 4, 'priority': 10, 'pos1': [1, 1, 1]}, \ {'group': 'ALEWarning', 'id': 5, 'priority': 10, 'pos1': [2, 1, 1]}, \ {'group': 'ALEError', 'id': 6, 'priority': 10, 'pos1': [3, 5, 1]} \ ], \ getmatches()