Before:
  Save g:ale_enabled
  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_enabled = 0
  let g:ale_set_signs = 0
  let g:ale_set_quickfix = 0
  let g:ale_set_loclist = 0
  let g:ale_set_highlights = 0
  let g:ale_echo_cursor = 0

  function EmptyString() abort
    return ''
  endfunction

  call ale#engine#InitBufferInfo(bufnr(''))

  call ale#linter#Define('testft', {
  \   'name': 'lsplinter',
  \   'lsp': 'tsserver',
  \   'executable_callback': 'EmptyString',
  \   'command_callback': 'EmptyString',
  \   'project_root_callback': 'EmptyString',
  \   'language_callback': 'EmptyString',
  \})

  call ale#linter#Define('testft', {
  \ 'name': 'otherlinter',
  \ 'callback': 'TestCallback',
  \ 'executable': has('win32') ? 'cmd': 'true',
  \ 'command': 'true',
  \ 'read_buffer': 0,
  \})

After:
  Restore

  unlet! b:ale_save_event_fired

  delfunction EmptyString
  call ale#linter#Reset()

Given testft(Some file with an imaginary filetype):
Execute(ALEStopAllLSPs should clear the loclist):
  let g:ale_buffer_info[bufnr('')].loclist = [
  \ {
  \   'text': 'a',
  \   'lnum': 10,
  \   'col': 0,
  \   'bufnr': bufnr(''),
  \   'vcol': 0,
  \   'type': 'E',
  \   'nr': -1,
  \   'linter_name': 'lsplinter',
  \ },
  \ {
  \   'text': 'a',
  \   'lnum': 10,
  \   'col': 0,
  \   'bufnr': bufnr(''),
  \   'vcol': 0,
  \   'type': 'E',
  \   'nr': -1,
  \   'linter_name': 'otherlinter',
  \ },
  \]
  let g:ale_buffer_info[bufnr('')].active_linter_list = ['lsplinter', 'otherlinter']

  ALEStopAllLSPs

  " The loclist should be updated.
  AssertEqual g:ale_buffer_info[bufnr('')].loclist, [
  \ {
  \   'text': 'a',
  \   'lnum': 10,
  \   'col': 0,
  \   'bufnr': bufnr(''),
  \   'vcol': 0,
  \   'type': 'E',
  \   'nr': -1,
  \   'linter_name': 'otherlinter',
  \ },
  \]

  " The LSP linter should be removed from the active linter list.
  AssertEqual g:ale_buffer_info[bufnr('')].active_linter_list, ['otherlinter']