blob: 142bfc8a54eb2f8ebad2fa136d813ee543d81b54 [file] [log] [blame]
Bram Moolenaar975b5272016-03-15 23:10:59 +01001" Test for timers
2
3if !has('timers')
4 finish
5endif
6
7func MyHandler(timer)
Bram Moolenaarb73598e2016-08-07 18:22:53 +02008 let g:val += 1
Bram Moolenaar975b5272016-03-15 23:10:59 +01009endfunc
10
Bram Moolenaare3188e22016-05-31 21:13:04 +020011func MyHandlerWithLists(lists, timer)
12 let x = string(a:lists)
13endfunc
14
Bram Moolenaar975b5272016-03-15 23:10:59 +010015func Test_oneshot()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020016 let g:val = 0
Bram Moolenaar975b5272016-03-15 23:10:59 +010017 let timer = timer_start(50, 'MyHandler')
Bram Moolenaarb73598e2016-08-07 18:22:53 +020018 let slept = WaitFor('g:val == 1')
19 call assert_equal(1, g:val)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020020 if has('reltime')
Bram Moolenaar0426bae2016-08-28 16:06:05 +020021 call assert_inrange(49, 100, slept)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020022 else
23 call assert_inrange(20, 100, slept)
24 endif
Bram Moolenaar975b5272016-03-15 23:10:59 +010025endfunc
26
27func Test_repeat_three()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020028 let g:val = 0
Bram Moolenaar975b5272016-03-15 23:10:59 +010029 let timer = timer_start(50, 'MyHandler', {'repeat': 3})
Bram Moolenaarb73598e2016-08-07 18:22:53 +020030 let slept = WaitFor('g:val == 3')
31 call assert_equal(3, g:val)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020032 if has('reltime')
Bram Moolenaar0426bae2016-08-28 16:06:05 +020033 call assert_inrange(149, 250, slept)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020034 else
35 call assert_inrange(80, 200, slept)
36 endif
Bram Moolenaar975b5272016-03-15 23:10:59 +010037endfunc
38
39func Test_repeat_many()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020040 let g:val = 0
Bram Moolenaar975b5272016-03-15 23:10:59 +010041 let timer = timer_start(50, 'MyHandler', {'repeat': -1})
42 sleep 200m
43 call timer_stop(timer)
Bram Moolenaarb73598e2016-08-07 18:22:53 +020044 call assert_inrange(2, 4, g:val)
Bram Moolenaar975b5272016-03-15 23:10:59 +010045endfunc
Bram Moolenaar92e35ef2016-03-26 18:20:41 +010046
47func Test_with_partial_callback()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020048 let g:val = 0
Bram Moolenaar26fe0d52016-09-10 14:27:30 +020049 let meow = {'one': 1}
50 function meow.bite(...)
51 let g:val += self.one
Bram Moolenaar92e35ef2016-03-26 18:20:41 +010052 endfunction
53
Bram Moolenaar26fe0d52016-09-10 14:27:30 +020054 call timer_start(50, meow.bite)
Bram Moolenaarb73598e2016-08-07 18:22:53 +020055 let slept = WaitFor('g:val == 1')
56 call assert_equal(1, g:val)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020057 if has('reltime')
Bram Moolenaar0426bae2016-08-28 16:06:05 +020058 call assert_inrange(49, 130, slept)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +020059 else
60 call assert_inrange(20, 100, slept)
61 endif
Bram Moolenaar92e35ef2016-03-26 18:20:41 +010062endfunc
Bram Moolenaare3188e22016-05-31 21:13:04 +020063
64func Test_retain_partial()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020065 call timer_start(50, function('MyHandlerWithLists', [['a']]))
Bram Moolenaare3188e22016-05-31 21:13:04 +020066 call test_garbagecollect_now()
Bram Moolenaarb73598e2016-08-07 18:22:53 +020067 sleep 100m
Bram Moolenaare3188e22016-05-31 21:13:04 +020068endfunc
Bram Moolenaarb73598e2016-08-07 18:22:53 +020069
70func Test_info()
71 let id = timer_start(1000, 'MyHandler')
72 let info = timer_info(id)
73 call assert_equal(id, info[0]['id'])
74 call assert_equal(1000, info[0]['time'])
75 call assert_true(info[0]['remaining'] > 500)
76 call assert_true(info[0]['remaining'] <= 1000)
77 call assert_equal(1, info[0]['repeat'])
78 call assert_equal("function('MyHandler')", string(info[0]['callback']))
79
80 let found = 0
81 for info in timer_info()
82 if info['id'] == id
83 let found += 1
84 endif
85 endfor
86 call assert_equal(1, found)
87
88 call timer_stop(id)
89 call assert_equal([], timer_info(id))
90endfunc
91
92func Test_stopall()
93 let id1 = timer_start(1000, 'MyHandler')
94 let id2 = timer_start(2000, 'MyHandler')
95 let info = timer_info()
96 call assert_equal(2, len(info))
97
98 call timer_stopall()
99 let info = timer_info()
100 call assert_equal(0, len(info))
101endfunc
102
103func Test_paused()
104 let g:val = 0
105
106 let id = timer_start(50, 'MyHandler')
107 let info = timer_info(id)
108 call assert_equal(0, info[0]['paused'])
109
110 call timer_pause(id, 1)
111 let info = timer_info(id)
112 call assert_equal(1, info[0]['paused'])
113 sleep 100m
114 call assert_equal(0, g:val)
115
116 call timer_pause(id, 0)
117 let info = timer_info(id)
118 call assert_equal(0, info[0]['paused'])
119
120 let slept = WaitFor('g:val == 1')
121 call assert_equal(1, g:val)
Bram Moolenaarf267f8b2016-08-22 21:40:29 +0200122 if has('reltime')
123 call assert_inrange(0, 30, slept)
124 else
125 call assert_inrange(0, 10, slept)
126 endif
Bram Moolenaarb73598e2016-08-07 18:22:53 +0200127endfunc
128
Bram Moolenaar417ccd72016-09-01 21:26:20 +0200129func StopMyself(timer)
130 let g:called += 1
131 if g:called == 2
132 call timer_stop(a:timer)
133 endif
134endfunc
135
136func Test_delete_myself()
137 let g:called = 0
138 let t = timer_start(10, 'StopMyself', {'repeat': -1})
139 call WaitFor('g:called == 2')
140 call assert_equal(2, g:called)
141 call assert_equal([], timer_info(t))
142endfunc
143
Bram Moolenaar75537a92016-09-05 22:45:28 +0200144func StopTimer1(timer)
145 let g:timer2 = timer_start(10, 'StopTimer2')
146 " avoid maxfuncdepth error
147 call timer_pause(g:timer1, 1)
148 sleep 40m
149endfunc
150
151func StopTimer2(timer)
152 call timer_stop(g:timer1)
153endfunc
154
155func Test_stop_in_callback()
156 let g:timer1 = timer_start(10, 'StopTimer1')
157 sleep 40m
158endfunc
159
160func StopTimerAll(timer)
161 call timer_stopall()
162endfunc
163
164func Test_stop_all_in_callback()
165 let g:timer1 = timer_start(10, 'StopTimerAll')
166 let info = timer_info()
167 call assert_equal(1, len(info))
168 sleep 40m
169 let info = timer_info()
170 call assert_equal(0, len(info))
171endfunc
172
Bram Moolenaar1e8e1452017-06-24 16:03:06 +0200173func FeedkeysCb(timer)
174 call feedkeys("hello\<CR>", 'nt')
175endfunc
176
177func InputCb(timer)
178 call timer_start(10, 'FeedkeysCb')
179 let g:val = input('?')
180 call Resume()
181endfunc
182
183func Test_input_in_timer()
184 let g:val = ''
185 call timer_start(10, 'InputCb')
186 call Standby(1000)
187 call assert_equal('hello', g:val)
188endfunc
Bram Moolenaar75537a92016-09-05 22:45:28 +0200189
Bram Moolenaarc577d812017-07-08 22:37:34 +0200190func FuncWithError(timer)
191 let g:call_count += 1
192 if g:call_count == 4
193 return
194 endif
195 doesnotexist
196endfunc
197
198func Test_timer_errors()
199 let g:call_count = 0
200 let timer = timer_start(10, 'FuncWithError', {'repeat': -1})
201 " Timer will be stopped after failing 3 out of 3 times.
202 call WaitFor('g:call_count == 3')
203 sleep 50m
204 call assert_equal(3, g:call_count)
205endfunc
206
Bram Moolenaar5e80de32017-09-03 15:48:12 +0200207func FeedAndPeek(timer)
208 call test_feedinput('a')
209 call getchar(1)
210endfunc
211
212func Interrupt(timer)
213 call test_feedinput("\<C-C>")
214endfunc
215
216func Test_peek_and_get_char()
217 if !has('unix') && !has('gui_running')
218 return
219 endif
220 call timer_start(0, 'FeedAndPeek')
221 let intr = timer_start(100, 'Interrupt')
222 let c = getchar()
223 call assert_equal(char2nr('a'), c)
224 call timer_stop(intr)
225endfunc
Bram Moolenaarc577d812017-07-08 22:37:34 +0200226
Bram Moolenaar9e4d8212016-08-18 23:04:48 +0200227" vim: shiftwidth=2 sts=2 expandtab