Include: include/setup.vader

Execute (LoclistCounts):
  call neomake#statusline#ResetCounts()
  call neomake#statusline#ResetCountsForBuf(99)
  call neomake#statusline#AddLoclistCount(99, {'type': 'E', 'bufnr': 99})
  call neomake#statusline#AddLoclistCount(99, {'type': 'W', 'bufnr': 99})
  AssertEqual neomake#statusline#LoclistCounts(), {}
  " With 'buf ==# "all"' this matched 0.
  AssertEqual neomake#statusline#LoclistCounts(0), {}

  " 0 could refer to current buffer, but does not currently.
  let curbufnr = bufnr('%')
  call neomake#statusline#AddLoclistCount(curbufnr, {'type': 'E', 'bufnr': curbufnr})
  AssertEqual neomake#statusline#LoclistCounts(0), {}

  AssertEqual neomake#statusline#LoclistCounts(1), {}
  AssertEqual neomake#statusline#LoclistCounts(99), {'E': 1, 'W': 1}
  AssertEqual filter(neomake#statusline#LoclistCounts('all'), 'v:key == 99'),
    \ {'99': {'E': 1, 'W': 1}}

Execute (neomake#statusline#ResetCounts):
  call neomake#statusline#ResetCounts()
  call neomake#statusline#AddLoclistCount(99, {'type': 'E', 'bufnr': 99})
  call neomake#statusline#AddLoclistCount(99, {'type': 'W', 'bufnr': 99})
  AssertEqual neomake#statusline#LoclistCounts('all'), {'99': {'E': 1, 'W': 1}}
  call neomake#statusline#AddQflistCount({'type': 'S', 'bufnr': 99})
  AssertEqual neomake#statusline#QflistCounts(), {'S': 1}

  call neomake#statusline#ResetCounts()
  AssertEqual neomake#statusline#LoclistCounts('all'), {}
  AssertEqual neomake#statusline#QflistCounts(), {}

Execute (LoclistCounts returns number):
  call g:NeomakeSetupAutocmdWrappers()
  new
  let bufnr = bufnr('%')
  call neomake#statusline#AddLoclistCount(bufnr, {'type': 'E', 'bufnr': bufnr})
  AssertEqual neomake#statusline#LoclistCounts(bufnr), {'E': 1}
  AssertEqual [], g:neomake_test_countschanged
  call neomake#statusline#ResetCountsForBuf(bufnr)
  AssertEqual bufnr, g:neomake_test_countschanged[0].bufnr
  call setbufvar(g:neomake_test_countschanged[0].bufnr, 'test', 1)
  AssertEqual 1, getbufvar(g:neomake_test_countschanged[0].bufnr, 'test')
  bwipe

Execute (LoclistCounts for wiped buffer should clean s:loclist_counts):
  call g:NeomakeSetupAutocmdWrappers()
  new
  let bufnr = bufnr('%')
  call neomake#statusline#AddLoclistCount(bufnr, {'type': 'E', 'bufnr': bufnr})
  AssertEqual neomake#statusline#LoclistCounts(bufnr), {'E': 1}
  bwipe
  AssertEqual neomake#statusline#LoclistCounts(bufnr), {'E': 1}
  AssertEqual [], g:neomake_test_countschanged

  call neomake#statusline#ResetCounts()
  AssertEqual bufnr, g:neomake_test_countschanged[0].bufnr
  call setbufvar(g:neomake_test_countschanged[0].bufnr, 'test', 1)
  AssertEqual '', getbufvar(g:neomake_test_countschanged[0].bufnr, 'test')

Execute (neomake#statusline#get_status):
  Save g:neomake_verbose
  let g:neomake_verbose = 3

  call neomake#statusline#ResetCounts()
  new
  let bufnr = bufnr('')
  AssertEqual neomake#statusline#get_status(bufnr, {}), '?'

  AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_unknown': '{{running_job_names}}'}), ''
  " {{running_jobs}} is only available with 'format_running' (internally).
  AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_unknown': '{{running_jobs}}'}), '{{running_jobs}}'
  AssertNeomakeMessage "Error when formatting '{{running_jobs}}': Unknown statusline format: {{running_jobs}}.", 0

  call neomake#Make({'enabled_makers': [g:sleep_maker]})
  if neomake#has_async_support()
    AssertEqual neomake#statusline#get_status(bufnr, {}), '… (sleep-maker)'
    AssertEqual neomake#statusline#get_status(bufnr, {'format_running': '...'}), '...'
    AssertEqual neomake#statusline#get_status(bufnr, {'format_running': ''}), ''
    " format_running=0 disables display of running state.
    AssertEqual neomake#statusline#get_status(bufnr, {'format_running': 0}), '?'
    AssertEqual neomake#statusline#get_status(bufnr, {'format_running': '{{running_job_names}}'}), 'sleep-maker'

    Assert neomake#statusline#get_status(bufnr, {'format_running': '{{running_jobs}}'}) =~# '\m^{''', '{{running_jobs}} is replaced in format_running'

    AssertEqual neomake#statusline#get_status(bufnr, {'format_lists': '{{quickfix}}'}), ''
    AssertEqual neomake#statusline#get_status(bufnr, {'format_lists': '{{loclist}}'}), '… (sleep-maker)'
    " lists_sep is ignored for single list.
    AssertEqual neomake#statusline#get_status(bufnr, {'lists_sep': 'IGNORED'}), '… (sleep-maker)'

    call neomake#statusline#get_status(bufnr(''), {'format_running': 'Neomake: {{does_not_exist}}'})
    AssertNeomakeMessage "Error when formatting 'Neomake: {{does_not_exist}}': Unknown statusline format: {{does_not_exist}}.", 0

    " Start project make.
    call neomake#Make({'file_mode': 0, 'enabled_makers': [g:sleep_maker]})
    AssertEqual neomake#statusline#get_status(bufnr, {}), '… (sleep-maker) … (sleep-maker!)'
    " Swapped default, no lists_sep.
    AssertEqual neomake#statusline#get_status(bufnr, {'format_lists': '{{quickfix}} {{loclist}}'}), '… (sleep-maker!) … (sleep-maker)'
    " Custom lists_sep.
    AssertEqual neomake#statusline#get_status(bufnr, {'lists_sep': '//'}), '… (sleep-maker)//… (sleep-maker!)'

    " Start project makers.
    call neomake#Make({'file_mode': 0, 'enabled_makers': [g:sleep_maker, g:sleep_maker]})
    AssertEqual neomake#statusline#get_status(bufnr, {
    \ 'running_jobs_separator': '_SEP_',
    \ 'format_running_job_project': 'project:%s',
    \ 'format_running_job_file': 'file:%s',
    \ }), '… (file:sleep-maker) … (project:sleep-maker_SEP_project:sleep-maker)'

    NeomakeTestsWaitForFinishedJobs
  else
    AssertEqual neomake#statusline#get_status(bufnr, {'format_running': '...'}), '%#NeomakeStatusGood#✓%#NeomakeStatReset#'
    AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_ok': 'dandy!'}), 'dandy!'
    AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_ok': '{{running_job_names}}'}), ''

    " Start project makers.
    call neomake#Make({'file_mode': 0, 'enabled_makers': [g:sleep_maker, g:sleep_maker]})
  endif

  AssertNeomakeMessage '\v^Skipped 1 entries without bufnr:', 3

  call neomake#statusline#get_status(bufnr(''), {'format_loclist_ok': 'Neomake: {{does_not_exist}}'})
  AssertNeomakeMessage "Error when formatting 'Neomake: {{does_not_exist}}': Unknown statusline format: {{does_not_exist}}.", 0
  call neomake#statusline#get_status(bufnr(''), {'format_loclist_ok': '{{foo}} {{bar}}'})
  AssertNeomakeMessage "Errors when formatting '{{foo}} {{bar}}': Unknown statusline format: {{foo}}., Unknown statusline format: {{bar}}.", 0

  " NOTE: warning is counted with quickfix list, but skipped with location list, because it has no bufnr.
  let expected = '%#NeomakeStatusGood#✓%#NeomakeStatReset# %#NeomakeStatColorQuickfixTypeW# QW:2 %#NeomakeStatReset#'
  AssertEqual neomake#statusline#get_status(bufnr, {}), expected
  AssertEqual neomake#statusline#get(bufnr, {}), expected

  call neomake#statusline#ResetCountsForBuf(bufnr)
  let expected = '? %#NeomakeStatColorQuickfixTypeW# QW:2 %#NeomakeStatReset#'
  AssertEqual neomake#statusline#get_status(bufnr, {}), expected
  AssertEqual neomake#statusline#get(bufnr, {}), expected

  call neomake#statusline#ResetCountsForProject()
  AssertEqual neomake#statusline#get_status(bufnr, {}), '?'
  AssertEqual neomake#statusline#get(bufnr, {}), '?'

  CallNeomake 0, [g:success_maker]
  AssertEqual neomake#statusline#get_status(bufnr, {'format_quickfix_ok': 'OK!'}), '? OK!'
  bwipe

Execute (neomake#statusline#get: clears cache with new job (file mode)):
  new
  let bufnr = bufnr('%')
  CallNeomake {'enabled_makers': [g:error_maker]}
  AssertEqual neomake#statusline#get(bufnr), '%#NeomakeStatColorTypeE# E:1 %#NeomakeStatReset#'

  call neomake#Make({'enabled_makers': [g:success_maker]})
  if neomake#has_async_support()
    AssertEqual neomake#statusline#get(bufnr), '… (success-maker)'
    NeomakeTestsWaitForFinishedJobs
  endif
  AssertEqual neomake#statusline#get(bufnr), '%#NeomakeStatusGood#✓%#NeomakeStatReset#'
  bwipe

Execute (neomake#statusline#get: clears cache with new job (project mode)):
  new
  let bufnr = bufnr('%')
  CallNeomake {'file_mode': 0, 'enabled_makers': [g:error_maker]}
  AssertEqual neomake#statusline#get(bufnr), '? %#NeomakeStatColorQuickfixTypeE# QE:1 %#NeomakeStatReset#'

  call neomake#Make({'file_mode': 0, 'enabled_makers': [g:true_maker]})
  if neomake#has_async_support()
    AssertEqual neomake#statusline#get(bufnr), '? … (true-maker!)'
  endif
  call neomake#Make({'file_mode': 0, 'enabled_makers': [g:success_maker]})
  if neomake#has_async_support()
    AssertEqual neomake#statusline#get(bufnr), '? … (true-maker!, success-maker!)'
    NeomakeTestsWaitForFinishedJobs
  endif
  " Unknown status, only project makers have been run.
  AssertEqual neomake#statusline#get(bufnr), '?'
  bwipe

Execute (neomake#statusline#get: clears cache with canceled job: keeps '?'):
  if neomake#has_async_support()
    new
    let bufnr = bufnr('%')
    call neomake#Make({'file_mode': 0, 'enabled_makers': [g:sleep_maker]})
    AssertEqual neomake#statusline#get(bufnr), '? … (sleep-maker!)'
    NeomakeCancelJobs
    AssertEqual neomake#statusline#get(bufnr), '? … (sleep-maker!)'
    NeomakeTestsWaitForFinishedJobs
    AssertEqual neomake#statusline#get(bufnr), '?'
    bwipe
  else
    NeomakeTestsSkip 'no async support.'
  endif

Execute (neomake#statusline#get: disabling/enabling: clears cache):
  new
  let bufnr = bufnr('%')
  AssertEqual neomake#statusline#get(bufnr), '?'
  NeomakeDisableBuffer
  AssertEqual neomake#statusline#get(bufnr), 'b- ?'
  AssertNeomakeMessage "Using setting disabled=1 from 'buffer' (statusline#get).", 3, {'bufnr': bufnr}

  NeomakeToggleBuffer
  AssertEqual neomake#statusline#get(bufnr), '?'

  CallNeomake 1, [g:true_maker]
  AssertEqual neomake#statusline#get(bufnr), '%#NeomakeStatusGood#✓%#NeomakeStatReset#'

  " no-op
  NeomakeEnableBuffer
  AssertEqual neomake#statusline#get(bufnr), '%#NeomakeStatusGood#✓%#NeomakeStatReset#'
  bwipe

Execute (neomake#statusline#get: use_highlights_with_defaults):
  new
  let bufnr = bufnr('%')
  AssertEqual neomake#statusline#get(bufnr, {'use_highlights_with_defaults': 0}), '?'
  CallNeomake 1, [g:success_entry_maker]
  AssertEqual neomake#statusline#get(bufnr, {'use_highlights_with_defaults': 0}), '✓'
  AssertEqual neomake#statusline#get(bufnr, {'use_highlights_with_defaults': 1}),
  \ '%#NeomakeStatusGood#✓%#NeomakeStatReset#'
  bwipe

Execute (statusline: uses user-configured highlights):
  new
  let bufnr = bufnr('%')
  hi NeomakeStatColorTypeW ctermfg=Black ctermbg=Black cterm=none
  let orig = neomake#utils#redir('hi NeomakeStatColorTypeW')
  CallNeomake 1, [g:success_entry_maker]
  AssertEqual neomake#utils#redir('hi NeomakeStatColorTypeW'), orig
  bwipe