" Tests for the NeomakeInfo command.
Include: include/setup.vader

Execute (:NeomakeInfo output end to end test):
  if !(exists('*execute') && has('nvim-0.2.0'))
    NeomakeTestsSkip 'Only with execute() support'
  else
    let info = split(neomake#utils#redir('NeomakeInfo'), '\n')
    Assert len(filter(copy(info), "v:val =~ '\\v^#+ Settings$'")), 'Settings header exists'
  endif

Execute (:NeomakeInfo):
  Save g:neomake_c_enabled_makers, g:neomaker_not_a_setting
  let g:neomake_c_enabled_makers = ['doesnotexist']
  let g:neomaker_not_a_setting = 1
  Save &makeprg
  let &makeprg = 'mycustom make %'

  let info = neomake#debug#_get_info_lines()
  Assert len(filter(copy(info), "v:val =~ '\\v^#+ Settings$'")), 'Settings header exists'
  Assert index(info, "g:neomake_c_enabled_makers = ['doesnotexist']") != -1,
  \ 'neomake_c_enabled_makers setting gets reported'
  AssertEqual filter(copy(info), "v:val =~ 'neomaker'"), []

  Assert len(filter(copy(info), 'v:val =~# "^makeprg=mycustom make %, Last set from"')) == 1,
  \ 'Contains &makeprg: '.string(info)

Execute (:NeomakeInfo with FuncRef):
  Save g:neomake_c_enabled_makers, g:neomake_c_doesnotexist_maker
  new
  set filetype=c
  function! InitForJob(jobinfo) abort
  endfunction
  let g:neomake_c_enabled_makers = ['doesnotexist']
  let g:neomake_c_doesnotexist_maker = {
  \ 'InitForJob': function('InitForJob'),
  \ 'errorformat': 'custom_efm: %m'}

  let info = neomake#debug#_get_info_lines()
  let idx = -1
  for line in [
      \ 'For the current filetype ("c", used with :Neomake):',
      \ ' - doesnotexist',
      \ '   - errorformat: ''custom_efm: %m''',
      \ '   - exe: ''doesnotexist''']
    let i = index(info, line)
    Assert i > idx, 'line not found: "'.line.'" (idx: '.idx.')'."\n".join(info, "\n")
    let idx = i
  endfor
  Assert len(map(info, 'v:val =~# "   - InitForJob: function.*"')), 'InitForJob not found'
  delfunction InitForJob
  bwipe

Execute (:NeomakeInfo with unusual filetype):
  new
  set filetype=ft1.gentoo-package-keywords
  let info = neomake#debug#_get_info_lines()
  Assert index(info, 'NOTE: you can define g:neomake_ft1_gentoo_package_keywords_enabled_makers to configure it (or b:neomake_ft1_gentoo_package_keywords_enabled_makers).') != -1, 'Line was found'
  bwipe

Execute (:NeomakeInfo displays issues):
  Save g:neomake_enabled_makers, g:neomake_mymaker_maker

  let g:neomake_enabled_makers = ['mymaker']
  let g:neomake_mymaker_maker = {
  \ 'exe': 'doesnotexist',
  \ 'errorformat': 'custom_efm: %m',
  \ 'mapexpr': '',
  \ 'postprocess': function('tr'),
  \ 'process_output': function('tr'),
  \ }

  let info = neomake#debug#_get_info_lines()
  let idx = -1
  for line in [
      \ '#### Neomake debug information',
      \ 'For the project (used with :Neomake!):',
      \ ' - mymaker',
      \ '   - errorformat: ''custom_efm: %m''',
      \ '   - exe: ''doesnotexist''',
      \ '   - ERRORS:',
      \ "     - maker's exe (doesnotexist) is not executable.",
      \ '   - WARNINGS:',
      \ '     - maker has mapexpr, but only process_output will be used.',
      \ '     - maker has postprocess, but only process_output will be used.',
      \ '#### :version',
      \ '#### :messages',
      \ ]
    let i = index(info, line)
    Assert i > idx, 'line not found: "'.line.'" (idx: '.idx.')'."\n".join(info, "\n")
    let idx = i
  endfor

Execute (NeomakeInfo! copies to clipboard):
  try
    let save_reg = getreg('+')
  catch
    NeomakeTestsSkip 'Clipboard is not available: '.v:exception
    return
  endtry

  call NeomakeTestsSetVimMessagesMarker()
  let restore = 1
  try
    NeomakeInfo!
    let info = split(getreg('+'), '\n')
    if empty(info)
      let restore = 0
      AssertNeomakeMessage "Could not set clipboard: Vim(call):E354: Invalid register name: '+'.", 0
      return
    endif
  finally
    if restore
      call setreg('+', save_reg, 'l')
    endif
  endtry
  let idx = -1
  for line in [
      \ '#### Neomake debug information',
      \ '#### :version',
      \ '#### :messages',
      \ ]
    let i = index(info, line)
    Assert i > idx, 'line not found: "'.line.'" (idx: '.idx.')'."\n".join(info, "\n")
    let idx = i
  endfor

  AssertEqual NeomakeTestsGetVimMessages(), [
  \ 'Copied Neomake info to clipboard ("+).']

Execute (NeomakeInfo displays new-style config):
  Assert !exists('g:neomake')
  new

  let info = neomake#debug#_get_info_lines()
  let idx = -1
  for line in [
      \ '#### Neomake debug information',
      \ '##### Settings',
      \ '###### New-style (dict, overrides old-style)',
      \ "g:neomake: unset",
      \ 'b:neomake: unset',
      \ ]
    let i = index(info, line)
    Assert i > idx, 'line not found: "'.line.'" (idx: '.idx.')'."\n".join(info, "\n")
    let idx = i
  endfor

  " Using neomake#config#get() should not trigger setting g:neomake.
  AssertEqual neomake#config#get('doesnotexist'), g:neomake#config#undefined
  let b:neomake = {}
  let info = neomake#debug#_get_info_lines()
  let idx = -1
  for line in [
      \ '#### Neomake debug information',
      \ '##### Settings',
      \ '###### New-style (dict, overrides old-style)',
      \ "g:neomake: unset",
      \ 'b:neomake: {}',
      \ ]
    let i = index(info, line)
    Assert i > idx, 'line not found: "'.line.'" (idx: '.idx.')'."\n".join(info, "\n")
    let idx = i
  endfor
  bwipe

Execute (NeomakeInfo does not display message for filetype with no makers):
  new
  noautocmd set filetype=doesnotexist

  call NeomakeTestsSetVimMessagesMarker()
  let info = neomake#debug#_get_info_lines()
  let msgs = NeomakeTestsGetVimMessages()
  bwipe

  AssertEqual msgs, []
  Assert index(info, 'For the current filetype ("doesnotexist", used with :Neomake):') > 0

Execute (NeomakeInfo with maker name):
  " NOTE: Vim needs non-empty PATH for executable to be false!
  " (https://github.com/vim/vim/pull/3283)
  call g:NeomakeTestsSetPATH('/doesnotexist')
  Assert !executable('make')

  new
  noautocmd set filetype=neomake_tests
  NeomakeInfo foo
  AssertNeomakeMessage 'Maker not found: foo.', 0

  call NeomakeTestsSetVimMessagesMarker()
  NeomakeInfo makeprg
  AssertEqual NeomakeTestsGetVimMessages(), []
  AssertEqual neomake#debug#get_maker_info('maker_with_nonstring_exe')[-2:], [
  \ ' - ERRORS:',
  \ "   - Non-string given for executable of maker maker_with_nonstring_exe: type 2.",
  \ ]

  call NeomakeTestsSetVimMessagesMarker()
  NeomakeInfo makeprg
  AssertEqual NeomakeTestsGetVimMessages(), []
  AssertEqual neomake#debug#get_maker_info('makeprg')[-2:], [
  \ ' - ERRORS:',
  \ "   - maker's exe (make) is not executable.",
  \ ]

  Save &makeprg
  set makeprg=custommakeprg
  NeomakeInfo makeprg
  AssertEqual NeomakeTestsGetVimMessages(), []
  AssertEqual neomake#debug#get_maker_info('makeprg')[-2:], [
  \ ' - ERRORS:',
  \ "   - maker's exe (custommakeprg) is not executable.",
  \ ]

  " Uses &shell when checking executable for makeprg with spaces.
  Save &shell
  set shell=customshell
  set makeprg=custom\ make\ prg
  NeomakeInfo makeprg
  AssertEqual NeomakeTestsGetVimMessages(), []
  AssertEqual neomake#debug#get_maker_info('makeprg')[-2:], [
  \ ' - ERRORS:',
  \ "   - maker's exe (customshell) is not executable.",
  \ ]

  let b:neomake_makeprg_exe = 'custom_exe'
  NeomakeInfo makeprg
  AssertEqual NeomakeTestsGetVimMessages(), []
  AssertEqual neomake#debug#get_maker_info('makeprg')[-2:], [
  \ ' - ERRORS:',
  \ "   - maker's exe (custom_exe) is not executable.",
  \ ]
  bwipe