blob: 18f6b19d8ac93d456b6a576fbbe9287b47438dae [file] [log] [blame]
Bram Moolenaar90df4b92021-07-07 20:26:08 +02001*testing.txt* For Vim version 8.2. Last change: 2021 Jul 07
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
49test_autochdir() *test_autochdir()*
50 Set a flag to enable the effect of 'autochdir' before Vim
51 startup has finished.
52
53
54test_feedinput({string}) *test_feedinput()*
55 Characters in {string} are queued for processing as if they
56 were typed by the user. This uses a low level input buffer.
57 This function works only when with |+unix| or GUI is running.
58
Bram Moolenaarce90e362019-09-08 18:58:44 +020059 Can also be used as a |method|: >
60 GetText()->test_feedinput()
Bram Moolenaared997ad2019-07-21 16:42:00 +020061
62test_garbagecollect_now() *test_garbagecollect_now()*
63 Like garbagecollect(), but executed right away. This must
64 only be called directly to avoid any structure to exist
65 internally, and |v:testing| must have been set before calling
66 any function.
67
68
69test_garbagecollect_soon() *test_garbagecollect_soon()*
70 Set the flag to call the garbagecollector as if in the main
71 loop. Only to be used in tests.
72
73
74test_getvalue({name}) *test_getvalue()*
75 Get the value of an internal variable. These values for
76 {name} are supported:
77 need_fileinfo
78
Bram Moolenaarce90e362019-09-08 18:58:44 +020079 Can also be used as a |method|: >
80 GetName()->test_getvalue()
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +020081<
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020082 *test_gui_drop_files()*
83test_gui_drop_files({list}, {row}, {col}, {mods})
84 Drop one or more files in {list} in the window at {row}, {col}.
Bram Moolenaar90df4b92021-07-07 20:26:08 +020085 This function only works when the GUI is running and the
86 |drag-n-drop| feature is present.
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020087
88 The supported values for {mods} are:
89 0x4 Shift
90 0x8 Alt
91 0x10 Ctrl
92 The files are added to the argument list and the first file in
93 {list} is edited in the window. See |drag-n-drop| for more
94 information.
95
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +020096 *test_gui_mouse_event()*
97test_gui_mouse_event({button}, {row}, {col}, {multiclick}, {modifiers})
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +020098 Inject a mouse button click event. This function only works
99 when the GUI is running.
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +0200100 The supported values for {button} are:
101 0 right mouse button
102 1 middle mouse button
103 2 left mouse button
104 3 mouse button release
105 4 scroll wheel down
106 5 scroll wheel up
107 6 scroll wheel left
108 7 scroll wheel right
Yegappan Lakshmanan18d46582021-06-23 20:46:52 +0200109 {row} and {col} specify the location of the mouse click. The
110 first row of the Vim window is 1 and the last row is 'lines'.
111 The maximum value of {col} is 'columns'.
Yegappan Lakshmananf1e74492021-06-21 18:44:26 +0200112 To inject a multiclick event, set {multiclick} to 1.
113 The supported values for {modifiers} are:
114 4 shift is pressed
115 8 alt is pressed
116 16 ctrl is pressed
117 After injecting the mouse event you probably should call
118 |feedkeys()| to have them processed, e.g.: >
119 call feedkeys("y", 'Lx!')
120
Bram Moolenaared997ad2019-07-21 16:42:00 +0200121
122test_ignore_error({expr}) *test_ignore_error()*
123 Ignore any error containing {expr}. A normal message is given
124 instead.
125 This is only meant to be used in tests, where catching the
126 error with try/catch cannot be used (because it skips over
127 following code).
128 {expr} is used literally, not as a pattern.
129 When the {expr} is the string "RESET" then the list of ignored
130 errors is made empty.
131
Bram Moolenaarce90e362019-09-08 18:58:44 +0200132 Can also be used as a |method|: >
133 GetErrorText()->test_ignore_error()
Bram Moolenaared997ad2019-07-21 16:42:00 +0200134
135test_null_blob() *test_null_blob()*
136 Return a |Blob| that is null. Only useful for testing.
137
138
139test_null_channel() *test_null_channel()*
140 Return a |Channel| that is null. Only useful for testing.
141 {only available when compiled with the +channel feature}
142
143
144test_null_dict() *test_null_dict()*
145 Return a |Dict| that is null. Only useful for testing.
146
147
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200148test_null_function() *test_null_function()*
Bram Moolenaard1caa942020-04-10 22:10:56 +0200149 Return a |Funcref| that is null. Only useful for testing.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200150
151
Bram Moolenaared997ad2019-07-21 16:42:00 +0200152test_null_job() *test_null_job()*
153 Return a |Job| that is null. Only useful for testing.
154 {only available when compiled with the +job feature}
155
156
157test_null_list() *test_null_list()*
158 Return a |List| that is null. Only useful for testing.
159
160
161test_null_partial() *test_null_partial()*
162 Return a |Partial| that is null. Only useful for testing.
163
164
165test_null_string() *test_null_string()*
166 Return a |String| that is null. Only useful for testing.
167
168
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100169test_unknown() *test_unknown()*
170 Return a value with unknown type. Only useful for testing.
171
172test_void() *test_void()*
173 Return a value with void type. Only useful for testing.
174
175
Bram Moolenaared997ad2019-07-21 16:42:00 +0200176test_option_not_set({name}) *test_option_not_set()*
177 Reset the flag that indicates option {name} was set. Thus it
178 looks like it still has the default value. Use like this: >
179 set ambiwidth=double
180 call test_option_not_set('ambiwidth')
181< Now the 'ambiwidth' option behaves like it was never changed,
182 even though the value is "double".
183 Only to be used for testing!
184
Bram Moolenaarce90e362019-09-08 18:58:44 +0200185 Can also be used as a |method|: >
186 GetOptionName()->test_option_not_set()
187
Bram Moolenaared997ad2019-07-21 16:42:00 +0200188
189test_override({name}, {val}) *test_override()*
190 Overrides certain parts of Vim's internal processing to be able
191 to run tests. Only to be used for testing Vim!
192 The override is enabled when {val} is non-zero and removed
193 when {val} is zero.
194 Current supported values for name are:
195
196 name effect when {val} is non-zero ~
197 redraw disable the redrawing() function
198 redraw_flag ignore the RedrawingDisabled flag
199 char_avail disable the char_avail() function
200 starting reset the "starting" variable, see below
201 nfa_fail makes the NFA regexp engine fail to force a
202 fallback to the old engine
203 no_query_mouse do not query the mouse position for "dec"
204 terminals
205 no_wait_return set the "no_wait_return" flag. Not restored
206 with "ALL".
Bram Moolenaarb340bae2020-06-15 19:51:56 +0200207 ui_delay time in msec to use in ui_delay(); overrules a
208 wait time of up to 3 seconds for messages
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +0200209 term_props reset all terminal properties when the version
210 string is detected
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +0100211 uptime overrules sysinfo.uptime
Bram Moolenaared997ad2019-07-21 16:42:00 +0200212 ALL clear all overrides ({val} is not used)
213
214 "starting" is to be used when a test should behave like
215 startup was done. Since the tests are run by sourcing a
216 script the "starting" variable is non-zero. This is usually a
217 good thing (tests run faster), but sometimes changes behavior
218 in a way that the test doesn't work properly.
219 When using: >
220 call test_override('starting', 1)
221< The value of "starting" is saved. It is restored by: >
222 call test_override('starting', 0)
223
Bram Moolenaarce90e362019-09-08 18:58:44 +0200224< Can also be used as a |method|: >
225 GetOverrideVal()-> test_override('starting')
Bram Moolenaared997ad2019-07-21 16:42:00 +0200226
227test_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
256test_setmouse({row}, {col}) *test_setmouse()*
257 Set the mouse position to be used for the next mouse action.
258 {row} and {col} are one based.
259 For example: >
260 call test_setmouse(4, 20)
261 call feedkeys("\<LeftMouse>", "xt")
262
Bram Moolenaared997ad2019-07-21 16:42:00 +0200263test_settime({expr}) *test_settime()*
264 Set the time Vim uses internally. Currently only used for
265 timestamps in the history, as they are used in viminfo, and
266 for undo.
267 Using a value of 1 makes Vim not sleep after a warning or
268 error message.
269 {expr} must evaluate to a number. When the value is zero the
270 normal behavior is restored.
271
Bram Moolenaarce90e362019-09-08 18:58:44 +0200272 Can also be used as a |method|: >
273 GetTime()->test_settime()
274
Bram Moolenaar4f645c52020-02-08 16:40:39 +0100275test_srand_seed([seed]) *test_srand_seed()*
276 When [seed] is given this sets the seed value used by
277 `srand()`. When omitted the test seed is removed.
278
Bram Moolenaared997ad2019-07-21 16:42:00 +0200279==============================================================================
Bram Moolenaar54775062019-07-31 21:07:14 +02002803. Assert functions *assert-functions-details*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200281
282
283assert_beeps({cmd}) *assert_beeps()*
284 Run {cmd} and add an error message to |v:errors| if it does
285 NOT produce a beep or visual bell.
Bram Moolenaar5b8cabf2021-04-02 18:55:57 +0200286 Also see |assert_fails()|, |assert_nobeep()| and
287 |assert-return|.
Bram Moolenaared997ad2019-07-21 16:42:00 +0200288
Bram Moolenaar24278d22019-08-16 21:49:22 +0200289 Can also be used as a |method|: >
290 GetCmd()->assert_beeps()
291<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200292 *assert_equal()*
293assert_equal({expected}, {actual} [, {msg}])
294 When {expected} and {actual} are not equal an error message is
295 added to |v:errors| and 1 is returned. Otherwise zero is
296 returned |assert-return|.
297 There is no automatic conversion, the String "4" is different
298 from the Number 4. And the number 4 is different from the
299 Float 4.0. The value of 'ignorecase' is not used here, case
300 always matters.
301 When {msg} is omitted an error in the form "Expected
302 {expected} but got {actual}" is produced.
303 Example: >
304 assert_equal('foo', 'bar')
305< Will result in a string to be added to |v:errors|:
306 test.vim line 12: Expected 'foo' but got 'bar' ~
307
Bram Moolenaar7ff78462020-07-10 22:00:53 +0200308 Can also be used as a |method|, the base is passed as the
309 second argument: >
Bram Moolenaar25e42232019-08-04 15:04:10 +0200310 mylist->assert_equal([1, 2, 3])
311
Bram Moolenaar25e42232019-08-04 15:04:10 +0200312< *assert_equalfile()*
Bram Moolenaarfb517ba2020-06-03 19:55:35 +0200313assert_equalfile({fname-one}, {fname-two} [, {msg}])
Bram Moolenaared997ad2019-07-21 16:42:00 +0200314 When the files {fname-one} and {fname-two} do not contain
315 exactly the same text an error message is added to |v:errors|.
316 Also see |assert-return|.
317 When {fname-one} or {fname-two} does not exist the error will
318 mention that.
319 Mainly useful with |terminal-diff|.
320
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200321 Can also be used as a |method|: >
322 GetLog()->assert_equalfile('expected.log')
323
Bram Moolenaared997ad2019-07-21 16:42:00 +0200324assert_exception({error} [, {msg}]) *assert_exception()*
325 When v:exception does not contain the string {error} an error
326 message is added to |v:errors|. Also see |assert-return|.
327 This can be used to assert that a command throws an exception.
328 Using the error number, followed by a colon, avoids problems
329 with translations: >
330 try
331 commandthatfails
332 call assert_false(1, 'command should have failed')
333 catch
334 call assert_exception('E492:')
335 endtry
Bram Moolenaar1d634542020-08-18 13:41:50 +0200336<
337 *assert_fails()*
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200338assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
Bram Moolenaared997ad2019-07-21 16:42:00 +0200339 Run {cmd} and add an error message to |v:errors| if it does
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200340 NOT produce an error or when {error} is not found in the
341 error message. Also see |assert-return|.
342
343 When {error} is a string it must be found literally in the
344 first reported error. Most often this will be the error code,
345 including the colon, e.g. "E123:". >
346 assert_fails('bad cmd', 'E987:')
347<
348 When {error} is a |List| with one or two strings, these are
349 used as patterns. The first pattern is matched against the
350 first reported error: >
351 assert_fails('cmd', ['E987:.*expected bool'])
352< The second pattern, if present, is matched against the last
Bram Moolenaar4072ba52020-12-23 13:56:35 +0100353 reported error.
354 If there is only one error then both patterns must match. This
355 can be used to check that there is only one error.
356 To only match the last error use an empty string for the first
357 error: >
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200358 assert_fails('cmd', ['', 'E987:'])
359<
Bram Moolenaar1d634542020-08-18 13:41:50 +0200360 If {msg} is empty then it is not used. Do this to get the
361 default message when passing the {lnum} argument.
362
363 When {lnum} is present and not negative, and the {error}
364 argument is present and matches, then this is compared with
365 the line number at which the error was reported. That can be
366 the line number in a function or in a script.
367
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200368 When {context} is present it is used as a pattern and matched
369 against the context (script name or function name) where
370 {lnum} is located in.
371
Bram Moolenaared997ad2019-07-21 16:42:00 +0200372 Note that beeping is not considered an error, and some failing
373 commands only beep. Use |assert_beeps()| for those.
374
Bram Moolenaar24278d22019-08-16 21:49:22 +0200375 Can also be used as a |method|: >
376 GetCmd()->assert_fails('E99:')
377
Bram Moolenaar1d634542020-08-18 13:41:50 +0200378assert_false({actual} [, {msg}]) *assert_false()*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200379 When {actual} is not false an error message is added to
380 |v:errors|, like with |assert_equal()|.
381 Also see |assert-return|.
382 A value is false when it is zero. When {actual} is not a
383 number the assert fails.
384 When {msg} is omitted an error in the form
385 "Expected False but got {actual}" is produced.
386
Bram Moolenaar24278d22019-08-16 21:49:22 +0200387 Can also be used as a |method|: >
388 GetResult()->assert_false()
389
Bram Moolenaared997ad2019-07-21 16:42:00 +0200390assert_inrange({lower}, {upper}, {actual} [, {msg}]) *assert_inrange()*
391 This asserts number and |Float| values. When {actual} is lower
392 than {lower} or higher than {upper} an error message is added
393 to |v:errors|. Also see |assert-return|.
394 When {msg} is omitted an error in the form
395 "Expected range {lower} - {upper}, but got {actual}" is
396 produced.
397
398 *assert_match()*
399assert_match({pattern}, {actual} [, {msg}])
400 When {pattern} does not match {actual} an error message is
401 added to |v:errors|. Also see |assert-return|.
402
403 {pattern} is used as with |=~|: The matching is always done
404 like 'magic' was set and 'cpoptions' is empty, no matter what
405 the actual value of 'magic' or 'cpoptions' is.
406
407 {actual} is used as a string, automatic conversion applies.
408 Use "^" and "$" to match with the start and end of the text.
409 Use both to match the whole text.
410
411 When {msg} is omitted an error in the form
412 "Pattern {pattern} does not match {actual}" is produced.
413 Example: >
414 assert_match('^f.*o$', 'foobar')
415< Will result in a string to be added to |v:errors|:
416 test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~
417
Bram Moolenaar24278d22019-08-16 21:49:22 +0200418 Can also be used as a |method|: >
419 getFile()->assert_match('foo.*')
420<
Bram Moolenaar5b8cabf2021-04-02 18:55:57 +0200421assert_nobeep({cmd}) *assert_nobeep()*
422 Run {cmd} and add an error message to |v:errors| if it
423 produces a beep or visual bell.
424 Also see |assert_beeps()|.
425
426 Can also be used as a |method|: >
427 GetCmd()->assert_nobeep()
428<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200429 *assert_notequal()*
430assert_notequal({expected}, {actual} [, {msg}])
431 The opposite of `assert_equal()`: add an error message to
432 |v:errors| when {expected} and {actual} are equal.
433 Also see |assert-return|.
434
Bram Moolenaar25e42232019-08-04 15:04:10 +0200435 Can also be used as a |method|: >
436 mylist->assert_notequal([1, 2, 3])
437
438< *assert_notmatch()*
Bram Moolenaared997ad2019-07-21 16:42:00 +0200439assert_notmatch({pattern}, {actual} [, {msg}])
440 The opposite of `assert_match()`: add an error message to
441 |v:errors| when {pattern} matches {actual}.
442 Also see |assert-return|.
443
Bram Moolenaar24278d22019-08-16 21:49:22 +0200444 Can also be used as a |method|: >
445 getFile()->assert_notmatch('bar.*')
446
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200447
Bram Moolenaared997ad2019-07-21 16:42:00 +0200448assert_report({msg}) *assert_report()*
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200449 Report a test failure directly, using String {msg}.
Bram Moolenaared997ad2019-07-21 16:42:00 +0200450 Always returns one.
451
Bram Moolenaare49fbff2019-08-21 22:50:07 +0200452 Can also be used as a |method|: >
453 GetMessage()->assert_report()
454
455
Bram Moolenaared997ad2019-07-21 16:42:00 +0200456assert_true({actual} [, {msg}]) *assert_true()*
457 When {actual} is not true an error message is added to
458 |v:errors|, like with |assert_equal()|.
459 Also see |assert-return|.
460 A value is TRUE when it is a non-zero number. When {actual}
461 is not a number the assert fails.
462 When {msg} is omitted an error in the form "Expected True but
463 got {actual}" is produced.
464
Bram Moolenaar24278d22019-08-16 21:49:22 +0200465 Can also be used as a |method|: >
466 GetResult()->assert_true()
467<
Bram Moolenaared997ad2019-07-21 16:42:00 +0200468
469 vim:tw=78:ts=8:noet:ft=help:norl: