*testing.txt*	For Vim version 9.1.  Last change: 2024 Apr 07


		  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()


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


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()


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.


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.


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()
<
						*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})
<
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()


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})
<

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


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


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


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


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


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


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


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


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()


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
		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')


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()


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")


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()


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.


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


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

==============================================================================
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()
<
							*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.

		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: >
	assert_equal('foo', 'bar')
<		Will result in a string to be added to |v:errors|:
	test.vim line 12: 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])

<							*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')

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
<
							*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:". >
			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: >
			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: >
			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:')

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 prepended to that.
		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()

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.

								*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.

		{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: >
	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.*')
<
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()
<
							*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])

<							*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.*')


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()


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 precedes the default message.

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

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