Before:
  Save g:ale_buffer_info
  Save g:ale_set_signs
  Save g:ale_set_quickfix
  Save g:ale_set_loclist
  Save g:ale_set_highlights
  Save g:ale_echo_cursor

  let g:ale_buffer_info = {}
  let g:ale_run_synchronously = 1
  let g:ale_set_lists_synchronously = 1
  let g:ale_set_signs = 0
  let g:ale_set_quickfix = 0
  let g:ale_set_loclist = 1
  let g:ale_set_highlights = 0
  let g:ale_echo_cursor = 0

  function! TestCallback(buffer, output)
    return []
  endfunction

  call ale#linter#Define('foobar', {
  \ 'name': 'testlinter',
  \ 'callback': 'TestCallback',
  \ 'executable': has('win32') ? 'cmd' : 'echo',
  \ 'command': has('win32') ? 'echo foo bar' : '/bin/sh -c ''echo foo bar''',
  \})

After:
  Restore

  unlet! b:ale_linters
  unlet! g:want_results_signaled
  unlet! g:want_results_buffer_value
  unlet! g:lint_pre_signaled
  unlet! g:ale_run_synchronously
  unlet! g:ale_set_lists_synchronously

  delfunction TestCallback

  augroup VaderTest
    autocmd!
  augroup END

  augroup! VaderTest

  call ale#linter#Reset()
  call setloclist(0, [])

Given foobar (Some imaginary filetype):
Execute(StartChecking should mark a buffer as being actively checked):
  Assert !ale#engine#IsCheckingBuffer(bufnr(''))

  call ale#other_source#StartChecking(bufnr(''), 'other-source-linter')

  Assert ale#engine#IsCheckingBuffer(bufnr(''))

Execute(ShowResults should make a buffer inactive):
  call ale#other_source#StartChecking(bufnr(''), 'other-source-linter')
  call ale#other_source#StartChecking(bufnr(''), 'second-other-source-linter')

  call ale#other_source#ShowResults(bufnr(''), 'other-source-linter', [])

  Assert ale#engine#IsCheckingBuffer(bufnr(''))

  call ale#other_source#ShowResults(bufnr(''), 'second-other-source-linter', [])

  Assert !ale#engine#IsCheckingBuffer(bufnr(''))

Execute(ShowResults should show results at any time):
  call ale#other_source#ShowResults(bufnr(''), 'other-source-linter', [
  \ {'text': 'xyz', 'lnum': 1},
  \])

  AssertEqual
  \ [
  \   {
  \     'lnum': 1,
  \     'bufnr': bufnr(''),
  \     'col': 0,
  \     'valid': 1,
  \     'vcol': 0,
  \     'nr': -1,
  \     'type': 'E',
  \     'pattern': '',
  \     'text': 'xyz',
  \   },
  \ ],
  \ ale#test#GetLoclistWithoutNewerKeys()

  call ale#other_source#ShowResults(bufnr(''), 'other-source-linter', [])

  AssertEqual [], ale#test#GetLoclistWithoutNewerKeys()

Execute(A regular lint cycle shouldn't clear results from other sources):
  call ale#other_source#ShowResults(bufnr(''), 'other-source-linter', [
  \ {'text': 'xyz', 'lnum': 1},
  \])
  ALELint

  AssertEqual
  \ [
  \   {
  \     'lnum': 1,
  \     'bufnr': bufnr(''),
  \     'col': 0,
  \     'valid': 1,
  \     'vcol': 0,
  \     'nr': -1,
  \     'type': 'E',
  \     'pattern': '',
  \     'text': 'xyz',
  \   },
  \ ],
  \ ale#test#GetLoclistWithoutNewerKeys()

Execute(ALEWantResults should be signaled when a buffer is checked):
  augroup VaderTest
    autocmd!
    autocmd User ALEWantResults let g:want_results_signaled = 1
    autocmd User ALELintPre let g:lint_pre_signaled = 1
  augroup END

  " Even when all linters are disabled, we should send the signal.
  let b:ale_linters = []
  ALELint

  Assert get(g:, 'want_results_signaled')
  Assert !get(g:, 'lint_pre_signaled')

Execute(ALEWantResults should set a variable indicating which buffer is being checked):
  augroup VaderTest
    autocmd!
    autocmd User ALEWantResults let g:want_results_buffer_value = g:ale_want_results_buffer
  augroup END

  let b:ale_linters = []
  ALELint

  AssertEqual bufnr(''), g:want_results_buffer_value

Execute(ALEWantResults should lead to an ALELintPre signal if another source responds):
  augroup VaderTest
    autocmd!
    autocmd User ALEWantResults call ale#other_source#StartChecking(bufnr(''), 'other-source-linter')
    autocmd User ALELintPre let g:lint_pre_signaled = 1
  augroup END

  " Even when all linters are disabled, we should send the signal.
  let b:ale_linters = []
  ALELint

  Assert get(g:, 'lint_pre_signaled')
