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