Include: include/setup.vader

Execute (action queue: order on WinEnter):
  function! F1(...)
    return neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'),
                \ a:000])
  endfunction
  function! F2(...)
    return neomake#action_queue#add(['WinEnter'], [function('F2'),
                \ a:000])
  endfunction
  let jobinfo = NeomakeTestsFakeJobinfo()

  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])
  call neomake#action_queue#add(['WinEnter'], [function('F2'), [jobinfo]])

  doautocmd WinEnter

  AssertNeomakeMessage 'action queue: processing for WinEnter (2 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'action queue: calling F1.', 3

  call neomake#action_queue#clean(jobinfo)
  delfunction F1
  delfunction F2

Execute (action queue: order on WinEnter with Timer):
  let s:calls = [0, 0]
  function! F1(...)
    let s:calls[0] += 1
    " NOTE: copies a:000 to work around https://github.com/neovim/neovim/issues/9169.
    return neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'),
                \ copy(a:000)])
  endfunction
  function! F2(...)
    let s:calls[1] += 1
    " NOTE: copies a:000 to work around https://github.com/neovim/neovim/issues/9169.
    return neomake#action_queue#add(['WinEnter'], [function('F2'),
                \ copy(a:000)])
  endfunction
  let jobinfo = NeomakeTestsFakeJobinfo()

  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])
  call neomake#action_queue#add(['WinEnter'], [function('F2'), [jobinfo]])

  if has('timers')
    AssertNeomakeMessage '\V\^Retrying Timer event in 10ms'
    NeomakeTestsWaitForMessage 'action queue: processing for Timer (1 items).', 3, {'winnr': 1}
  else
    doautocmd CursorHold
    AssertNeomakeMessage 'action queue: processing for Timer (1 items).', 3, {'winnr': 1}
  endif
  AssertNeomakeMessage 'Queuing action F1 for Timer, WinEnter.'
  AssertNeomakeMessage 'action queue: re-queuing F2 for not processed make_id.', 3

  doautocmd WinEnter

  AssertNeomakeMessage 'action queue: processing for WinEnter (2 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'action queue: calling F1.', 3
  AssertNeomakeMessage 'action queue: re-queuing F2 for not processed make_id.', 3

  call neomake#action_queue#clean(jobinfo)

  delfunction F1
  delfunction F2
  AssertEqual s:calls, [2, 0]

Execute (action queue: re-queued with different events):
  let s:calls = [0, 0]
  function! F1(...)
    let s:calls[0] += 1
    if s:calls[0] == 2
        return g:neomake#action_queue#processed
    endif
    " NOTE: copies a:000 to work around https://github.com/neovim/neovim/issues/9169.
    return neomake#action_queue#add(['BufEnter', 'WinEnter'], [function('F1'),
                \ copy(a:000)])
  endfunction
  function! F2(...)
    let s:calls[1] += 1
    if s:calls[1] == 2
        return g:neomake#action_queue#processed
    endif
    " NOTE: copies a:000 to work around https://github.com/neovim/neovim/issues/9169.
    return neomake#action_queue#add(['WinEnter'], [function('F2'),
                \ copy(a:000)])
  endfunction

  let jobinfo = NeomakeTestsFakeJobinfo()
  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])
  call neomake#action_queue#add(['WinEnter'], [function('F2'), [jobinfo]])

  if has('timers')
    AssertNeomakeMessage '\V\^Retrying Timer event in 10ms'
  else
    doautocmd CursorHold
  endif
  NeomakeTestsWaitForMessage 'action queue: processing for Timer (1 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'Queuing action F1 for BufEnter, WinEnter.'
  AssertNeomakeMessage 'action queue: re-queuing F2 for not processed make_id.', 3

  AssertEqual s:calls, [1, 0]
  doautocmd WinEnter
  AssertEqual s:calls, [2, 1]

  AssertNeomakeMessage 'action queue: processing for WinEnter (2 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'action queue: calling F1.', 3
  AssertNeomakeMessage 'action queue: calling F2.', 3
  AssertNeomakeMessage 'Queuing action F2 for WinEnter.', 3

  AssertEqual s:calls, [2, 1]
  AssertEqual len(g:neomake#action_queue#_s.action_queue), 1

  doautocmd WinEnter
  AssertEqual len(g:neomake#action_queue#_s.action_queue), 0

  delfunction F1
  delfunction F2
  AssertEqual s:calls, [2, 2]

Execute (action queue: logs errors (get_list_entries, WinEnter)):
  function! F1(jobinfo,...)
    if a:0
      return g:neomake#action_queue#processed
    endif
    throw 'error_in_F1'
  endfunction
  let jobinfo = NeomakeTestsFakeJobinfo()

  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])

  doautocmd WinEnter

  AssertNeomakeMessage 'action queue: processing for WinEnter (1 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'action queue: calling F1.', 3
  AssertNeomakeMessage 'Error during action queue processing: error_in_F1.', 0
  AssertNeomakeMessage '\v^CancelJob: job not found: \d+.', 0

  call neomake#action_queue#clean(jobinfo)
  delfunction F1

Execute (action queue: logs errors (get_list_entries, Timer)):
  function! F1(jobinfo,...)
    if a:0
      return g:neomake#action_queue#processed
    endif
    throw 'error_in_F1'
  endfunction
  let jobinfo = NeomakeTestsFakeJobinfo()

  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])

  if has('timers')
    NeomakeTestsWaitForMessage 'action queue: processing for Timer (1 items).', 3, {'winnr': 1}
  else
    doautocmd CursorHold
  endif
  AssertNeomakeMessage 'action queue: calling F1.', 3
  AssertNeomakeMessage 'Error during action queue processing: error_in_F1.', 0
  AssertNeomakeMessage '\v^CancelJob: job not found: \d+.', 0

  call neomake#action_queue#clean(jobinfo)
  delfunction F1

Execute (action queue: logs errors (E48, WinEnter)):
  function! F1(jobinfo,...)
    if a:0
      return g:neomake#action_queue#processed
    endif
    sandbox bprevious
  endfunction
  let jobinfo = NeomakeTestsFakeJobinfo()

  call neomake#action_queue#add(['Timer', 'WinEnter'], [function('F1'), [jobinfo]])

  doautocmd WinEnter

  AssertNeomakeMessage 'action queue: processing for WinEnter (1 items).', 3, {'winnr': 1}
  AssertNeomakeMessage 'action queue: calling F1.', 3
  AssertNeomakeMessage '\vError during action queue processing: .*E48'
  AssertNeomakeMessage '\v^CancelJob: job not found: \d+.', 0

  call neomake#action_queue#clean(jobinfo)
  delfunction F1

Execute (action queue: handles make_info in clean_make_info queue check):
  if !neomake#has_async_support() || !has('patch-v8.1.0342')
    NeomakeTestsSkip 'no async support.'
  else
    new
    call neomake#Make({'enabled_makers': [g:true_maker]})
    let make_info = values(neomake#GetStatus().make_info)[0]
    function F(...)
      return g:neomake#action_queue#processed
    endfunction
    call neomake#action_queue#add(['InsertLeave'], [function('F'), [make_info]])
    NeomakeTestsWaitForFinishedJobs
    AssertNeomakeMessage '\VQueuing clean_make_info for already queued actions: [''make \d\+'']', 3
    AssertNeomakeMessage 'Queuing action clean_make_info for any event.', 3
    AssertNeomakeMessage 'Skipping cleaning of make info for queued actions.', 3

    doautocmd InsertLeave

    AssertNeomakeMessage 'action queue: calling F.'
    AssertNeomakeMessage 'action queue: calling clean_make_info.'
    bwipe
    delfunction F
  endif

Execute (action queue: skips processing during internal autocommands):
  if NeomakeAsyncTestsSetup()
    Save g:neomake_open_list
    let g:neomake_open_list = 2

    new

    let s:calls = []
    function! F(...)
      call add(s:calls, a:000)
      return g:neomake#action_queue#processed
    endfunction
    let jobinfo = NeomakeTestsFakeJobinfo()
    call neomake#action_queue#add(['WinEnter'], [function('F'), [jobinfo]])

    call neomake#Make(1, [g:error_maker])
    let job = neomake#GetJobs()[-1]
    NeomakeTestsWaitForFinishedJobs

    AssertNeomakeMessage 'Handling location list: executing lwindow.', 3, job
    AssertNeomakeMessage 'action queue: skip processing for WinEnter (ignore_autocommands=1).', 3
    AssertNeomakeMessage 'list window has been opened (old count: 2, new count: 3, height: 1).', 3
    AssertNeomakeMessage 'action queue: skip processing for WinEnter (ignore_autocommands=1).', 3
    AssertNeomakeMessage 'action queue: skip processing for WinEnter (ignore_autocommands=1).', 3
    lclose
    wincmd p
    AssertNeomakeMessage '\vaction queue: processing for WinEnter'
    wincmd p
    bwipe
    delfunction F
  endif
