1
1
let s: save_cpo = &cpoptions
2
2
set cpoptions &vim
3
3
4
- let s: state2char = {
5
- \ ' Not run' : ' |' ,
6
- \ ' Running' : ' -' ,
7
- \ ' Passed' : ' *' ,
8
- \ ' Failed' : ' !'
9
- \}
10
-
11
4
function ! OmniSharp#testrunner#Open () abort
12
5
if ! OmniSharp#actions#test#Validate () | return | endif
13
6
call s: Open ()
@@ -37,9 +30,6 @@ function s:Open() abort
37
30
botright new
38
31
endif
39
32
let s: testrunner_bufnr = bufnr ()
40
- silent setlocal noswapfile signcolumn = no conceallevel=3 concealcursor=nv
41
- setlocal comments = :# commentstring = #\ % s
42
- set bufhidden = hide
43
33
let &filetype = ft
44
34
execute ' file' title
45
35
call s: Paint ()
@@ -70,18 +60,28 @@ function! s:Paint() abort
70
60
call add (lines , ' ' )
71
61
72
62
for sln_or_dir in OmniSharp#proc#ListRunningJobs ()
73
- call add (lines , fnamemodify (sln_or_dir, ' :t' ))
74
63
let job = OmniSharp#proc#GetJob (sln_or_dir)
75
64
if ! has_key (job, ' tests' ) | continue | endif
76
- for testfile in keys (job.tests)
77
- call add (lines , ' ' . fnamemodify (testfile, ' :.' ))
78
- for name in keys (job.tests[testfile])
79
- let test = job.tests[testfile][name]
80
- let state = s: state2char [test.state ]
81
- call add (lines , printf (' %s %s' , state , name))
82
- if state == # ' -' && ! has_key (test, ' spintimer' )
83
- call s: SpinnerStart (test, len (lines ))
84
- endif
65
+ for testproject in sort (keys (job.tests))
66
+ call add (lines , testproject)
67
+ for testfile in sort (keys (job.tests[testproject]))
68
+ call add (lines , ' ' . fnamemodify (testfile, ' :.' ))
69
+ let tests = job.tests[testproject][testfile]
70
+ for name in sort (keys (tests), {a ,b - > tests[a ].lnum > tests[b ].lnum})
71
+ let test = tests[name]
72
+ let state = s: utils .state2char[test.state ]
73
+ call add (lines , printf (' %s %s' , state , name))
74
+ if state == # ' -' && ! has_key (test, ' spintimer' )
75
+ call s: spinner .start (test, len (lines ))
76
+ endif
77
+ let output = get (test, ' output' , [])
78
+ if len (output)
79
+ for outputline in output
80
+ call add (lines , ' // ' . outputline)
81
+ endfor
82
+ endif
83
+ endfor
84
+ call add (lines , ' __' )
85
85
endfor
86
86
endfor
87
87
call add (lines , ' ' )
@@ -93,54 +93,24 @@ function! s:Paint() abort
93
93
call setbufline (s: testrunner_bufnr , 1 , lines )
94
94
call setbufvar (s: testrunner_bufnr , ' &modifiable' , 0 )
95
95
call setbufvar (s: testrunner_bufnr , ' &modified' , 0 )
96
- if bufnr () == s: testrunner_bufnr |call winrestview (winview) | endif
97
- endfunction
98
-
99
- function ! s: SpinnerSpin (test, lnum, timer) abort
100
- if s: state2char [a: test .state ] !=# ' -'
101
- call timer_stop (a: timer )
102
- return
103
- endif
104
- let lines = getbufline (s: testrunner_bufnr , a: lnum )
105
- if len (lines ) == 0
106
- call timer_stop (a: timer )
107
- return
108
- endif
109
- let line = lines [0 ]
110
- let steps = get (g: , ' OmniSharp_testrunner_spinnersteps' , [
111
- \ ' <*---->' , ' <-*--->' , ' <--*-->' , ' <---*->' ,
112
- \ ' <----*>' , ' <---*->' , ' <--*-->' , ' <-*--->' ])
113
- if ! has_key (a: test .spinner, ' index' )
114
- let line .= ' -- ' . steps[0 ]
115
- let a: test .spinner.index = 0
116
- else
117
- let a: test .spinner.index += 1
118
- if a: test .spinner.index >= len (steps)
119
- let a: test .spinner.index = 0
120
- endif
121
- let line = substitute (line , ' -- \zs.*$' , steps[a: test .spinner.index ], ' ' )
96
+ if bufnr () == s: testrunner_bufnr
97
+ call winrestview (winview)
98
+ syn sync fromstart
122
99
endif
123
- call setbufvar (s: testrunner_bufnr , ' &modifiable' , 1 )
124
- call setbufline (s: testrunner_bufnr , a: lnum , line )
125
- call setbufvar (s: testrunner_bufnr , ' &modifiable' , 0 )
126
- call setbufvar (s: testrunner_bufnr , ' &modified' , 0 )
127
100
endfunction
128
101
129
- function ! s: SpinnerStart (test, lnum) abort
130
- let a: test .spinner = {}
131
- let a: test .spinner.timer = timer_start (300 ,
132
- \ funcref (' s:SpinnerSpin' , [a: test , a: lnum ]),
133
- \ {' repeat' : -1 })
134
- endfunction
135
102
136
103
function ! OmniSharp#testrunner#SetTests (bufferTests) abort
137
104
let winid = win_getid ()
138
105
for buffer in a: bufferTests
139
106
let job = OmniSharp#GetHost (buffer .bufnr ).job
140
107
let job.tests = get (job, ' tests' , {})
108
+ let projectname = s: utils .getProjectName (buffer .bufnr )
109
+ let testproject = get (job.tests, projectname, {})
110
+ let job.tests[projectname] = testproject
141
111
let filename = fnamemodify (bufname (buffer .bufnr ), ' :p' )
142
- let existing = get (job.tests , filename, {})
143
- let job.tests [filename] = existing
112
+ let existing = get (testproject , filename, {})
113
+ let testproject [filename] = existing
144
114
for test in buffer .tests
145
115
let extest = get (existing, test.name, { ' state' : ' Not run' })
146
116
let existing[test.name] = extest
@@ -152,13 +122,14 @@ function! OmniSharp#testrunner#SetTests(bufferTests) abort
152
122
call win_gotoid (winid)
153
123
endfunction
154
124
155
- function ! s: UpdateState (bufnr , testnames, state ) abort
156
- let job = OmniSharp#GetHost (a: bufnr ).job
125
+ function ! s: UpdateState (bufnr , testnames, state , output ) abort
126
+ let projectname = s: utils . getProjectName (a: bufnr )
157
127
let filename = fnamemodify (bufname (a: bufnr ), ' :p' )
158
- let tests = get ( job.tests, filename, {})
128
+ let tests = OmniSharp#GetHost ( a: bufnr ). job.tests[projectname][ filename]
159
129
for testname in a: testnames
160
130
if has_key (tests, testname)
161
131
let tests[testname].state = a: state
132
+ let tests[testname].output = a: output
162
133
endif
163
134
endfor
164
135
call s: Repaint ()
@@ -167,24 +138,90 @@ endfunction
167
138
function ! OmniSharp#testrunner#StateRunning (bufnr , testnames) abort
168
139
let testnames = type (a: testnames ) == type ([]) ? a: testnames : [a: testnames ]
169
140
let s: lasttestnames = testnames
170
- call s: UpdateState (a: bufnr , testnames, ' Running' )
141
+ call s: UpdateState (a: bufnr , testnames, ' Running' , [] )
171
142
endfunction
172
143
173
- function ! OmniSharp#testrunner#StateSkipped (bufnr , ... ) abort
174
- let testnames = a: 0 ? (type (a: 1 ) == type ([]) ? a: 1 : [a: 1 ]) : s: lasttestnames
175
- call s: UpdateState (a: bufnr , testnames, ' Not run' )
144
+ function ! OmniSharp#testrunner#StateComplete (location) abort
145
+ if get (a: location , ' type' , ' ' ) == # ' E'
146
+ let state = ' Failed'
147
+ elseif get (a: location , ' type' , ' ' ) == # ' W'
148
+ let state = ' Not run'
149
+ else
150
+ let state = ' Passed'
151
+ endif
152
+ let output = get (a: location , ' output' , [])
153
+ call s: UpdateState (a: .location.bufnr , [a: location .fullname], state , output)
176
154
endfunction
177
155
178
- function ! OmniSharp#testrunner#StatePassed (bufnr , ... ) abort
179
- let testnames = a: 0 ? (type (a: 1 ) == type ([]) ? a: 1 : [a: 1 ]) : s: lasttestnames
180
- call s: UpdateState (a: bufnr , testnames, ' Passed' )
156
+ function ! OmniSharp#testrunner#StateSkipped (bufnr ) abort
157
+ call s: UpdateState (a: bufnr , s: lasttestnames , ' Not run' , [])
181
158
endfunction
182
159
183
- function ! OmniSharp#testrunner#StateFailed (bufnr , ... ) abort
184
- let testnames = a: 0 ? (type (a: 1 ) == type ([]) ? a: 1 : [a: 1 ]) : s: lasttestnames
185
- call s: UpdateState (a: bufnr , testnames, ' Failed' )
160
+
161
+ let s: spinner = {}
162
+ let s: spinner .steps = get (g: , ' OmniSharp_testrunner_spinnersteps' , [
163
+ \ ' <*---->' ,
164
+ \ ' <-*--->' ,
165
+ \ ' <--*-->' ,
166
+ \ ' <---*->' ,
167
+ \ ' <----*>' ,
168
+ \ ' <---*->' ,
169
+ \ ' <--*-->' ,
170
+ \ ' <-*--->' ])
171
+
172
+ function ! s: spinner .spin (test, lnum, timer) abort
173
+ if s: utils .state2char[a: test .state ] !=# ' -'
174
+ call timer_stop (a: timer )
175
+ return
176
+ endif
177
+ let lines = getbufline (s: testrunner_bufnr , a: lnum )
178
+ if len (lines ) == 0
179
+ call timer_stop (a: timer )
180
+ return
181
+ endif
182
+ let line = lines [0 ]
183
+ if ! has_key (a: test .spinner, ' index' )
184
+ let line .= ' -- ' . s: spinner .steps[0 ]
185
+ let a: test .spinner.index = 0
186
+ else
187
+ let a: test .spinner.index += 1
188
+ if a: test .spinner.index >= len (s: spinner .steps)
189
+ let a: test .spinner.index = 0
190
+ endif
191
+ let step = s: spinner .steps[a: test .spinner.index ]
192
+ let line = substitute (line , ' -- \zs.*$' , step, ' ' )
193
+ endif
194
+ call setbufvar (s: testrunner_bufnr , ' &modifiable' , 1 )
195
+ call setbufline (s: testrunner_bufnr , a: lnum , line )
196
+ call setbufvar (s: testrunner_bufnr , ' &modifiable' , 0 )
197
+ call setbufvar (s: testrunner_bufnr , ' &modified' , 0 )
186
198
endfunction
187
199
200
+ function ! s: spinner .start (test, lnum) abort
201
+ if ! get (g: , ' OmniSharp_testrunner_spinner' , 1 ) | return | endif
202
+ let a: test .spinner = {}
203
+ let a: test .spinner.timer = timer_start (300 ,
204
+ \ funcref (' s:spinner.spin' , [a: test , a: lnum ], self ),
205
+ \ {' repeat' : -1 })
206
+ endfunction
207
+
208
+
209
+ let s: utils = {}
210
+
211
+ let s: utils .state2char = {
212
+ \ ' Not run' : ' |' ,
213
+ \ ' Running' : ' -' ,
214
+ \ ' Passed' : ' *' ,
215
+ \ ' Failed' : ' !'
216
+ \}
217
+
218
+ function ! s: utils .getProjectName (bufnr ) abort
219
+ let project = OmniSharp#GetHost (a: bufnr ).project
220
+ let msbuildproject = get (project, ' MsBuildProject' , {})
221
+ return get (msbuildproject, ' AssemblyName' , ' _Default' )
222
+ endfunction
223
+
224
+
188
225
let &cpoptions = s: save_cpo
189
226
unlet s: save_cpo
190
227
0 commit comments