blob: 0459aa3042b78f5e2fd712c1ef194b81486b8c47 [file] [log] [blame]
Bram Moolenaarfd31be22022-01-16 14:46:06 +00001*testing.txt* For Vim version 8.2. Last change: 2022 Jan 13
Bram Moolenaared997ad2019-07-21 16:42:00 +02002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
7Testing Vim and Vim script *testing-support*
8
9Expression evaluation is explained in |eval.txt|. This file goes into details
10about writing tests in Vim script. This can be used for testing Vim itself
11and for testing plugins.
12
131. Testing Vim |testing|
Bram Moolenaar54775062019-07-31 21:07:14 +0200142. Test functions |test-functions-details|
153. Assert functions |assert-functions-details|
Bram Moolenaared997ad2019-07-21 16:42:00 +020016
17==============================================================================
181. Testing Vim *testing*
19
20Vim can be tested after building it, usually with "make test".
21The tests are located in the directory "src/testdir".
22
Bram Moolenaarb96a32e2020-08-13 18:59:55 +020023There are two types of tests added over time:
24 test20.in oldest, only for tiny and small builds
25 test_something.vim new style tests
26
Bram Moolenaared997ad2019-07-21 16:42:00 +020027 *new-style-testing*
Bram Moolenaarf7c4d832020-08-11 20:42:19 +020028New tests should be added as new style tests. The test scripts are named
29test_<feature>.vim (replace <feature> with the feature under test). These use
30functions such as |assert_equal()| to keep the test commands and the expected
31result in one place.
Bram Moolenaarb96a32e2020-08-13 18:59:55 +020032 *old-style-testing*
33These tests are used only for testing Vim without the |+eval| feature.
Bram Moolenaared997ad2019-07-21 16:42:00 +020034
35Find more information in the file src/testdir/README.txt.
36
37==============================================================================
Bram Moolenaar54775062019-07-31 21:07:14 +0200382. Test functions *test-functions-details*
Bram Moolenaared997ad2019-07-21 16:42:00 +020039
40test_alloc_fail({id}, {countdown}, {repeat}) *test_alloc_fail()*
41 This is for testing: If the memory allocation with {id} is
42 called, then decrement {countdown}, and when it reaches zero
43 let memory allocation fail {repeat} times. When {repeat} is
44 smaller than one it fails one time.
45
Bram Moolenaarce90e362019-09-08 18:58:44 +020046 Can also be used as a |method|: >
47 GetAllocId()->test_alloc_fail()
Bram Moolenaared997ad2019-07-21 16:42:00 +020048
Bram Moolenaar89a9c152021-08-29 21:55:35 +020049
Bram Moolenaared997ad2019-07-21 16:42:00 +020050test_autochdir() *test_autochdir()*
51 Set a flag to enable the effect of 'autochdir' before Vim
52 startup has finished.
53
54
55test_feedinput({string}) *test_feedinput()*
56 Characters in {string} are queued for processing as if they
57 were typed by the user. This uses a low level input buffer.
58 This function works only when with |+unix| or GUI is running.
59
Bram Moolenaarce90e362019-09-08 18:58:44 +020060 Can also be used as a |method|: >
61 GetText()->test_feedinput()
Bram Moolenaared997ad2019-07-21 16:42:00 +020062
Bram Moolenaar89a9c152021-08-29 21:55:35 +020063
Bram Moolenaared997ad2019-07-21 16:42:00 +020064test_garbagecollect_now() *test_garbagecollect_now()*
65 Like garbagecollect(), but executed right away. This must
66 only be called directly to avoid any structure to exist
67 internally, and |v:testing| must have been set before calling
Bram Moolenaar0e6adf82021-12-16 14:41:10 +000068 any function. This will not work when called from a :def
69 function, because variables on the stack will be freed.
Bram Moolenaared997ad2019-07-21 16:42:00 +020070
71
72test_garbagecollect_soon() *test_garbagecollect_soon()*
73 Set the flag to call the garbagecollector as if in the main
74 loop. Only to be used in tests.
75
76
77test_getvalue({name}) *test_getvalue()*
78 Get the value of an internal variable. These values for
79 {name} are supported:
80 need_fileinfo
81
Bram Moolenaarce90e362019-09-08 18:58:44 +020082 Can also be used as a |method|: >
83 GetName()->test_getvalue()
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +020084<
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020085 *test_gui_drop_files()*
86test_gui_drop_files({list}, {row}, {col}, {mods})
87 Drop one or more files in {list} in the window at {row}, {col}.
Bram Moolenaar90df4b92021-07-07 20:26:08 +020088 This function only works when the GUI is running and the
Bram Moolenaar22863042021-10-16 15:23:36 +010089 |drop_file| feature is present.
90
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020091 The supported values for {mods} are:
92 0x4 Shift
93 0x8 Alt
94 0x10 Ctrl
Bram Moolenaar22863042021-10-16 15:23:36 +010095 The files are added to the |argument-list| and the first file
96 in {list} is edited in the window. See |drag-n-drop| for more
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020097 information.
98
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +020099 *test_gui_mouse_event()*
100test_gui_mouse_event({button}, {row}, {col}, {multiclick}, {modifiers})
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +0200101 Inject a mouse button click event. This function only works
102 when the GUI is running.
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +0200103 The supported values for {button} are:
104 0 right mouse button
105 1 middle mouse button
106 2 left mouse button
107 3 mouse button release
108 4 scroll wheel down
109 5 scroll wheel up
110 6 scroll wheel left
111 7 scroll wheel right
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +0200112 {row} and {col} specify the location of the mouse click. The
113 first row of the Vim window is 1 and the last row is 'lines'.
114 The maximum value of {col} is 'columns'.
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +0200115 To inject a multiclick event, set {multiclick} to 1.
116 The supported values for {modifiers} are:
117 4 shift is pressed
118 8 alt is pressed
119 16 ctrl is pressed
120 After injecting the mouse event you probably should call
121 |feedkeys()| to have them processed, e.g.: >
122 call feedkeys("y", 'Lx!')
123
Bram Moolenaared997ad2019-07-21 16:42:00 +0200124
125test_ignore_error({expr}) *test_ignore_error()*
126 Ignore any error containing {expr}. A normal message is given
127 instead.
128 This is only meant to be used in tests, where catching the
129 error with try/catch cannot be used (because it skips over
130 following code).
131 {expr} is used literally, not as a pattern.
132 When the {expr} is the string "RESET" then the list of ignored
133 errors is made empty.
134
Bram Moolenaarce90e362019-09-08 18:58:44 +0200135 Can also be used as a |method|: >
136 GetErrorText()->test_ignore_error()
Bram Moolenaared997ad2019-07-21 16:42:00 +0200137
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200138
Bram Moolenaared997ad2019-07-21 16:42:00 +0200139test_null_blob() *test_null_blob()*
140 Return a |Blob| that is null. Only useful for testing.
141
142
143test_null_channel() *test_null_channel()*
144 Return a |Channel| that is null. Only useful for testing.
145 {only available when compiled with the +channel feature}
146
147
148test_null_dict() *test_null_dict()*
149 Return a |Dict| that is null. Only useful for testing.
150
151
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200152test_null_function() *test_null_function()*
Bram Moolenaard1caa942020-04-10 22:10:56 +0200153 Return a |Funcref| that is null. Only useful for testing.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200154
155
Bram Moolenaared997ad2019-07-21 16:42:00 +0200156test_null_job() *test_null_job()*
157 Return a |Job| that is null. Only useful for testing.
158 {only available when compiled with the +job feature}
159
160
161test_null_list() *test_null_list()*
162 Return a |List| that is null. Only useful for testing.
163
164
165test_null_partial() *test_null_partial()*
166 Return a |Partial| that is null. Only useful for testing.
167
168
169test_null_string() *test_null_string()*
170 Return a |String| that is null. Only useful for testing.
171
172
173test_option_not_set({name}) *test_option_not_set()*
174 Reset the flag that indicates option {name} was set. Thus it
175 looks like it still has the default value. Use like this: >
176 set ambiwidth=double
177 call test_option_not_set('ambiwidth')
178< Now the 'ambiwidth' option behaves like it was never changed,
179 even though the value is "double".
180 Only to be used for testing!
181
Bram Moolenaarce90e362019-09-08 18:58:44 +0200182 Can also be used as a |method|: >
183 GetOptionName()->test_option_not_set()
184
Bram Moolenaared997ad2019-07-21 16:42:00 +0200185
186test_override({name}, {val}) *test_override()*
187 Overrides certain parts of Vim's internal processing to be able
188 to run tests. Only to be used for testing Vim!
189 The override is enabled when {val} is non-zero and removed
190 when {val} is zero.
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +0000191 Current supported values for {name} are:
Bram Moolenaared997ad2019-07-21 16:42:00 +0200192
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +0000193 {name} effect when {val} is non-zero ~
194 autoload `import autoload` will load the script right
195 away, not postponed until an item is used
Bram Moolenaared997ad2019-07-21 16:42:00 +0200196 char_avail disable the char_avail() function
Bram Moolenaared997ad2019-07-21 16:42:00 +0200197 nfa_fail makes the NFA regexp engine fail to force a
198 fallback to the old engine
199 no_query_mouse do not query the mouse position for "dec"
200 terminals
201 no_wait_return set the "no_wait_return" flag. Not restored
202 with "ALL".
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +0000203 redraw disable the redrawing() function
204 redraw_flag ignore the RedrawingDisabled flag
205 starting reset the "starting" variable, see below
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +0200206 term_props reset all terminal properties when the version
207 string is detected
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +0000208 ui_delay time in msec to use in ui_delay(); overrules a
209 wait time of up to 3 seconds for messages
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +0100210 uptime overrules sysinfo.uptime
Bram Moolenaared997ad2019-07-21 16:42:00 +0200211 ALL clear all overrides ({val} is not used)
212
213 "starting" is to be used when a test should behave like
214 startup was done. Since the tests are run by sourcing a
215 script the "starting" variable is non-zero. This is usually a
216 good thing (tests run faster), but sometimes changes behavior
217 in a way that the test doesn't work properly.
218 When using: >
219 call test_override('starting', 1)
220< The value of "starting" is saved. It is restored by: >
221 call test_override('starting', 0)
222
Bram Moolenaarce90e362019-09-08 18:58:44 +0200223< Can also be used as a |method|: >
224 GetOverrideVal()-> test_override('starting')
Bram Moolenaared997ad2019-07-21 16:42:00 +0200225
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200226
Bram Moolenaared997ad2019-07-21 16:42:00 +0200227test_refcount({expr}) *test_refcount()*
228 Return the reference count of {expr}. When {expr} is of a
229 type that does not have a reference count, returns -1. Only
230 to be used for testing.
231
Bram Moolenaarce90e362019-09-08 18:58:44 +0200232 Can also be used as a |method|: >
233 GetVarname()->test_refcount()
234
Bram Moolenaared997ad2019-07-21 16:42:00 +0200235
236test_scrollbar({which}, {value}, {dragging}) *test_scrollbar()*
237 Pretend using scrollbar {which} to move it to position
238 {value}. {which} can be:
239 left Left scrollbar of the current window
240 right Right scrollbar of the current window
241 hor Horizontal scrollbar
242
243 For the vertical scrollbars {value} can be 1 to the
244 line-count of the buffer. For the horizontal scrollbar the
245 {value} can be between 1 and the maximum line length, assuming
246 'wrap' is not set.
247
248 When {dragging} is non-zero it's like dragging the scrollbar,
249 otherwise it's like clicking in the scrollbar.
250 Only works when the {which} scrollbar actually exists,
251 obviously only when using the GUI.
252
Bram Moolenaarce90e362019-09-08 18:58:44 +0200253 Can also be used as a |method|: >
254 GetValue()->test_scrollbar('right', 0)
Bram Moolenaared997ad2019-07-21 16:42:00 +0200255
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200256
Bram Moolenaared997ad2019-07-21 16:42:00 +0200257test_setmouse({row}, {col}) *test_setmouse()*
258 Set the mouse position to be used for the next mouse action.
259 {row} and {col} are one based.
260 For example: >
261 call test_setmouse(4, 20)
262 call feedkeys("\<LeftMouse>", "xt")
263
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200264
Bram Moolenaared997ad2019-07-21 16:42:00 +0200265test_settime({expr}) *test_settime()*
266 Set the time Vim uses internally. Currently only used for
267 timestamps in the history, as they are used in viminfo, and
268 for undo.
269 Using a value of 1 makes Vim not sleep after a warning or
270 error message.
271 {expr} must evaluate to a number. When the value is zero the
272 normal behavior is restored.
273
Bram Moolenaarce90e362019-09-08 18:58:44 +0200274 Can also be used as a |method|: >
275 GetTime()->test_settime()
276
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200277
Bram Moolenaar4f645c52020-02-08 16:40:39 +0100278test_srand_seed([seed]) *test_srand_seed()*
279 When [seed] is given this sets the seed value used by
280 `srand()`. When omitted the test seed is removed.
281
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200282
283test_unknown() *test_unknown()*
284 Return a value with unknown type. Only useful for testing.
285
286
287test_void() *test_void()*
288 Return a value with void type. Only useful for testing.
289
Bram Moolenaared997ad2019-07-21 16:42:00 +0200290==============================================================================
Bram Moolenaar54775062019-07-31 21:07:14 +02002913. Assert functions *assert-functions-details*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200292
293
294assert_beeps({cmd}) *assert_beeps()*
295 Run {cmd} and add an error message to |v:errors| if it does
296 NOT produce a beep or visual bell.
Bram Moolenaar5b8cabf2021-04-02 18:55:57 +0200297 Also see |assert_fails()|, |assert_nobeep()| and
298 |assert-return|.
Bram Moolenaared997ad2019-07-21 16:42:00 +0200299
Bram Moolenaar24278d22019-08-16 21:49:22 +0200300 Can also be used as a |method|: >
301 GetCmd()->assert_beeps()
302<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200303 *assert_equal()*
304assert_equal({expected}, {actual} [, {msg}])
305 When {expected} and {actual} are not equal an error message is
306 added to |v:errors| and 1 is returned. Otherwise zero is
307 returned |assert-return|.
308 There is no automatic conversion, the String "4" is different
309 from the Number 4. And the number 4 is different from the
310 Float 4.0. The value of 'ignorecase' is not used here, case
311 always matters.
312 When {msg} is omitted an error in the form "Expected
313 {expected} but got {actual}" is produced.
314 Example: >
315 assert_equal('foo', 'bar')
316< Will result in a string to be added to |v:errors|:
317 test.vim line 12: Expected 'foo' but got 'bar' ~
318
Bram Moolenaar7ff78462020-07-10 22:00:53 +0200319 Can also be used as a |method|, the base is passed as the
320 second argument: >
Bram Moolenaar25e42232019-08-04 15:04:10 +0200321 mylist->assert_equal([1, 2, 3])
322
Bram Moolenaar25e42232019-08-04 15:04:10 +0200323< *assert_equalfile()*
Bram Moolenaarfb517ba2020-06-03 19:55:35 +0200324assert_equalfile({fname-one}, {fname-two} [, {msg}])
Bram Moolenaared997ad2019-07-21 16:42:00 +0200325 When the files {fname-one} and {fname-two} do not contain
326 exactly the same text an error message is added to |v:errors|.
327 Also see |assert-return|.
328 When {fname-one} or {fname-two} does not exist the error will
329 mention that.
330 Mainly useful with |terminal-diff|.
331
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200332 Can also be used as a |method|: >
333 GetLog()->assert_equalfile('expected.log')
334
Bram Moolenaared997ad2019-07-21 16:42:00 +0200335assert_exception({error} [, {msg}]) *assert_exception()*
336 When v:exception does not contain the string {error} an error
337 message is added to |v:errors|. Also see |assert-return|.
338 This can be used to assert that a command throws an exception.
339 Using the error number, followed by a colon, avoids problems
340 with translations: >
341 try
342 commandthatfails
343 call assert_false(1, 'command should have failed')
344 catch
345 call assert_exception('E492:')
346 endtry
Bram Moolenaar1d634542020-08-18 13:41:50 +0200347<
348 *assert_fails()*
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200349assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
Bram Moolenaared997ad2019-07-21 16:42:00 +0200350 Run {cmd} and add an error message to |v:errors| if it does
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200351 NOT produce an error or when {error} is not found in the
352 error message. Also see |assert-return|.
353
354 When {error} is a string it must be found literally in the
355 first reported error. Most often this will be the error code,
356 including the colon, e.g. "E123:". >
357 assert_fails('bad cmd', 'E987:')
358<
359 When {error} is a |List| with one or two strings, these are
360 used as patterns. The first pattern is matched against the
361 first reported error: >
362 assert_fails('cmd', ['E987:.*expected bool'])
363< The second pattern, if present, is matched against the last
Bram Moolenaar4072ba52020-12-23 13:56:35 +0100364 reported error.
365 If there is only one error then both patterns must match. This
366 can be used to check that there is only one error.
367 To only match the last error use an empty string for the first
368 error: >
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200369 assert_fails('cmd', ['', 'E987:'])
370<
Bram Moolenaar1d634542020-08-18 13:41:50 +0200371 If {msg} is empty then it is not used. Do this to get the
372 default message when passing the {lnum} argument.
373
374 When {lnum} is present and not negative, and the {error}
375 argument is present and matches, then this is compared with
376 the line number at which the error was reported. That can be
377 the line number in a function or in a script.
378
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200379 When {context} is present it is used as a pattern and matched
380 against the context (script name or function name) where
381 {lnum} is located in.
382
Bram Moolenaared997ad2019-07-21 16:42:00 +0200383 Note that beeping is not considered an error, and some failing
384 commands only beep. Use |assert_beeps()| for those.
385
Bram Moolenaar24278d22019-08-16 21:49:22 +0200386 Can also be used as a |method|: >
387 GetCmd()->assert_fails('E99:')
388
Bram Moolenaar1d634542020-08-18 13:41:50 +0200389assert_false({actual} [, {msg}]) *assert_false()*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200390 When {actual} is not false an error message is added to
391 |v:errors|, like with |assert_equal()|.
392 Also see |assert-return|.
393 A value is false when it is zero. When {actual} is not a
394 number the assert fails.
395 When {msg} is omitted an error in the form
396 "Expected False but got {actual}" is produced.
397
Bram Moolenaar24278d22019-08-16 21:49:22 +0200398 Can also be used as a |method|: >
399 GetResult()->assert_false()
400
Bram Moolenaared997ad2019-07-21 16:42:00 +0200401assert_inrange({lower}, {upper}, {actual} [, {msg}]) *assert_inrange()*
402 This asserts number and |Float| values. When {actual} is lower
403 than {lower} or higher than {upper} an error message is added
404 to |v:errors|. Also see |assert-return|.
405 When {msg} is omitted an error in the form
406 "Expected range {lower} - {upper}, but got {actual}" is
407 produced.
408
409 *assert_match()*
410assert_match({pattern}, {actual} [, {msg}])
411 When {pattern} does not match {actual} an error message is
412 added to |v:errors|. Also see |assert-return|.
413
414 {pattern} is used as with |=~|: The matching is always done
415 like 'magic' was set and 'cpoptions' is empty, no matter what
416 the actual value of 'magic' or 'cpoptions' is.
417
418 {actual} is used as a string, automatic conversion applies.
419 Use "^" and "$" to match with the start and end of the text.
420 Use both to match the whole text.
421
422 When {msg} is omitted an error in the form
423 "Pattern {pattern} does not match {actual}" is produced.
424 Example: >
425 assert_match('^f.*o$', 'foobar')
426< Will result in a string to be added to |v:errors|:
427 test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~
428
Bram Moolenaar24278d22019-08-16 21:49:22 +0200429 Can also be used as a |method|: >
430 getFile()->assert_match('foo.*')
431<
Bram Moolenaar5b8cabf2021-04-02 18:55:57 +0200432assert_nobeep({cmd}) *assert_nobeep()*
433 Run {cmd} and add an error message to |v:errors| if it
434 produces a beep or visual bell.
435 Also see |assert_beeps()|.
436
437 Can also be used as a |method|: >
438 GetCmd()->assert_nobeep()
439<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200440 *assert_notequal()*
441assert_notequal({expected}, {actual} [, {msg}])
442 The opposite of `assert_equal()`: add an error message to
443 |v:errors| when {expected} and {actual} are equal.
444 Also see |assert-return|.
445
Bram Moolenaar25e42232019-08-04 15:04:10 +0200446 Can also be used as a |method|: >
447 mylist->assert_notequal([1, 2, 3])
448
449< *assert_notmatch()*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200450assert_notmatch({pattern}, {actual} [, {msg}])
451 The opposite of `assert_match()`: add an error message to
452 |v:errors| when {pattern} matches {actual}.
453 Also see |assert-return|.
454
Bram Moolenaar24278d22019-08-16 21:49:22 +0200455 Can also be used as a |method|: >
456 getFile()->assert_notmatch('bar.*')
457
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200458
Bram Moolenaared997ad2019-07-21 16:42:00 +0200459assert_report({msg}) *assert_report()*
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200460 Report a test failure directly, using String {msg}.
Bram Moolenaared997ad2019-07-21 16:42:00 +0200461 Always returns one.
462
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200463 Can also be used as a |method|: >
464 GetMessage()->assert_report()
465
466
Bram Moolenaared997ad2019-07-21 16:42:00 +0200467assert_true({actual} [, {msg}]) *assert_true()*
468 When {actual} is not true an error message is added to
469 |v:errors|, like with |assert_equal()|.
470 Also see |assert-return|.
471 A value is TRUE when it is a non-zero number. When {actual}
472 is not a number the assert fails.
473 When {msg} is omitted an error in the form "Expected True but
474 got {actual}" is produced.
475
Bram Moolenaar24278d22019-08-16 21:49:22 +0200476 Can also be used as a |method|: >
477 GetResult()->assert_true()
478<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200479
480 vim:tw=78:ts=8:noet:ft=help:norl: