Patch 8.0.1771
Problem:    In tests, when WaitFor() fails it doesn't say why. (James McCoy)
Solution:   Add WaitForAssert(), which produces an assert error when it fails.
Files:      src/testdir/shared.vim, src/testdir/test_terminal.vim,
            src/testdir/screendump.vim, src/testdir/test_autocmd.vim,
            src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
            src/testdir/test_job_fails.vim


*** ../vim-8.0.1770/src/testdir/shared.vim      2018-04-11 20:53:45.765218228 
+0200
--- src/testdir/shared.vim      2018-04-28 19:05:09.304805196 +0200
***************
*** 115,152 ****
  
  " Wait for up to five seconds for "expr" to become true.  "expr" can be a
  " stringified expression to evaluate, or a funcref without arguments.
  " A second argument can be used to specify a different timeout in msec.
  "
! " 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, ...)
    let timeout = get(a:000, 0, 5000)
    " using reltime() is more accurate, but not always available
    if has('reltime')
      let start = reltime()
-   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 Test()
!       if has('reltime')
!       return float2nr(reltimefloat(reltime(start)) * 1000)
!       endif
        return slept
      endif
!     if !has('reltime')
!       let slept += 10
      endif
      sleep 10m
!   endfor
!   throw 'WaitFor() timed out after ' . timeout . ' msec'
  endfunc
  
  " Wait for up to a given milliseconds.
  " With the +timers feature this waits for key-input by getchar(), Resume()
  " feeds key-input and resumes process. Return time waited in milliseconds.
--- 115,194 ----
  
  " Wait for up to five seconds for "expr" to become true.  "expr" can be a
  " stringified expression to evaluate, or a funcref without arguments.
+ " Using a lambda works best.  Example:
+ "     call WaitFor({-> status == "ok"})
+ "
  " A second argument can be used to specify a different timeout in msec.
  "
! " When successful the time slept is returned.
! " When running into the timeout an exception is thrown, thus the function does
! " not return.
  func WaitFor(expr, ...)
    let timeout = get(a:000, 0, 5000)
+   let slept = s:WaitForCommon(a:expr, v:null, timeout)
+   if slept < 0
+     throw 'WaitFor() timed out after ' . timeout . ' msec'
+   endif
+   return slept
+ endfunc
+ 
+ " Wait for up to five seconds for "assert" to return zero.  "assert" must be a
+ " (lambda) function containing one assert function.  Example:
+ "     call WaitForAssert({-> assert_equal("dead", job_status(job)})
+ "
+ " A second argument can be used to specify a different timeout in msec.
+ "
+ " Return zero for success, one for failure (like the assert function).
+ func WaitForAssert(assert, ...)
+   let timeout = get(a:000, 0, 5000)
+   if s:WaitForCommon(v:null, a:assert, timeout) < 0
+     return 1
+   endif
+   return 0
+ endfunc
+ 
+ " Common implementation of WaitFor() and WaitForAssert().
+ " Either "expr" or "assert" is not v:null
+ " Return the waiting time for success, -1 for failure.
+ func s:WaitForCommon(expr, assert, timeout)
    " using reltime() is more accurate, but not always available
+   let slept = 0
    if has('reltime')
      let start = reltime()
    endif
! 
!   while 1
!     if type(a:expr) == v:t_func
!       let success = a:expr()
!     elseif type(a:assert) == v:t_func
!       let success = a:assert() == 0
!     else
!       let success = eval(a:expr)
!     endif
!     if success
        return slept
      endif
! 
!     if slept >= a:timeout
!       break
      endif
+     if type(a:assert) == v:t_func
+       " Remove the error added by the assert function.
+       call remove(v:errors, -1)
+     endif
+ 
      sleep 10m
!     if has('reltime')
!       let slept = float2nr(reltimefloat(reltime(start)) * 1000)
!     else
!       let slept += 10
!     endif
!   endwhile
! 
!   return -1  " timed out
  endfunc
  
+ 
  " Wait for up to a given milliseconds.
  " With the +timers feature this waits for key-input by getchar(), Resume()
  " feeds key-input and resumes process. Return time waited in milliseconds.
*** ../vim-8.0.1770/src/testdir/test_terminal.vim       2018-04-21 
23:34:38.522654097 +0200
--- src/testdir/test_terminal.vim       2018-04-28 19:01:35.566204828 +0200
***************
*** 83,90 ****
    let buf = Run_shell_in_terminal({})
    call assert_fails(buf . 'bwipe', 'E517')
    exe buf . 'bwipe!'
!   call WaitFor('job_status(g:job) == "dead"')
!   call assert_equal('dead', job_status(g:job))
    call assert_equal("", bufname(buf))
  
    unlet g:job
--- 83,89 ----
    let buf = Run_shell_in_terminal({})
    call assert_fails(buf . 'bwipe', 'E517')
    exe buf . 'bwipe!'
!   call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
    call assert_equal("", bufname(buf))
  
    unlet g:job
***************
*** 100,106 ****
    call assert_equal('run', job_status(g:job))
  
    quit!
!   call WaitFor('job_status(g:job) == "dead"')
    call assert_equal('dead', job_status(g:job))
  
    exe buf . 'bwipe'
--- 99,105 ----
    call assert_equal('run', job_status(g:job))
  
    quit!
!   call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
    call assert_equal('dead', job_status(g:job))
  
    exe buf . 'bwipe'
*** ../vim-8.0.1770/src/testdir/screendump.vim  2018-04-15 22:25:50.496763590 
+0200
--- src/testdir/screendump.vim  2018-04-28 19:37:34.471963491 +0200
***************
*** 64,72 ****
      let cols = term_getsize(buf)[1]
    endif
  
!   " Wait for "All" of the ruler in the status line to be shown.
!   " This can be quite slow (e.g. when using valgrind).
!   call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1})
  
    return buf
  endfunc
--- 64,78 ----
      let cols = term_getsize(buf)[1]
    endif
  
!   " Wait for "All" or "Top" of the ruler in the status line to be shown.  This
!   " can be quite slow (e.g. when using valgrind).
!   " If it fails then show the terminal contents for debugging.
!   try
!     call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1})
!   catch /timed out after/
!     let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
!     call assert_report('RunVimInTerminal() failed, screen contents: ' . 
join(lines, "<NL>"))
!   endtry
  
    return buf
  endfunc
***************
*** 75,81 ****
  func StopVimInTerminal(buf)
    call assert_equal("running", term_getstatus(a:buf))
    call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
!   call WaitFor('term_getstatus(' . a:buf . ') == "finished"')
    only!
  endfunc
  
--- 81,87 ----
  func StopVimInTerminal(buf)
    call assert_equal("running", term_getstatus(a:buf))
    call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
!   call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
    only!
  endfunc
  
*** ../vim-8.0.1770/src/testdir/test_autocmd.vim        2018-04-22 
13:27:38.812672851 +0200
--- src/testdir/test_autocmd.vim        2018-04-28 20:01:18.338634100 +0200
***************
*** 1322,1332 ****
    let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], 
{'term_rows': 3})
    call assert_equal('running', term_getstatus(buf))
    " Wait for the ruler (in the status line) to be shown.
!   call WaitFor({-> term_getline(buf, 3) =~# '\<All$'})
    " It's only adding autocmd, so that no event occurs.
    call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 
'Xchanged.txt')\<cr>")
    call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
!   call WaitFor({-> term_getstatus(buf) == 'finished'})
    call assert_equal([''], readfile('Xchanged.txt'))
  
    " clean up
--- 1322,1332 ----
    let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], 
{'term_rows': 3})
    call assert_equal('running', term_getstatus(buf))
    " Wait for the ruler (in the status line) to be shown.
!   call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))})
    " It's only adding autocmd, so that no event occurs.
    call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 
'Xchanged.txt')\<cr>")
    call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
!   call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))})
    call assert_equal([''], readfile('Xchanged.txt'))
  
    " clean up
*** ../vim-8.0.1770/src/testdir/test_channel.vim        2018-04-24 
20:54:01.572445034 +0200
--- src/testdir/test_channel.vim        2018-04-28 21:07:37.996856199 +0200
***************
*** 95,112 ****
    " handled before getting the response, but it's not guaranteed, thus wait a
    " tiny bit for the commands to get executed.
    call assert_equal('ok', ch_evalexpr(handle, 'make change'))
!   call WaitFor('"added2" == getline("$")')
    call assert_equal('added1', getline(line('$') - 1))
-   call assert_equal('added2', getline('$'))
  
    " Request command "foo bar", which fails silently.
    call assert_equal('ok', ch_evalexpr(handle, 'bad command'))
!   call WaitFor('v:errmsg =~ "E492"')
!   call assert_match('E492:.*foo bar', v:errmsg)
  
    call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100}))
!   call WaitFor('"added more" == getline("$")')
!   call assert_equal('added more', getline('$'))
  
    " Send a request with a specific handler.
    call ch_sendexpr(handle, 'hello!', {'callback': 'Ch_requestHandler'})
--- 95,109 ----
    " handled before getting the response, but it's not guaranteed, thus wait a
    " tiny bit for the commands to get executed.
    call assert_equal('ok', ch_evalexpr(handle, 'make change'))
!   call WaitForAssert({-> assert_equal("added2", getline("$"))})
    call assert_equal('added1', getline(line('$') - 1))
  
    " Request command "foo bar", which fails silently.
    call assert_equal('ok', ch_evalexpr(handle, 'bad command'))
!   call WaitForAssert({-> assert_match("E492:.*foo bar", v:errmsg)})
  
    call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100}))
!   call WaitForAssert({-> assert_equal('added more', getline('$'))})
  
    " Send a request with a specific handler.
    call ch_sendexpr(handle, 'hello!', {'callback': 'Ch_requestHandler'})
***************
*** 188,197 ****
  
    " Send an expr request
    call assert_equal('ok', ch_evalexpr(handle, 'an expr'))
!   call WaitFor('"three" == getline("$")')
    call assert_equal('one', getline(line('$') - 2))
    call assert_equal('two', getline(line('$') - 1))
-   call assert_equal('three', getline('$'))
  
    " Request a redraw, we don't check for the effect.
    call assert_equal('ok', ch_evalexpr(handle, 'redraw'))
--- 185,193 ----
  
    " Send an expr request
    call assert_equal('ok', ch_evalexpr(handle, 'an expr'))
!   call WaitForAssert({-> assert_equal('three', getline('$'))})
    call assert_equal('one', getline(line('$') - 2))
    call assert_equal('two', getline(line('$') - 1))
  
    " Request a redraw, we don't check for the effect.
    call assert_equal('ok', ch_evalexpr(handle, 'redraw'))
***************
*** 288,298 ****
  
    " Test that it works while waiting on a numbered message.
    call assert_equal('ok', ch_evalexpr(handle, 'call me'))
!   call WaitFor('"we called you" == g:Ch_reply')
  
    " Test that it works while not waiting on a numbered message.
    call ch_sendexpr(handle, 'call me again')
!   call WaitFor('"we did call you" == g:Ch_reply')
  endfunc
  
  func Test_channel_handler()
--- 284,294 ----
  
    " Test that it works while waiting on a numbered message.
    call assert_equal('ok', ch_evalexpr(handle, 'call me'))
!   call WaitForAssert({-> assert_equal('we called you', g:Ch_reply)})
  
    " Test that it works while not waiting on a numbered message.
    call ch_sendexpr(handle, 'call me again')
!   call WaitForAssert({-> assert_equal('we did call you', g:Ch_reply)})
  endfunc
  
  func Test_channel_handler()
***************
*** 334,340 ****
    let g:Ch_reply = ''
    call assert_equal('sent zero', ch_evalexpr(handle, 'send zero'))
    if s:has_handler
!     call WaitFor('"zero index" == g:Ch_reply')
    else
      sleep 20m
      call assert_equal('', g:Ch_reply)
--- 330,336 ----
    let g:Ch_reply = ''
    call assert_equal('sent zero', ch_evalexpr(handle, 'send zero'))
    if s:has_handler
!     call WaitForAssert({-> assert_equal('zero index', g:Ch_reply)})
    else
      sleep 20m
      call assert_equal('', g:Ch_reply)
***************
*** 344,350 ****
    let g:Ch_reply = ''
    let g:Ch_zero_reply = ''
    call ch_sendexpr(handle, 'send zero', {'callback': 'Ch_oneHandler'})
!   call WaitFor('"sent zero" == g:Ch_zero_reply')
    if s:has_handler
      call assert_equal('zero index', g:Ch_reply)
    else
--- 340,346 ----
    let g:Ch_reply = ''
    let g:Ch_zero_reply = ''
    call ch_sendexpr(handle, 'send zero', {'callback': 'Ch_oneHandler'})
!   call WaitForAssert({-> assert_equal('sent zero', g:Ch_zero_reply)})
    if s:has_handler
      call assert_equal('zero index', g:Ch_reply)
    else
***************
*** 395,409 ****
  
    " The messages are sent raw, we do our own JSON strings here.
    call ch_sendraw(handle, "[1, \"hello!\"]\n", {'callback': 'Ch_handleRaw1'})
!   call WaitFor('g:Ch_reply1 != ""')
!   call assert_equal("[1, \"got it\"]", g:Ch_reply1)
    call ch_sendraw(handle, "[2, \"echo something\"]\n", {'callback': 
'Ch_handleRaw2'})
    call ch_sendraw(handle, "[3, \"wait a bit\"]\n", {'callback': 
'Ch_handleRaw3'})
!   call WaitFor('g:Ch_reply2 != ""')
!   call assert_equal("[2, \"something\"]", g:Ch_reply2)
    " wait for the 200 msec delayed reply
!   call WaitFor('g:Ch_reply3 != ""')
!   call assert_equal("[3, \"waited\"]", g:Ch_reply3)
  endfunc
  
  func Test_raw_one_time_callback()
--- 391,402 ----
  
    " The messages are sent raw, we do our own JSON strings here.
    call ch_sendraw(handle, "[1, \"hello!\"]\n", {'callback': 'Ch_handleRaw1'})
!   call WaitForAssert({-> assert_equal("[1, \"got it\"]", g:Ch_reply1)})
    call ch_sendraw(handle, "[2, \"echo something\"]\n", {'callback': 
'Ch_handleRaw2'})
    call ch_sendraw(handle, "[3, \"wait a bit\"]\n", {'callback': 
'Ch_handleRaw3'})
!   call WaitForAssert({-> assert_equal("[2, \"something\"]", g:Ch_reply2)})
    " wait for the 200 msec delayed reply
!   call WaitForAssert({-> assert_equal("[3, \"waited\"]", g:Ch_reply3)})
  endfunc
  
  func Test_raw_one_time_callback()
***************
*** 494,501 ****
  
      let g:Ch_reply = ""
      call ch_sendraw(job, "double this\n", {'callback': 'Ch_handler'})
!     call WaitFor('"" != g:Ch_reply')
!     call assert_equal("this\nAND this\n", substitute(g:Ch_reply, "\r", "", 
'g'))
  
      let reply = ch_evalraw(job, "quit\n", {'timeout': 100})
      call assert_equal("Goodbye!\n", substitute(reply, "\r", "", 'g'))
--- 487,493 ----
  
      let g:Ch_reply = ""
      call ch_sendraw(job, "double this\n", {'callback': 'Ch_handler'})
!     call WaitForAssert({-> assert_equal("this\nAND this\n", 
substitute(g:Ch_reply, "\r", "", 'g'))})
  
      let reply = ch_evalraw(job, "quit\n", {'timeout': 100})
      call assert_equal("Goodbye!\n", substitute(reply, "\r", "", 'g'))
***************
*** 504,510 ****
    endtry
  
    let g:Ch_job = job
!   call WaitFor('"dead" == job_status(g:Ch_job)')
    let info = job_info(job)
    call assert_equal("dead", info.status)
    call assert_equal("term", info.stoponexit)
--- 496,502 ----
    endtry
  
    let g:Ch_job = job
!   call WaitForAssert({-> assert_equal("dead", job_status(g:Ch_job))})
    let info = job_info(job)
    call assert_equal("dead", info.status)
    call assert_equal("term", info.stoponexit)
***************
*** 602,608 ****
    if has('win32')
      " On MS-Windows the server must close the file handle before we are able
      " to delete the file.
!     call WaitFor('job_status(g:job) == "dead"')
      sleep 10m
    endif
  endfunc
--- 594,600 ----
    if has('win32')
      " On MS-Windows the server must close the file handle before we are able
      " to delete the file.
!     call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
      sleep 10m
    endif
  endfunc
***************
*** 641,648 ****
      call ch_sendraw(handle, "echo line one\n")
      call ch_sendraw(handle, "echo line two\n")
      call ch_sendraw(handle, "double this\n")
!     call WaitFor('len(readfile("Xoutput")) > 2')
!     call assert_equal(['line one', 'line two', 'this', 'AND this'], 
readfile('Xoutput'))
    finally
      call Stop_g_job()
      call assert_equal(-1, match(s:get_resources(), '\(^\|/\)Xoutput$'))
--- 633,639 ----
      call ch_sendraw(handle, "echo line one\n")
      call ch_sendraw(handle, "echo line two\n")
      call ch_sendraw(handle, "double this\n")
!     call WaitForAssert({-> assert_equal(['line one', 'line two', 'this', 'AND 
this'], readfile('Xoutput'))})
    finally
      call Stop_g_job()
      call assert_equal(-1, match(s:get_resources(), '\(^\|/\)Xoutput$'))
***************
*** 663,670 ****
      call ch_sendraw(handle, "echoerr line one\n")
      call ch_sendraw(handle, "echoerr line two\n")
      call ch_sendraw(handle, "doubleerr this\n")
!     call WaitFor('len(readfile("Xoutput")) > 2')
!     call assert_equal(['line one', 'line two', 'this', 'AND this'], 
readfile('Xoutput'))
    finally
      call Stop_g_job()
      call delete('Xoutput')
--- 654,660 ----
      call ch_sendraw(handle, "echoerr line one\n")
      call ch_sendraw(handle, "echoerr line two\n")
      call ch_sendraw(handle, "doubleerr this\n")
!     call WaitForAssert({-> assert_equal(['line one', 'line two', 'this', 'AND 
this'], readfile('Xoutput'))})
    finally
      call Stop_g_job()
      call delete('Xoutput')
***************
*** 685,692 ****
      call ch_sendraw(handle, "echo line two\n")
      call ch_sendraw(handle, "double this\n")
      call ch_sendraw(handle, "doubleerr that\n")
!     call WaitFor('len(readfile("Xoutput")) > 5')
!     call assert_equal(['line one', 'line two', 'this', 'AND this', 'that', 
'AND that'], readfile('Xoutput'))
    finally
      call Stop_g_job()
      call assert_equal(-1, match(s:get_resources(), '\(^\|/\)Xoutput$'))
--- 675,681 ----
      call ch_sendraw(handle, "echo line two\n")
      call ch_sendraw(handle, "double this\n")
      call ch_sendraw(handle, "doubleerr that\n")
!     call WaitForAssert({-> assert_equal(['line one', 'line two', 'this', 'AND 
this', 'that', 'AND that'], readfile('Xoutput'))})
    finally
      call Stop_g_job()
      call assert_equal(-1, match(s:get_resources(), '\(^\|/\)Xoutput$'))
***************
*** 777,784 ****
    let job = job_start(s:python . " test_channel_write.py", options)
    call assert_equal("run", job_status(job))
    try
!     call WaitFor('line("$") == 3')
!     call assert_equal(3, line('$'))
      quit!
      sleep 100m
      " Make sure the write didn't happen to the wrong buffer.
--- 766,772 ----
    let job = job_start(s:python . " test_channel_write.py", options)
    call assert_equal("run", job_status(job))
    try
!     call WaitForAssert({-> assert_equal(3, line('$'))})
      quit!
      sleep 100m
      " Make sure the write didn't happen to the wrong buffer.
***************
*** 827,834 ****
      call ch_sendraw(handle, "doubleerr this\n")
      call ch_sendraw(handle, "quit\n")
      sp pipe-err
!     call WaitFor('line("$") == ' . len(expected))
!     call assert_equal(expected, getline(1, '$'))
      if a:nomod
        call assert_equal(0, &modifiable)
      else
--- 815,821 ----
      call ch_sendraw(handle, "doubleerr this\n")
      call ch_sendraw(handle, "quit\n")
      sp pipe-err
!     call WaitForAssert({-> assert_equal(expected, getline(1, '$'))})
      if a:nomod
        call assert_equal(0, &modifiable)
      else
***************
*** 872,879 ****
      call ch_sendraw(handle, "doubleerr that\n")
      call ch_sendraw(handle, "quit\n")
      sp pipe-err
!     call WaitFor('line("$") >= 7')
!     call assert_equal(['Reading from channel output...', 'line one', 'line 
two', 'this', 'AND this', 'that', 'AND that', 'Goodbye!'], getline(1, '$'))
      bwipe!
    finally
      call job_stop(job)
--- 859,865 ----
      call ch_sendraw(handle, "doubleerr that\n")
      call ch_sendraw(handle, "quit\n")
      sp pipe-err
!     call WaitForAssert({-> assert_equal(['Reading from channel output...', 
'line one', 'line two', 'this', 'AND this', 'that', 'AND that', 'Goodbye!'], 
getline(1, '$'))})
      bwipe!
    finally
      call job_stop(job)
***************
*** 939,946 ****
      call ch_close_in(g:job)
    endif
  
!   call WaitFor('job_status(g:job) == "dead"')
!   call assert_equal("dead", job_status(g:job))
  
    sp sortout
    call WaitFor('line("$") > 3')
--- 925,931 ----
      call ch_close_in(g:job)
    endif
  
!   call WaitForAssert({-> assert_equal("dead", job_status(g:job))})
  
    sp sortout
    call WaitFor('line("$") > 3')
***************
*** 1222,1237 ****
      let g:Ch_errmsg = ''
      call ch_sendraw(job, "echo [0, \"hello\"]\n")
      call ch_sendraw(job, "echoerr [0, \"there\"]\n")
!     call WaitFor('g:Ch_outmsg != ""')
!     call assert_equal("dict: hello", g:Ch_outmsg)
!     call WaitFor('g:Ch_errmsg != ""')
!     call assert_equal("dict: there", g:Ch_errmsg)
  
      " Receive a json object split in pieces
      unlet! g:Ch_outobj
      call ch_sendraw(job, "echosplit [0, {\"one\": 1,| \"tw|o\": 2, \"three\": 
3|}]\n")
!     call WaitFor('exists("g:Ch_outobj")')
!     call assert_equal({'one': 1, 'two': 2, 'three': 3}, g:Ch_outobj)
    finally
      call job_stop(job)
    endtry
--- 1207,1220 ----
      let g:Ch_errmsg = ''
      call ch_sendraw(job, "echo [0, \"hello\"]\n")
      call ch_sendraw(job, "echoerr [0, \"there\"]\n")
!     call WaitForAssert({-> assert_equal("dict: hello", g:Ch_outmsg)})
!     call WaitForAssert({-> assert_equal("dict: there", g:Ch_errmsg)})
  
      " Receive a json object split in pieces
      unlet! g:Ch_outobj
      call ch_sendraw(job, "echosplit [0, {\"one\": 1,| \"tw|o\": 2, \"three\": 
3|}]\n")
!     let g:Ch_outobj = ''
!     call WaitForAssert({-> assert_equal({'one': 1, 'two': 2, 'three': 3}, 
g:Ch_outobj)})
    finally
      call job_stop(job)
    endtry
***************
*** 1261,1269 ****
        \ 'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitFor('g:Ch_closemsg != 0 && g:Ch_msg1 != ""')
!     call assert_equal('quit', g:Ch_msg1)
!     call assert_equal(2, g:Ch_closemsg)
    finally
      call job_stop(job)
      delfunc OutHandler
--- 1244,1251 ----
        \ 'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitForAssert({-> assert_equal('quit', g:Ch_msg1)})
!     call WaitForAssert({-> assert_equal(2, g:Ch_closemsg)})
    finally
      call job_stop(job)
      delfunc OutHandler
***************
*** 1285,1292 ****
        \ {'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitFor('g:Ch_received != ""')
!     call assert_equal('quit', g:Ch_received)
    finally
      call job_stop(job)
      delfunc CloseHandler
--- 1267,1273 ----
        \ {'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitForAssert({-> assert_equal('quit', g:Ch_received)})
    finally
      call job_stop(job)
      delfunc CloseHandler
***************
*** 1310,1317 ****
        \ {'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitFor('g:Ch_received != ""')
!     call assert_equal('incomplete', g:Ch_received)
    finally
      call job_stop(job)
      delfunc CloseHandler
--- 1291,1297 ----
        \ {'close_cb': 'CloseHandler'})
    call assert_equal("run", job_status(job))
    try
!     call WaitForAssert({-> assert_equal('incomplete', g:Ch_received)})
    finally
      call job_stop(job)
      delfunc CloseHandler
***************
*** 1335,1344 ****
      let g:Ch_errmsg = ''
      call ch_sendraw(job, "echo [0, \"hello\"]\n")
      call ch_sendraw(job, "echoerr [0, \"there\"]\n")
!     call WaitFor('g:Ch_outmsg != ""')
!     call assert_equal("lambda: hello", g:Ch_outmsg)
!     call WaitFor('g:Ch_errmsg != ""')
!     call assert_equal("lambda: there", g:Ch_errmsg)
    finally
      call job_stop(job)
    endtry
--- 1315,1322 ----
      let g:Ch_errmsg = ''
      call ch_sendraw(job, "echo [0, \"hello\"]\n")
      call ch_sendraw(job, "echoerr [0, \"there\"]\n")
!     call WaitForAssert({-> assert_equal("lambda: hello", g:Ch_outmsg)})
!     call WaitForAssert({-> assert_equal("lambda: there", g:Ch_errmsg)})
    finally
      call job_stop(job)
    endtry
***************
*** 1364,1371 ****
          \ })
    call assert_equal('run', job_status(g:job))
    unlet g:job
!   call WaitFor('len(g:retdict.ret) >= 2')
!   call assert_equal(2, len(g:retdict.ret))
    call assert_match('^\%(dead\|run\)', g:retdict.ret['close_cb'])
    call assert_equal('dead', g:retdict.ret['exit_cb'])
    unlet g:retdict
--- 1342,1348 ----
          \ })
    call assert_equal('run', job_status(g:job))
    unlet g:job
!   call WaitForAssert({-> assert_equal(2, len(g:retdict.ret))})
    call assert_match('^\%(dead\|run\)', g:retdict.ret['close_cb'])
    call assert_equal('dead', g:retdict.ret['exit_cb'])
    unlet g:retdict
***************
*** 1383,1390 ****
  func Ch_unlet_handle(port)
    let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
    call ch_sendexpr(s:channelfd, "test", {'callback': 
function('s:UnletHandler')})
!   call WaitFor('"what?" == g:Ch_unletResponse')
!   call assert_equal('what?', g:Ch_unletResponse)
  endfunc
  
  func Test_unlet_handle()
--- 1360,1366 ----
  func Ch_unlet_handle(port)
    let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
    call ch_sendexpr(s:channelfd, "test", {'callback': 
function('s:UnletHandler')})
!   call WaitForAssert({-> assert_equal('what?', g:Ch_unletResponse)})
  endfunc
  
  func Test_unlet_handle()
***************
*** 1404,1411 ****
  func Ch_close_handle(port)
    let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
    call ch_sendexpr(s:channelfd, "test", {'callback': 
function('Ch_CloseHandler')})
!   call WaitFor('"what?" == g:Ch_unletResponse')
!   call assert_equal('what?', g:Ch_unletResponse)
  endfunc
  
  func Test_close_handle()
--- 1380,1386 ----
  func Ch_close_handle(port)
    let s:channelfd = ch_open('localhost:' . a:port, s:chopt)
    call ch_sendexpr(s:channelfd, "test", {'callback': 
function('Ch_CloseHandler')})
!   call WaitForAssert({-> assert_equal('what?', g:Ch_unletResponse)})
  endfunc
  
  func Test_close_handle()
***************
*** 1458,1465 ****
  
    let g:Ch_call_ret = []
    call assert_equal('ok', ch_evalexpr(handle, 'call-func'))
!   call WaitFor('len(g:Ch_call_ret) > 0')
!   call assert_equal([1, 2, 3], g:Ch_call_ret)
  endfunc
  
  func Test_call()
--- 1433,1439 ----
  
    let g:Ch_call_ret = []
    call assert_equal('ok', ch_evalexpr(handle, 'call-func'))
!   call WaitForAssert({-> assert_equal([1, 2, 3], g:Ch_call_ret)})
  endfunc
  
  func Test_call()
***************
*** 1556,1563 ****
    call ch_setoptions(handle, {'close_cb': 'MyCloseCb'})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitFor('"closed" == g:Ch_close_ret')
!   call assert_equal('closed', g:Ch_close_ret)
  endfunc
  
  func Test_close_callback()
--- 1530,1536 ----
    call ch_setoptions(handle, {'close_cb': 'MyCloseCb'})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitForAssert({-> assert_equal('closed', g:Ch_close_ret)})
  endfunc
  
  func Test_close_callback()
***************
*** 1578,1585 ****
    call ch_setoptions(handle, {'close_cb': g:Ch_d.closeCb})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitFor('"closed" == g:Ch_d.close_ret')
!   call assert_equal('closed', g:Ch_d.close_ret)
    unlet g:Ch_d
  endfunc
  
--- 1551,1557 ----
    call ch_setoptions(handle, {'close_cb': g:Ch_d.closeCb})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitForAssert({-> assert_equal('closed', g:Ch_d.close_ret)})
    unlet g:Ch_d
  endfunc
  
***************
*** 1601,1608 ****
    let g:job = job_start([s:python, '-c', 'import time;time.sleep(10)'])
    try
      call job_stop(g:job)
!     call WaitFor('"dead" == job_status(g:job)')
!     call assert_equal('dead', job_status(g:job))
    finally
      call job_stop(g:job, 'kill')
      unlet g:job
--- 1573,1579 ----
    let g:job = job_start([s:python, '-c', 'import time;time.sleep(10)'])
    try
      call job_stop(g:job)
!     call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
    finally
      call job_stop(g:job, 'kill')
      unlet g:job
***************
*** 1637,1644 ****
    split testout
    1,$delete
    call job_start('cat test_channel.vim', {'out_io': 'buffer', 'out_name': 
'testout'})
!   call WaitFor('line("$") >= g:linecount')
!   call assert_inrange(g:linecount, g:linecount + 1, line('$'))
    bwipe!
  endfunc
  
--- 1608,1614 ----
    split testout
    1,$delete
    call job_start('cat test_channel.vim', {'out_io': 'buffer', 'out_name': 
'testout'})
!   call WaitForAssert({-> assert_inrange(g:linecount, g:linecount + 1, 
line('$'))})
    bwipe!
  endfunc
  
***************
*** 1648,1660 ****
    endif
    call assert_false(filereadable("file with space"))
    let job = job_start('touch "file with space"')
!   call WaitFor('filereadable("file with space")')
!   call assert_true(filereadable("file with space"))
    call delete("file with space")
  
    let job = job_start('touch file\ with\ space')
!   call WaitFor('filereadable("file with space")')
!   call assert_true(filereadable("file with space"))
    call delete("file with space")
  endfunc
  
--- 1618,1628 ----
    endif
    call assert_false(filereadable("file with space"))
    let job = job_start('touch "file with space"')
!   call WaitForAssert({-> assert_true(filereadable("file with space"))})
    call delete("file with space")
  
    let job = job_start('touch file\ with\ space')
!   call WaitForAssert({-> assert_true(filereadable("file with space"))})
    call delete("file with space")
  endfunc
  
***************
*** 1683,1689 ****
    new mybuffer
    call setline(1, ["asdf\nasdf", "xxx\n", "\nyyy"])
    let g:Ch_job = job_start('cat', {'in_io': 'buffer', 'in_name': 'mybuffer', 
'out_io': 'file', 'out_name': 'Xtestwrite'})
!   call WaitFor('"dead" == job_status(g:Ch_job)')
    bwipe!
    split Xtestwrite
    call assert_equal("asdf\nasdf", getline(1))
--- 1651,1657 ----
    new mybuffer
    call setline(1, ["asdf\nasdf", "xxx\n", "\nyyy"])
    let g:Ch_job = job_start('cat', {'in_io': 'buffer', 'in_name': 'mybuffer', 
'out_io': 'file', 'out_name': 'Xtestwrite'})
!   call WaitForAssert({-> assert_equal("dead", job_status(g:Ch_job))})
    bwipe!
    split Xtestwrite
    call assert_equal("asdf\nasdf", getline(1))
***************
*** 1707,1714 ****
    let g:linecount = 0
    let arg = 'import sys;sys.stdout.write("1\n2\n3")'
    call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
!   call WaitFor('3 <= g:linecount')
!   call assert_equal(3, g:linecount)
  endfunc
  
  func Test_read_from_terminated_job()
--- 1675,1681 ----
    let g:linecount = 0
    let arg = 'import sys;sys.stdout.write("1\n2\n3")'
    call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
!   call WaitForAssert({-> assert_equal(3, g:linecount)})
  endfunc
  
  func Test_read_from_terminated_job()
***************
*** 1719,1726 ****
    let g:linecount = 0
    let arg = 'import os,sys;os.close(1);sys.stderr.write("test\n")'
    call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
!   call WaitFor('1 <= g:linecount')
!   call assert_equal(1, g:linecount)
  endfunc
  
  func Test_env()
--- 1686,1692 ----
    let g:linecount = 0
    let arg = 'import os,sys;os.close(1);sys.stderr.write("test\n")'
    call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
!   call WaitForAssert({-> assert_equal(1, g:linecount)})
  endfunc
  
  func Test_env()
***************
*** 1736,1743 ****
    endif
    call assert_fails('call job_start(cmd, {"env": 1})', 'E475:')
    call job_start(cmd, {'callback': {ch,msg -> execute(":let g:envstr .= 
msg")}, 'env': {'FOO': 'bar'}})
!   call WaitFor('"" != g:envstr')
!   call assert_equal("bar", g:envstr)
    unlet g:envstr
  endfunc
  
--- 1702,1708 ----
    endif
    call assert_fails('call job_start(cmd, {"env": 1})', 'E475:')
    call job_start(cmd, {'callback': {ch,msg -> execute(":let g:envstr .= 
msg")}, 'env': {'FOO': 'bar'}})
!   call WaitForAssert({-> assert_equal("bar", g:envstr)})
    unlet g:envstr
  endfunc
  
***************
*** 1756,1762 ****
    endif
    let job = job_start(cmd, {'callback': {ch,msg -> execute(":let g:envstr .= 
msg")}, 'cwd': expect})
    try
!     call WaitFor('"" != g:envstr')
      let expect = substitute(expect, '[/\\]$', '', '')
      let g:envstr = substitute(g:envstr, '[/\\]$', '', '')
      if $CI != '' && stridx(g:envstr, '/private/') == 0
--- 1721,1727 ----
    endif
    let job = job_start(cmd, {'callback': {ch,msg -> execute(":let g:envstr .= 
msg")}, 'cwd': expect})
    try
!     call WaitForAssert({-> assert_notequal("", g:envstr)})
      let expect = substitute(expect, '[/\\]$', '', '')
      let g:envstr = substitute(g:envstr, '[/\\]$', '', '')
      if $CI != '' && stridx(g:envstr, '/private/') == 0
***************
*** 1779,1786 ****
    call ch_setoptions(handle, {'close_cb': {ch -> execute("let g:Ch_close_ret 
= 'closed'")}})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitFor('"closed" == g:Ch_close_ret')
!   call assert_equal('closed', g:Ch_close_ret)
  endfunc
  
  func Test_close_lambda()
--- 1744,1750 ----
    call ch_setoptions(handle, {'close_cb': {ch -> execute("let g:Ch_close_ret 
= 'closed'")}})
  
    call assert_equal('', ch_evalexpr(handle, 'close me'))
!   call WaitForAssert({-> assert_equal('closed', g:Ch_close_ret)})
  endfunc
  
  func Test_close_lambda()
*** ../vim-8.0.1770/src/testdir/test_clientserver.vim   2018-04-11 
20:53:45.765218228 +0200
--- src/testdir/test_clientserver.vim   2018-04-28 21:12:37.358995843 +0200
***************
*** 28,39 ****
    let name = 'XVIMTEST'
    let cmd .= ' --servername ' . name
    let job = job_start(cmd, {'stoponexit': 'kill', 'out_io': 'null'})
!   call WaitFor({-> job_status(job) == "run"})
  
    " Takes a short while for the server to be active.
    " When using valgrind it takes much longer.
!   call WaitFor('serverlist() =~ "' . name . '"')
!   call assert_match(name, serverlist())
  
    call remote_foreground(name)
  
--- 28,38 ----
    let name = 'XVIMTEST'
    let cmd .= ' --servername ' . name
    let job = job_start(cmd, {'stoponexit': 'kill', 'out_io': 'null'})
!   call WaitForAssert({-> assert_equal("run", job_status(job))})
  
    " Takes a short while for the server to be active.
    " When using valgrind it takes much longer.
!   call WaitForAssert({-> assert_match(name, serverlist())})
  
    call remote_foreground(name)
  
***************
*** 54,65 ****
      endif
      " Wait for the server to be up and answering requests.
      sleep 100m
!     call WaitFor('remote_expr("' . name . '", "v:version", "", 1) != ""')
!     call assert_true(remote_expr(name, "v:version", "", 1) != "")
  
      call remote_send(name, ":let testvar = 'maybe'\<CR>")
!     call WaitFor('remote_expr("' . name . '", "testvar", "", 1) == "maybe"')
!     call assert_equal('maybe', remote_expr(name, "testvar", "", 2))
    endif
  
    call assert_fails('call remote_send("XXX", ":let testvar = ''yes''\<CR>")', 
'E241')
--- 53,62 ----
      endif
      " Wait for the server to be up and answering requests.
      sleep 100m
!     call WaitForAssert({-> assert_true(remote_expr(name, "v:version", "", 1) 
!= "")})
  
      call remote_send(name, ":let testvar = 'maybe'\<CR>")
!     call WaitForAssert({-> assert_equal('maybe', remote_expr(name, "testvar", 
"", 2))})
    endif
  
    call assert_fails('call remote_send("XXX", ":let testvar = ''yes''\<CR>")', 
'E241')
***************
*** 94,100 ****
  
    call remote_send(name, ":qa!\<CR>")
    try
!     call WaitFor({-> job_status(job) == "dead"})
    finally
      if job_status(job) != 'dead'
        call assert_report('Server did not exit')
--- 91,97 ----
  
    call remote_send(name, ":qa!\<CR>")
    try
!     call WaitForAssert({-> assert_equal("dead", job_status(job))})
    finally
      if job_status(job) != 'dead'
        call assert_report('Server did not exit')
*** ../vim-8.0.1770/src/testdir/test_job_fails.vim      2017-11-04 
19:24:24.754197129 +0100
--- src/testdir/test_job_fails.vim      2018-04-28 21:13:12.494766693 +0200
***************
*** 8,16 ****
    if has('job')
      let job = job_start('axdfxsdf')
      if has('unix')
!       call WaitFor({-> job_status(job) == "dead"})
      else
!       call WaitFor({-> job_status(job) == "fail"})
      endif
    endif
  endfunc
--- 8,16 ----
    if has('job')
      let job = job_start('axdfxsdf')
      if has('unix')
!       call WaitForAssert({-> assert_equal("dead", job_status(job))})
      else
!       call WaitForAssert({-> assert_equal("fail", job_status(job))})
      endif
    endif
  endfunc
*** ../vim-8.0.1770/src/version.c       2018-04-28 16:56:20.792322716 +0200
--- src/version.c       2018-04-28 19:07:23.095939984 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1771,
  /**/

-- 
       When danger reared its ugly head,
       He bravely turned his tail and fled
       Yes, Brave Sir Robin turned about
       And gallantly he chickened out
       Bravely taking to his feet
       He beat a very brave retreat
       Bravest of the brave Sir Robin
       Petrified of being dead
       Soiled his pants then brave Sir Robin
       Turned away and fled.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui