Skip to content

Instantly share code, notes, and snippets.

@rerorero
Last active July 24, 2020 03:13
Show Gist options
  • Save rerorero/058bc1a0e62fc519176583eb1000a569 to your computer and use it in GitHub Desktop.
Save rerorero/058bc1a0e62fc519176583eb1000a569 to your computer and use it in GitHub Desktop.
vim-go-dlv-unittest
sign define delvbreakpoint text=B>
command BP call s:go_delv_mark_breakpoint()
command BD call s:go_delv_delete_breakpoint()
command BS call s:go_delv_show_breakpoints()
command GoDelvTest call s:go_delv_test()
function! s:go_delv_mark_breakpoint() abort
let l:filename = fnamemodify(expand('%'), ':p:gs!\\!/!')
let l:linenr = line('.')
exe 'sign place 9900 name=delvbreakpoint group=go-delv-debug line=' . l:linenr . ' file=' . l:filename
endfunction
function! s:go_delv_delete_breakpoint() abort
exe 'sign unplace * group=go-delv-debug'
endfunction
function! s:go_delv_get_breakpoints() abort
" get all signs
let l:bufinfo = getbufinfo()
let l:listed = []
for l:info in l:bufinfo
if l:info.listed
let l:listed = add(l:listed, l:info)
endif
endfor
let l:signs = []
for l:buf in l:listed
let l:signs = add(l:signs, sign_getplaced(l:buf.bufnr, {'group': 'go-delv-debug', 'name': 'delvbreakpoint'})[0])
endfor
" breakpoints
let l:breakpoints = []
for l:item in l:signs
let l:filepath = fnamemodify(bufname(l:item.bufnr), ':p')
for l:sign in l:item.signs
call add(l:breakpoints, {
\ 'file': l:filepath,
\ 'line': l:sign.lnum,
\ })
endfor
endfor
return l:breakpoints
endfunction
function! s:go_delv_show_breakpoints() abort
let l:breakpoints = s:go_delv_get_breakpoints()
:echo 'Delv BreakPoints ---'
for l:bp in l:breakpoints
:echo l:bp.file ':' l:bp.line
endfor
return l:breakpoints
endfunction
function! s:go_delv_test() abort
let l:test = search('func \(Test\|Example\)', "bcnW")
if l:test == 0
echo "no test found"
return
end
" create init file
let l:breakpoints = s:go_delv_get_breakpoints()
let l:contents = []
for l:bp in l:breakpoints
let l:bpcmd = 'break ' . l:bp.file . ':' . l:bp.line
call add(l:contents, l:bpcmd)
endfor
let l:initfile = fnameescape(tempname())
call writefile(l:contents, l:initfile)
" run via neoterm
let l:line = getline(l:test)
let l:name = split(split(l:line, " ")[1], "(")[0]
let l:filepath = expand('%:p:h')
let l:cmd = ':T dlv test --init ' . l:initfile . ' --build-flags=$(go list ' . l:filepath . ') -- -test.run ' . l:name . '$'
exe l:cmd
endfunction
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment