patch 7.4.2180
Problem:    There is no easy way to stop all timers.  There is no way to
            temporary pause a timer.
Solution:   Add timer_stopall() and timer_pause().
diff --git a/src/testdir/test_timers.vim b/src/testdir/test_timers.vim
index 0969377..fb35f61 100644
--- a/src/testdir/test_timers.vim
+++ b/src/testdir/test_timers.vim
@@ -1,11 +1,13 @@
 " Test for timers
 
+source shared.vim
+
 if !has('timers')
   finish
 endif
 
 func MyHandler(timer)
-  let s:val += 1
+  let g:val += 1
 endfunc
 
 func MyHandlerWithLists(lists, timer)
@@ -13,43 +15,101 @@
 endfunc
 
 func Test_oneshot()
-  let s:val = 0
+  let g:val = 0
   let timer = timer_start(50, 'MyHandler')
-  sleep 200m
-  call assert_equal(1, s:val)
+  let slept = WaitFor('g:val == 1')
+  call assert_equal(1, g:val)
+  call assert_inrange(30, 100, slept)
 endfunc
 
 func Test_repeat_three()
-  let s:val = 0
+  let g:val = 0
   let timer = timer_start(50, 'MyHandler', {'repeat': 3})
-  sleep 500m
-  call assert_equal(3, s:val)
+  let slept = WaitFor('g:val == 3')
+  call assert_equal(3, g:val)
+  call assert_inrange(100, 250, slept)
 endfunc
 
 func Test_repeat_many()
-  let s:val = 0
+  let g:val = 0
   let timer = timer_start(50, 'MyHandler', {'repeat': -1})
   sleep 200m
   call timer_stop(timer)
-  call assert_true(s:val > 1)
-  call assert_true(s:val < 5)
+  call assert_inrange(2, 4, g:val)
 endfunc
 
 func Test_with_partial_callback()
-  let s:val = 0
+  let g:val = 0
   let s:meow = {}
   function s:meow.bite(...)
-    let s:val += 1
+    let g:val += 1
   endfunction
 
   call timer_start(50, s:meow.bite)
-  sleep 200m
-  call assert_equal(1, s:val)
+  let slept = WaitFor('g:val == 1')
+  call assert_equal(1, g:val)
+  call assert_inrange(30, 100, slept)
 endfunc
 
 func Test_retain_partial()
-  call timer_start(100, function('MyHandlerWithLists', [['a']]))
+  call timer_start(50, function('MyHandlerWithLists', [['a']]))
   call test_garbagecollect_now()
-  sleep 200m
+  sleep 100m
 endfunc
+
+func Test_info()
+  let id = timer_start(1000, 'MyHandler')
+  let info = timer_info(id)
+  call assert_equal(id, info[0]['id'])
+  call assert_equal(1000, info[0]['time'])
+  call assert_true(info[0]['remaining'] > 500)
+  call assert_true(info[0]['remaining'] <= 1000)
+  call assert_equal(1, info[0]['repeat'])
+  call assert_equal("function('MyHandler')", string(info[0]['callback']))
+
+  let found = 0
+  for info in timer_info()
+    if info['id'] == id
+      let found += 1
+    endif
+  endfor
+  call assert_equal(1, found)
+
+  call timer_stop(id)
+  call assert_equal([], timer_info(id))
+endfunc
+
+func Test_stopall()
+  let id1 = timer_start(1000, 'MyHandler')
+  let id2 = timer_start(2000, 'MyHandler')
+  let info = timer_info()
+  call assert_equal(2, len(info))
+
+  call timer_stopall()
+  let info = timer_info()
+  call assert_equal(0, len(info))
+endfunc
+
+func Test_paused()
+  let g:val = 0
+
+  let id = timer_start(50, 'MyHandler')
+  let info = timer_info(id)
+  call assert_equal(0, info[0]['paused'])
+
+  call timer_pause(id, 1)
+  let info = timer_info(id)
+  call assert_equal(1, info[0]['paused'])
+  sleep 100m
+  call assert_equal(0, g:val)
+
+  call timer_pause(id, 0)
+  let info = timer_info(id)
+  call assert_equal(0, info[0]['paused'])
+
+  let slept = WaitFor('g:val == 1')
+  call assert_equal(1, g:val)
+  call assert_inrange(0, 10, slept)
+endfunc
+
 " vim: ts=2 sw=0 et