2018-02-04 06:35:08 -05:00
func ! Test_GoTest ( ) abort
let expected = [
\ {'lnum' : 12 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'log message' },
\ {'lnum' : 13 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'sub badness' },
\ {'lnum' : 15 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'badness' },
\ {'lnum' : 16 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'helper badness' },
\ {'lnum' : 20 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is an error' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'and a second line, too' },
\ {'lnum' : 21 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : '' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is another error' },
\ {'lnum' : 26 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is a sub-test error' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'and a second line, too' },
\ {'lnum' : 6 , 'bufnr' : 3 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'another package badness' },
\ {'lnum' : 43 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'panic: worst ever [recovered]' }
\ ]
call s :test ( 'play/play_test.go' , expected )
endfunc
func ! Test_GoTestConcurrentPanic ( )
let expected = [
\ {'lnum' : 50 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'panic: concurrent fail' }
\ ]
call s :test ( 'play/play_test.go' , expected , "-run" , "TestConcurrentPanic" )
endfunc
func ! Test_GoTestVerbose ( ) abort
let expected = [
\ {'lnum' : 12 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'log message' },
\ {'lnum' : 13 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'sub badness' },
\ {'lnum' : 15 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'badness' },
\ {'lnum' : 16 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'helper badness' },
\ {'lnum' : 20 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is an error' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'and a second line, too' },
\ {'lnum' : 21 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : '' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is another error' },
\ {'lnum' : 26 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'this is a sub-test error' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'and a second line, too' },
\ {'lnum' : 32 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'goodness' },
\ {'lnum' : 6 , 'bufnr' : 3 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'another package badness' },
\ {'lnum' : 43 , 'bufnr' : 2 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'panic: worst ever [recovered]' }
\ ]
call s :test ( 'play/play_test.go' , expected , "-v" )
endfunc
func ! Test_GoTestCompilerError ( ) abort
let expected = [
\ {'lnum' : 6 , 'bufnr' : 6 , 'col' : 22 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'syntax error: unexpected newline, expecting comma or )' }
\ ]
call s :test ( 'compilerror/compilerror_test.go' , expected )
endfunc
func ! Test_GoTestTimeout ( ) abort
let expected = [
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'panic: test timed out after 500ms' }
\ ]
let g :go_test_timeout = "500ms"
call s :test ( 'timeout/timeout_test.go' , expected )
unlet g :go_test_timeout
endfunc
func ! Test_GoTestShowName ( ) abort
let expected = [
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'TestHelloWorld' },
\ {'lnum' : 6 , 'bufnr' : 9 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'so long' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'TestHelloWorld/sub' },
\ {'lnum' : 9 , 'bufnr' : 9 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'thanks for all the fish' },
\ ]
let g :go_test_show_name = 1
call s :test ( 'showname/showname_test.go' , expected )
2018-06-14 06:31:12 -04:00
unlet g :go_test_show_name
endfunc
func ! Test_GoTestVet ( ) abort
let expected = [
\ {'lnum' : 6 , 'bufnr' : 16 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'Errorf format %v reads arg #1, but call has only 0 args' },
\ ]
call s :test ( 'veterror/veterror.go' , expected )
endfunc
func ! Test_GoTestTestCompilerError ( ) abort
let expected = [
\ {'lnum' : 10 , 'bufnr' : 11 , 'col' : 16 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'cannot use r (type struct {}) as type io.Reader in argument to ioutil.ReadAll:' },
\ {'lnum' : 0 , 'bufnr' : 0 , 'col' : 0 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'struct {} does not implement io.Reader (missing Read method)' }
\ ]
call s :test ( 'testcompilerror/testcompilerror_test.go' , expected )
2018-02-04 06:35:08 -05:00
endfunc
func ! s :test ( file , expected , ...) abort
if has ( 'nvim' )
" nvim mostly shows test errors correctly, but the the expected errors are
" slightly different; buffer numbers are not the same and stderr doesn't
" seem to be redirected to the job, so the lines from the panic aren't in
" the output to be parsed, and hence are not in the quickfix lists. Once
" those two issues are resolved, this early return should be removed so
" the tests will run for Neovim, too.
return
endif
let $GOPATH = fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/test'
silent exe 'e ' . $GOPATH . '/src/' . a :file
" clear the quickfix lists
call setqflist ( [], 'r' )
let args = [1 , 0 ]
if a :0
let args + = a :000
endif
" run the tests
2018-06-14 06:31:12 -04:00
silent call call ( function ( 'go#test#Test' ) , args )
2018-02-04 06:35:08 -05:00
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
for item in actual
let item .text = s :normalize_durations ( item .text )
endfor
for item in a :expected
let item .text = s :normalize_durations ( item .text )
endfor
call gotest #assert_quickfix ( actual , a :expected )
endfunc
func ! s :normalize_durations ( str ) abort
return substitute ( a :str , '[0-9]\+\(\.[0-9]\+\)\?s' , '0.000s' , 'g' )
endfunc
" vim: sw=2 ts=2 et