# HG changeset patch # User Christian Brabandt # Date 1509818405 -3600 # Node ID 7f27e9769f62cf81e71c40e2ed32799888e1201a # Parent 50fd18c60c3d125b0fe12f0846f32c16bf9d7bd3 patch 8.0.1259: search test can be flaky commit https://github.com/vim/vim/commit/13deab8d08145c1f6e2a3e82cb547bc7f87a3686 Author: Bram Moolenaar Date: Sat Nov 4 18:48:43 2017 +0100 patch 8.0.1259: search test can be flaky Problem: Search test can be flaky. Solution: Use WaitFor() instead of a delay. Make it possible to pass a funcref to WaitFor() to avoid the need for global variables. (James McCoy, closes #2282) diff --git a/src/testdir/shared.vim b/src/testdir/shared.vim --- a/src/testdir/shared.vim +++ b/src/testdir/shared.vim @@ -113,7 +113,9 @@ func s:kill_server(cmd) endif endfunc -" Wait for up to a second for "expr" to become true. +" Wait for up to a second for "expr" to become true. "expr" can be a +" stringified expression to evaluate, or a funcref without arguments. +" " Return time slept in milliseconds. With the +reltime feature this can be " more than the actual waiting time. Without +reltime it can also be less. func WaitFor(expr, ...) @@ -124,8 +126,13 @@ func WaitFor(expr, ...) else let slept = 0 endif + if type(a:expr) == v:t_func + let Test = a:expr + else + let Test = {-> eval(a:expr) } + endif for i in range(timeout / 10) - if eval(a:expr) + if Test() if has('reltime') return float2nr(reltimefloat(reltime(start)) * 1000) endif diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -482,19 +482,17 @@ func Test_search_cmdline8() " Prepare buffer text let lines = ['abb vim vim vi', 'vimvivim'] call writefile(lines, 'Xsearch.txt') - let g:buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) + let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) - call term_wait(g:buf, 200) - call assert_equal(lines[0], term_getline(g:buf, 1)) - call assert_equal(lines[1], term_getline(g:buf, 2)) + call WaitFor({-> lines == [term_getline(buf, 1), term_getline(buf, 2)] }) - call term_sendkeys(g:buf, ":set incsearch hlsearch\") - call term_sendkeys(g:buf, ":14vsp\") - call term_sendkeys(g:buf, "/vim\") - call term_sendkeys(g:buf, "/b\") - call term_sendkeys(g:buf, "gg0") - call term_wait(g:buf, 500) - let screen_line = term_scrape(g:buf, 1) + call term_sendkeys(buf, ":set incsearch hlsearch\") + call term_sendkeys(buf, ":14vsp\") + call term_sendkeys(buf, "/vim\") + call term_sendkeys(buf, "/b\") + call term_sendkeys(buf, "gg0") + call term_wait(buf, 500) + let screen_line = term_scrape(buf, 1) let [a0,a1,a2,a3] = [screen_line[3].attr, screen_line[4].attr, \ screen_line[18].attr, screen_line[19].attr] call assert_notequal(a0, a1) @@ -607,19 +605,17 @@ func Test_search_cmdline_incsearch_highl endif " Prepare buffer text - let g:lines = ['abb vim vim vi', 'vimvivim'] - call writefile(g:lines, 'Xsearch.txt') - let g:buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) - call WaitFor('g:lines[0] == term_getline(g:buf, 1)') - call assert_equal(g:lines[0], term_getline(g:buf, 1)) - call assert_equal(g:lines[1], term_getline(g:buf, 2)) - unlet g:lines + let lines = ['abb vim vim vi', 'vimvivim'] + call writefile(lines, 'Xsearch.txt') + let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) + + call WaitFor({-> lines == [term_getline(buf, 1), term_getline(buf, 2)] }) " Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight - call term_sendkeys(g:buf, ":set incsearch hlsearch\") - call term_sendkeys(g:buf, '/b') - call term_wait(g:buf, 200) - let screen_line1 = term_scrape(g:buf, 1) + call term_sendkeys(buf, ":set incsearch hlsearch\") + call term_sendkeys(buf, '/b') + call term_wait(buf, 200) + let screen_line1 = term_scrape(buf, 1) call assert_true(len(screen_line1) > 2) " a0: attr_normal let a0 = screen_line1[0].attr @@ -630,53 +626,53 @@ func Test_search_cmdline_incsearch_highl call assert_notequal(a0, a1) call assert_notequal(a0, a2) call assert_notequal(a1, a2) - call term_sendkeys(g:buf, "\gg0") + call term_sendkeys(buf, "\gg0") " Test incremental highlight search - call term_sendkeys(g:buf, "/vim") - call term_wait(g:buf, 200) + call term_sendkeys(buf, "/vim") + call term_wait(buf, 200) " Buffer: " abb vim vim vi " vimvivim " Search: /vim let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a2,a2,a2,a0,a0,a0] let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] - call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr')) - call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) " Test - call term_sendkeys(g:buf, "\\") - call term_wait(g:buf, 200) + call term_sendkeys(buf, "\\") + call term_wait(buf, 200) let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] let attr_line2 = [a1,a1,a1,a0,a0,a2,a2,a2] - call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr')) - call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) " Test - call term_sendkeys(g:buf, "\") - call term_wait(g:buf, 200) + call term_sendkeys(buf, "\") + call term_wait(buf, 200) let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a1,a1,a1,a0,a0,a0] let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] - call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr')) - call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) " Type Enter and a1(incsearch highlight) should become a2(hlsearch highlight) - call term_sendkeys(g:buf, "\") - call term_wait(g:buf, 200) + call term_sendkeys(buf, "\") + call term_wait(buf, 200) let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] - call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr')) - call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) " Test nohlsearch. a2(hlsearch highlight) should become a0(normal highlight) - call term_sendkeys(g:buf, ":1\") - call term_sendkeys(g:buf, ":set nohlsearch\") - call term_sendkeys(g:buf, "/vim") - call term_wait(g:buf, 200) + call term_sendkeys(buf, ":1\") + call term_sendkeys(buf, ":set nohlsearch\") + call term_sendkeys(buf, "/vim") + call term_wait(buf, 200) let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a0,a0,a0,a0,a0,a0] let attr_line2 = [a0,a0,a0,a0,a0,a0,a0,a0] - call assert_equal(attr_line1, map(term_scrape(g:buf, 1)[:len(attr_line1)-1], 'v:val.attr')) - call assert_equal(attr_line2, map(term_scrape(g:buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) call delete('Xsearch.txt') call delete('Xsearch.txt') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1259, +/**/ 1258, /**/ 1257,