Skip to content

Commit 3af7d7c

Browse files
committed
Run test/tests in file/tests in project
1 parent 95e01fd commit 3af7d7c

File tree

2 files changed

+74
-37
lines changed

2 files changed

+74
-37
lines changed

autoload/OmniSharp/actions/test.vim

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ endfunction
2323
function! s:debug.prepare(bufferTests) abort
2424
let bufnr = a:bufferTests[0].bufnr
2525
let tests = a:bufferTests[0].tests
26-
let currentTest = s:utils.findTest(tests)
26+
let currentTest = s:utils.findTest(tests, '')
2727
if type(currentTest) != type({})
2828
return s:utils.log.warn('No test found')
2929
endif
@@ -105,16 +105,18 @@ function! s:debug.process.closed(...) abort
105105
endfunction
106106

107107

108-
function! OmniSharp#actions#test#Run(nobuild) abort
108+
function! OmniSharp#actions#test#Run(nobuild, ...) abort
109109
if !s:utils.capabilities() | return | endif
110110
let s:nobuild = a:nobuild
111-
call s:utils.initialize([bufnr('%')], s:run.single.test)
111+
let bufnr = a:0 ? (type(a:1) == type('') ? bufnr(a:1) : a:1) : bufnr('%')
112+
let RunTest = funcref('s:run.single.test', [a:0 > 1 ? a:2 : ''])
113+
call s:utils.initialize([bufnr], RunTest)
112114
endfunction
113115

114-
function! s:run.single.test(bufferTests) abort
116+
function! s:run.single.test(testName, bufferTests) abort
115117
let bufnr = a:bufferTests[0].bufnr
116118
let tests = a:bufferTests[0].tests
117-
let currentTest = s:utils.findTest(tests)
119+
let currentTest = s:utils.findTest(tests, a:testName)
118120
if type(currentTest) != type({})
119121
return s:utils.log.warn('No test found')
120122
endif
@@ -124,6 +126,7 @@ function! s:run.single.test(bufferTests) abort
124126
let targetFramework = project.MsBuildProject.TargetFramework
125127
let opts = {
126128
\ 'ResponseHandler': funcref('s:run.process', [s:run.single.complete, bufnr, tests]),
129+
\ 'BufNum': bufnr,
127130
\ 'Parameters': {
128131
\ 'MethodName': currentTest.name,
129132
\ 'NoBuild': get(s:, 'nobuild', 0),
@@ -405,10 +408,10 @@ function! s:utils.extractTests(codeElements) abort
405408
endfunction
406409

407410
" Find the test in a list of tests that matches the current cursor position
408-
function! s:utils.findTest(tests, ...) abort
411+
function! s:utils.findTest(tests, testName) abort
409412
for test in a:tests
410-
if a:0
411-
if test.name ==# a:1
413+
if a:testName !=# ''
414+
if test.name ==# a:testName
412415
return test
413416
endif
414417
else
@@ -441,7 +444,8 @@ function! s:utils.init.extract(Callback, codeStructures) abort
441444
\ 'tests': s:utils.extractTests(cs[1])
442445
\}})
443446
call OmniSharp#testrunner#SetTests(bufferTests)
444-
call a:Callback(bufferTests)
447+
let dict = { 'f': a:Callback }
448+
call dict.f(bufferTests)
445449
endfunction
446450

447451
function! s:utils.log.echo(highlightGroup, message) abort

autoload/OmniSharp/testrunner.vim

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,28 @@ endfunction
2323

2424

2525
function! OmniSharp#testrunner#Run() abort
26+
let filename = ''
27+
let line = getline('.')
28+
if line =~# '^\a'
29+
" Project selected - run all tests
30+
let projectname = getline('.')
31+
for sln_or_dir in OmniSharp#proc#ListRunningJobs()
32+
let job = OmniSharp#proc#GetJob(sln_or_dir)
33+
if has_key(job, 'tests') && has_key(job.tests, projectname)
34+
call OmniSharp#actions#test#RunInFile(1, keys(job.tests[projectname]))
35+
endif
36+
endfor
37+
elseif line =~# '^ \f'
38+
" File selected
39+
let filename = trim(line)
40+
call OmniSharp#actions#test#RunInFile(0, filename)
41+
return
42+
else
43+
let test = s:utils.findTest()
44+
if has_key(test, 'filename')
45+
call OmniSharp#actions#test#Run(0, test.filename, test.name)
46+
endif
47+
endif
2648
endfunction
2749

2850

@@ -49,27 +71,10 @@ function! OmniSharp#testrunner#Navigate() abort
4971
endif
5072
endif
5173
if filename ==# ''
52-
" Search for test
53-
let testpattern = '[-|*!] \S'
54-
if line =~# testpattern
55-
let testline = line('.')
56-
else
57-
let testline = search(testpattern, 'bcnWz')
58-
endif
59-
if testline > 0
60-
let testname = matchlist(getline(testline), '[-|*!] \zs.*$')[0]
61-
let projectline = search('^\a', 'bcnWz')
62-
let projectname = matchlist(getline(projectline), '^\S\+')[0]
63-
let fileline = search('^ \f', 'bcnWz')
64-
let filename = matchlist(getline(fileline), '^ \zs.*$')[0]
65-
let filename = fnamemodify(filename, ':p')
66-
for sln_or_dir in OmniSharp#proc#ListRunningJobs()
67-
let job = OmniSharp#proc#GetJob(sln_or_dir)
68-
if has_key(job, 'tests') && has_key(job.tests, projectname)
69-
let lnum = job.tests[projectname][filename][testname].lnum
70-
break
71-
endif
72-
endfor
74+
let test = s:utils.findTest()
75+
if has_key(test, 'filename')
76+
let filename = test.filename
77+
let lnum = test.lnum
7378
endif
7479
endif
7580
endif
@@ -245,13 +250,15 @@ function! OmniSharp#testrunner#SetTests(bufferTests) abort
245250
let testproject = get(job.tests, projectname, {})
246251
let job.tests[projectname] = testproject
247252
let filename = fnamemodify(bufname(buffer.bufnr), ':p')
248-
let existing = get(testproject, filename, {})
249-
let testproject[filename] = existing
250-
for test in buffer.tests
251-
let extest = get(existing, test.name, { 'state': 'Not run' })
252-
let existing[test.name] = extest
253-
let extest.framework = test.framework
254-
let extest.lnum = test.nameRange.Start.Line
253+
let filetests = get(testproject, filename, {})
254+
let testproject[filename] = filetests
255+
for buffertest in buffer.tests
256+
let test = get(filetests, buffertest.name, { 'state': 'Not run' })
257+
let filetests[buffertest.name] = test
258+
let test.name = buffertest.name
259+
let test.filename = filename
260+
let test.framework = buffertest.framework
261+
let test.lnum = buffertest.nameRange.Start.Line
255262
endfor
256263
endfor
257264
call s:Open()
@@ -404,6 +411,32 @@ let s:utils.state2char = {
404411
\ 'Failed': '!'
405412
\}
406413

414+
function! s:utils.findTest() abort
415+
if &filetype !=# 'omnisharptest' | return {} | endif
416+
let testpattern = '[-|*!] \S'
417+
let line = getline('.')
418+
if line =~# testpattern
419+
let testline = line('.')
420+
else
421+
let testline = search(testpattern, 'bcnWz')
422+
endif
423+
if testline > 0
424+
let testname = matchlist(getline(testline), '[-|*!] \zs.*$')[0]
425+
let projectline = search('^\a', 'bcnWz')
426+
let projectname = matchlist(getline(projectline), '^\S\+')[0]
427+
let fileline = search('^ \f', 'bcnWz')
428+
let filename = matchlist(getline(fileline), '^ \zs.*$')[0]
429+
let filename = fnamemodify(filename, ':p')
430+
for sln_or_dir in OmniSharp#proc#ListRunningJobs()
431+
let job = OmniSharp#proc#GetJob(sln_or_dir)
432+
if has_key(job, 'tests') && has_key(job.tests, projectname)
433+
return job.tests[projectname][filename][testname]
434+
endif
435+
endfor
436+
endif
437+
return {}
438+
endfunction
439+
407440
function! s:utils.getProjectName(bufnr) abort
408441
let project = OmniSharp#GetHost(a:bufnr).project
409442
let msbuildproject = get(project, 'MsBuildProject', {})

0 commit comments

Comments
 (0)