*testing.txt*	For Vim version 9.1.  Last change: 2024 Jul 18


		  VIM REFERENCE MANUAL	  by Bram Moolenaar


Testing Vim and Vim script			*testing-support*

Expression evaluation is explained in |eval.txt|.  This file goes into details
about writing tests in Vim script.  This can be used for testing Vim itself
and for testing plugins.

1. Testing Vim				|testing|
2. Test functions			|test-functions-details|
3. Assert functions			|assert-functions-details|

==============================================================================
1. Testing Vim						*testing*

Vim can be tested after building it, usually with "make test".
The tests are located in the directory "src/testdir".

There are two types of tests added over time:
	test20.in		oldest, only for tiny builds
	test_something.vim	new style tests

						*new-style-testing*
New tests should be added as new style tests.  The test scripts are named
test_<feature>.vim (replace <feature> with the feature under test). These use
functions such as |assert_equal()| to keep the test commands and the expected
result in one place.
						*old-style-testing*
These tests are used only for testing Vim without the |+eval| feature.

Find more information in the file src/testdir/README.txt.

==============================================================================
2. Test functions				*test-functions-details*

test_alloc_fail({id}, {countdown}, {repeat})		*test_alloc_fail()*
		This is for testing: If the memory allocation with {id} is
		called, then decrement {countdown}, and when it reaches zero
		let memory allocation fail {repeat} times.  When {repeat} is
		smaller than one it fails one time.

		Can also be used as a |method|: >
			GetAllocId()->test_alloc_fail()
<
		Return type: |Number|


test_autochdir()					*test_autochdir()*
		Set a flag to enable the effect of 'autochdir' before Vim
		startup has finished.

		Return type: |Number|


test_feedinput({string})				*test_feedinput()*
		Characters in {string} are queued for processing as if they
		were typed by the user. This uses a low level input buffer.
		This function works only when with |+unix| or GUI is running.

		Can also be used as a |method|: >
			GetText()->test_feedinput()
<
		Return type: |Number|


test_garbagecollect_now()			 *test_garbagecollect_now()*
		Like garbagecollect(), but executed right away.  This must
		only be called directly to avoid any structure to exist
		internally, and |v:testing| must have been set before calling
		any function.   *E1142*
		This will not work when called from a :def function, because
		variables on the stack will be freed.

		Return type: |Number|

test_garbagecollect_soon()			 *test_garbagecollect_soon()*
		Set the flag to call the garbagecollector as if in the main
		loop.  Only to be used in tests.

		Return type: |Number|

test_getvalue({name})					*test_getvalue()*
		Get the value of an internal variable.  These values for
		{name} are supported:
			need_fileinfo

		Can also be used as a |method|: >
			GetName()->test_getvalue()
<
		Return type: |Number|

						*test_gui_event()*
test_gui_event({event}, {args})
		Generate a GUI {event} with arguments {args} for testing Vim
		functionality. This function works only when the GUI is
		running.

		{event} is a String and the supported values are:
		    "dropfiles"	drop one or more files in a window.
		    "findrepl"  search and replace text.
		    "mouse"	mouse button click event.
		    "scrollbar" move or drag the scrollbar.
		    "key"	send a low-level keyboard event.
		    "tabline"	select a tab page by mouse click.
		    "tabmenu"	select a tabline menu entry.

		{args} is a Dict and contains the arguments for the event.

		"dropfiles":
		  Drop one or more files in a specified window.  The supported
		  items in {args} are:
		    files:	List of file names
		    row:	window row number
		    col:	window column number
		    modifiers:	key modifiers. The supported values are:
				    0x4	Shift
				    0x8	Alt
				   0x10	Ctrl
		  The files are added to the |argument-list| and the first
		  file in {files} is edited in the window.  See |drag-n-drop|
		  for more information.  This event works only when the
		  |drop_file| feature is present.

		"findrepl":
		  {only available when the GUI has a find/replace dialog}
		  Perform a search and replace of text.  The supported items
		  in {args} are:
		    find_text:	string to find.
		    repl_text:	replacement string.
		    flags:	flags controlling the find/replace. Supported
				values are:
				    1	search next string (find dialog)
				    2	search next string (replace dialog)
				    3	replace string once
				    4	replace all matches
				    8	match whole words only
				   16	match case
		    forward:	set to 1 for forward search.

		"mouse":
		  Inject either a mouse button click, or a mouse move, event.
		  The supported items in {args} are:
		    button:	mouse button.  The supported values are:
				    0	left mouse button
				    1	middle mouse button
				    2	right mouse button
				    3	mouse button release
				    4	scroll wheel down
				    5	scroll wheel up
				    6	scroll wheel left
				    7	scroll wheel right
		    row:	mouse click row number.  The first row of the
				Vim window is 1 and the last row is 'lines'.
		    col:	mouse click column number.  The maximum value
				of {col} is 'columns'.
		    multiclick:	set to 1 to inject a multiclick mouse event.
		    modifiers:	key modifiers.  The supported values are:
				    4	shift is pressed
				    8	alt is pressed
				   16	ctrl is pressed
		    move:	Optional; if used and TRUE then a mouse move
			        event can be generated.
				Only {args} row: and col: are used and
				required; they are interpreted as pixels or
				screen cells, depending on "cell".
				Only results in an event when 'mousemoveevent'
				is set or a popup uses mouse move events.
		    cell:	Optional: when present and TRUE then "move"
				uses screen cells instead of pixel positions

		"scrollbar":
		  Set or drag the left, right or horizontal scrollbar.  Only
		  works when the scrollbar actually exists.  The supported
		  items in {args} are:
		    which:	Selects the scrollbar. The supported values
				are:
				    left  Left scrollbar of the current window
				    right Right scrollbar of the current window
				    hor   Horizontal scrollbar
		    value:	Amount to scroll.  For the vertical scrollbars
				the value can be between 0 to the line-count
				of the buffer minus one.  For the horizontal
				scrollbar the value can be between 1 and the
				maximum line length, assuming 'wrap' is not
				set.
		    dragging:	1 to drag the scrollbar and 0 to click in the
				scrollbar.

		"key":
		  Send a low-level keyboard event (e.g. key-up or down).
		  Currently only supported on MS-Windows.
		  The supported items in {args} are:
		    event:	The supported string values are:
				    keyup   generate a keyup event
				    keydown generate a keydown event
		    keycode:    Keycode to use for a keyup or a keydown event.
								*E1291*

		"tabline":
		  Inject a mouse click event on the tabline to select a
		  tabpage. The supported items in {args} are:
		    tabnr:	tab page number

		"tabmenu":
		  Inject an event to select a tabline menu entry. The
		  supported items in {args} are:
		    tabnr:	tab page number
		    item:	tab page menu item number. 1 for the first
				menu item, 2 for the second item and so on.

		After injecting the GUI events you probably should call
		|feedkeys()| to have them processed, e.g.: >
			call feedkeys("y", 'Lx!')
<
		Returns TRUE if the event is successfully added, FALSE if
		there is a failure.

		Can also be used as a |method|: >
			GetEvent()->test_gui_event({args})
<
		Return type: |vim9-boolean|

test_ignore_error({expr})			 *test_ignore_error()*
		Ignore any error containing {expr}.  A normal message is given
		instead.
		This is only meant to be used in tests, where catching the
		error with try/catch cannot be used (because it skips over
		following code).
		{expr} is used literally, not as a pattern.
		When the {expr} is the string "RESET" then the list of ignored
		errors is made empty.

		Can also be used as a |method|: >
			GetErrorText()->test_ignore_error()
<
		Return type: |Number|

test_mswin_event({event}, {args})		*test_mswin_event()*
		Generate a low-level MS-Windows {event} with arguments {args}
		for testing Vim functionality.  It works for MS-Windows GUI
		and for the console.

		{event} is a String and the supported values are:
		    "mouse"	mouse event.
		    "key"	keyboard event.
		    "set_keycode_trans_strategy"
				Change the key translation method.

		"mouse":
		  Inject either a mouse button click, or a mouse move, event.
		  The supported items in {args} are:
		    button:	mouse button.  The supported values are:
				    0	right mouse button
				    1	middle mouse button
				    2	left mouse button
				    3	mouse button release
				    4	scroll wheel down
				    5	scroll wheel up
				    6	scroll wheel left
				    7	scroll wheel right
		    row:	mouse click row number.  The first row of the
				Vim window is 1 and the last row is 'lines'.
		    col:	mouse click column number.  The maximum value
				of {col} is 'columns'.
				Note: row and col are always interpreted as
				screen cells for the console application.
				But, they may be interpreted as pixels
				for the GUI, depending on "cell".
		    multiclick:	set to 1 to inject a double-click mouse event.
		    modifiers:	key modifiers.  The supported values are:
				    4	shift is pressed
				    8	alt is pressed
				   16	ctrl is pressed
		    move:	Optional; if used and TRUE then a mouse move
			        event can be generated.
				Only {args} row: and col: are used and
				required.
				Only results in an event when 'mousemoveevent'
				is set or a popup uses mouse move events.
		    cell:	Optional for the GUI: when present and TRUE
				then "move" uses screen cells instead of pixel
				positions.  Not used by the console.

		"key":
		  Send a low-level keyboard event (e.g. keyup or keydown).
		  The supported items in {args} are:
		    event:	The supported string values are:
				    keyup   generate a keyup event
				    keydown generate a keydown event
		    keycode:	Keycode to use for a keyup or a keydown event.
		    modifiers:	Optional; key modifiers.
				The supported values are:
				    2	shift is pressed
				    4	ctrl is pressed
				    8	alt is pressed
				Note: These values are different from the
				mouse modifiers.
		    execute:	Optional. Similar to |feedkeys()| mode x.
				When this is included and set to true
				(non-zero) then Vim will process any buffered
				unprocessed key events.  All other {args}
				items are optional when this is set and true.

		"set_keycode_trans_strategy":
		  |w32-experimental-keycode-trans-strategy|
		  Switch the keycode translation method. The supported methods
		  are:
		    experimental:   The method used after Patch v8.2.4807
				    using ToUnicode() Win API call.
		    classic:	    The method used pre Patch v8.2.4807
				    using the TranslateMessage() Win API call.

		Returns TRUE if the event is successfully added or executed,
		FALSE if there is a failure.

		Can also be used as a |method|: >
			GetEvent()->test_mswin_event({args})
<
		Return type: |vim9-boolean|

test_null_blob()					*test_null_blob()*
		Return a |Blob| that is null. Only useful for testing.

		Return type: |Blob|

test_null_channel()					*test_null_channel()*
		Return a |Channel| that is null. Only useful for testing.
		{only available when compiled with the +channel feature}

		Return type: |Channel|

test_null_dict()					*test_null_dict()*
		Return a |Dict| that is null. Only useful for testing.

		Return type: dict<any>

test_null_function()					*test_null_function()*
		Return a |Funcref| that is null. Only useful for testing.

		Return type: func(...): unknown

test_null_job()						*test_null_job()*
		Return a |Job| that is null. Only useful for testing.
		{only available when compiled with the +job feature}

		Return type: |job|

test_null_list()					*test_null_list()*
		Return a |List| that is null. Only useful for testing.

		Return type: list<any>

test_null_partial()					*test_null_partial()*
		Return a |Partial| that is null. Only useful for testing.

		Return type: func(...): unknown

test_null_string()					*test_null_string()*
		Return a |String| that is null. Only useful for testing.

		Return type: |String|

test_option_not_set({name})				*test_option_not_set()*
		Reset the flag that indicates option {name} was set.  Thus it
		looks like it still has the default value. Use like this: >
			set ambiwidth=double
			call test_option_not_set('ambiwidth')
<		Now the 'ambiwidth' option behaves like it was never changed,
		even though the value is "double".
		Only to be used for testing!

		Can also be used as a |method|: >
			GetOptionName()->test_option_not_set()
<
		Return type: |Number|

test_override({name}, {val})				*test_override()*
		Overrides certain parts of Vim's internal processing to be able
		to run tests. Only to be used for testing Vim!
		The override is enabled when {val} is non-zero and removed
		when {val} is zero.
		Current supported values for {name} are:

		{name}	     effect when {val} is non-zero ~
		alloc_lines  make a copy of every buffer line into allocated
			     memory, so that memory access errors can be found
			     by valgrind.
		autoload     `import autoload` will load the script right
			     away, not postponed until an item is used.
		char_avail   disable the char_avail() function.
		defcompile   all the |:def| functions in a sourced script are
			     compiled when defined.  This is similar to using
			     the |:defcompile| command in a script.
		nfa_fail     makes the NFA regexp engine fail to force a
			     fallback to the old engine.
		no_query_mouse  do not query the mouse position for "dec"
				terminals.
		no_wait_return	set the "no_wait_return" flag.  Not restored
				with "ALL".
		redraw       disable the redrawing() function.
		redraw_flag  ignore the RedrawingDisabled flag.
		starting     reset the "starting" variable, see below.
		term_props   reset all terminal properties when the version
			     string is detected.
		ui_delay     time in msec to use in ui_delay(); overrules a
			     wait time of up to 3 seconds for messages.
		unreachable  no error for code after `:throw` and `:return`.
		uptime	     overrules sysinfo.uptime.
		vterm_title  setting the window title by a job running in a
			     terminal window.
		ALL	     clear all overrides, except alloc_lines ({val} is
			     not used).

		"starting" is to be used when a test should behave like
		startup was done.  Since the tests are run by sourcing a
		script the "starting" variable is non-zero. This is usually a
		good thing (tests run faster), but sometimes this changes
		behavior in a way that the test doesn't work properly.
		When using: >
			call test_override('starting', 1)
<		The value of "starting" is saved.  It is restored by: >
			call test_override('starting', 0)

<		To make sure the flag is reset later using `:defer` can be
		useful: >
			call test_override('unreachable', 1)
			defer call test_override('unreachable', 0)

<		Can also be used as a |method|: >
			GetOverrideVal()-> test_override('starting')
<
		Return type: |Number|

test_refcount({expr})					*test_refcount()*
		Return the reference count of {expr}.  When {expr} is of a
		type that does not have a reference count, returns -1.  Only
		to be used for testing.

		Can also be used as a |method|: >
			GetVarname()->test_refcount()
<
		Return type: |Number|

test_setmouse({row}, {col})				*test_setmouse()*
		Set the mouse position to be used for the next mouse action.
		{row} and {col} are one based.
		For example: >
			call test_setmouse(4, 20)
			call feedkeys("\<LeftMouse>", "xt")
<
		Return type: |Number|


test_settime({expr})					*test_settime()*
		Set the time Vim uses internally.  Currently only used for
		timestamps in the history, as they are used in viminfo, and
		for undo.
		Using a value of 1 makes Vim not sleep after a warning or
		error message.
		{expr} must evaluate to a number.  When the value is zero the
		normal behavior is restored.

		Can also be used as a |method|: >
			GetTime()->test_settime()
<
		Return type: |Number|

test_srand_seed([{seed}])				*test_srand_seed()*
		When {seed} is given this sets the seed value used by
		`srand()`.  When omitted the test seed is removed.

		Return type: |Number|

test_unknown()						*test_unknown()*
		Return a value with unknown type. Only useful for testing.

		Return type: unknown

test_void()						*test_void()*
		Return a value with void type. Only useful for testing.

		Return type: void

==============================================================================
3. Assert functions				*assert-functions-details*


assert_beeps({cmd})					*assert_beeps()*
		Run {cmd} and add an error message to |v:errors| if it does
		NOT produce a beep or visual bell.
		Also see |assert_fails()|, |assert_nobeep()| and
		|assert-return|.

		Can also be used as a |method|: >
			GetCmd()->assert_beeps()
<
		Return type: |Number|

							*assert_equal()*
assert_equal({expected}, {actual} [, {msg}])
		When {expected} and {actual} are not equal an error message is
		added to |v:errors| and 1 is returned.  Otherwise zero is
		returned. |assert-return|
		The error is in the form "Expected {expected} but got
		{actual}".  When {msg} is present it is prefixed to that,
		along with the location of the assert when run from a script.

		There is no automatic conversion, the String "4" is different
		from the Number 4.  And the number 4 is different from the
		Float 4.0.  The value of 'ignorecase' is not used here, case
		always matters.
		Example: >
			call assert_equal('foo', 'bar', 'baz')
<		Will add the following to |v:errors|:
			test.vim line 12: baz: Expected 'foo' but got 'bar' ~

		Can also be used as a |method|, the base is passed as the
		second argument: >
			mylist->assert_equal([1, 2, 3])
<
		Return type: |Number|

							*assert_equalfile()*
assert_equalfile({fname-one}, {fname-two} [, {msg}])
		When the files {fname-one} and {fname-two} do not contain
		exactly the same text an error message is added to |v:errors|.
		Also see |assert-return|.
		When {fname-one} or {fname-two} does not exist the error will
		mention that.
		Mainly useful with |terminal-diff|.

		Can also be used as a |method|: >
			GetLog()->assert_equalfile('expected.log')
<
		Return type: |Number|

assert_exception({error} [, {msg}])			*assert_exception()*
		When v:exception does not contain the string {error} an error
		message is added to |v:errors|.  Also see |assert-return|.
		This can be used to assert that a command throws an exception.
		Using the error number, followed by a colon, avoids problems
		with translations: >
			try
			  commandthatfails
			  call assert_false(1, 'command should have failed')
			catch
			  call assert_exception('E492:')
			endtry
<
		Return type: |Number|

							*assert_fails()*
assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
		Run {cmd} and add an error message to |v:errors| if it does
		NOT produce an error or when {error} is not found in the
		error message.  Also see |assert-return|.
							*E856*
		When {error} is a string it must be found literally in the
		first reported error. Most often this will be the error code,
		including the colon, e.g. "E123:". >
			call assert_fails('bad cmd', 'E987:')
<
		When {error} is a |List| with one or two strings, these are
		used as patterns.  The first pattern is matched against the
		first reported error: >
			call assert_fails('cmd', ['E987:.*expected bool'])
<		The second pattern, if present, is matched against the last
		reported error.
		If there is only one error then both patterns must match. This
		can be used to check that there is only one error.
		To only match the last error use an empty string for the first
		error: >
			call assert_fails('cmd', ['', 'E987:'])
<
		If {msg} is empty then it is not used.  Do this to get the
		default message when passing the {lnum} argument.
							*E1115*
		When {lnum} is present and not negative, and the {error}
		argument is present and matches, then this is compared with
		the line number at which the error was reported. That can be
		the line number in a function or in a script.
							*E1116*
		When {context} is present it is used as a pattern and matched
		against the context (script name or function name) where
		{lnum} is located in.

		Note that beeping is not considered an error, and some failing
		commands only beep.  Use |assert_beeps()| for those.

		Can also be used as a |method|: >
			GetCmd()->assert_fails('E99:')
<
		Return type: |Number|

assert_false({actual} [, {msg}])			*assert_false()*
		When {actual} is not false an error message is added to
		|v:errors|, like with |assert_equal()|.
		The error is in the form "Expected False but got {actual}".
		When {msg} is present it is prefixed to that, along with the
		location of the assert when run from a script.
		Also see |assert-return|.

		A value is false when it is zero. When {actual} is not a
		number the assert fails.

		Can also be used as a |method|: >
			GetResult()->assert_false()
<
		Return type: |Number|

assert_inrange({lower}, {upper}, {actual} [, {msg}])	 *assert_inrange()*
		This asserts number and |Float| values.  When {actual}  is lower
		than {lower} or higher than {upper} an error message is added
		to |v:errors|.  Also see |assert-return|.
		The error is in the form "Expected range {lower} - {upper},
		but got {actual}".  When {msg} is present it is prefixed to
		that.

		Return type: |Number|

								*assert_match()*
assert_match({pattern}, {actual} [, {msg}])
		When {pattern} does not match {actual} an error message is
		added to |v:errors|.  Also see |assert-return|.
		The error is in the form "Pattern {pattern} does not match
		{actual}".  When {msg} is present it is prefixed to that,
		along with the location of the assert when run from a script.

		{pattern} is used as with |=~|: The matching is always done
		like 'magic' was set and 'cpoptions' is empty, no matter what
		the actual value of 'magic' or 'cpoptions' is.

		{actual} is used as a string, automatic conversion applies.
		Use "^" and "$" to match with the start and end of the text.
		Use both to match the whole text.

		Example: >
			call assert_match('^f.*o$', 'foobar')
<		Will result in a string to be added to |v:errors|:
			test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~

		Can also be used as a |method|: >
			getFile()->assert_match('foo.*')
<
		Return type: |Number|

assert_nobeep({cmd})					*assert_nobeep()*
		Run {cmd} and add an error message to |v:errors| if it
		produces a beep or visual bell.
		Also see |assert_beeps()|.

		Can also be used as a |method|: >
			GetCmd()->assert_nobeep()
<
		Return type: |Number|

							*assert_notequal()*
assert_notequal({expected}, {actual} [, {msg}])
		The opposite of `assert_equal()`: add an error message to
		|v:errors| when {expected} and {actual} are equal.
		Also see |assert-return|.

		Can also be used as a |method|: >
			mylist->assert_notequal([1, 2, 3])
<
		Return type: |Number|

							*assert_notmatch()*
assert_notmatch({pattern}, {actual} [, {msg}])
		The opposite of `assert_match()`: add an error message to
		|v:errors| when {pattern} matches {actual}.
		Also see |assert-return|.

		Can also be used as a |method|: >
			getFile()->assert_notmatch('bar.*')
<
		Return type: |Number|

assert_report({msg})					*assert_report()*
		Report a test failure directly, using String {msg}.
		Always returns one.

		Can also be used as a |method|: >
			GetMessage()->assert_report()
<
		Return type: |Number|


assert_true({actual} [, {msg}])				*assert_true()*
		When {actual} is not true an error message is added to
		|v:errors|, like with |assert_equal()|.
		Also see |assert-return|.
		A value is TRUE when it is a non-zero number.  When {actual}
		is not a number the assert fails.
		When {msg} is given it is prefixed to the default message,
		along with the location of the assert when run from a script.

		Can also be used as a |method|: >
			GetResult()->assert_true()
<
		Return type: |Number|


 vim:tw=78:ts=8:noet:ft=help:norl:
