Skip to content

Commit 63e832b

Browse files
committed
feat: process in batches
BREAKING CHANGE: Process functions accept lists In preparation for suite testing, the process functions have changed to accept lists instead of single tests/results. This greatly improves the performance of the summary and diagnostics.
1 parent 3eada6b commit 63e832b

File tree

11 files changed

+291
-209
lines changed

11 files changed

+291
-209
lines changed

autoload/ultest/adapter.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function! ultest#adapter#build_cmd(test, scope) abort
1717
execute 'cd' g:test#project_root
1818
endif
1919
let a:test.file = fnamemodify(a:test.file, get(g:, "test#filename_modifier", ":."))
20-
call ultest#process#pre(a:test)
20+
call ultest#process#pre([a:test])
2121
let runner = test#determine_runner(a:test.file)
2222
let executable = test#base#executable(runner)
2323

autoload/ultest/process.vim

Lines changed: 99 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -19,75 +19,116 @@ function! s:CallProcessor(event, args) abort
1919
endfor
2020
endfunction
2121

22-
function ultest#process#new(test) abort
23-
call ultest#process#pre(a:test)
24-
if index(g:ultest_buffers, a:test.file) == -1
25-
let g:ultest_buffers = add(g:ultest_buffers, a:test.file)
26-
endif
27-
let tests = getbufvar(a:test.file, "ultest_tests", {})
28-
let tests[a:test.id] = a:test
29-
call s:CallProcessor("new", [a:test])
22+
function! s:UpdateBufferTests(tests) abort
23+
let new_tests = {}
24+
for test in a:tests
25+
if index(g:ultest_buffers, test.file) == -1
26+
let g:ultest_buffers = add(g:ultest_buffers, test.file)
27+
endif
28+
if !has_key(new_tests, test.file)
29+
let new_tests[test.file] = {}
30+
endif
31+
let new_tests[test.file][test.id] = test
32+
endfor
33+
for [file, new_file_tests] in items(new_tests)
34+
let tests = getbufvar(file, "ultest_tests", {})
35+
call extend(tests, new_file_tests)
36+
endfor
3037
endfunction
3138

32-
function ultest#process#start(test) abort
33-
call ultest#process#pre(a:test)
34-
let tests = getbufvar(a:test.file, "ultest_tests", {})
35-
let tests[a:test.id] = a:test
36-
let results = getbufvar(a:test.file, "ultest_results")
37-
if has_key(results, a:test.id)
38-
call remove(results, a:test.id)
39-
endif
40-
call s:CallProcessor("start", [a:test])
39+
function! s:UpdateBufferResults(results) abort
40+
let new_results = {}
41+
for result in a:results
42+
if !has_key(new_results, result.file)
43+
let new_results[result.file] = {}
44+
endif
45+
let new_results[result.file][result.id] = result
46+
endfor
47+
for [file, new_file_results] in items(new_results)
48+
let tests = getbufvar(file, "ultest_results", {})
49+
call extend(tests, new_file_results)
50+
endfor
4151
endfunction
4252

43-
function ultest#process#move(test) abort
44-
call ultest#process#pre(a:test)
45-
let tests = getbufvar(a:test.file, "ultest_tests")
46-
let tests[a:test.id] = a:test
47-
call s:CallProcessor("move", [a:test])
53+
function! s:ClearTests(tests) abort
54+
for test in a:tests
55+
let buf_tests = getbufvar(test.file, "ultest_tests")
56+
if has_key(buf_tests, test.id)
57+
call remove(buf_tests, test.id)
58+
endif
59+
endfor
4860
endfunction
4961

50-
function ultest#process#replace(test, result) abort
51-
call ultest#process#pre(a:test)
52-
let tests = getbufvar(a:test.file, "ultest_tests")
53-
let tests[a:test.id] = a:test
54-
let results = getbufvar(a:result.file, "ultest_results")
55-
let results[a:result.id] = a:result
56-
call s:CallProcessor("replace", [a:result])
62+
function! s:ClearTestResults(tests) abort
63+
for test in a:tests
64+
let results = getbufvar(test.file, "ultest_results")
65+
if has_key(results, test.id)
66+
call remove(results, test.id)
67+
endif
68+
endfor
5769
endfunction
5870

59-
function ultest#process#clear(test) abort
60-
call ultest#process#pre(a:test)
61-
let tests = getbufvar(a:test.file, "ultest_tests")
62-
if has_key(tests, a:test.id)
63-
call remove(tests, a:test.id)
64-
endif
65-
let results = getbufvar(a:test.file, "ultest_results")
66-
if has_key(results, a:test.id)
67-
call remove(results, a:test.id)
68-
endif
69-
call s:CallProcessor("clear", [a:test])
71+
function! s:SeparateTestAndResults(combined) abort
72+
let tests = []
73+
let results = []
74+
for [test, result] in a:combined
75+
call add(tests, test)
76+
call add(results, result)
77+
endfor
78+
return [tests, results]
7079
endfunction
7180

72-
function ultest#process#exit(test, result) abort
73-
call ultest#process#pre(a:test)
74-
if !has_key(getbufvar(a:result.file, "ultest_tests", {}), a:result.id)
75-
return
76-
endif
77-
let tests = getbufvar(a:test.file, "ultest_tests", {})
78-
let tests[a:test.id] = a:test
79-
let results = getbufvar(a:result.file, "ultest_results")
80-
let results[a:result.id] = a:result
81-
call s:CallProcessor("exit", [a:result])
81+
function ultest#process#new(tests) abort
82+
call ultest#process#pre(a:tests)
83+
call s:UpdateBufferTests(a:tests)
84+
call s:CallProcessor("new", [a:tests])
85+
endfunction
86+
87+
function ultest#process#start(tests) abort
88+
call ultest#process#pre(a:tests)
89+
call s:UpdateBufferTests(a:tests)
90+
call s:ClearTestResults(a:tests)
91+
call s:CallProcessor("start", [a:tests])
92+
endfunction
93+
94+
function ultest#process#move(tests) abort
95+
call ultest#process#pre(a:tests)
96+
call s:UpdateBufferTests(a:tests)
97+
call s:CallProcessor("move", [a:tests])
98+
endfunction
99+
100+
function ultest#process#replace(combined) abort
101+
let [tests, results] = s:SeparateTestAndResults(a:combined)
102+
call ultest#process#pre(tests)
103+
call s:UpdateBufferTests(tests)
104+
call s:UpdateBufferResults(results)
105+
call s:CallProcessor("replace", [results])
82106
endfunction
83107

84-
function ultest#process#pre(test) abort
85-
if type(a:test.name) == v:t_list
86-
if exists("*list2str")
87-
let newName = list2str(a:test.name)
88-
else
89-
let newName = join(map(a:test.name, {nr, val -> nr2char(val)}), '')
108+
function ultest#process#clear(tests) abort
109+
call ultest#process#pre(a:tests)
110+
call s:ClearTests(a:tests)
111+
call s:ClearTestResults(a:tests)
112+
call s:CallProcessor("clear", [a:tests])
113+
endfunction
114+
115+
function ultest#process#exit(combined) abort
116+
let [tests, results] = s:SeparateTestAndResults(a:combined)
117+
call ultest#process#pre(tests)
118+
call s:UpdateBufferTests(tests)
119+
call s:UpdateBufferResults(results)
120+
call s:CallProcessor("exit", [results])
121+
endfunction
122+
123+
function ultest#process#pre(tests) abort
124+
for test in a:tests
125+
if type(test.name) == v:t_list
126+
if exists("*list2str")
127+
let newName = list2str(test.name)
128+
else
129+
let newName = join(map(test.name, {nr, val -> nr2char(val)}), '')
130+
endif
131+
let test.name = newName
90132
endif
91-
let a:test.name = newName
92-
endif
133+
endfor
93134
endfunction

autoload/ultest/signs.vim

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,42 @@
1-
function! ultest#signs#move(test) abort
2-
if (a:test.type != "test") | return | endif
3-
let result = get(getbufvar(a:test.file, "ultest_results"), a:test.id, {})
4-
if result != {}
5-
call ultest#signs#process(result)
6-
else
7-
call ultest#signs#start(a:test)
8-
endif
1+
function! ultest#signs#move(tests) abort
2+
for test in a:tests
3+
if (test.type != "test") | continue | endif
4+
let result = get(getbufvar(test.file, "ultest_results"), test.id, {})
5+
if result != {}
6+
call ultest#signs#process([result])
7+
else
8+
call ultest#signs#start([test])
9+
endif
10+
endfor
911
endfunction
1012

11-
function! ultest#signs#start(test) abort
12-
if (a:test.type != "test") | return | endif
13-
call ultest#signs#unplace(a:test)
14-
if !a:test.running | return | endif
13+
function! ultest#signs#start(tests) abort
14+
for test in a:tests
15+
if (test.type != "test") | continue | endif
16+
call ultest#signs#unplace([test])
17+
if !test.running | continue | endif
1518
if s:UseVirtual()
16-
call s:PlaceVirtualText(a:test, g:ultest_running_text, "UltestRunning")
19+
call s:PlaceVirtualText(test, g:ultest_running_text, "UltestRunning")
1720
else
18-
call s:PlaceSign(a:test, "test_running")
21+
call s:PlaceSign(test, "test_running")
1922
endif
23+
endfor
2024
endfunction
2125

22-
function! ultest#signs#process(result) abort
23-
let test = getbufvar(a:result.file, "ultest_tests")[a:result.id]
24-
if (test.type != "test") | return | endif
25-
call ultest#signs#unplace(test)
26+
function! ultest#signs#process(results) abort
27+
for result in a:results
28+
let test = getbufvar(result.file, "ultest_tests")[result.id]
29+
if (test.type != "test") | continue | endif
30+
call ultest#signs#unplace([test])
2631
if s:UseVirtual()
27-
let text_highlight = a:result.code ? "UltestFail" : "UltestPass"
28-
let text = a:result.code ? g:ultest_fail_text : g:ultest_pass_text
32+
let text_highlight = result.code ? "UltestFail" : "UltestPass"
33+
let text = result.code ? g:ultest_fail_text : g:ultest_pass_text
2934
call s:PlaceVirtualText(test, text, text_highlight)
3035
else
31-
let test_icon = a:result.code ? "test_fail" : "test_pass"
36+
let test_icon = result.code ? "test_fail" : "test_pass"
3237
call s:PlaceSign(test, test_icon)
3338
endif
39+
endfor
3440
endfunction
3541

3642
function! s:UseVirtual() abort
@@ -48,15 +54,17 @@ function! s:PlaceVirtualText(test, text, highlight) abort
4854
call nvim_buf_set_virtual_text(buffer, namespace, str2nr(a:test.line) - 1, [[a:text, a:highlight]], {})
4955
endfunction
5056

51-
function! ultest#signs#unplace(test)
52-
if (a:test.type != "test") | return | endif
57+
function! ultest#signs#unplace(tests)
58+
for test in a:tests
59+
if (test.type != "test") | continue | endif
5360
if s:UseVirtual()
54-
let namespace = s:GetNamespace(a:test)
61+
let namespace = s:GetNamespace(test)
5562
call nvim_buf_clear_namespace(0, namespace, 0, -1)
5663
else
57-
call sign_unplace(a:test.id, {"buffer": a:test.file})
64+
call sign_unplace(test.id, {"buffer": test.file})
5865
redraw
5966
endif
67+
endfor
6068
endfunction
6169

6270
function! s:GetNamespace(test)

autoload/ultest/statusline.vim

Lines changed: 0 additions & 17 deletions
This file was deleted.

autoload/ultest/summary.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function! ultest#summary#toggle(jump) abort
6060
endif
6161
endfunction
6262

63-
function! ultest#summary#render(test) abort
63+
function! ultest#summary#render(...) abort
6464
if s:IsOpen()
6565
call s:RenderSummary()
6666
endif

0 commit comments

Comments
 (0)