Before:
  call ale#test#SetDirectory('/testplugin/test/command_callback')

  Save g:ale_java_javac_options
  Save g:ale_java_javac_classpath

  unlet! g:ale_java_javac_options
  unlet! g:ale_java_javac_classpath

  let g:cp_sep = has('unix') ? ':' : ';'

  function! GetCommand(previous_output) abort
    let l:command = ale_linters#java#javac#GetCommand(
    \ bufnr(''),
    \ a:previous_output
    \)

    let l:split_command = split(l:command)
    let l:index = index(l:split_command, '-d')

    let l:split_command[l:index + 1] = 'TEMP'

    return join(l:split_command)
  endfunction

  runtime ale_linters/java/javac.vim
  call ale#engine#InitBufferInfo(bufnr(''))

  call ale#test#SetFilename('dummy.java')

After:
  call ale#test#RestoreDirectory()

  Restore

  unlet! g:cp_sep

  delfunction GetCommand

  call ale#linter#Reset()
  " We need to clean up the buffer to remove the temporary directories created
  " for the command.
  call ale#engine#Cleanup(bufnr(''))

Execute(The javac callback should return the correct default value):
  AssertEqual 'javac -Xlint -d TEMP %t', GetCommand([])

Execute(The javac callback should use g:ale_java_javac_classpath correctly):
  let g:ale_java_javac_classpath = 'foo.jar'

  AssertEqual
  \ 'javac -Xlint'
  \   . ' -cp ' . ale#Escape('foo.jar')
  \   . ' -d TEMP %t',
  \ GetCommand([])

Execute(The javac callback should include discovered classpaths):
  AssertEqual
  \ 'javac -Xlint -cp '
  \   . ale#Escape(join(['/foo/bar.jar', '/xyz/abc.jar'], g:cp_sep))
  \   . ' -d TEMP %t',
  \ GetCommand([
  \   '[DEBUG] Ignore this.',
  \   '[INFO] Something we should ignore.',
  \   '/foo/bar.jar',
  \   '/xyz/abc.jar',
  \ ])

Execute(The javac callback should combine discovered classpaths and manual ones):
  let g:ale_java_javac_classpath = 'configured.jar'

  AssertEqual
  \ 'javac -Xlint -cp '
  \   . ale#Escape(join(
  \     [
  \       '/foo/bar.jar',
  \       '/xyz/abc.jar',
  \       'configured.jar',
  \     ],
  \     g:cp_sep
  \   ))
  \   . ' -d TEMP %t',
  \ GetCommand([
  \   '[DEBUG] Ignore this.',
  \   '[INFO] Something we should ignore.',
  \   '/foo/bar.jar',
  \   '/xyz/abc.jar',
  \ ])

  let g:ale_java_javac_classpath = 'configured.jar' . g:cp_sep . 'configured2.jar'

  AssertEqual
  \ 'javac -Xlint -cp '
  \   . ale#Escape(join(
  \     [
  \       '/foo/bar.jar',
  \       '/xyz/abc.jar',
  \       'configured.jar',
  \       'configured2.jar',
  \     ],
  \     g:cp_sep
  \   ))
  \   . ' -d TEMP %t',
  \ GetCommand([
  \   '[DEBUG] Ignore this.',
  \   '[INFO] Something we should ignore.',
  \   '/foo/bar.jar',
  \   '/xyz/abc.jar',
  \ ])

Execute(The javac callback should detect source directories):
  call ale#engine#Cleanup(bufnr(''))
  :e! java_paths/src/main/java/com/something/dummy
  call ale#engine#InitBufferInfo(bufnr(''))

  AssertEqual
  \ 'javac -Xlint'
  \   . ' -sourcepath ' . ale#Escape(
  \     ale#path#Winify(g:dir . '/java_paths/src/main/java/')
  \   )
  \   . ' -d TEMP %t',
  \ GetCommand([])

Execute(The javac callback should combine detected source directories and classpaths):
  call ale#engine#Cleanup(bufnr(''))
  call ale#test#SetFilename('java_paths/src/main/java/com/something/dummy.java')
  call ale#engine#InitBufferInfo(bufnr(''))

  AssertEqual
  \ 'javac -Xlint'
  \   . ' -cp ' . ale#Escape(join(['/foo/bar.jar', '/xyz/abc.jar'], g:cp_sep))
  \   . ' -sourcepath ' . ale#Escape(
  \     ale#path#Winify(g:dir . '/java_paths/src/main/java/')
  \   )
  \   . ' -d TEMP %t',
  \ GetCommand([
  \   '[DEBUG] Ignore this.',
  \   '[INFO] Something we should ignore.',
  \   '/foo/bar.jar',
  \   '/xyz/abc.jar',
  \ ])

Execute(The javac callback should use g:ale_java_javac_options correctly):
  let g:ale_java_javac_options = '--anything --else'

  let b:command = ale_linters#java#javac#GetCommand(bufnr(''), [])

  AssertEqual
  \ 'javac -Xlint'
  \   . ' -d TEMP --anything --else %t',
  \ GetCommand([])