blob: 436ef72f61394b1ed057013d5fe369e30baba476 [file] [log] [blame]
Bram Moolenaar43345542015-11-29 17:35:35 +01001" This script is sourced while editing the .vim file with the tests.
2" When the script is successful the .res file will be created.
3" Errors are appended to the test.log file.
4"
Bram Moolenaarbefb3662016-02-20 14:41:40 +01005" To execute only specific test functions, add a second argument. It will be
6" matched against the names of the Test_ funtion. E.g.:
7" ../vim -u NONE -S runtest.vim test_channel.vim open_delay
8" The output can be found in the "messages" file.
9"
Bram Moolenaar43345542015-11-29 17:35:35 +010010" The test script may contain anything, only functions that start with
11" "Test_" are special. These will be invoked and should contain assert
12" functions. See test_assert.vim for an example.
13"
14" It is possible to source other files that contain "Test_" functions. This
15" can speed up testing, since Vim does not need to restart. But be careful
16" that the tests do not interfere with each other.
17"
18" If an error cannot be detected properly with an assert function add the
19" error to the v:errors list:
20" call add(v:errors, 'test foo failed: Cannot find xyz')
21"
22" If preparation for each Test_ function is needed, define a SetUp function.
23" It will be called before each Test_ function.
24"
25" If cleanup after each Test_ function is needed, define a TearDown function.
26" It will be called after each Test_ function.
Bram Moolenaar00af60b2016-02-13 14:06:14 +010027"
28" When debugging a test it can be useful to add messages to v:errors:
Bram Moolenaar8ad16da2019-01-06 15:29:57 +010029" call add(v:errors, "this happened")
Bram Moolenaar00af60b2016-02-13 14:06:14 +010030
Bram Moolenaar43345542015-11-29 17:35:35 +010031
32" Without the +eval feature we can't run these tests, bail out.
Bram Moolenaar4686b322015-12-28 14:44:10 +010033so small.vim
Bram Moolenaar43345542015-11-29 17:35:35 +010034
35" Check that the screen size is at least 24 x 80 characters.
36if &lines < 24 || &columns < 80
37 let error = 'Screen size too small! Tests require at least 24 lines with 80 characters'
38 echoerr error
39 split test.log
40 $put =error
Bram Moolenaar45aa07d2019-06-15 18:20:38 +020041 write
42 split messages
43 call append(line('$'), error)
44 write
45 qa!
Bram Moolenaar43345542015-11-29 17:35:35 +010046endif
47
Bram Moolenaar75ee5442019-06-06 18:05:25 +020048if has('reltime')
49 let s:start_time = reltime()
50endif
51
Bram Moolenaar89b10422016-07-12 22:51:22 +020052" Common with all tests on all systems.
53source setup.vim
54
Bram Moolenaarc0662462015-12-30 15:49:05 +010055" For consistency run all tests with 'nocompatible' set.
56" This also enables use of line continuation.
57set nocp viminfo+=nviminfo
58
Bram Moolenaar30276f22019-01-24 17:59:39 +010059" Use utf-8 by default, instead of whatever the system default happens to be.
Bram Moolenaared79d1e2019-02-22 14:38:58 +010060" Individual tests can overrule this at the top of the file and use
61" g:orig_encoding if needed.
62let g:orig_encoding = &encoding
Bram Moolenaar30276f22019-01-24 17:59:39 +010063set encoding=utf-8
Bram Moolenaarac105ed2016-07-21 20:33:32 +020064
Bram Moolenaard8f27b32018-10-07 15:42:07 +020065" REDIR_TEST_TO_NULL has a very permissive SwapExists autocommand which is for
66" the test_name.vim file itself. Replace it here with a more restrictive one,
67" so we still catch mistakes.
68let s:test_script_fname = expand('%')
69au! SwapExists * call HandleSwapExists()
70func HandleSwapExists()
Bram Moolenaarb073da82019-07-13 14:47:26 +020071 " Ignore finding a swap file for the test script (the user might be
Bram Moolenaard8f27b32018-10-07 15:42:07 +020072 " editing it and do ":make test_name") and the output file.
Bram Moolenaarb073da82019-07-13 14:47:26 +020073 " Report finding another swap file and chose 'q' to avoid getting stuck.
Bram Moolenaard8f27b32018-10-07 15:42:07 +020074 if expand('<afile>') == 'messages' || expand('<afile>') =~ s:test_script_fname
75 let v:swapchoice = 'e'
Bram Moolenaarb073da82019-07-13 14:47:26 +020076 else
77 call assert_report('Unexpected swap file: ' .. v:swapname)
78 let v:swapchoice = 'q'
Bram Moolenaard8f27b32018-10-07 15:42:07 +020079 endif
80endfunc
81
Bram Moolenaar7a073542017-02-01 23:17:36 +010082" Avoid stopping at the "hit enter" prompt
83set nomore
84
Bram Moolenaarc0662462015-12-30 15:49:05 +010085" Output all messages in English.
86lang mess C
87
Bram Moolenaarf60b7962016-01-16 22:47:23 +010088" Always use forward slashes.
89set shellslash
90
Bram Moolenaar28fb79d2016-01-09 22:28:33 +010091let s:srcdir = expand('%:p:h:h')
92
Bram Moolenaar8e8df252016-05-25 21:23:21 +020093" Prepare for calling test_garbagecollect_now().
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020094let v:testing = 1
95
Bram Moolenaar28fb79d2016-01-09 22:28:33 +010096" Support function: get the alloc ID by name.
97function GetAllocId(name)
98 exe 'split ' . s:srcdir . '/alloc.h'
Bram Moolenaar065ee9a2016-01-15 20:53:38 +010099 let top = search('typedef enum')
100 if top == 0
101 call add(v:errors, 'typedef not found in alloc.h')
102 endif
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100103 let lnum = search('aid_' . a:name . ',')
104 if lnum == 0
105 call add(v:errors, 'Alloc ID ' . a:name . ' not defined')
106 endif
107 close
Bram Moolenaar065ee9a2016-01-15 20:53:38 +0100108 return lnum - top - 1
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100109endfunc
110
Bram Moolenaar42205552017-03-18 19:42:22 +0100111func RunTheTest(test)
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100112 echo 'Executing ' . a:test
Bram Moolenaar75ee5442019-06-06 18:05:25 +0200113 if has('reltime')
114 let func_start = reltime()
115 endif
Bram Moolenaare5f2a072017-02-01 22:31:49 +0100116
117 " Avoid stopping at the "hit enter" prompt
118 set nomore
119
120 " Avoid a three second wait when a message is about to be overwritten by the
121 " mode message.
122 set noshowmode
123
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100124 " Clear any overrides.
125 call test_override('ALL', 0)
126
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200127 " Some tests wipe out buffers. To be consistent, always wipe out all
128 " buffers.
129 %bwipe!
130
Bram Moolenaar209d3872017-11-16 21:52:51 +0100131 " The test may change the current directory. Save and restore the
132 " directory after executing the test.
133 let save_cwd = getcwd()
134
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100135 if exists("*SetUp")
Bram Moolenaarcc28e2d2016-11-17 17:56:13 +0100136 try
137 call SetUp()
138 catch
139 call add(v:errors, 'Caught exception in SetUp() before ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
140 endtry
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100141 endif
142
Bram Moolenaarf204e052017-10-26 17:14:01 +0200143 if a:test =~ 'Test_nocatch_'
144 " Function handles errors itself. This avoids skipping commands after the
145 " error.
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100146 exe 'call ' . a:test
Bram Moolenaarf204e052017-10-26 17:14:01 +0200147 else
148 try
Bram Moolenaar89036762018-06-12 14:58:39 +0200149 let s:test = a:test
150 au VimLeavePre * call EarlyExit(s:test)
Bram Moolenaarf204e052017-10-26 17:14:01 +0200151 exe 'call ' . a:test
Bram Moolenaar89036762018-06-12 14:58:39 +0200152 au! VimLeavePre
Bram Moolenaarf204e052017-10-26 17:14:01 +0200153 catch /^\cskipped/
154 call add(s:messages, ' Skipped')
155 call add(s:skipped, 'SKIPPED ' . a:test . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
156 catch
157 call add(v:errors, 'Caught exception in ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
158 endtry
159 endif
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100160
Bram Moolenaar8ad16da2019-01-06 15:29:57 +0100161 " In case 'insertmode' was set and something went wrong, make sure it is
162 " reset to avoid trouble with anything else.
163 set noinsertmode
164
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100165 if exists("*TearDown")
Bram Moolenaarcc28e2d2016-11-17 17:56:13 +0100166 try
167 call TearDown()
168 catch
169 call add(v:errors, 'Caught exception in TearDown() after ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
170 endtry
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100171 endif
Bram Moolenaar7cba71d2016-08-02 23:04:49 +0200172
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200173 " Clear any autocommands
174 au!
Bram Moolenaard8f27b32018-10-07 15:42:07 +0200175 au SwapExists * call HandleSwapExists()
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200176
Bram Moolenaarae943152019-06-16 22:54:14 +0200177 " Close any stray popup windows
178 if has('textprop')
179 call popup_clear()
180 endif
181
Bram Moolenaarce11de82017-10-26 22:00:00 +0200182 " Close any extra tab pages and windows and make the current one not modified.
183 while tabpagenr('$') > 1
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200184 quit!
Bram Moolenaarce11de82017-10-26 22:00:00 +0200185 endwhile
186
Bram Moolenaar358308d2016-08-24 21:21:26 +0200187 while 1
188 let wincount = winnr('$')
189 if wincount == 1
190 break
191 endif
Bram Moolenaar7cba71d2016-08-02 23:04:49 +0200192 bwipe!
Bram Moolenaar358308d2016-08-24 21:21:26 +0200193 if wincount == winnr('$')
194 " Did not manage to close a window.
195 only!
196 break
197 endif
Bram Moolenaar7cba71d2016-08-02 23:04:49 +0200198 endwhile
Bram Moolenaar209d3872017-11-16 21:52:51 +0100199
200 exe 'cd ' . save_cwd
Bram Moolenaar640d4f02019-06-10 17:43:46 +0200201
202 let message = 'Executed ' . a:test
203 if has('reltime')
204 let message ..= ' in ' .. reltimestr(reltime(func_start)) .. ' seconds'
205 endif
206 call add(s:messages, message)
207 let s:done += 1
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100208endfunc
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100209
Bram Moolenaar42205552017-03-18 19:42:22 +0100210func AfterTheTest()
211 if len(v:errors) > 0
212 let s:fail += 1
213 call add(s:errors, 'Found errors in ' . s:test . ':')
214 call extend(s:errors, v:errors)
215 let v:errors = []
216 endif
217endfunc
218
Bram Moolenaar89036762018-06-12 14:58:39 +0200219func EarlyExit(test)
220 " It's OK for the test we use to test the quit detection.
221 if a:test != 'Test_zz_quit_detected()'
222 call add(v:errors, 'Test caused Vim to exit: ' . a:test)
223 endif
224
225 call FinishTesting()
226endfunc
227
Bram Moolenaar42205552017-03-18 19:42:22 +0100228" This function can be called by a test if it wants to abort testing.
229func FinishTesting()
230 call AfterTheTest()
231
232 " Don't write viminfo on exit.
233 set viminfo=
234
Bram Moolenaard1ee0042017-07-29 20:39:53 +0200235 " Clean up files created by setup.vim
236 call delete('XfakeHOME', 'rf')
237
Bram Moolenaar42205552017-03-18 19:42:22 +0100238 if s:fail == 0
239 " Success, create the .res file so that make knows it's done.
240 exe 'split ' . fnamemodify(g:testname, ':r') . '.res'
241 write
242 endif
243
244 if len(s:errors) > 0
245 " Append errors to test.log
246 split test.log
247 call append(line('$'), '')
248 call append(line('$'), 'From ' . g:testname . ':')
249 call append(line('$'), s:errors)
250 write
251 endif
252
Bram Moolenaar29f9ed22018-04-10 19:20:31 +0200253 if s:done == 0
254 let message = 'NO tests executed'
255 else
256 let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test')
257 endif
Bram Moolenaar75ee5442019-06-06 18:05:25 +0200258 if has('reltime')
259 let message ..= ' in ' .. reltimestr(reltime(s:start_time)) .. ' seconds'
260 endif
Bram Moolenaar42205552017-03-18 19:42:22 +0100261 echo message
262 call add(s:messages, message)
263 if s:fail > 0
264 let message = s:fail . ' FAILED:'
265 echo message
266 call add(s:messages, message)
267 call extend(s:messages, s:errors)
268 endif
269
270 " Add SKIPPED messages
271 call extend(s:messages, s:skipped)
272
273 " Append messages to the file "messages"
274 split messages
275 call append(line('$'), '')
276 call append(line('$'), 'From ' . g:testname . ':')
277 call append(line('$'), s:messages)
278 write
279
280 qall!
281endfunc
282
Bram Moolenaar43345542015-11-29 17:35:35 +0100283" Source the test script. First grab the file name, in case the script
Bram Moolenaar00af60b2016-02-13 14:06:14 +0100284" navigates away. g:testname can be used by the tests.
285let g:testname = expand('%')
286let s:done = 0
287let s:fail = 0
288let s:errors = []
289let s:messages = []
Bram Moolenaardac19472016-09-03 22:35:40 +0200290let s:skipped = []
Bram Moolenaarb544f3c2017-02-23 19:03:28 +0100291if expand('%') =~ 'test_vimscript.vim'
Bram Moolenaar00af60b2016-02-13 14:06:14 +0100292 " this test has intentional s:errors, don't use try/catch.
Bram Moolenaar4686b322015-12-28 14:44:10 +0100293 source %
Bram Moolenaara2cce862016-01-02 19:50:04 +0100294else
295 try
296 source %
Bram Moolenaar9c0cec62019-06-06 13:38:15 +0200297 catch /^\cskipped/
298 call add(s:messages, ' Skipped')
299 call add(s:skipped, 'SKIPPED ' . expand('%') . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
Bram Moolenaara2cce862016-01-02 19:50:04 +0100300 catch
Bram Moolenaar00af60b2016-02-13 14:06:14 +0100301 let s:fail += 1
302 call add(s:errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint)
Bram Moolenaara2cce862016-01-02 19:50:04 +0100303 endtry
304endif
Bram Moolenaar43345542015-11-29 17:35:35 +0100305
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100306" Names of flaky tests.
Bram Moolenaardbc0d212018-11-16 18:22:45 +0100307let s:flaky_tests = [
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100308 \ 'Test_call()',
309 \ 'Test_channel_handler()',
Bram Moolenaar42205552017-03-18 19:42:22 +0100310 \ 'Test_client_server()',
Bram Moolenaar6fe2eb42017-01-29 21:49:51 +0100311 \ 'Test_close_and_exit_cb()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100312 \ 'Test_close_callback()',
313 \ 'Test_close_handle()',
314 \ 'Test_close_lambda()',
Bram Moolenaard80232b2018-12-15 17:46:23 +0100315 \ 'Test_close_output_buffer()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100316 \ 'Test_close_partial()',
Bram Moolenaarb2455592017-02-01 18:00:13 +0100317 \ 'Test_collapse_buffers()',
318 \ 'Test_communicate()',
Bram Moolenaar65873842018-03-25 17:12:58 +0200319 \ 'Test_cwd()',
Bram Moolenaar218959b2018-11-11 18:51:42 +0100320 \ 'Test_diff_screen()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100321 \ 'Test_exit_callback()',
Bram Moolenaar0529b3e2017-03-16 22:30:37 +0100322 \ 'Test_exit_callback_interval()',
Bram Moolenaarb2455592017-02-01 18:00:13 +0100323 \ 'Test_nb_basic()',
Bram Moolenaard512e172017-02-27 21:35:53 +0100324 \ 'Test_oneshot()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100325 \ 'Test_open_delay()',
Bram Moolenaar1eca6f12017-12-05 14:04:27 +0100326 \ 'Test_out_cb()',
Bram Moolenaar24820692017-12-02 16:38:12 +0100327 \ 'Test_paused()',
Bram Moolenaarc79d6aa2016-09-25 22:27:37 +0200328 \ 'Test_pipe_through_sort_all()',
Bram Moolenaar4e032e12017-02-01 20:48:13 +0100329 \ 'Test_pipe_through_sort_some()',
Bram Moolenaar142ae732018-08-19 17:04:01 +0200330 \ 'Test_popup_and_window_resize()',
Bram Moolenaar0fbff642017-03-05 14:30:52 +0100331 \ 'Test_quoteplus()',
Bram Moolenaar7dd48502017-03-19 20:04:22 +0100332 \ 'Test_quotestar()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100333 \ 'Test_raw_one_time_callback()',
Bram Moolenaarb2455592017-02-01 18:00:13 +0100334 \ 'Test_reltime()',
Bram Moolenaarbfbea562018-02-12 21:31:35 +0100335 \ 'Test_repeat_three()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100336 \ 'Test_server_crash()',
337 \ 'Test_terminal_ansicolors_default()',
338 \ 'Test_terminal_ansicolors_func()',
339 \ 'Test_terminal_ansicolors_global()',
Bram Moolenaarf204e052017-10-26 17:14:01 +0200340 \ 'Test_terminal_composing_unicode()',
Bram Moolenaar38767892019-02-21 18:17:14 +0100341 \ 'Test_terminal_does_not_truncate_last_newlines()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100342 \ 'Test_terminal_env()',
343 \ 'Test_terminal_hide_buffer()',
344 \ 'Test_terminal_make_change()',
Bram Moolenaar3615abb2019-02-10 23:04:12 +0100345 \ 'Test_terminal_no_cmd()',
Bram Moolenaar75a60f72017-09-07 22:24:41 +0200346 \ 'Test_terminal_noblock()',
Bram Moolenaar7dd88c52017-11-04 20:46:40 +0100347 \ 'Test_terminal_redir_file()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100348 \ 'Test_terminal_response_to_control_sequence()',
349 \ 'Test_terminal_scrollback()',
350 \ 'Test_terminal_split_quit()',
351 \ 'Test_terminal_termwinkey()',
352 \ 'Test_terminal_termwinsize_mininmum()',
353 \ 'Test_terminal_termwinsize_option_fixed()',
354 \ 'Test_terminal_termwinsize_option_zero()',
Bram Moolenaar24820692017-12-02 16:38:12 +0100355 \ 'Test_terminal_tmap()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100356 \ 'Test_terminal_wall()',
357 \ 'Test_terminal_wipe_buffer()',
358 \ 'Test_terminal_wqall()',
359 \ 'Test_two_channels()',
360 \ 'Test_unlet_handle()',
Bram Moolenaard09be322017-07-30 21:37:58 +0200361 \ 'Test_with_partial_callback()',
Bram Moolenaarc0f05d02018-11-16 17:44:48 +0100362 \ 'Test_zero_reply()',
363 \ 'Test_zz1_terminal_in_gui()',
Bram Moolenaare1c8c7a2016-09-11 16:48:50 +0200364 \ ]
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100365
Bram Moolenaardbc0d212018-11-16 18:22:45 +0100366" Pattern indicating a common flaky test failure.
Bram Moolenaar447f6ce2018-11-16 18:50:19 +0100367let s:flaky_errors_re = 'StopVimInTerminal\|VerifyScreenDump'
Bram Moolenaardbc0d212018-11-16 18:22:45 +0100368
Bram Moolenaar43345542015-11-29 17:35:35 +0100369" Locate Test_ functions and execute them.
370redir @q
Bram Moolenaar93bf5582016-02-18 22:25:47 +0100371silent function /^Test_
Bram Moolenaar43345542015-11-29 17:35:35 +0100372redir END
Bram Moolenaar00af60b2016-02-13 14:06:14 +0100373let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
Bram Moolenaar43345542015-11-29 17:35:35 +0100374
Bram Moolenaarbefb3662016-02-20 14:41:40 +0100375" If there is an extra argument filter the function names against it.
376if argc() > 1
377 let s:tests = filter(s:tests, 'v:val =~ argv(1)')
378endif
379
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100380" Execute the tests in alphabetical order.
Bram Moolenaar93bf5582016-02-18 22:25:47 +0100381for s:test in sort(s:tests)
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +0200382 " Silence, please!
383 set belloff=all
Bram Moolenaarf77af0e2018-11-16 16:52:16 +0100384 let prev_error = ''
385 let total_errors = []
386 let run_nr = 1
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +0200387
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100388 call RunTheTest(s:test)
Bram Moolenaar43345542015-11-29 17:35:35 +0100389
Bram Moolenaarf77af0e2018-11-16 16:52:16 +0100390 " Repeat a flaky test. Give up when:
391 " - it fails again with the same message
392 " - it fails five times (with a different mesage)
Bram Moolenaardbc0d212018-11-16 18:22:45 +0100393 if len(v:errors) > 0
394 \ && (index(s:flaky_tests, s:test) >= 0
395 \ || v:errors[0] =~ s:flaky_errors_re)
Bram Moolenaarf77af0e2018-11-16 16:52:16 +0100396 while 1
397 call add(s:messages, 'Found errors in ' . s:test . ':')
398 call extend(s:messages, v:errors)
Bram Moolenaar15e737f2017-03-18 21:22:47 +0100399
Bram Moolenaarf77af0e2018-11-16 16:52:16 +0100400 call add(total_errors, 'Run ' . run_nr . ':')
401 call extend(total_errors, v:errors)
Bram Moolenaar55058602017-11-21 15:14:51 +0100402
Bram Moolenaarf77af0e2018-11-16 16:52:16 +0100403 if run_nr == 5 || prev_error == v:errors[0]
404 call add(total_errors, 'Flaky test failed too often, giving up')
405 let v:errors = total_errors
406 break
407 endif
408
409 call add(s:messages, 'Flaky test failed, running it again')
410
411 " Flakiness is often caused by the system being very busy. Sleep a
412 " couple of seconds to have a higher chance of succeeding the second
413 " time.
414 sleep 2
415
416 let prev_error = v:errors[0]
417 let v:errors = []
418 let run_nr += 1
419
420 call RunTheTest(s:test)
421
422 if len(v:errors) == 0
423 " Test passed on rerun.
424 break
425 endif
426 endwhile
Bram Moolenaarb5760a12016-03-03 13:10:44 +0100427 endif
Bram Moolenaar43345542015-11-29 17:35:35 +0100428
Bram Moolenaar42205552017-03-18 19:42:22 +0100429 call AfterTheTest()
Bram Moolenaar43345542015-11-29 17:35:35 +0100430endfor
431
Bram Moolenaar42205552017-03-18 19:42:22 +0100432call FinishTesting()
Bram Moolenaarcc28e2d2016-11-17 17:56:13 +0100433
434" vim: shiftwidth=2 sts=2 expandtab