xref: /vim-8.2.3635/src/testdir/test_timers.vim (revision f08b0eb8)
1975b5271SBram Moolenaar" Test for timers
2975b5271SBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature timers
5975b5271SBram Moolenaar
63fffa971SBram Moolenaarsource screendump.vim
711aa62f8SBram Moolenaarsource shared.vim
87a39dd7fSBram Moolenaarsource term_util.vim
911aa62f8SBram Moolenaar
10975b5271SBram Moolenaarfunc MyHandler(timer)
11b73598e2SBram Moolenaar  let g:val += 1
12975b5271SBram Moolenaarendfunc
13975b5271SBram Moolenaar
14e3188e26SBram Moolenaarfunc MyHandlerWithLists(lists, timer)
15e3188e26SBram Moolenaar  let x = string(a:lists)
16e3188e26SBram Moolenaarendfunc
17e3188e26SBram Moolenaar
189a2fddcfSBram Moolenaarfunc Test_timer_oneshot()
19*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
20b73598e2SBram Moolenaar  let g:val = 0
21975b5271SBram Moolenaar  let timer = timer_start(50, 'MyHandler')
22b73598e2SBram Moolenaar  let slept = WaitFor('g:val == 1')
23b73598e2SBram Moolenaar  call assert_equal(1, g:val)
24bc28e9f1SBram Moolenaar  if has('mac')
25818fed7aSBram Moolenaar    " Mac on Travis can be very slow.
26818fed7aSBram Moolenaar    let limit = 180
27f267f8bdSBram Moolenaar  else
28bc28e9f1SBram Moolenaar    let limit = 100
29bc28e9f1SBram Moolenaar  endif
30bc28e9f1SBram Moolenaar  if has('reltime')
31bc28e9f1SBram Moolenaar    call assert_inrange(49, limit, slept)
32bc28e9f1SBram Moolenaar  else
33bc28e9f1SBram Moolenaar    call assert_inrange(20, limit, slept)
34f267f8bdSBram Moolenaar  endif
35975b5271SBram Moolenaarendfunc
36975b5271SBram Moolenaar
379a2fddcfSBram Moolenaarfunc Test_timer_repeat_three()
38*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
39b73598e2SBram Moolenaar  let g:val = 0
40975b5271SBram Moolenaar  let timer = timer_start(50, 'MyHandler', {'repeat': 3})
41b73598e2SBram Moolenaar  let slept = WaitFor('g:val == 3')
42b73598e2SBram Moolenaar  call assert_equal(3, g:val)
43f267f8bdSBram Moolenaar  if has('reltime')
44bc28e9f1SBram Moolenaar    if has('mac')
45bc28e9f1SBram Moolenaar      " Mac on Travis can be slow.
46bc28e9f1SBram Moolenaar      call assert_inrange(149, 400, slept)
47bc28e9f1SBram Moolenaar    else
480426bae2SBram Moolenaar      call assert_inrange(149, 250, slept)
49bc28e9f1SBram Moolenaar    endif
50f267f8bdSBram Moolenaar  else
5136d1c0feSBram Moolenaar    call assert_inrange(80, 200, slept)
52f267f8bdSBram Moolenaar  endif
53975b5271SBram Moolenaarendfunc
54975b5271SBram Moolenaar
559a2fddcfSBram Moolenaarfunc Test_timer_repeat_many()
56*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
57b73598e2SBram Moolenaar  let g:val = 0
58975b5271SBram Moolenaar  let timer = timer_start(50, 'MyHandler', {'repeat': -1})
59975b5271SBram Moolenaar  sleep 200m
60975b5271SBram Moolenaar  call timer_stop(timer)
61bc28e9f1SBram Moolenaar  " Mac on Travis can be slow.
62bc28e9f1SBram Moolenaar  if has('mac')
63bc28e9f1SBram Moolenaar    call assert_inrange(1, 5, g:val)
64bc28e9f1SBram Moolenaar  else
657e6feb9eSBram Moolenaar    call assert_inrange(2, 5, g:val)
66bc28e9f1SBram Moolenaar  endif
67975b5271SBram Moolenaarendfunc
6892e35efaSBram Moolenaar
699a2fddcfSBram Moolenaarfunc Test_timer_with_partial_callback()
70*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
71b73598e2SBram Moolenaar  let g:val = 0
7226fe0d56SBram Moolenaar  let meow = {'one': 1}
7326fe0d56SBram Moolenaar  function meow.bite(...)
7426fe0d56SBram Moolenaar    let g:val += self.one
7592e35efaSBram Moolenaar  endfunction
7692e35efaSBram Moolenaar
7726fe0d56SBram Moolenaar  call timer_start(50, meow.bite)
78b73598e2SBram Moolenaar  let slept = WaitFor('g:val == 1')
79b73598e2SBram Moolenaar  call assert_equal(1, g:val)
80f267f8bdSBram Moolenaar  if has('reltime')
815c463a28SBram Moolenaar    " Mac on Travis can be slow.
825c463a28SBram Moolenaar    if has('mac')
835c463a28SBram Moolenaar      call assert_inrange(49, 180, slept)
845c463a28SBram Moolenaar    else
850426bae2SBram Moolenaar      call assert_inrange(49, 130, slept)
865c463a28SBram Moolenaar    endif
87f267f8bdSBram Moolenaar  else
88f267f8bdSBram Moolenaar    call assert_inrange(20, 100, slept)
89f267f8bdSBram Moolenaar  endif
9092e35efaSBram Moolenaarendfunc
91e3188e26SBram Moolenaar
929a2fddcfSBram Moolenaarfunc Test_timer_retain_partial()
93b73598e2SBram Moolenaar  call timer_start(50, function('MyHandlerWithLists', [['a']]))
94e3188e26SBram Moolenaar  call test_garbagecollect_now()
95b73598e2SBram Moolenaar  sleep 100m
96e3188e26SBram Moolenaarendfunc
97b73598e2SBram Moolenaar
989a2fddcfSBram Moolenaarfunc Test_timer_info()
99b73598e2SBram Moolenaar  let id = timer_start(1000, 'MyHandler')
100f92e58caSBram Moolenaar  let info = id->timer_info()
101b73598e2SBram Moolenaar  call assert_equal(id, info[0]['id'])
102b73598e2SBram Moolenaar  call assert_equal(1000, info[0]['time'])
103b73598e2SBram Moolenaar  call assert_true(info[0]['remaining'] > 500)
104b73598e2SBram Moolenaar  call assert_true(info[0]['remaining'] <= 1000)
105b73598e2SBram Moolenaar  call assert_equal(1, info[0]['repeat'])
106b73598e2SBram Moolenaar  call assert_equal("function('MyHandler')", string(info[0]['callback']))
107b73598e2SBram Moolenaar
108b73598e2SBram Moolenaar  let found = 0
109b73598e2SBram Moolenaar  for info in timer_info()
110b73598e2SBram Moolenaar    if info['id'] == id
111b73598e2SBram Moolenaar      let found += 1
112b73598e2SBram Moolenaar    endif
113b73598e2SBram Moolenaar  endfor
114b73598e2SBram Moolenaar  call assert_equal(1, found)
115b73598e2SBram Moolenaar
116b73598e2SBram Moolenaar  call timer_stop(id)
117b73598e2SBram Moolenaar  call assert_equal([], timer_info(id))
118e20b9eceSBram Moolenaar
119e20b9eceSBram Moolenaar  call assert_fails('call timer_info("abc")', 'E39:')
120b73598e2SBram Moolenaarendfunc
121b73598e2SBram Moolenaar
1229a2fddcfSBram Moolenaarfunc Test_timer_stopall()
123b73598e2SBram Moolenaar  let id1 = timer_start(1000, 'MyHandler')
124b73598e2SBram Moolenaar  let id2 = timer_start(2000, 'MyHandler')
125b73598e2SBram Moolenaar  let info = timer_info()
126b73598e2SBram Moolenaar  call assert_equal(2, len(info))
127b73598e2SBram Moolenaar
128b73598e2SBram Moolenaar  call timer_stopall()
129b73598e2SBram Moolenaar  let info = timer_info()
130b73598e2SBram Moolenaar  call assert_equal(0, len(info))
131b73598e2SBram Moolenaarendfunc
132b73598e2SBram Moolenaar
1339a2fddcfSBram Moolenaarfunc Test_timer_paused()
134*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
135b73598e2SBram Moolenaar  let g:val = 0
136b73598e2SBram Moolenaar
137b73598e2SBram Moolenaar  let id = timer_start(50, 'MyHandler')
138b73598e2SBram Moolenaar  let info = timer_info(id)
139b73598e2SBram Moolenaar  call assert_equal(0, info[0]['paused'])
140b73598e2SBram Moolenaar
141f92e58caSBram Moolenaar  eval id->timer_pause(1)
142b73598e2SBram Moolenaar  let info = timer_info(id)
143b73598e2SBram Moolenaar  call assert_equal(1, info[0]['paused'])
144b73598e2SBram Moolenaar  sleep 100m
145b73598e2SBram Moolenaar  call assert_equal(0, g:val)
146b73598e2SBram Moolenaar
147b73598e2SBram Moolenaar  call timer_pause(id, 0)
148b73598e2SBram Moolenaar  let info = timer_info(id)
149b73598e2SBram Moolenaar  call assert_equal(0, info[0]['paused'])
150b73598e2SBram Moolenaar
151b73598e2SBram Moolenaar  let slept = WaitFor('g:val == 1')
152b73598e2SBram Moolenaar  call assert_equal(1, g:val)
153f267f8bdSBram Moolenaar  if has('reltime')
154a47ebdbdSBram Moolenaar    if has('mac')
155a47ebdbdSBram Moolenaar      " The travis Mac machines appear to be very busy.
156bc28e9f1SBram Moolenaar      call assert_inrange(0, 90, slept)
157a47ebdbdSBram Moolenaar    else
158f267f8bdSBram Moolenaar      call assert_inrange(0, 30, slept)
159a47ebdbdSBram Moolenaar    endif
160f267f8bdSBram Moolenaar  else
161b73598e2SBram Moolenaar    call assert_inrange(0, 10, slept)
162f267f8bdSBram Moolenaar  endif
163e20b9eceSBram Moolenaar
164e20b9eceSBram Moolenaar  call assert_fails('call timer_pause("abc", 1)', 'E39:')
165b73598e2SBram Moolenaarendfunc
166b73598e2SBram Moolenaar
167417ccd71SBram Moolenaarfunc StopMyself(timer)
168417ccd71SBram Moolenaar  let g:called += 1
169417ccd71SBram Moolenaar  if g:called == 2
170417ccd71SBram Moolenaar    call timer_stop(a:timer)
171417ccd71SBram Moolenaar  endif
172417ccd71SBram Moolenaarendfunc
173417ccd71SBram Moolenaar
1749a2fddcfSBram Moolenaarfunc Test_timer_delete_myself()
175417ccd71SBram Moolenaar  let g:called = 0
176417ccd71SBram Moolenaar  let t = timer_start(10, 'StopMyself', {'repeat': -1})
1770e9d1ae3SBram Moolenaar  call WaitForAssert({-> assert_equal(2, g:called)})
178417ccd71SBram Moolenaar  call assert_equal(2, g:called)
179417ccd71SBram Moolenaar  call assert_equal([], timer_info(t))
180417ccd71SBram Moolenaarendfunc
181417ccd71SBram Moolenaar
18275537a93SBram Moolenaarfunc StopTimer1(timer)
183f92e58caSBram Moolenaar  let g:timer2 = 10->timer_start('StopTimer2')
18475537a93SBram Moolenaar  " avoid maxfuncdepth error
18575537a93SBram Moolenaar  call timer_pause(g:timer1, 1)
186413c04e8SBram Moolenaar  sleep 20m
18775537a93SBram Moolenaarendfunc
18875537a93SBram Moolenaar
18975537a93SBram Moolenaarfunc StopTimer2(timer)
19075537a93SBram Moolenaar  call timer_stop(g:timer1)
19175537a93SBram Moolenaarendfunc
19275537a93SBram Moolenaar
1939a2fddcfSBram Moolenaarfunc Test_timer_stop_in_callback()
194*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
195427dddf0SBram Moolenaar  call assert_equal(0, len(timer_info()))
19675537a93SBram Moolenaar  let g:timer1 = timer_start(10, 'StopTimer1')
197315244d8SBram Moolenaar  let slept = 0
198315244d8SBram Moolenaar  for i in range(10)
199315244d8SBram Moolenaar    if len(timer_info()) == 0
200315244d8SBram Moolenaar      break
201315244d8SBram Moolenaar    endif
202315244d8SBram Moolenaar    sleep 10m
203315244d8SBram Moolenaar    let slept += 10
204315244d8SBram Moolenaar  endfor
205315244d8SBram Moolenaar  " This should take only 30 msec, but on Mac it's often longer
206315244d8SBram Moolenaar  call assert_inrange(0, 50, slept)
20775537a93SBram Moolenaarendfunc
20875537a93SBram Moolenaar
20975537a93SBram Moolenaarfunc StopTimerAll(timer)
21075537a93SBram Moolenaar  call timer_stopall()
21175537a93SBram Moolenaarendfunc
21275537a93SBram Moolenaar
2139a2fddcfSBram Moolenaarfunc Test_timer_stop_all_in_callback()
214*f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
215427dddf0SBram Moolenaar  call assert_equal(0, len(timer_info()))
216427dddf0SBram Moolenaar  call timer_start(10, 'StopTimerAll')
217427dddf0SBram Moolenaar  call assert_equal(1, len(timer_info()))
218427dddf0SBram Moolenaar  let slept = 0
219427dddf0SBram Moolenaar  for i in range(10)
220427dddf0SBram Moolenaar    if len(timer_info()) == 0
221427dddf0SBram Moolenaar      break
222427dddf0SBram Moolenaar    endif
223427dddf0SBram Moolenaar    sleep 10m
224427dddf0SBram Moolenaar    let slept += 10
225427dddf0SBram Moolenaar  endfor
226427dddf0SBram Moolenaar  call assert_inrange(0, 30, slept)
22775537a93SBram Moolenaarendfunc
22875537a93SBram Moolenaar
2291e8e1455SBram Moolenaarfunc FeedkeysCb(timer)
2301e8e1455SBram Moolenaar  call feedkeys("hello\<CR>", 'nt')
2311e8e1455SBram Moolenaarendfunc
2321e8e1455SBram Moolenaar
2331e8e1455SBram Moolenaarfunc InputCb(timer)
2341e8e1455SBram Moolenaar  call timer_start(10, 'FeedkeysCb')
2351e8e1455SBram Moolenaar  let g:val = input('?')
2361e8e1455SBram Moolenaar  call Resume()
2371e8e1455SBram Moolenaarendfunc
2381e8e1455SBram Moolenaar
2399a2fddcfSBram Moolenaarfunc Test_timer_input_in_timer()
2401e8e1455SBram Moolenaar  let g:val = ''
2411e8e1455SBram Moolenaar  call timer_start(10, 'InputCb')
2421e8e1455SBram Moolenaar  call Standby(1000)
2431e8e1455SBram Moolenaar  call assert_equal('hello', g:val)
2441e8e1455SBram Moolenaarendfunc
24575537a93SBram Moolenaar
246c577d813SBram Moolenaarfunc FuncWithError(timer)
247c577d813SBram Moolenaar  let g:call_count += 1
248c577d813SBram Moolenaar  if g:call_count == 4
249c577d813SBram Moolenaar    return
250c577d813SBram Moolenaar  endif
251c577d813SBram Moolenaar  doesnotexist
252c577d813SBram Moolenaarendfunc
253c577d813SBram Moolenaar
254c577d813SBram Moolenaarfunc Test_timer_errors()
255c577d813SBram Moolenaar  let g:call_count = 0
256c577d813SBram Moolenaar  let timer = timer_start(10, 'FuncWithError', {'repeat': -1})
257c577d813SBram Moolenaar  " Timer will be stopped after failing 3 out of 3 times.
2580e9d1ae3SBram Moolenaar  call WaitForAssert({-> assert_equal(3, g:call_count)})
259c577d813SBram Moolenaar  sleep 50m
260c577d813SBram Moolenaar  call assert_equal(3, g:call_count)
261e20b9eceSBram Moolenaar
262e20b9eceSBram Moolenaar  call assert_fails('call timer_start(100, "MyHandler", "abc")', 'E475:')
263e20b9eceSBram Moolenaar  call assert_fails('call timer_start(100, [])', 'E921:')
264e20b9eceSBram Moolenaar  call assert_fails('call timer_stop("abc")', 'E39:')
265c577d813SBram Moolenaarendfunc
266c577d813SBram Moolenaar
267e723c428SBram Moolenaarfunc FuncWithCaughtError(timer)
268e723c428SBram Moolenaar  let g:call_count += 1
269e723c428SBram Moolenaar  try
270e723c428SBram Moolenaar    doesnotexist
271e723c428SBram Moolenaar  catch
272e723c428SBram Moolenaar    " nop
273e723c428SBram Moolenaar  endtry
274e723c428SBram Moolenaarendfunc
275e723c428SBram Moolenaar
276e723c428SBram Moolenaarfunc Test_timer_catch_error()
277e723c428SBram Moolenaar  let g:call_count = 0
278e723c428SBram Moolenaar  let timer = timer_start(10, 'FuncWithCaughtError', {'repeat': 4})
279e723c428SBram Moolenaar  " Timer will not be stopped.
2800e9d1ae3SBram Moolenaar  call WaitForAssert({-> assert_equal(4, g:call_count)})
281e723c428SBram Moolenaar  sleep 50m
282e723c428SBram Moolenaar  call assert_equal(4, g:call_count)
283e723c428SBram Moolenaarendfunc
284e723c428SBram Moolenaar
2855e80de3fSBram Moolenaarfunc FeedAndPeek(timer)
2865e80de3fSBram Moolenaar  call test_feedinput('a')
2875e80de3fSBram Moolenaar  call getchar(1)
2885e80de3fSBram Moolenaarendfunc
2895e80de3fSBram Moolenaar
2905e80de3fSBram Moolenaarfunc Interrupt(timer)
291ce90e36fSBram Moolenaar  eval "\<C-C>"->test_feedinput()
2925e80de3fSBram Moolenaarendfunc
2935e80de3fSBram Moolenaar
2949a2fddcfSBram Moolenaarfunc Test_timer_peek_and_get_char()
2958c5a278fSBram Moolenaar  CheckUnix
2968c5a278fSBram Moolenaar  CheckGui
2978c5a278fSBram Moolenaar
2985e80de3fSBram Moolenaar  call timer_start(0, 'FeedAndPeek')
2995e80de3fSBram Moolenaar  let intr = timer_start(100, 'Interrupt')
3005e80de3fSBram Moolenaar  let c = getchar()
3015e80de3fSBram Moolenaar  call assert_equal(char2nr('a'), c)
302f92e58caSBram Moolenaar  eval intr->timer_stop()
3035e80de3fSBram Moolenaarendfunc
304c577d813SBram Moolenaar
3059a2fddcfSBram Moolenaarfunc Test_timer_getchar_zero()
3068d4ce56aSBram Moolenaar  if has('win32') && !has('gui_running')
3078c5a278fSBram Moolenaar    throw 'Skipped: cannot get low-level input'
308cb908a81SBram Moolenaar  endif
3095feabe00SBram Moolenaar  CheckFunction reltimefloat
310cb908a81SBram Moolenaar
31150948e4aSBram Moolenaar  " Measure the elapsed time to avoid a hang when it fails.
31250948e4aSBram Moolenaar  let start = reltime()
3138d4ce56aSBram Moolenaar  let id = timer_start(20, {-> feedkeys('x', 'L')})
31412dfc9eeSBram Moolenaar  let c = 0
31550948e4aSBram Moolenaar  while c == 0 && reltimefloat(reltime(start)) < 0.2
31612dfc9eeSBram Moolenaar    let c = getchar(0)
31712dfc9eeSBram Moolenaar    sleep 10m
31812dfc9eeSBram Moolenaar  endwhile
31912dfc9eeSBram Moolenaar  call assert_equal('x', nr2char(c))
320cb908a81SBram Moolenaar  call timer_stop(id)
32112dfc9eeSBram Moolenaarendfunc
32212dfc9eeSBram Moolenaar
3239a2fddcfSBram Moolenaarfunc Test_timer_ex_mode()
324f5291f30SBram Moolenaar  " Function with an empty line.
325f5291f30SBram Moolenaar  func Foo(...)
326f5291f30SBram Moolenaar
327f5291f30SBram Moolenaar  endfunc
328f5291f30SBram Moolenaar  let timer = timer_start(40, function('g:Foo'), {'repeat':-1})
329f5291f30SBram Moolenaar  " This used to throw error E749.
330f5291f30SBram Moolenaar  exe "normal Qsleep 100m\rvi\r"
331f5291f30SBram Moolenaar  call timer_stop(timer)
332f5291f30SBram Moolenaarendfunc
333f5291f30SBram Moolenaar
3349a2fddcfSBram Moolenaarfunc Test_timer_restore_count()
335494e9069SBram Moolenaar  CheckRunVimInTerminal
336b0f42ba6SBram Moolenaar  " Check that v:count is saved and restored, not changed by a timer.
337b0f42ba6SBram Moolenaar  call writefile([
338b0f42ba6SBram Moolenaar        \ 'nnoremap <expr><silent> L v:count ? v:count . "l" : "l"',
339b0f42ba6SBram Moolenaar        \ 'func Doit(id)',
340b0f42ba6SBram Moolenaar        \ '  normal 3j',
341b0f42ba6SBram Moolenaar        \ 'endfunc',
342b0f42ba6SBram Moolenaar        \ 'call timer_start(100, "Doit")',
343b0f42ba6SBram Moolenaar	\ ], 'Xtrcscript')
344b0f42ba6SBram Moolenaar  call writefile([
345b0f42ba6SBram Moolenaar        \ '1-1234',
346b0f42ba6SBram Moolenaar        \ '2-1234',
347b0f42ba6SBram Moolenaar        \ '3-1234',
348b0f42ba6SBram Moolenaar	\ ], 'Xtrctext')
349b0f42ba6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtrcscript Xtrctext', {})
350b0f42ba6SBram Moolenaar
351b0f42ba6SBram Moolenaar  " Wait for the timer to move the cursor to the third line.
352b0f42ba6SBram Moolenaar  call WaitForAssert({-> assert_equal(3, term_getcursor(buf)[0])})
353b0f42ba6SBram Moolenaar  call assert_equal(1, term_getcursor(buf)[1])
354b0f42ba6SBram Moolenaar  " Now check that v:count has not been set to 3
355b0f42ba6SBram Moolenaar  call term_sendkeys(buf, 'L')
356b0f42ba6SBram Moolenaar  call WaitForAssert({-> assert_equal(2, term_getcursor(buf)[1])})
357b0f42ba6SBram Moolenaar
358b0f42ba6SBram Moolenaar  call StopVimInTerminal(buf)
359b0f42ba6SBram Moolenaar  call delete('Xtrcscript')
360b0f42ba6SBram Moolenaar  call delete('Xtrctext')
361b0f42ba6SBram Moolenaarendfunc
362b0f42ba6SBram Moolenaar
363adc6714aSBram Moolenaar" Test that the garbage collector isn't triggered if a timer callback invokes
364adc6714aSBram Moolenaar" vgetc().
3659a2fddcfSBram Moolenaarfunc Test_timer_nocatch_garbage_collect()
366adc6714aSBram Moolenaar  " 'uptimetime. must be bigger than the timer timeout
367adc6714aSBram Moolenaar  set ut=200
368adc6714aSBram Moolenaar  call test_garbagecollect_soon()
369adc6714aSBram Moolenaar  call test_override('no_wait_return', 0)
370adc6714aSBram Moolenaar  func CauseAnError(id)
371adc6714aSBram Moolenaar    " This will show an error and wait for Enter.
372adc6714aSBram Moolenaar    let a = {'foo', 'bar'}
373adc6714aSBram Moolenaar  endfunc
374adc6714aSBram Moolenaar  func FeedChar(id)
375adc6714aSBram Moolenaar    call feedkeys('x', 't')
376adc6714aSBram Moolenaar  endfunc
377adc6714aSBram Moolenaar  call timer_start(300, 'FeedChar')
378adc6714aSBram Moolenaar  call timer_start(100, 'CauseAnError')
379adc6714aSBram Moolenaar  let x = getchar()
380adc6714aSBram Moolenaar
381adc6714aSBram Moolenaar  set ut&
382adc6714aSBram Moolenaar  call test_override('no_wait_return', 1)
383adc6714aSBram Moolenaar  delfunc CauseAnError
384adc6714aSBram Moolenaar  delfunc FeedChar
385adc6714aSBram Moolenaarendfunc
386adc6714aSBram Moolenaar
3879a2fddcfSBram Moolenaarfunc Test_timer_error_in_timer_callback()
3880d702028SBram Moolenaar  if !has('terminal') || (has('win32') && has('gui_running'))
3897d491c42SBram Moolenaar    throw 'Skipped: cannot run Vim in a terminal window'
3907d491c42SBram Moolenaar  endif
3917d491c42SBram Moolenaar
3927d491c42SBram Moolenaar  let lines =<< trim [CODE]
3937d491c42SBram Moolenaar  func Func(timer)
3947d491c42SBram Moolenaar    " fail to create list
3957d491c42SBram Moolenaar    let x = [
3967d491c42SBram Moolenaar  endfunc
3977d491c42SBram Moolenaar  set updatetime=50
3987d491c42SBram Moolenaar  call timer_start(1, 'Func')
3997d491c42SBram Moolenaar  [CODE]
4007d491c42SBram Moolenaar  call writefile(lines, 'Xtest.vim')
4017d491c42SBram Moolenaar
4020d702028SBram Moolenaar  let buf = term_start(GetVimCommandCleanTerm() .. ' -S Xtest.vim', {'term_rows': 8})
4037d491c42SBram Moolenaar  let job = term_getjob(buf)
4047d491c42SBram Moolenaar  call WaitForAssert({-> assert_notequal('', term_getline(buf, 8))})
4057d491c42SBram Moolenaar
4067d491c42SBram Moolenaar  " GC must not run during timer callback, which can make Vim crash.
4076a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
4087d491c42SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
4096a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
4107d491c42SBram Moolenaar  call assert_equal('run', job_status(job))
4117d491c42SBram Moolenaar
4127d491c42SBram Moolenaar  call term_sendkeys(buf, ":qall!\<CR>")
4137d491c42SBram Moolenaar  call WaitFor({-> job_status(job) ==# 'dead'})
4147d491c42SBram Moolenaar  if has('unix')
4157d491c42SBram Moolenaar    call assert_equal('', job_info(job).termsig)
4167d491c42SBram Moolenaar  endif
4177d491c42SBram Moolenaar
4187d491c42SBram Moolenaar  call delete('Xtest.vim')
4197d491c42SBram Moolenaar  exe buf .. 'bwipe!'
4207d491c42SBram Moolenaarendfunc
4217d491c42SBram Moolenaar
422e20b9eceSBram Moolenaar" Test for garbage collection when a timer is still running
423e20b9eceSBram Moolenaarfunc Test_timer_garbage_collect()
424e20b9eceSBram Moolenaar  let timer = timer_start(1000, function('MyHandler'), {'repeat' : 10})
425e20b9eceSBram Moolenaar  call test_garbagecollect_now()
426e20b9eceSBram Moolenaar  let l = timer_info(timer)
427e20b9eceSBram Moolenaar  call assert_equal(function('MyHandler'), l[0].callback)
428e20b9eceSBram Moolenaar  call timer_stop(timer)
429e20b9eceSBram Moolenaarendfunc
430e20b9eceSBram Moolenaar
43114e57909SBram Moolenaarfunc Test_timer_invalid_callback()
432e2e4075fSBram Moolenaar  call assert_fails('call timer_start(0, "0")', 'E921:')
43314e57909SBram Moolenaarendfunc
43414e57909SBram Moolenaar
4353fffa971SBram Moolenaarfunc Test_timer_changing_function_list()
4363fffa971SBram Moolenaar  CheckRunVimInTerminal
4373fffa971SBram Moolenaar
4383fffa971SBram Moolenaar  " Create a large number of functions.  Should get the "more" prompt.
4393fffa971SBram Moolenaar  " The typing "G" triggers the timer, which changes the function table.
4403fffa971SBram Moolenaar  let lines =<< trim END
4413fffa971SBram Moolenaar    for func in map(range(1,99), "'Func' .. v:val")
4423fffa971SBram Moolenaar      exe "func " .. func .. "()"
4433fffa971SBram Moolenaar      endfunc
4443fffa971SBram Moolenaar    endfor
4453fffa971SBram Moolenaar    au CmdlineLeave : call timer_start(0, {-> 0})
4463fffa971SBram Moolenaar  END
4473fffa971SBram Moolenaar  call writefile(lines, 'XTest_timerchange')
4483fffa971SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_timerchange', #{rows: 10})
4493fffa971SBram Moolenaar  call term_sendkeys(buf, ":fu\<CR>")
4503fffa971SBram Moolenaar  call WaitForAssert({-> assert_match('-- More --', term_getline(buf, 10))})
4513fffa971SBram Moolenaar  call term_sendkeys(buf, "G")
452e2e4075fSBram Moolenaar  call WaitForAssert({-> assert_match('E454:', term_getline(buf, 9))})
4533fffa971SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
4543fffa971SBram Moolenaar
4553fffa971SBram Moolenaar  call StopVimInTerminal(buf)
4563fffa971SBram Moolenaar  call delete('XTest_timerchange')
4573fffa971SBram Moolenaarendfunc
4583fffa971SBram Moolenaar
4599f28416eSBram Moolenaarfunc Test_timer_outputting_message()
4609f28416eSBram Moolenaar  CheckRunVimInTerminal
4619f28416eSBram Moolenaar
4629f28416eSBram Moolenaar  let lines =<< trim END
4639f28416eSBram Moolenaar    vim9script
4649f28416eSBram Moolenaar    setline(1, 'some text')
4659f28416eSBram Moolenaar    set showcmd ut=2000 cmdheight=1
4669f28416eSBram Moolenaar    timer_start(0, (_) => {
4679f28416eSBram Moolenaar            echon repeat('x', &columns - 11)
4689f28416eSBram Moolenaar        })
4699f28416eSBram Moolenaar  END
4709f28416eSBram Moolenaar  call writefile(lines, 'XTest_timermessage')
4719f28416eSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_timermessage', #{rows: 6})
4729f28416eSBram Moolenaar  call term_sendkeys(buf, "l")
4739f28416eSBram Moolenaar  call term_wait(buf)
4749f28416eSBram Moolenaar  " should not get a hit-enter prompt
4759f28416eSBram Moolenaar  call WaitForAssert({-> assert_match('xxxxxxxxxxx', term_getline(buf, 6))})
4769f28416eSBram Moolenaar
4779f28416eSBram Moolenaar  call StopVimInTerminal(buf)
4789f28416eSBram Moolenaar  call delete('XTest_timermessage')
4799f28416eSBram Moolenaarendfunc
4809f28416eSBram Moolenaar
481*f08b0eb8SBram Moolenaar
4829e4d8215SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
483