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