changeset 15659:8513d9864f7e v8.1.0837

patch 8.1.0837: timer interrupting cursorhold and mapping not tested commit https://github.com/vim/vim/commit/26d982185e21398738a9c688429c0a1840d7c9c3 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 27 22:32:55 2019 +0100 patch 8.1.0837: timer interrupting cursorhold and mapping not tested Problem: Timer interrupting cursorhold and mapping not tested. Solution: Add tests with timers. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/3871)
author Bram Moolenaar <Bram@vim.org>
date Sun, 27 Jan 2019 22:45:05 +0100
parents baf0958cbef4
children 8dcb275f209b
files src/testdir/test_autocmd.vim src/testdir/test_mapping.vim src/version.c
diffstat 3 files changed, 66 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -32,6 +32,28 @@ if has('timers')
     call timer_start(100, 'ExitInsertMode')
     call feedkeys('a', 'x!')
     call assert_equal(1, g:triggered)
+    unlet g:triggered
+    au! CursorHoldI
+    set updatetime&
+  endfunc
+
+  func Test_cursorhold_insert_with_timer_interrupt()
+    if !has('job')
+      return
+    endif
+    " Need to move the cursor.
+    call feedkeys("ggG", "xt")
+
+    " Confirm the timer invoked in exit_cb of the job doesn't disturb
+    " CursorHoldI event.
+    let g:triggered = 0
+    au CursorHoldI * let g:triggered += 1
+    set updatetime=500
+    call job_start(has('win32') ? 'cmd /c echo:' : 'echo',
+          \ {'exit_cb': {j, s -> timer_start(1000, 'ExitInsertMode')}})
+    call feedkeys('a', 'x!')
+    call assert_equal(1, g:triggered)
+    unlet g:triggered
     au! CursorHoldI
     set updatetime&
   endfunc
@@ -44,6 +66,7 @@ if has('timers')
     " CursorHoldI does not trigger after CTRL-X
     call feedkeys("a\<C-X>", 'x!')
     call assert_equal(0, g:triggered)
+    unlet g:triggered
     au! CursorHoldI
     set updatetime&
   endfunc
@@ -452,7 +475,7 @@ func s:AutoCommandOptionSet(match)
 endfunc
 
 func Test_OptionSet()
-  if !has("eval") || !has("autocmd") || !exists("+autochdir")
+  if !has("eval") || !exists("+autochdir")
     return
   endif
 
@@ -595,7 +618,7 @@ endfunc
 
 func Test_OptionSet_diffmode()
   call test_override('starting', 1)
-  " 18: Changing an option when enetering diff mode
+  " 18: Changing an option when entering diff mode
   new
   au OptionSet diff :let &l:cul=v:option_new
 
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -1,5 +1,7 @@
 " Tests for mappings and abbreviations
 
+source shared.vim
+
 func Test_abbreviation()
   " abbreviation with 0x80 should work
   inoreab чкпр   vim
@@ -169,6 +171,9 @@ func Test_abbr_after_line_join()
 endfunc
 
 func Test_map_timeout()
+  if !has('timers')
+    return
+  endif
   nnoremap aaaa :let got_aaaa = 1<CR>
   nnoremap bb :let got_bb = 1<CR>
   nmap b aaa
@@ -178,7 +183,7 @@ func Test_map_timeout()
     call feedkeys("\<Esc>", "t")
   endfunc
   set timeout timeoutlen=200
-  call timer_start(300, 'ExitInsert')
+  let timer = timer_start(300, 'ExitInsert')
   " After the 'b' Vim waits for another character to see if it matches 'bb'.
   " When it times out it is expanded to "aaa", but there is no wait for
   " "aaaa".  Can't check that reliably though.
@@ -193,6 +198,39 @@ func Test_map_timeout()
   nunmap b
   set timeoutlen&
   delfunc ExitInsert
+  call timer_stop(timer)
+endfunc
+
+func Test_map_timeout_with_timer_interrupt()
+  if !has('job') || !has('timers')
+    return
+  endif
+
+  " Confirm the timer invoked in exit_cb of the job doesn't disturb mapped key
+  " sequence.
+  new
+  let g:val = 0
+  nnoremap \12 :let g:val = 1<CR>
+  nnoremap \123 :let g:val = 2<CR>
+  set timeout timeoutlen=1000
+
+  func ExitCb(job, status)
+    let g:timer = timer_start(1, {_ -> feedkeys("3\<Esc>", 't')})
+  endfunc
+
+  call job_start([&shell, &shellcmdflag, 'echo'], {'exit_cb': 'ExitCb'})
+  call feedkeys('\12', 'xt!')
+  call assert_equal(2, g:val)
+
+  bwipe!
+  nunmap \12
+  nunmap \123
+  set timeoutlen&
+  call WaitFor({-> exists('g:timer')})
+  call timer_stop(g:timer)
+  unlet g:timer
+  unlet g:val
+  delfunc ExitCb
 endfunc
 
 func Test_abbreviation_CR()
--- a/src/version.c
+++ b/src/version.c
@@ -784,6 +784,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    837,
+/**/
     836,
 /**/
     835,