Before:
  Save g:ale_go_gobuild_options

  unlet! g:ale_go_gobuild_options

  let g:env_prefix = has('win32')
  \ ? 'set GOPATH=' . ale#Escape('/foo/bar') . ' && '
  \ : 'GOPATH=' . ale#Escape('/foo/bar') . ' '

  runtime ale_linters/go/gobuild.vim

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

  call ale_linters#go#gobuild#ResetEnv()

After:
  Restore

  unlet! g:env_prefix

  call ale#linter#Reset()
  call ale#test#RestoreDirectory()

Execute(The default gobuild command should be correct):
  AssertEqual
  \ ale_linters#go#gobuild#GetCommand(bufnr(''), ['/foo/bar', '/foo/baz']),
  \ g:env_prefix . 'cd ' . ale#Escape(expand('%:p:h')) . ' && '
  \   . 'go test -c -o /dev/null ./'

Execute(The command for getting GOPATH should be correct):
  AssertEqual ale_linters#go#gobuild#GoEnv(bufnr('')), 'go env GOPATH GOROOT'

  call ale_linters#go#gobuild#GetCommand(bufnr(''), ['/foo/bar', '/foo/baz'])

  " We shouldn't run `go env` many times after we've got it.
  AssertEqual ale_linters#go#gobuild#GoEnv(bufnr('')), ''

Execute(The GOPATH output should be used after it has been read once):
  call ale_linters#go#gobuild#GetCommand(bufnr(''), ['/foo/bar', '/foo/baz'])

  AssertEqual
  \ ale_linters#go#gobuild#GetCommand(bufnr(''), []),
  \ g:env_prefix . 'cd ' . ale#Escape(expand('%:p:h')) . ' && '
  \   . 'go test -c -o /dev/null ./'

Execute(Extra options should be supported):
  let g:ale_go_gobuild_options = '--foo-bar'

  AssertEqual
  \ ale_linters#go#gobuild#GetCommand(bufnr(''), ['/foo/bar', '/foo/baz']),
  \ g:env_prefix . 'cd ' . ale#Escape(expand('%:p:h')) . ' && '
  \   . 'go test --foo-bar -c -o /dev/null ./'