@@ -4,12 +4,18 @@ set cpoptions&vim
44
55let s: current = get (s: , ' current' , {})
66let s: runner = get (s: , ' runner' , {})
7+ let s: tests = get (s: , ' tests' , {})
8+
9+ " Expose s:tests for custom scripting
10+ function ! OmniSharp#testrunner#GetTests () abort
11+ return s: tests
12+ endfunction
713
814
915function ! OmniSharp#testrunner#Debug () abort
1016 let filename = ' '
1117 let line = getline (' .' )
12- if line = ~# ' ^\a ' || line = ~# ' ^ \f'
18+ if line = ~# ' ^; ' || line = ~# ' ^ \f'
1319 return s: utils .log .warn (' Select a test to debug' )
1420 else
1521 let test = s: utils .findTest ()
@@ -35,17 +41,12 @@ endfunction
3541function ! OmniSharp#testrunner#Run () abort
3642 let filename = ' '
3743 let line = getline (' .' )
38- if line = ~# ' ^\a '
44+ if line = ~# ' ^; '
3945 " Project selected - run all tests
40- let projectname = getline (' .' )
41- for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
42- let job = OmniSharp#proc#GetJob (sln_or_dir)
43- if has_key (job, ' tests' ) && has_key (job.tests, projectname)
44- let filenames = filter (keys (job.tests[projectname]),
45- \ {_,f - > ! get (job.tests[projectname][f ], ' __OmniSharp__removed' )})
46- call OmniSharp#actions#test#RunInFile (1 , filenames)
47- endif
48- endfor
46+ let projectname = matchlist (getline (' .' ), ' ^\S\+' )[0 ]
47+ let filenames = filter (keys (s: tests [projectname].files ),
48+ \ {_,f - > s: tests [projectname].files [f ].visible})
49+ call OmniSharp#actions#test#RunInFile (1 , filenames)
4950 elseif line = ~# ' ^ \f'
5051 " File selected
5152 let filename = trim (line )
@@ -63,31 +64,19 @@ endfunction
6364function ! OmniSharp#testrunner#Remove () abort
6465 let filename = ' '
6566 let line = getline (' .' )
66- if line = ~# ' ^\a '
67+ if line = ~# ' ^; '
6768 " Project selected - run all tests
68- let projectname = getline (' .' )
69- for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
70- let job = OmniSharp#proc#GetJob (sln_or_dir)
71- if has_key (job, ' tests' ) && has_key (job.tests, projectname)
72- let job.tests[projectname].__OmniSharp__removed = 1
73- break
74- endif
75- endfor
69+ let projectname = matchlist (getline (' .' ), ' ^\S\+' )[0 ]
70+ let s: tests [projectname].visible = 0
7671 elseif line = ~# ' ^ \f'
7772 " File selected
7873 let filename = fnamemodify (trim (line ), ' :p' )
79- let projectline = search (' ^\a ' , ' bcnWz' )
74+ let projectline = search (' ^; ' , ' bcnWz' )
8075 let projectname = matchlist (getline (projectline), ' ^\S\+' )[0 ]
81- for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
82- let job = OmniSharp#proc#GetJob (sln_or_dir)
83- if has_key (job, ' tests' ) && has_key (job.tests, projectname)
84- let job.tests[projectname][filename].__OmniSharp__removed = 1
85- break
86- endif
87- endfor
76+ let s: tests [projectname].files [filename].visible = 0
8877 else
8978 let test = s: utils .findTest ()
90- let test.__OmniSharp__removed = 1
79+ let test.state = ' hidden '
9180 endif
9281 call s: Paint ()
9382endfunction
@@ -100,7 +89,7 @@ function! OmniSharp#testrunner#Navigate() abort
10089 let lnum = -1
10190 let col = -1
10291 let line = getline (' .' )
103- if line = ~# ' ^\a '
92+ if line = ~# ' ^; '
10493 " Project selected - do nothing
10594 elseif line = ~# ' ^ \f'
10695 " File selected
@@ -216,64 +205,63 @@ function! s:Paint() abort
216205 call add (lines , repeat (delimiter , 80 ))
217206 endif
218207
219- for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
220- let job = OmniSharp#proc#GetJob (sln_or_dir)
221- if ! has_key (job, ' tests' ) | continue | endif
222- for testproject in sort (keys (job.tests))
223- if get (job.tests[testproject], ' __OmniSharp__removed' ) | continue | endif
224- let errors = get (get (job, ' testerrors' , {}), testproject, [])
225- call add (lines , testproject . (len (errors) ? ' - ERROR' : ' ' ))
226- for errorline in errors
227- call add (lines , ' < ' . trim (errorline, ' ' , 2 ))
228- endfor
229- let loglevel = get (g: , ' OmniSharp_testrunner_loglevel' , ' error' )
230- if loglevel == ? ' all' || (loglevel == ? ' error' && len (errors))
231- " The diagnostic logs (build output) are only displayed when a single file
232- " is tested, otherwise multiple build outputs are intermingled
233- if OmniSharp#GetHost (s: current .singlebuffer).sln_or_dir == # sln_or_dir
234- if len (errors) > 0 && len (s: current .log ) > 1
208+ for key in sort (keys (s: tests ))
209+ let [assembly, sln] = split (key , ' ;' )
210+ if ! s: tests [key ].visible | continue | endif
211+ call add (lines , key . (len (s: tests [key ].errors) ? ' ERROR' : ' ' ))
212+ for errorline in s: tests [key ].errors
213+ call add (lines , ' < ' . trim (errorline, ' ' , 2 ))
214+ endfor
215+ let loglevel = get (g: , ' OmniSharp_testrunner_loglevel' , ' error' )
216+ if loglevel == ? ' all' || (loglevel == ? ' error' && len (s: tests [key ].errors))
217+ " The diagnostic logs (build output) are only displayed when a single file
218+ " is tested, otherwise multiple build outputs are intermingled
219+ if s: current .singlebuffer != -1
220+ let [ssln, sass, _] = s: utils .getProject (s: current .singlebuffer)
221+ if ssln == # sln && sass == # assembly
222+ if len (s: tests [key ].errors) > 0 && len (s: current .log ) > 1
235223 call add (lines , ' < ' . repeat (delimiter , 10 ))
236224 endif
237225 for log in s: current .log
238226 call add (lines , ' < ' . trim (log , ' ' , 2 ))
239227 endfor
240228 endif
241229 endif
242- for testfile in sort (keys (job.tests[testproject]))
243- let tests = job.tests[testproject][testfile]
244- if get (tests, ' __OmniSharp__removed' ) | continue | endif
245- call add (lines , ' ' . fnamemodify (testfile, ' :.' ))
246- for name in sort (keys (tests), {a ,b - > tests[a ].lnum > tests[b ].lnum})
247- let test = tests[name]
248- if get (test, ' __OmniSharp__removed' ) | continue | endif
249- let state = s: utils .state2char[test.state ]
250- call add (lines , printf (' %s %s' , state , name))
251- if state == # ' -' && ! has_key (test, ' spintimer' )
252- call s: spinner .start (test, len (lines ))
230+ endif
231+ for testfile in sort (keys (s: tests [key ].files ))
232+ if ! s: tests [key ].files [testfile].visible | continue | endif
233+ let tests = s: tests [key ].files [testfile].tests
234+ call add (lines , ' ' . fnamemodify (testfile, ' :.' ))
235+ for name in sort (keys (tests), {a ,b - > tests[a ].lnum > tests[b ].lnum})
236+ let test = tests[name]
237+ if test.state == # ' hidden' | continue | endif
238+ let state = s: utils .state2char[test.state ]
239+ call add (lines , printf (' %s %s' , state , name))
240+ if state == # ' -' && ! has_key (test, ' spintimer' )
241+ call s: spinner .start (test, len (lines ))
242+ endif
243+ for messageline in get (test, ' message' , [])
244+ call add (lines , ' > ' . trim (messageline, ' ' , 2 ))
245+ endfor
246+ for stacktraceline in get (test, ' stacktrace' , [])
247+ let line = trim (stacktraceline.text)
248+ if has_key (stacktraceline, ' filename' )
249+ let line = ' __ ' . line . ' ___ ' . stacktraceline.filename . ' __ '
250+ else
251+ let line = ' _._ ' . line . ' _._ '
253252 endif
254- for messageline in get (test, ' message' , [])
255- call add (lines , ' > ' . trim (messageline, ' ' , 2 ))
256- endfor
257- for stacktraceline in get (test, ' stacktrace' , [])
258- let line = trim (stacktraceline.text)
259- if has_key (stacktraceline, ' filename' )
260- let line = ' __ ' . line . ' ___ ' . stacktraceline.filename . ' __ '
261- else
262- let line = ' _._ ' . line . ' _._ '
263- endif
264- if has_key (stacktraceline, ' lnum' )
265- let line .= ' line ' . stacktraceline.lnum
266- endif
267- call add (lines , ' > ' . line )
268- endfor
269- for outputline in get (test, ' output' , [])
270- call add (lines , ' // ' . trim (outputline, ' ' , 2 ))
271- endfor
253+ if has_key (stacktraceline, ' lnum' )
254+ let line .= ' line ' . stacktraceline.lnum
255+ endif
256+ call add (lines , ' > ' . line )
257+ endfor
258+ for outputline in get (test, ' output' , [])
259+ call add (lines , ' // ' . trim (outputline, ' ' , 2 ))
272260 endfor
273- call add (lines , ' __' )
274261 endfor
275- call add (lines , ' ' )
262+ call add (lines , ' __ ' )
276263 endfor
264+ call add (lines , ' ' )
277265 endfor
278266
279267 if bufnr () == s: runner .bufnr | let winview = winsaveview () | endif
@@ -318,29 +306,22 @@ endfunction
318306function ! OmniSharp#testrunner#SetTests (bufferTests) abort
319307 let winid = win_getid ()
320308 for buffer in a: bufferTests
321- let job = OmniSharp#GetHost (buffer .bufnr ).job
322- let job.tests = get (job, ' tests' , {})
323- let projectname = s: utils .getProjectName (buffer .bufnr )
324- let testproject = get (job.tests, projectname, {})
325- if has_key (testproject, ' __OmniSharp__removed' )
326- unlet testproject.__OmniSharp__removed
327- endif
328- let job.tests[projectname] = testproject
309+ let [sln, assembly, key ] = s: utils .getProject (buffer .bufnr )
310+ let project = get (s: tests , key , { ' files' : {}, ' errors' : [] })
311+ let project.visible = 1
312+ let s: tests [key ] = project
329313 let filename = fnamemodify (bufname (buffer .bufnr ), ' :p' )
330- let filetests = get (testproject, filename, {})
331- if has_key (testproject, ' __OmniSharp__removed' )
332- unlet testproject.__OmniSharp__removed
333- endif
334- let testproject[filename] = filetests
314+ let testfile = get (project.files , filename, { ' tests' : {} })
315+ let testfile.visible = 1
316+ let project.files [filename] = testfile
335317 for buffertest in buffer .tests
336- let test = get (filetests, buffertest.name, { ' state' : ' Not run' })
337- if has_key (test, ' __OmniSharp__removed' )
338- unlet test.__OmniSharp__removed
339- endif
340- let filetests[buffertest.name] = test
341- let test.name = buffertest.name
318+ let name = buffertest.name
319+ let test = get (testfile.tests, name, { ' state' : ' Not run' })
320+ let testfile.tests[name] = test
321+ let test.name = name
342322 let test.filename = filename
343- let test.projectname = projectname
323+ let test.assembly = assembly
324+ let test.sln = sln
344325 let test.framework = buffertest.framework
345326 let test.lnum = buffertest.nameRange.Start.Line
346327 endfor
@@ -352,12 +333,10 @@ endfunction
352333
353334function ! s: UpdateState (bufnr , state , ... ) abort
354335 let opts = a: 0 ? a: 1 : {}
355- let job = OmniSharp#GetHost (a: bufnr ).job
356- let projectname = s: utils .getProjectName (a: bufnr )
357- let job.testerrors = get (job, ' testerrors' , {})
358- let job.testerrors[projectname] = get (opts, ' errors' , [])
336+ let [sln, assembly, key ] = s: utils .getProject (a: bufnr )
337+ let s: tests [key ].errors = get (opts, ' errors' , [])
359338 let filename = fnamemodify (bufname (a: bufnr ), ' :p' )
360- let tests = job. tests[projectname] [filename]
339+ let tests = s: tests [key ]. files [filename].tests
361340 for testname in get (opts, ' testnames' , s: current .testnames[a: bufnr ])
362341 if has_key (tests, testname)
363342 let stacktrace = []
@@ -507,25 +486,22 @@ function! s:utils.findTest() abort
507486 endif
508487 if testline > 0
509488 let testname = matchlist (getline (testline), ' [-|*!] \zs.*$' )[0 ]
510- let projectline = search (' ^\a ' , ' bcnWz' )
489+ let projectline = search (' ^; ' , ' bcnWz' )
511490 let projectname = matchlist (getline (projectline), ' ^\S\+' )[0 ]
512491 let fileline = search (' ^ \f' , ' bcnWz' )
513492 let filename = matchlist (getline (fileline), ' ^ \zs.*$' )[0 ]
514493 let filename = fnamemodify (filename, ' :p' )
515- for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
516- let job = OmniSharp#proc#GetJob (sln_or_dir)
517- if has_key (job, ' tests' ) && has_key (job.tests, projectname)
518- return job.tests[projectname][filename][testname]
519- endif
520- endfor
494+ return s: tests [projectname].files [filename].tests[testname]
521495 endif
522496 return {}
523497endfunction
524498
525- function ! s: utils .getProjectName (bufnr ) abort
526- let project = OmniSharp#GetHost (a: bufnr ).project
527- let msbuildproject = get (project, ' MsBuildProject' , {})
528- return get (msbuildproject, ' AssemblyName' , ' _Default' )
499+ function ! s: utils .getProject (bufnr ) abort
500+ let host = OmniSharp#GetHost (a: bufnr )
501+ let msbuildproject = get (host.project, ' MsBuildProject' , {})
502+ let sln = host.sln_or_dir
503+ let assembly = get (msbuildproject, ' AssemblyName' , ' _Default' )
504+ return [sln, assembly, printf (' ;%s;%s;' , assembly, sln)]
529505endfunction
530506
531507function ! s: utils .log .echo (highlightGroup, message) abort
0 commit comments