xref: /vim-8.2.3635/runtime/doc/testing.txt (revision ed997ada)
1*ed997adaSBram Moolenaar*testing.txt*	For Vim version 8.1.  Last change: 2019 Jul 21
2*ed997adaSBram Moolenaar
3*ed997adaSBram Moolenaar
4*ed997adaSBram Moolenaar		  VIM REFERENCE MANUAL	  by Bram Moolenaar
5*ed997adaSBram Moolenaar
6*ed997adaSBram Moolenaar
7*ed997adaSBram MoolenaarTesting Vim and Vim script			*testing-support*
8*ed997adaSBram Moolenaar
9*ed997adaSBram MoolenaarExpression evaluation is explained in |eval.txt|.  This file goes into details
10*ed997adaSBram Moolenaarabout writing tests in Vim script.  This can be used for testing Vim itself
11*ed997adaSBram Moolenaarand for testing plugins.
12*ed997adaSBram Moolenaar
13*ed997adaSBram Moolenaar1. Testing Vim				|testing|
14*ed997adaSBram Moolenaar2. Test functions			|test-functions|
15*ed997adaSBram Moolenaar3. Assert funtions			|assert-functions|
16*ed997adaSBram Moolenaar
17*ed997adaSBram Moolenaar==============================================================================
18*ed997adaSBram Moolenaar1. Testing Vim						*testing*
19*ed997adaSBram Moolenaar
20*ed997adaSBram MoolenaarVim can be tested after building it, usually with "make test".
21*ed997adaSBram MoolenaarThe tests are located in the directory "src/testdir".
22*ed997adaSBram Moolenaar
23*ed997adaSBram MoolenaarThere are several types of tests added over time:
24*ed997adaSBram Moolenaar	test33.in		oldest, don't add any of these
25*ed997adaSBram Moolenaar	test_something.in	old style tests
26*ed997adaSBram Moolenaar	test_something.vim	new style tests
27*ed997adaSBram Moolenaar
28*ed997adaSBram Moolenaar						*new-style-testing*
29*ed997adaSBram MoolenaarNew tests should be added as new style tests.  These use functions such as
30*ed997adaSBram Moolenaar|assert_equal()| to keep the test commands and the expected result in one
31*ed997adaSBram Moolenaarplace.
32*ed997adaSBram Moolenaar						*old-style-testing*
33*ed997adaSBram MoolenaarIn some cases an old style test needs to be used.  E.g. when testing Vim
34*ed997adaSBram Moolenaarwithout the |+eval| feature.
35*ed997adaSBram Moolenaar
36*ed997adaSBram MoolenaarFind more information in the file src/testdir/README.txt.
37*ed997adaSBram Moolenaar
38*ed997adaSBram Moolenaar==============================================================================
39*ed997adaSBram Moolenaar2. Test functions				*test-functions*
40*ed997adaSBram Moolenaar
41*ed997adaSBram Moolenaartest_alloc_fail({id}, {countdown}, {repeat})		*test_alloc_fail()*
42*ed997adaSBram Moolenaar		This is for testing: If the memory allocation with {id} is
43*ed997adaSBram Moolenaar		called, then decrement {countdown}, and when it reaches zero
44*ed997adaSBram Moolenaar		let memory allocation fail {repeat} times.  When {repeat} is
45*ed997adaSBram Moolenaar		smaller than one it fails one time.
46*ed997adaSBram Moolenaar
47*ed997adaSBram Moolenaar
48*ed997adaSBram Moolenaartest_autochdir()					*test_autochdir()*
49*ed997adaSBram Moolenaar		Set a flag to enable the effect of 'autochdir' before Vim
50*ed997adaSBram Moolenaar		startup has finished.
51*ed997adaSBram Moolenaar
52*ed997adaSBram Moolenaar
53*ed997adaSBram Moolenaartest_feedinput({string})				*test_feedinput()*
54*ed997adaSBram Moolenaar		Characters in {string} are queued for processing as if they
55*ed997adaSBram Moolenaar		were typed by the user. This uses a low level input buffer.
56*ed997adaSBram Moolenaar		This function works only when with |+unix| or GUI is running.
57*ed997adaSBram Moolenaar
58*ed997adaSBram Moolenaar
59*ed997adaSBram Moolenaartest_garbagecollect_now()			 *test_garbagecollect_now()*
60*ed997adaSBram Moolenaar		Like garbagecollect(), but executed right away.  This must
61*ed997adaSBram Moolenaar		only be called directly to avoid any structure to exist
62*ed997adaSBram Moolenaar		internally, and |v:testing| must have been set before calling
63*ed997adaSBram Moolenaar		any function.
64*ed997adaSBram Moolenaar
65*ed997adaSBram Moolenaar
66*ed997adaSBram Moolenaartest_garbagecollect_soon()			 *test_garbagecollect_soon()*
67*ed997adaSBram Moolenaar		Set the flag to call the garbagecollector as if in the main
68*ed997adaSBram Moolenaar		loop.  Only to be used in tests.
69*ed997adaSBram Moolenaar
70*ed997adaSBram Moolenaar
71*ed997adaSBram Moolenaartest_getvalue({name})					*test_getvalue()*
72*ed997adaSBram Moolenaar		Get the value of an internal variable.  These values for
73*ed997adaSBram Moolenaar		{name} are supported:
74*ed997adaSBram Moolenaar			need_fileinfo
75*ed997adaSBram Moolenaar
76*ed997adaSBram Moolenaar
77*ed997adaSBram Moolenaartest_ignore_error({expr})			 *test_ignore_error()*
78*ed997adaSBram Moolenaar		Ignore any error containing {expr}.  A normal message is given
79*ed997adaSBram Moolenaar		instead.
80*ed997adaSBram Moolenaar		This is only meant to be used in tests, where catching the
81*ed997adaSBram Moolenaar		error with try/catch cannot be used (because it skips over
82*ed997adaSBram Moolenaar		following code).
83*ed997adaSBram Moolenaar		{expr} is used literally, not as a pattern.
84*ed997adaSBram Moolenaar		When the {expr} is the string "RESET" then the list of ignored
85*ed997adaSBram Moolenaar		errors is made empty.
86*ed997adaSBram Moolenaar
87*ed997adaSBram Moolenaar
88*ed997adaSBram Moolenaartest_null_blob()					*test_null_blob()*
89*ed997adaSBram Moolenaar		Return a |Blob| that is null. Only useful for testing.
90*ed997adaSBram Moolenaar
91*ed997adaSBram Moolenaar
92*ed997adaSBram Moolenaartest_null_channel()					*test_null_channel()*
93*ed997adaSBram Moolenaar		Return a |Channel| that is null. Only useful for testing.
94*ed997adaSBram Moolenaar		{only available when compiled with the +channel feature}
95*ed997adaSBram Moolenaar
96*ed997adaSBram Moolenaar
97*ed997adaSBram Moolenaartest_null_dict()					*test_null_dict()*
98*ed997adaSBram Moolenaar		Return a |Dict| that is null. Only useful for testing.
99*ed997adaSBram Moolenaar
100*ed997adaSBram Moolenaar
101*ed997adaSBram Moolenaartest_null_job()						*test_null_job()*
102*ed997adaSBram Moolenaar		Return a |Job| that is null. Only useful for testing.
103*ed997adaSBram Moolenaar		{only available when compiled with the +job feature}
104*ed997adaSBram Moolenaar
105*ed997adaSBram Moolenaar
106*ed997adaSBram Moolenaartest_null_list()					*test_null_list()*
107*ed997adaSBram Moolenaar		Return a |List| that is null. Only useful for testing.
108*ed997adaSBram Moolenaar
109*ed997adaSBram Moolenaar
110*ed997adaSBram Moolenaartest_null_partial()					*test_null_partial()*
111*ed997adaSBram Moolenaar		Return a |Partial| that is null. Only useful for testing.
112*ed997adaSBram Moolenaar
113*ed997adaSBram Moolenaar
114*ed997adaSBram Moolenaartest_null_string()					*test_null_string()*
115*ed997adaSBram Moolenaar		Return a |String| that is null. Only useful for testing.
116*ed997adaSBram Moolenaar
117*ed997adaSBram Moolenaar
118*ed997adaSBram Moolenaartest_option_not_set({name})				*test_option_not_set()*
119*ed997adaSBram Moolenaar		Reset the flag that indicates option {name} was set.  Thus it
120*ed997adaSBram Moolenaar		looks like it still has the default value. Use like this: >
121*ed997adaSBram Moolenaar			set ambiwidth=double
122*ed997adaSBram Moolenaar			call test_option_not_set('ambiwidth')
123*ed997adaSBram Moolenaar<		Now the 'ambiwidth' option behaves like it was never changed,
124*ed997adaSBram Moolenaar		even though the value is "double".
125*ed997adaSBram Moolenaar		Only to be used for testing!
126*ed997adaSBram Moolenaar
127*ed997adaSBram Moolenaar
128*ed997adaSBram Moolenaartest_override({name}, {val})				*test_override()*
129*ed997adaSBram Moolenaar		Overrides certain parts of Vim's internal processing to be able
130*ed997adaSBram Moolenaar		to run tests. Only to be used for testing Vim!
131*ed997adaSBram Moolenaar		The override is enabled when {val} is non-zero and removed
132*ed997adaSBram Moolenaar		when {val} is zero.
133*ed997adaSBram Moolenaar		Current supported values for name are:
134*ed997adaSBram Moolenaar
135*ed997adaSBram Moolenaar		name	     effect when {val} is non-zero ~
136*ed997adaSBram Moolenaar		redraw       disable the redrawing() function
137*ed997adaSBram Moolenaar		redraw_flag  ignore the RedrawingDisabled flag
138*ed997adaSBram Moolenaar		char_avail   disable the char_avail() function
139*ed997adaSBram Moolenaar		starting     reset the "starting" variable, see below
140*ed997adaSBram Moolenaar		nfa_fail     makes the NFA regexp engine fail to force a
141*ed997adaSBram Moolenaar			     fallback to the old engine
142*ed997adaSBram Moolenaar		no_query_mouse  do not query the mouse position for "dec"
143*ed997adaSBram Moolenaar				terminals
144*ed997adaSBram Moolenaar		no_wait_return	set the "no_wait_return" flag.  Not restored
145*ed997adaSBram Moolenaar				with "ALL".
146*ed997adaSBram Moolenaar		ALL	     clear all overrides ({val} is not used)
147*ed997adaSBram Moolenaar
148*ed997adaSBram Moolenaar		"starting" is to be used when a test should behave like
149*ed997adaSBram Moolenaar		startup was done.  Since the tests are run by sourcing a
150*ed997adaSBram Moolenaar		script the "starting" variable is non-zero. This is usually a
151*ed997adaSBram Moolenaar		good thing (tests run faster), but sometimes changes behavior
152*ed997adaSBram Moolenaar		in a way that the test doesn't work properly.
153*ed997adaSBram Moolenaar		When using: >
154*ed997adaSBram Moolenaar			call test_override('starting', 1)
155*ed997adaSBram Moolenaar<		The value of "starting" is saved.  It is restored by: >
156*ed997adaSBram Moolenaar			call test_override('starting', 0)
157*ed997adaSBram Moolenaar
158*ed997adaSBram Moolenaar
159*ed997adaSBram Moolenaartest_refcount({expr})					*test_refcount()*
160*ed997adaSBram Moolenaar		Return the reference count of {expr}.  When {expr} is of a
161*ed997adaSBram Moolenaar		type that does not have a reference count, returns -1.  Only
162*ed997adaSBram Moolenaar		to be used for testing.
163*ed997adaSBram Moolenaar
164*ed997adaSBram Moolenaar
165*ed997adaSBram Moolenaartest_scrollbar({which}, {value}, {dragging})		*test_scrollbar()*
166*ed997adaSBram Moolenaar		Pretend using scrollbar {which} to move it to position
167*ed997adaSBram Moolenaar		{value}.  {which} can be:
168*ed997adaSBram Moolenaar			left	Left scrollbar of the current window
169*ed997adaSBram Moolenaar			right	Right scrollbar of the current window
170*ed997adaSBram Moolenaar			hor	Horizontal scrollbar
171*ed997adaSBram Moolenaar
172*ed997adaSBram Moolenaar		For the vertical scrollbars {value} can be 1 to the
173*ed997adaSBram Moolenaar		line-count of the buffer.  For the horizontal scrollbar the
174*ed997adaSBram Moolenaar		{value} can be between 1 and the maximum line length, assuming
175*ed997adaSBram Moolenaar		'wrap' is not set.
176*ed997adaSBram Moolenaar
177*ed997adaSBram Moolenaar		When {dragging} is non-zero it's like dragging the scrollbar,
178*ed997adaSBram Moolenaar		otherwise it's like clicking in the scrollbar.
179*ed997adaSBram Moolenaar		Only works when the {which} scrollbar actually exists,
180*ed997adaSBram Moolenaar		obviously only when using the GUI.
181*ed997adaSBram Moolenaar
182*ed997adaSBram Moolenaar
183*ed997adaSBram Moolenaartest_setmouse({row}, {col})				*test_setmouse()*
184*ed997adaSBram Moolenaar		Set the mouse position to be used for the next mouse action.
185*ed997adaSBram Moolenaar		{row} and {col} are one based.
186*ed997adaSBram Moolenaar		For example: >
187*ed997adaSBram Moolenaar			call test_setmouse(4, 20)
188*ed997adaSBram Moolenaar			call feedkeys("\<LeftMouse>", "xt")
189*ed997adaSBram Moolenaar
190*ed997adaSBram Moolenaar
191*ed997adaSBram Moolenaartest_settime({expr})					*test_settime()*
192*ed997adaSBram Moolenaar		Set the time Vim uses internally.  Currently only used for
193*ed997adaSBram Moolenaar		timestamps in the history, as they are used in viminfo, and
194*ed997adaSBram Moolenaar		for undo.
195*ed997adaSBram Moolenaar		Using a value of 1 makes Vim not sleep after a warning or
196*ed997adaSBram Moolenaar		error message.
197*ed997adaSBram Moolenaar		{expr} must evaluate to a number.  When the value is zero the
198*ed997adaSBram Moolenaar		normal behavior is restored.
199*ed997adaSBram Moolenaar
200*ed997adaSBram Moolenaar==============================================================================
201*ed997adaSBram Moolenaar3. Assert functions				*assert-functions*
202*ed997adaSBram Moolenaar
203*ed997adaSBram Moolenaar
204*ed997adaSBram Moolenaarassert_beeps({cmd})					*assert_beeps()*
205*ed997adaSBram Moolenaar		Run {cmd} and add an error message to |v:errors| if it does
206*ed997adaSBram Moolenaar		NOT produce a beep or visual bell.
207*ed997adaSBram Moolenaar		Also see |assert_fails()| and |assert-return|.
208*ed997adaSBram Moolenaar
209*ed997adaSBram Moolenaar							*assert_equal()*
210*ed997adaSBram Moolenaarassert_equal({expected}, {actual} [, {msg}])
211*ed997adaSBram Moolenaar		When {expected} and {actual} are not equal an error message is
212*ed997adaSBram Moolenaar		added to |v:errors| and 1 is returned.  Otherwise zero is
213*ed997adaSBram Moolenaar		returned |assert-return|.
214*ed997adaSBram Moolenaar		There is no automatic conversion, the String "4" is different
215*ed997adaSBram Moolenaar		from the Number 4.  And the number 4 is different from the
216*ed997adaSBram Moolenaar		Float 4.0.  The value of 'ignorecase' is not used here, case
217*ed997adaSBram Moolenaar		always matters.
218*ed997adaSBram Moolenaar		When {msg} is omitted an error in the form "Expected
219*ed997adaSBram Moolenaar		{expected} but got {actual}" is produced.
220*ed997adaSBram Moolenaar		Example: >
221*ed997adaSBram Moolenaar	assert_equal('foo', 'bar')
222*ed997adaSBram Moolenaar<		Will result in a string to be added to |v:errors|:
223*ed997adaSBram Moolenaar	test.vim line 12: Expected 'foo' but got 'bar' ~
224*ed997adaSBram Moolenaar
225*ed997adaSBram Moolenaar							*assert_equalfile()*
226*ed997adaSBram Moolenaarassert_equalfile({fname-one}, {fname-two})
227*ed997adaSBram Moolenaar		When the files {fname-one} and {fname-two} do not contain
228*ed997adaSBram Moolenaar		exactly the same text an error message is added to |v:errors|.
229*ed997adaSBram Moolenaar		Also see |assert-return|.
230*ed997adaSBram Moolenaar		When {fname-one} or {fname-two} does not exist the error will
231*ed997adaSBram Moolenaar		mention that.
232*ed997adaSBram Moolenaar		Mainly useful with |terminal-diff|.
233*ed997adaSBram Moolenaar
234*ed997adaSBram Moolenaarassert_exception({error} [, {msg}])			*assert_exception()*
235*ed997adaSBram Moolenaar		When v:exception does not contain the string {error} an error
236*ed997adaSBram Moolenaar		message is added to |v:errors|.  Also see |assert-return|.
237*ed997adaSBram Moolenaar		This can be used to assert that a command throws an exception.
238*ed997adaSBram Moolenaar		Using the error number, followed by a colon, avoids problems
239*ed997adaSBram Moolenaar		with translations: >
240*ed997adaSBram Moolenaar			try
241*ed997adaSBram Moolenaar			  commandthatfails
242*ed997adaSBram Moolenaar			  call assert_false(1, 'command should have failed')
243*ed997adaSBram Moolenaar			catch
244*ed997adaSBram Moolenaar			  call assert_exception('E492:')
245*ed997adaSBram Moolenaar			endtry
246*ed997adaSBram Moolenaar
247*ed997adaSBram Moolenaarassert_fails({cmd} [, {error} [, {msg}]])			*assert_fails()*
248*ed997adaSBram Moolenaar		Run {cmd} and add an error message to |v:errors| if it does
249*ed997adaSBram Moolenaar		NOT produce an error.  Also see |assert-return|.
250*ed997adaSBram Moolenaar		When {error} is given it must match in |v:errmsg|.
251*ed997adaSBram Moolenaar		Note that beeping is not considered an error, and some failing
252*ed997adaSBram Moolenaar		commands only beep.  Use |assert_beeps()| for those.
253*ed997adaSBram Moolenaar
254*ed997adaSBram Moolenaarassert_false({actual} [, {msg}])				*assert_false()*
255*ed997adaSBram Moolenaar		When {actual} is not false an error message is added to
256*ed997adaSBram Moolenaar		|v:errors|, like with |assert_equal()|.
257*ed997adaSBram Moolenaar		Also see |assert-return|.
258*ed997adaSBram Moolenaar		A value is false when it is zero. When {actual} is not a
259*ed997adaSBram Moolenaar		number the assert fails.
260*ed997adaSBram Moolenaar		When {msg} is omitted an error in the form
261*ed997adaSBram Moolenaar		"Expected False but got {actual}" is produced.
262*ed997adaSBram Moolenaar
263*ed997adaSBram Moolenaarassert_inrange({lower}, {upper}, {actual} [, {msg}])	 *assert_inrange()*
264*ed997adaSBram Moolenaar		This asserts number and |Float| values.  When {actual}  is lower
265*ed997adaSBram Moolenaar		than {lower} or higher than {upper} an error message is added
266*ed997adaSBram Moolenaar		to |v:errors|.  Also see |assert-return|.
267*ed997adaSBram Moolenaar		When {msg} is omitted an error in the form
268*ed997adaSBram Moolenaar		"Expected range {lower} - {upper}, but got {actual}" is
269*ed997adaSBram Moolenaar		produced.
270*ed997adaSBram Moolenaar
271*ed997adaSBram Moolenaar								*assert_match()*
272*ed997adaSBram Moolenaarassert_match({pattern}, {actual} [, {msg}])
273*ed997adaSBram Moolenaar		When {pattern} does not match {actual} an error message is
274*ed997adaSBram Moolenaar		added to |v:errors|.  Also see |assert-return|.
275*ed997adaSBram Moolenaar
276*ed997adaSBram Moolenaar		{pattern} is used as with |=~|: The matching is always done
277*ed997adaSBram Moolenaar		like 'magic' was set and 'cpoptions' is empty, no matter what
278*ed997adaSBram Moolenaar		the actual value of 'magic' or 'cpoptions' is.
279*ed997adaSBram Moolenaar
280*ed997adaSBram Moolenaar		{actual} is used as a string, automatic conversion applies.
281*ed997adaSBram Moolenaar		Use "^" and "$" to match with the start and end of the text.
282*ed997adaSBram Moolenaar		Use both to match the whole text.
283*ed997adaSBram Moolenaar
284*ed997adaSBram Moolenaar		When {msg} is omitted an error in the form
285*ed997adaSBram Moolenaar		"Pattern {pattern} does not match {actual}" is produced.
286*ed997adaSBram Moolenaar		Example: >
287*ed997adaSBram Moolenaar	assert_match('^f.*o$', 'foobar')
288*ed997adaSBram Moolenaar<		Will result in a string to be added to |v:errors|:
289*ed997adaSBram Moolenaar	test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~
290*ed997adaSBram Moolenaar
291*ed997adaSBram Moolenaar							*assert_notequal()*
292*ed997adaSBram Moolenaarassert_notequal({expected}, {actual} [, {msg}])
293*ed997adaSBram Moolenaar		The opposite of `assert_equal()`: add an error message to
294*ed997adaSBram Moolenaar		|v:errors| when {expected} and {actual} are equal.
295*ed997adaSBram Moolenaar		Also see |assert-return|.
296*ed997adaSBram Moolenaar
297*ed997adaSBram Moolenaar							*assert_notmatch()*
298*ed997adaSBram Moolenaarassert_notmatch({pattern}, {actual} [, {msg}])
299*ed997adaSBram Moolenaar		The opposite of `assert_match()`: add an error message to
300*ed997adaSBram Moolenaar		|v:errors| when {pattern} matches {actual}.
301*ed997adaSBram Moolenaar		Also see |assert-return|.
302*ed997adaSBram Moolenaar
303*ed997adaSBram Moolenaarassert_report({msg})					*assert_report()*
304*ed997adaSBram Moolenaar		Report a test failure directly, using {msg}.
305*ed997adaSBram Moolenaar		Always returns one.
306*ed997adaSBram Moolenaar
307*ed997adaSBram Moolenaarassert_true({actual} [, {msg}])				*assert_true()*
308*ed997adaSBram Moolenaar		When {actual} is not true an error message is added to
309*ed997adaSBram Moolenaar		|v:errors|, like with |assert_equal()|.
310*ed997adaSBram Moolenaar		Also see |assert-return|.
311*ed997adaSBram Moolenaar		A value is TRUE when it is a non-zero number.  When {actual}
312*ed997adaSBram Moolenaar		is not a number the assert fails.
313*ed997adaSBram Moolenaar		When {msg} is omitted an error in the form "Expected True but
314*ed997adaSBram Moolenaar		got {actual}" is produced.
315*ed997adaSBram Moolenaar
316*ed997adaSBram Moolenaar
317*ed997adaSBram Moolenaar vim:tw=78:ts=8:noet:ft=help:norl:
318