xref: /vim-8.2.3635/src/testing.c (revision 4490ec4e)
1ecaa70eaSBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet:
2ecaa70eaSBram Moolenaar  *
3ecaa70eaSBram Moolenaar  * VIM - Vi IMproved	by Bram Moolenaar
4ecaa70eaSBram Moolenaar  *
5ecaa70eaSBram Moolenaar  * Do ":help uganda"  in Vim to read copying and usage conditions.
6ecaa70eaSBram Moolenaar  * Do ":help credits" in Vim to see a list of people who contributed.
7ecaa70eaSBram Moolenaar  * See README.txt for an overview of the Vim source code.
8ecaa70eaSBram Moolenaar  */
9ecaa70eaSBram Moolenaar 
10ecaa70eaSBram Moolenaar /*
11ecaa70eaSBram Moolenaar  * testing.c: Support for tests.
12ecaa70eaSBram Moolenaar  */
13ecaa70eaSBram Moolenaar 
14ecaa70eaSBram Moolenaar #include "vim.h"
15ecaa70eaSBram Moolenaar 
16ecaa70eaSBram Moolenaar #if defined(FEAT_EVAL) || defined(PROTO)
17ecaa70eaSBram Moolenaar 
18ecaa70eaSBram Moolenaar /*
19ecaa70eaSBram Moolenaar  * Prepare "gap" for an assert error and add the sourcing position.
20ecaa70eaSBram Moolenaar  */
21ecaa70eaSBram Moolenaar     static void
prepare_assert_error(garray_T * gap)22ecaa70eaSBram Moolenaar prepare_assert_error(garray_T *gap)
23ecaa70eaSBram Moolenaar {
24ecaa70eaSBram Moolenaar     char    buf[NUMBUFLEN];
254f25b1abSBram Moolenaar     char_u  *sname = estack_sfile(ESTACK_NONE);
26ecaa70eaSBram Moolenaar 
27ecaa70eaSBram Moolenaar     ga_init2(gap, 1, 100);
281a47ae32SBram Moolenaar     if (sname != NULL)
29ecaa70eaSBram Moolenaar     {
301a47ae32SBram Moolenaar 	ga_concat(gap, sname);
311a47ae32SBram Moolenaar 	if (SOURCING_LNUM > 0)
32ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" ");
33ecaa70eaSBram Moolenaar     }
341a47ae32SBram Moolenaar     if (SOURCING_LNUM > 0)
35ecaa70eaSBram Moolenaar     {
361a47ae32SBram Moolenaar 	sprintf(buf, "line %ld", (long)SOURCING_LNUM);
37ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)buf);
38ecaa70eaSBram Moolenaar     }
391a47ae32SBram Moolenaar     if (sname != NULL || SOURCING_LNUM > 0)
40ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)": ");
411a47ae32SBram Moolenaar     vim_free(sname);
42ecaa70eaSBram Moolenaar }
43ecaa70eaSBram Moolenaar 
44ecaa70eaSBram Moolenaar /*
45ecaa70eaSBram Moolenaar  * Append "p[clen]" to "gap", escaping unprintable characters.
46ecaa70eaSBram Moolenaar  * Changes NL to \n, CR to \r, etc.
47ecaa70eaSBram Moolenaar  */
48ecaa70eaSBram Moolenaar     static void
ga_concat_esc(garray_T * gap,char_u * p,int clen)49ecaa70eaSBram Moolenaar ga_concat_esc(garray_T *gap, char_u *p, int clen)
50ecaa70eaSBram Moolenaar {
51ecaa70eaSBram Moolenaar     char_u  buf[NUMBUFLEN];
52ecaa70eaSBram Moolenaar 
53ecaa70eaSBram Moolenaar     if (clen > 1)
54ecaa70eaSBram Moolenaar     {
55ecaa70eaSBram Moolenaar 	mch_memmove(buf, p, clen);
56ecaa70eaSBram Moolenaar 	buf[clen] = NUL;
57ecaa70eaSBram Moolenaar 	ga_concat(gap, buf);
58ecaa70eaSBram Moolenaar     }
59ecaa70eaSBram Moolenaar     else switch (*p)
60ecaa70eaSBram Moolenaar     {
61ecaa70eaSBram Moolenaar 	case BS: ga_concat(gap, (char_u *)"\\b"); break;
62ecaa70eaSBram Moolenaar 	case ESC: ga_concat(gap, (char_u *)"\\e"); break;
63ecaa70eaSBram Moolenaar 	case FF: ga_concat(gap, (char_u *)"\\f"); break;
64ecaa70eaSBram Moolenaar 	case NL: ga_concat(gap, (char_u *)"\\n"); break;
65ecaa70eaSBram Moolenaar 	case TAB: ga_concat(gap, (char_u *)"\\t"); break;
66ecaa70eaSBram Moolenaar 	case CAR: ga_concat(gap, (char_u *)"\\r"); break;
67ecaa70eaSBram Moolenaar 	case '\\': ga_concat(gap, (char_u *)"\\\\"); break;
68ecaa70eaSBram Moolenaar 	default:
697177da9dSBram Moolenaar 		   if (*p < ' ' || *p == 0x7f)
70ecaa70eaSBram Moolenaar 		   {
71ecaa70eaSBram Moolenaar 		       vim_snprintf((char *)buf, NUMBUFLEN, "\\x%02x", *p);
72ecaa70eaSBram Moolenaar 		       ga_concat(gap, buf);
73ecaa70eaSBram Moolenaar 		   }
74ecaa70eaSBram Moolenaar 		   else
75ecaa70eaSBram Moolenaar 		       ga_append(gap, *p);
76ecaa70eaSBram Moolenaar 		   break;
77ecaa70eaSBram Moolenaar     }
78ecaa70eaSBram Moolenaar }
79ecaa70eaSBram Moolenaar 
80ecaa70eaSBram Moolenaar /*
81ecaa70eaSBram Moolenaar  * Append "str" to "gap", escaping unprintable characters.
82ecaa70eaSBram Moolenaar  * Changes NL to \n, CR to \r, etc.
83ecaa70eaSBram Moolenaar  */
84ecaa70eaSBram Moolenaar     static void
ga_concat_shorten_esc(garray_T * gap,char_u * str)85ecaa70eaSBram Moolenaar ga_concat_shorten_esc(garray_T *gap, char_u *str)
86ecaa70eaSBram Moolenaar {
87ecaa70eaSBram Moolenaar     char_u  *p;
88ecaa70eaSBram Moolenaar     char_u  *s;
89ecaa70eaSBram Moolenaar     int	    c;
90ecaa70eaSBram Moolenaar     int	    clen;
91ecaa70eaSBram Moolenaar     char_u  buf[NUMBUFLEN];
92ecaa70eaSBram Moolenaar     int	    same_len;
93ecaa70eaSBram Moolenaar 
94ecaa70eaSBram Moolenaar     if (str == NULL)
95ecaa70eaSBram Moolenaar     {
96ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)"NULL");
97ecaa70eaSBram Moolenaar 	return;
98ecaa70eaSBram Moolenaar     }
99ecaa70eaSBram Moolenaar 
100ecaa70eaSBram Moolenaar     for (p = str; *p != NUL; ++p)
101ecaa70eaSBram Moolenaar     {
102ecaa70eaSBram Moolenaar 	same_len = 1;
103ecaa70eaSBram Moolenaar 	s = p;
104ecaa70eaSBram Moolenaar 	c = mb_ptr2char_adv(&s);
105ecaa70eaSBram Moolenaar 	clen = s - p;
106ecaa70eaSBram Moolenaar 	while (*s != NUL && c == mb_ptr2char(s))
107ecaa70eaSBram Moolenaar 	{
108ecaa70eaSBram Moolenaar 	    ++same_len;
109ecaa70eaSBram Moolenaar 	    s += clen;
110ecaa70eaSBram Moolenaar 	}
111ecaa70eaSBram Moolenaar 	if (same_len > 20)
112ecaa70eaSBram Moolenaar 	{
113ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)"\\[");
114ecaa70eaSBram Moolenaar 	    ga_concat_esc(gap, p, clen);
115ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" occurs ");
116ecaa70eaSBram Moolenaar 	    vim_snprintf((char *)buf, NUMBUFLEN, "%d", same_len);
117ecaa70eaSBram Moolenaar 	    ga_concat(gap, buf);
118ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" times]");
119ecaa70eaSBram Moolenaar 	    p = s - 1;
120ecaa70eaSBram Moolenaar 	}
121ecaa70eaSBram Moolenaar 	else
122ecaa70eaSBram Moolenaar 	    ga_concat_esc(gap, p, clen);
123ecaa70eaSBram Moolenaar     }
124ecaa70eaSBram Moolenaar }
125ecaa70eaSBram Moolenaar 
126ecaa70eaSBram Moolenaar /*
127ecaa70eaSBram Moolenaar  * Fill "gap" with information about an assert error.
128ecaa70eaSBram Moolenaar  */
129ecaa70eaSBram Moolenaar     static void
fill_assert_error(garray_T * gap,typval_T * opt_msg_tv,char_u * exp_str,typval_T * exp_tv_arg,typval_T * got_tv_arg,assert_type_T atype)130ecaa70eaSBram Moolenaar fill_assert_error(
131ecaa70eaSBram Moolenaar     garray_T	*gap,
132ecaa70eaSBram Moolenaar     typval_T	*opt_msg_tv,
133ecaa70eaSBram Moolenaar     char_u      *exp_str,
1344a021dfbSBram Moolenaar     typval_T	*exp_tv_arg,
1354a021dfbSBram Moolenaar     typval_T	*got_tv_arg,
136ecaa70eaSBram Moolenaar     assert_type_T atype)
137ecaa70eaSBram Moolenaar {
138ecaa70eaSBram Moolenaar     char_u	numbuf[NUMBUFLEN];
139ecaa70eaSBram Moolenaar     char_u	*tofree;
1404a021dfbSBram Moolenaar     typval_T	*exp_tv = exp_tv_arg;
1414a021dfbSBram Moolenaar     typval_T	*got_tv = got_tv_arg;
1424a021dfbSBram Moolenaar     int		did_copy = FALSE;
1434a021dfbSBram Moolenaar     int		omitted = 0;
144ecaa70eaSBram Moolenaar 
1451d634542SBram Moolenaar     if (opt_msg_tv->v_type != VAR_UNKNOWN
1461d634542SBram Moolenaar 	    && !(opt_msg_tv->v_type == VAR_STRING
1471d634542SBram Moolenaar 		&& (opt_msg_tv->vval.v_string == NULL
1481d634542SBram Moolenaar 		    || *opt_msg_tv->vval.v_string == NUL)))
149ecaa70eaSBram Moolenaar     {
150ecaa70eaSBram Moolenaar 	ga_concat(gap, echo_string(opt_msg_tv, &tofree, numbuf, 0));
151ecaa70eaSBram Moolenaar 	vim_free(tofree);
152ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)": ");
153ecaa70eaSBram Moolenaar     }
154ecaa70eaSBram Moolenaar 
155ecaa70eaSBram Moolenaar     if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH)
156ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)"Pattern ");
157ecaa70eaSBram Moolenaar     else if (atype == ASSERT_NOTEQUAL)
158ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)"Expected not equal to ");
159ecaa70eaSBram Moolenaar     else
160ecaa70eaSBram Moolenaar 	ga_concat(gap, (char_u *)"Expected ");
161ecaa70eaSBram Moolenaar     if (exp_str == NULL)
162ecaa70eaSBram Moolenaar     {
1634a021dfbSBram Moolenaar 	// When comparing dictionaries, drop the items that are equal, so that
1644a021dfbSBram Moolenaar 	// it's a lot easier to see what differs.
1654a021dfbSBram Moolenaar 	if (atype != ASSERT_NOTEQUAL
1664a021dfbSBram Moolenaar 		&& exp_tv->v_type == VAR_DICT && got_tv->v_type == VAR_DICT
1674a021dfbSBram Moolenaar 		&& exp_tv->vval.v_dict != NULL && got_tv->vval.v_dict != NULL)
1684a021dfbSBram Moolenaar 	{
1694a021dfbSBram Moolenaar 	    dict_T	*exp_d = exp_tv->vval.v_dict;
1704a021dfbSBram Moolenaar 	    dict_T	*got_d = got_tv->vval.v_dict;
1714a021dfbSBram Moolenaar 	    hashitem_T	*hi;
1724a021dfbSBram Moolenaar 	    dictitem_T	*item2;
1734a021dfbSBram Moolenaar 	    int		todo;
1744a021dfbSBram Moolenaar 
1754a021dfbSBram Moolenaar 	    did_copy = TRUE;
1764a021dfbSBram Moolenaar 	    exp_tv->vval.v_dict = dict_alloc();
1774a021dfbSBram Moolenaar 	    got_tv->vval.v_dict = dict_alloc();
1784a021dfbSBram Moolenaar 	    if (exp_tv->vval.v_dict == NULL || got_tv->vval.v_dict == NULL)
1794a021dfbSBram Moolenaar 		return;
1804a021dfbSBram Moolenaar 
1814a021dfbSBram Moolenaar 	    todo = (int)exp_d->dv_hashtab.ht_used;
1824a021dfbSBram Moolenaar 	    for (hi = exp_d->dv_hashtab.ht_array; todo > 0; ++hi)
1834a021dfbSBram Moolenaar 	    {
1844a021dfbSBram Moolenaar 		if (!HASHITEM_EMPTY(hi))
1854a021dfbSBram Moolenaar 		{
1864a021dfbSBram Moolenaar 		    item2 = dict_find(got_d, hi->hi_key, -1);
1874a021dfbSBram Moolenaar 		    if (item2 == NULL || !tv_equal(&HI2DI(hi)->di_tv,
1884a021dfbSBram Moolenaar 						  &item2->di_tv, FALSE, FALSE))
1894a021dfbSBram Moolenaar 		    {
1904a021dfbSBram Moolenaar 			// item of exp_d not present in got_d or values differ.
1914a021dfbSBram Moolenaar 			dict_add_tv(exp_tv->vval.v_dict,
1924a021dfbSBram Moolenaar 					(char *)hi->hi_key, &HI2DI(hi)->di_tv);
1934a021dfbSBram Moolenaar 			if (item2 != NULL)
1944a021dfbSBram Moolenaar 			    dict_add_tv(got_tv->vval.v_dict,
1954a021dfbSBram Moolenaar 					    (char *)hi->hi_key, &item2->di_tv);
1964a021dfbSBram Moolenaar 		    }
1974a021dfbSBram Moolenaar 		    else
1984a021dfbSBram Moolenaar 			++omitted;
1994a021dfbSBram Moolenaar 		    --todo;
2004a021dfbSBram Moolenaar 		}
2014a021dfbSBram Moolenaar 	    }
2024a021dfbSBram Moolenaar 
2034a021dfbSBram Moolenaar 	    // Add items only present in got_d.
2044a021dfbSBram Moolenaar 	    todo = (int)got_d->dv_hashtab.ht_used;
2054a021dfbSBram Moolenaar 	    for (hi = got_d->dv_hashtab.ht_array; todo > 0; ++hi)
2064a021dfbSBram Moolenaar 	    {
2074a021dfbSBram Moolenaar 		if (!HASHITEM_EMPTY(hi))
2084a021dfbSBram Moolenaar 		{
2094a021dfbSBram Moolenaar 		    item2 = dict_find(exp_d, hi->hi_key, -1);
2104a021dfbSBram Moolenaar 		    if (item2 == NULL)
2114a021dfbSBram Moolenaar 			// item of got_d not present in exp_d
2124a021dfbSBram Moolenaar 			dict_add_tv(got_tv->vval.v_dict,
2134a021dfbSBram Moolenaar 					(char *)hi->hi_key, &HI2DI(hi)->di_tv);
2144a021dfbSBram Moolenaar 		    --todo;
2154a021dfbSBram Moolenaar 		}
2164a021dfbSBram Moolenaar 	    }
2174a021dfbSBram Moolenaar 	}
2184a021dfbSBram Moolenaar 
219ecaa70eaSBram Moolenaar 	ga_concat_shorten_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0));
220ecaa70eaSBram Moolenaar 	vim_free(tofree);
221ecaa70eaSBram Moolenaar     }
222ecaa70eaSBram Moolenaar     else
223631e8f93SBram Moolenaar     {
224631e8f93SBram Moolenaar 	ga_concat(gap, (char_u *)"'");
225ecaa70eaSBram Moolenaar 	ga_concat_shorten_esc(gap, exp_str);
226631e8f93SBram Moolenaar 	ga_concat(gap, (char_u *)"'");
227631e8f93SBram Moolenaar     }
228ecaa70eaSBram Moolenaar     if (atype != ASSERT_NOTEQUAL)
229ecaa70eaSBram Moolenaar     {
230ecaa70eaSBram Moolenaar 	if (atype == ASSERT_MATCH)
231ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" does not match ");
232ecaa70eaSBram Moolenaar 	else if (atype == ASSERT_NOTMATCH)
233ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" does match ");
234ecaa70eaSBram Moolenaar 	else
235ecaa70eaSBram Moolenaar 	    ga_concat(gap, (char_u *)" but got ");
236ecaa70eaSBram Moolenaar 	ga_concat_shorten_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
237ecaa70eaSBram Moolenaar 	vim_free(tofree);
2384a021dfbSBram Moolenaar 
2394a021dfbSBram Moolenaar 	if (omitted != 0)
2404a021dfbSBram Moolenaar 	{
2414a021dfbSBram Moolenaar 	    char buf[100];
2424a021dfbSBram Moolenaar 
2434a021dfbSBram Moolenaar 	    vim_snprintf(buf, 100, " - %d equal item%s omitted",
2444a021dfbSBram Moolenaar 					     omitted, omitted == 1 ? "" : "s");
2454a021dfbSBram Moolenaar 	    ga_concat(gap, (char_u *)buf);
2464a021dfbSBram Moolenaar 	}
2474a021dfbSBram Moolenaar     }
2484a021dfbSBram Moolenaar 
2494a021dfbSBram Moolenaar     if (did_copy)
2504a021dfbSBram Moolenaar     {
2514a021dfbSBram Moolenaar 	clear_tv(exp_tv);
2524a021dfbSBram Moolenaar 	clear_tv(got_tv);
253ecaa70eaSBram Moolenaar     }
254ecaa70eaSBram Moolenaar }
255ecaa70eaSBram Moolenaar 
256ecaa70eaSBram Moolenaar     static int
assert_equal_common(typval_T * argvars,assert_type_T atype)257ecaa70eaSBram Moolenaar assert_equal_common(typval_T *argvars, assert_type_T atype)
258ecaa70eaSBram Moolenaar {
259ecaa70eaSBram Moolenaar     garray_T	ga;
260ecaa70eaSBram Moolenaar 
261ecaa70eaSBram Moolenaar     if (tv_equal(&argvars[0], &argvars[1], FALSE, FALSE)
262ecaa70eaSBram Moolenaar 						   != (atype == ASSERT_EQUAL))
263ecaa70eaSBram Moolenaar     {
264ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
265ecaa70eaSBram Moolenaar 	fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
266ecaa70eaSBram Moolenaar 								       atype);
267ecaa70eaSBram Moolenaar 	assert_error(&ga);
268ecaa70eaSBram Moolenaar 	ga_clear(&ga);
269ecaa70eaSBram Moolenaar 	return 1;
270ecaa70eaSBram Moolenaar     }
271ecaa70eaSBram Moolenaar     return 0;
272ecaa70eaSBram Moolenaar }
273ecaa70eaSBram Moolenaar 
274ecaa70eaSBram Moolenaar     static int
assert_match_common(typval_T * argvars,assert_type_T atype)275ecaa70eaSBram Moolenaar assert_match_common(typval_T *argvars, assert_type_T atype)
276ecaa70eaSBram Moolenaar {
277ecaa70eaSBram Moolenaar     garray_T	ga;
278ecaa70eaSBram Moolenaar     char_u	buf1[NUMBUFLEN];
279ecaa70eaSBram Moolenaar     char_u	buf2[NUMBUFLEN];
2807177da9dSBram Moolenaar     int		called_emsg_before = called_emsg;
281*4490ec4eSYegappan Lakshmanan     char_u	*pat;
282*4490ec4eSYegappan Lakshmanan     char_u	*text;
283ecaa70eaSBram Moolenaar 
284*4490ec4eSYegappan Lakshmanan     if (in_vim9script()
285*4490ec4eSYegappan Lakshmanan 	    && (check_for_string_arg(argvars, 0) == FAIL
286*4490ec4eSYegappan Lakshmanan 		|| check_for_string_arg(argvars, 1) == FAIL
287*4490ec4eSYegappan Lakshmanan 		|| check_for_opt_string_arg(argvars, 2) == FAIL))
288*4490ec4eSYegappan Lakshmanan 	return 1;
289*4490ec4eSYegappan Lakshmanan 
290*4490ec4eSYegappan Lakshmanan     pat = tv_get_string_buf_chk(&argvars[0], buf1);
291*4490ec4eSYegappan Lakshmanan     text = tv_get_string_buf_chk(&argvars[1], buf2);
2927177da9dSBram Moolenaar     if (called_emsg == called_emsg_before
2937177da9dSBram Moolenaar 		 && pattern_match(pat, text, FALSE) != (atype == ASSERT_MATCH))
294ecaa70eaSBram Moolenaar     {
295ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
296ecaa70eaSBram Moolenaar 	fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
297ecaa70eaSBram Moolenaar 									atype);
298ecaa70eaSBram Moolenaar 	assert_error(&ga);
299ecaa70eaSBram Moolenaar 	ga_clear(&ga);
300ecaa70eaSBram Moolenaar 	return 1;
301ecaa70eaSBram Moolenaar     }
302ecaa70eaSBram Moolenaar     return 0;
303ecaa70eaSBram Moolenaar }
304ecaa70eaSBram Moolenaar 
305ecaa70eaSBram Moolenaar /*
306ecaa70eaSBram Moolenaar  * Common for assert_true() and assert_false().
307ecaa70eaSBram Moolenaar  * Return non-zero for failure.
308ecaa70eaSBram Moolenaar  */
309ecaa70eaSBram Moolenaar     static int
assert_bool(typval_T * argvars,int isTrue)310ecaa70eaSBram Moolenaar assert_bool(typval_T *argvars, int isTrue)
311ecaa70eaSBram Moolenaar {
312ecaa70eaSBram Moolenaar     int		error = FALSE;
313ecaa70eaSBram Moolenaar     garray_T	ga;
314ecaa70eaSBram Moolenaar 
3159b4a15d5SBram Moolenaar     if (argvars[0].v_type == VAR_BOOL
316ecaa70eaSBram Moolenaar 	    && argvars[0].vval.v_number == (isTrue ? VVAL_TRUE : VVAL_FALSE))
317ecaa70eaSBram Moolenaar 	return 0;
318ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_NUMBER
319ecaa70eaSBram Moolenaar 	    || (tv_get_number_chk(&argvars[0], &error) == 0) == isTrue
320ecaa70eaSBram Moolenaar 	    || error)
321ecaa70eaSBram Moolenaar     {
322ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
323ecaa70eaSBram Moolenaar 	fill_assert_error(&ga, &argvars[1],
324ecaa70eaSBram Moolenaar 		(char_u *)(isTrue ? "True" : "False"),
325ecaa70eaSBram Moolenaar 		NULL, &argvars[0], ASSERT_OTHER);
326ecaa70eaSBram Moolenaar 	assert_error(&ga);
327ecaa70eaSBram Moolenaar 	ga_clear(&ga);
328ecaa70eaSBram Moolenaar 	return 1;
329ecaa70eaSBram Moolenaar     }
330ecaa70eaSBram Moolenaar     return 0;
331ecaa70eaSBram Moolenaar }
332ecaa70eaSBram Moolenaar 
333ecaa70eaSBram Moolenaar     static void
assert_append_cmd_or_arg(garray_T * gap,typval_T * argvars,char_u * cmd)334ecaa70eaSBram Moolenaar assert_append_cmd_or_arg(garray_T *gap, typval_T *argvars, char_u *cmd)
335ecaa70eaSBram Moolenaar {
336ecaa70eaSBram Moolenaar     char_u	*tofree;
337ecaa70eaSBram Moolenaar     char_u	numbuf[NUMBUFLEN];
338ecaa70eaSBram Moolenaar 
339ecaa70eaSBram Moolenaar     if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
340ecaa70eaSBram Moolenaar     {
341ecaa70eaSBram Moolenaar 	ga_concat(gap, echo_string(&argvars[2], &tofree, numbuf, 0));
342ecaa70eaSBram Moolenaar 	vim_free(tofree);
343ecaa70eaSBram Moolenaar     }
344ecaa70eaSBram Moolenaar     else
345ecaa70eaSBram Moolenaar 	ga_concat(gap, cmd);
346ecaa70eaSBram Moolenaar }
347ecaa70eaSBram Moolenaar 
348ecaa70eaSBram Moolenaar     static int
assert_beeps(typval_T * argvars,int no_beep)3495b8cabfeSBram Moolenaar assert_beeps(typval_T *argvars, int no_beep)
350ecaa70eaSBram Moolenaar {
3511a71d31bSYegappan Lakshmanan     char_u	*cmd;
352ecaa70eaSBram Moolenaar     garray_T	ga;
353ecaa70eaSBram Moolenaar     int		ret = 0;
354ecaa70eaSBram Moolenaar 
3551a71d31bSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
3561a71d31bSYegappan Lakshmanan 	return 0;
3571a71d31bSYegappan Lakshmanan 
3581a71d31bSYegappan Lakshmanan     cmd = tv_get_string_chk(&argvars[0]);
359ecaa70eaSBram Moolenaar     called_vim_beep = FALSE;
360ecaa70eaSBram Moolenaar     suppress_errthrow = TRUE;
361ecaa70eaSBram Moolenaar     emsg_silent = FALSE;
362ecaa70eaSBram Moolenaar     do_cmdline_cmd(cmd);
3635b8cabfeSBram Moolenaar     if (no_beep ? called_vim_beep : !called_vim_beep)
364ecaa70eaSBram Moolenaar     {
365ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
3665b8cabfeSBram Moolenaar 	if (no_beep)
3675b8cabfeSBram Moolenaar 	    ga_concat(&ga, (char_u *)"command did beep: ");
3685b8cabfeSBram Moolenaar 	else
369ecaa70eaSBram Moolenaar 	    ga_concat(&ga, (char_u *)"command did not beep: ");
370ecaa70eaSBram Moolenaar 	ga_concat(&ga, cmd);
371ecaa70eaSBram Moolenaar 	assert_error(&ga);
372ecaa70eaSBram Moolenaar 	ga_clear(&ga);
373ecaa70eaSBram Moolenaar 	ret = 1;
374ecaa70eaSBram Moolenaar     }
375ecaa70eaSBram Moolenaar 
376ecaa70eaSBram Moolenaar     suppress_errthrow = FALSE;
377ecaa70eaSBram Moolenaar     emsg_on_display = FALSE;
378ecaa70eaSBram Moolenaar     return ret;
379ecaa70eaSBram Moolenaar }
380ecaa70eaSBram Moolenaar 
381ecaa70eaSBram Moolenaar /*
3821a71d31bSYegappan Lakshmanan  * "assert_beeps(cmd)" function
383ecaa70eaSBram Moolenaar  */
384ecaa70eaSBram Moolenaar     void
f_assert_beeps(typval_T * argvars,typval_T * rettv)385ecaa70eaSBram Moolenaar f_assert_beeps(typval_T *argvars, typval_T *rettv)
386ecaa70eaSBram Moolenaar {
387*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
388*4490ec4eSYegappan Lakshmanan 	return;
389*4490ec4eSYegappan Lakshmanan 
3905b8cabfeSBram Moolenaar     rettv->vval.v_number = assert_beeps(argvars, FALSE);
3915b8cabfeSBram Moolenaar }
3925b8cabfeSBram Moolenaar 
3935b8cabfeSBram Moolenaar /*
3941a71d31bSYegappan Lakshmanan  * "assert_nobeep(cmd)" function
3955b8cabfeSBram Moolenaar  */
3965b8cabfeSBram Moolenaar     void
f_assert_nobeep(typval_T * argvars,typval_T * rettv)3975b8cabfeSBram Moolenaar f_assert_nobeep(typval_T *argvars, typval_T *rettv)
3985b8cabfeSBram Moolenaar {
399*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
400*4490ec4eSYegappan Lakshmanan 	return;
401*4490ec4eSYegappan Lakshmanan 
4025b8cabfeSBram Moolenaar     rettv->vval.v_number = assert_beeps(argvars, TRUE);
403ecaa70eaSBram Moolenaar }
404ecaa70eaSBram Moolenaar 
405ecaa70eaSBram Moolenaar /*
406ecaa70eaSBram Moolenaar  * "assert_equal(expected, actual[, msg])" function
407ecaa70eaSBram Moolenaar  */
408ecaa70eaSBram Moolenaar     void
f_assert_equal(typval_T * argvars,typval_T * rettv)409ecaa70eaSBram Moolenaar f_assert_equal(typval_T *argvars, typval_T *rettv)
410ecaa70eaSBram Moolenaar {
411ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_equal_common(argvars, ASSERT_EQUAL);
412ecaa70eaSBram Moolenaar }
413ecaa70eaSBram Moolenaar 
414ecaa70eaSBram Moolenaar     static int
assert_equalfile(typval_T * argvars)415ecaa70eaSBram Moolenaar assert_equalfile(typval_T *argvars)
416ecaa70eaSBram Moolenaar {
417ecaa70eaSBram Moolenaar     char_u	buf1[NUMBUFLEN];
418ecaa70eaSBram Moolenaar     char_u	buf2[NUMBUFLEN];
4197177da9dSBram Moolenaar     int		called_emsg_before = called_emsg;
420ecaa70eaSBram Moolenaar     char_u	*fname1 = tv_get_string_buf_chk(&argvars[0], buf1);
421ecaa70eaSBram Moolenaar     char_u	*fname2 = tv_get_string_buf_chk(&argvars[1], buf2);
422ecaa70eaSBram Moolenaar     garray_T	ga;
423ecaa70eaSBram Moolenaar     FILE	*fd1;
424ecaa70eaSBram Moolenaar     FILE	*fd2;
42530cc44a9SBram Moolenaar     char	line1[200];
42630cc44a9SBram Moolenaar     char	line2[200];
42730cc44a9SBram Moolenaar     int		lineidx = 0;
428ecaa70eaSBram Moolenaar 
4297177da9dSBram Moolenaar     if (called_emsg > called_emsg_before)
430ecaa70eaSBram Moolenaar 	return 0;
431ecaa70eaSBram Moolenaar 
432ecaa70eaSBram Moolenaar     IObuff[0] = NUL;
433ecaa70eaSBram Moolenaar     fd1 = mch_fopen((char *)fname1, READBIN);
434ecaa70eaSBram Moolenaar     if (fd1 == NULL)
435ecaa70eaSBram Moolenaar     {
436ecaa70eaSBram Moolenaar 	vim_snprintf((char *)IObuff, IOSIZE, (char *)e_notread, fname1);
437ecaa70eaSBram Moolenaar     }
438ecaa70eaSBram Moolenaar     else
439ecaa70eaSBram Moolenaar     {
440ecaa70eaSBram Moolenaar 	fd2 = mch_fopen((char *)fname2, READBIN);
441ecaa70eaSBram Moolenaar 	if (fd2 == NULL)
442ecaa70eaSBram Moolenaar 	{
443ecaa70eaSBram Moolenaar 	    fclose(fd1);
444ecaa70eaSBram Moolenaar 	    vim_snprintf((char *)IObuff, IOSIZE, (char *)e_notread, fname2);
445ecaa70eaSBram Moolenaar 	}
446ecaa70eaSBram Moolenaar 	else
447ecaa70eaSBram Moolenaar 	{
448ecaa70eaSBram Moolenaar 	    int	    c1, c2;
449ecaa70eaSBram Moolenaar 	    long    count = 0;
45030cc44a9SBram Moolenaar 	    long    linecount = 1;
451ecaa70eaSBram Moolenaar 
452ecaa70eaSBram Moolenaar 	    for (;;)
453ecaa70eaSBram Moolenaar 	    {
454ecaa70eaSBram Moolenaar 		c1 = fgetc(fd1);
455ecaa70eaSBram Moolenaar 		c2 = fgetc(fd2);
456ecaa70eaSBram Moolenaar 		if (c1 == EOF)
457ecaa70eaSBram Moolenaar 		{
458ecaa70eaSBram Moolenaar 		    if (c2 != EOF)
459ecaa70eaSBram Moolenaar 			STRCPY(IObuff, "first file is shorter");
460ecaa70eaSBram Moolenaar 		    break;
461ecaa70eaSBram Moolenaar 		}
462ecaa70eaSBram Moolenaar 		else if (c2 == EOF)
463ecaa70eaSBram Moolenaar 		{
464ecaa70eaSBram Moolenaar 		    STRCPY(IObuff, "second file is shorter");
465ecaa70eaSBram Moolenaar 		    break;
466ecaa70eaSBram Moolenaar 		}
46730cc44a9SBram Moolenaar 		else
46830cc44a9SBram Moolenaar 		{
46930cc44a9SBram Moolenaar 		    line1[lineidx] = c1;
47030cc44a9SBram Moolenaar 		    line2[lineidx] = c2;
47130cc44a9SBram Moolenaar 		    ++lineidx;
47230cc44a9SBram Moolenaar 		    if (c1 != c2)
473ecaa70eaSBram Moolenaar 		    {
474ecaa70eaSBram Moolenaar 			vim_snprintf((char *)IObuff, IOSIZE,
47530cc44a9SBram Moolenaar 					    "difference at byte %ld, line %ld",
47630cc44a9SBram Moolenaar 							     count, linecount);
477ecaa70eaSBram Moolenaar 			break;
478ecaa70eaSBram Moolenaar 		    }
47930cc44a9SBram Moolenaar 		}
480ecaa70eaSBram Moolenaar 		++count;
48130cc44a9SBram Moolenaar 		if (c1 == NL)
48230cc44a9SBram Moolenaar 		{
48330cc44a9SBram Moolenaar 		    ++linecount;
48430cc44a9SBram Moolenaar 		    lineidx = 0;
48530cc44a9SBram Moolenaar 		}
48630cc44a9SBram Moolenaar 		else if (lineidx + 2 == (int)sizeof(line1))
48730cc44a9SBram Moolenaar 		{
48830cc44a9SBram Moolenaar 		    mch_memmove(line1, line1 + 100, lineidx - 100);
48930cc44a9SBram Moolenaar 		    mch_memmove(line2, line2 + 100, lineidx - 100);
49030cc44a9SBram Moolenaar 		    lineidx -= 100;
49130cc44a9SBram Moolenaar 		}
492ecaa70eaSBram Moolenaar 	    }
493ecaa70eaSBram Moolenaar 	    fclose(fd1);
494ecaa70eaSBram Moolenaar 	    fclose(fd2);
495ecaa70eaSBram Moolenaar 	}
496ecaa70eaSBram Moolenaar     }
497ecaa70eaSBram Moolenaar     if (IObuff[0] != NUL)
498ecaa70eaSBram Moolenaar     {
499ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
500fb517bacSBram Moolenaar 	if (argvars[2].v_type != VAR_UNKNOWN)
501fb517bacSBram Moolenaar 	{
502fb517bacSBram Moolenaar 	    char_u	numbuf[NUMBUFLEN];
503fb517bacSBram Moolenaar 	    char_u	*tofree;
504fb517bacSBram Moolenaar 
505fb517bacSBram Moolenaar 	    ga_concat(&ga, echo_string(&argvars[2], &tofree, numbuf, 0));
506fb517bacSBram Moolenaar 	    vim_free(tofree);
507fb517bacSBram Moolenaar 	    ga_concat(&ga, (char_u *)": ");
508fb517bacSBram Moolenaar 	}
509ecaa70eaSBram Moolenaar 	ga_concat(&ga, IObuff);
51030cc44a9SBram Moolenaar 	if (lineidx > 0)
51130cc44a9SBram Moolenaar 	{
51230cc44a9SBram Moolenaar 	    line1[lineidx] = NUL;
51330cc44a9SBram Moolenaar 	    line2[lineidx] = NUL;
51430cc44a9SBram Moolenaar 	    ga_concat(&ga, (char_u *)" after \"");
51530cc44a9SBram Moolenaar 	    ga_concat(&ga, (char_u *)line1);
51630cc44a9SBram Moolenaar 	    if (STRCMP(line1, line2) != 0)
51730cc44a9SBram Moolenaar 	    {
51830cc44a9SBram Moolenaar 		ga_concat(&ga, (char_u *)"\" vs \"");
51930cc44a9SBram Moolenaar 		ga_concat(&ga, (char_u *)line2);
52030cc44a9SBram Moolenaar 	    }
52130cc44a9SBram Moolenaar 	    ga_concat(&ga, (char_u *)"\"");
52230cc44a9SBram Moolenaar 	}
523ecaa70eaSBram Moolenaar 	assert_error(&ga);
524ecaa70eaSBram Moolenaar 	ga_clear(&ga);
525ecaa70eaSBram Moolenaar 	return 1;
526ecaa70eaSBram Moolenaar     }
527ecaa70eaSBram Moolenaar     return 0;
528ecaa70eaSBram Moolenaar }
529ecaa70eaSBram Moolenaar 
530ecaa70eaSBram Moolenaar /*
531fb517bacSBram Moolenaar  * "assert_equalfile(fname-one, fname-two[, msg])" function
532ecaa70eaSBram Moolenaar  */
533ecaa70eaSBram Moolenaar     void
f_assert_equalfile(typval_T * argvars,typval_T * rettv)534ecaa70eaSBram Moolenaar f_assert_equalfile(typval_T *argvars, typval_T *rettv)
535ecaa70eaSBram Moolenaar {
536*4490ec4eSYegappan Lakshmanan     if (in_vim9script()
537*4490ec4eSYegappan Lakshmanan 	    && (check_for_string_arg(argvars, 0) == FAIL
538*4490ec4eSYegappan Lakshmanan 		|| check_for_string_arg(argvars, 1) == FAIL
539*4490ec4eSYegappan Lakshmanan 		|| check_for_opt_string_arg(argvars, 2) == FAIL))
540*4490ec4eSYegappan Lakshmanan 	return;
541*4490ec4eSYegappan Lakshmanan 
542ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_equalfile(argvars);
543ecaa70eaSBram Moolenaar }
544ecaa70eaSBram Moolenaar 
545ecaa70eaSBram Moolenaar /*
546ecaa70eaSBram Moolenaar  * "assert_notequal(expected, actual[, msg])" function
547ecaa70eaSBram Moolenaar  */
548ecaa70eaSBram Moolenaar     void
f_assert_notequal(typval_T * argvars,typval_T * rettv)549ecaa70eaSBram Moolenaar f_assert_notequal(typval_T *argvars, typval_T *rettv)
550ecaa70eaSBram Moolenaar {
551ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_equal_common(argvars, ASSERT_NOTEQUAL);
552ecaa70eaSBram Moolenaar }
553ecaa70eaSBram Moolenaar 
554ecaa70eaSBram Moolenaar /*
555ecaa70eaSBram Moolenaar  * "assert_exception(string[, msg])" function
556ecaa70eaSBram Moolenaar  */
557ecaa70eaSBram Moolenaar     void
f_assert_exception(typval_T * argvars,typval_T * rettv)558ecaa70eaSBram Moolenaar f_assert_exception(typval_T *argvars, typval_T *rettv)
559ecaa70eaSBram Moolenaar {
560ecaa70eaSBram Moolenaar     garray_T	ga;
561*4490ec4eSYegappan Lakshmanan     char_u	*error;
562ecaa70eaSBram Moolenaar 
563*4490ec4eSYegappan Lakshmanan     if (in_vim9script()
564*4490ec4eSYegappan Lakshmanan 	    && (check_for_string_arg(argvars, 0) == FAIL
565*4490ec4eSYegappan Lakshmanan 		|| check_for_opt_string_arg(argvars, 1) == FAIL))
566*4490ec4eSYegappan Lakshmanan 	return;
567*4490ec4eSYegappan Lakshmanan 
568*4490ec4eSYegappan Lakshmanan     error = tv_get_string_chk(&argvars[0]);
569ecaa70eaSBram Moolenaar     if (*get_vim_var_str(VV_EXCEPTION) == NUL)
570ecaa70eaSBram Moolenaar     {
571ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
572ecaa70eaSBram Moolenaar 	ga_concat(&ga, (char_u *)"v:exception is not set");
573ecaa70eaSBram Moolenaar 	assert_error(&ga);
574ecaa70eaSBram Moolenaar 	ga_clear(&ga);
575ecaa70eaSBram Moolenaar 	rettv->vval.v_number = 1;
576ecaa70eaSBram Moolenaar     }
577ecaa70eaSBram Moolenaar     else if (error != NULL
578ecaa70eaSBram Moolenaar 	&& strstr((char *)get_vim_var_str(VV_EXCEPTION), (char *)error) == NULL)
579ecaa70eaSBram Moolenaar     {
580ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
581ecaa70eaSBram Moolenaar 	fill_assert_error(&ga, &argvars[1], NULL, &argvars[0],
582ecaa70eaSBram Moolenaar 				  get_vim_var_tv(VV_EXCEPTION), ASSERT_OTHER);
583ecaa70eaSBram Moolenaar 	assert_error(&ga);
584ecaa70eaSBram Moolenaar 	ga_clear(&ga);
585ecaa70eaSBram Moolenaar 	rettv->vval.v_number = 1;
586ecaa70eaSBram Moolenaar     }
587ecaa70eaSBram Moolenaar }
588ecaa70eaSBram Moolenaar 
589ecaa70eaSBram Moolenaar /*
590ecaa70eaSBram Moolenaar  * "assert_fails(cmd [, error[, msg]])" function
591ecaa70eaSBram Moolenaar  */
592ecaa70eaSBram Moolenaar     void
f_assert_fails(typval_T * argvars,typval_T * rettv)593ecaa70eaSBram Moolenaar f_assert_fails(typval_T *argvars, typval_T *rettv)
594ecaa70eaSBram Moolenaar {
595a764e73dSYegappan Lakshmanan     char_u	*cmd;
596ecaa70eaSBram Moolenaar     garray_T	ga;
597ecaa70eaSBram Moolenaar     int		save_trylevel = trylevel;
59853989554SBram Moolenaar     int		called_emsg_before = called_emsg;
59944d6652dSBram Moolenaar     char	*wrong_arg_msg = NULL;
600ecaa70eaSBram Moolenaar 
601a764e73dSYegappan Lakshmanan     if (check_for_string_or_number_arg(argvars, 0) == FAIL
602a764e73dSYegappan Lakshmanan 	    || check_for_opt_string_or_list_arg(argvars, 1) == FAIL
603a764e73dSYegappan Lakshmanan 	    || (argvars[1].v_type != VAR_UNKNOWN
604a764e73dSYegappan Lakshmanan 		&& (argvars[2].v_type != VAR_UNKNOWN
605a764e73dSYegappan Lakshmanan 		    && (check_for_opt_number_arg(argvars, 3) == FAIL
606a764e73dSYegappan Lakshmanan 			|| (argvars[3].v_type != VAR_UNKNOWN
607a764e73dSYegappan Lakshmanan 			    && check_for_opt_string_arg(argvars, 4) == FAIL)))))
608a764e73dSYegappan Lakshmanan 	return;
609a764e73dSYegappan Lakshmanan 
610a764e73dSYegappan Lakshmanan     cmd = tv_get_string_chk(&argvars[0]);
611a764e73dSYegappan Lakshmanan 
612ecaa70eaSBram Moolenaar     // trylevel must be zero for a ":throw" command to be considered failed
613ecaa70eaSBram Moolenaar     trylevel = 0;
614ecaa70eaSBram Moolenaar     suppress_errthrow = TRUE;
61528ee892aSBram Moolenaar     in_assert_fails = TRUE;
616ecaa70eaSBram Moolenaar 
617ecaa70eaSBram Moolenaar     do_cmdline_cmd(cmd);
61853989554SBram Moolenaar     if (called_emsg == called_emsg_before)
619ecaa70eaSBram Moolenaar     {
620ecaa70eaSBram Moolenaar 	prepare_assert_error(&ga);
621ecaa70eaSBram Moolenaar 	ga_concat(&ga, (char_u *)"command did not fail: ");
622ecaa70eaSBram Moolenaar 	assert_append_cmd_or_arg(&ga, argvars, cmd);
623ecaa70eaSBram Moolenaar 	assert_error(&ga);
624ecaa70eaSBram Moolenaar 	ga_clear(&ga);
625ecaa70eaSBram Moolenaar 	rettv->vval.v_number = 1;
626ecaa70eaSBram Moolenaar     }
627ecaa70eaSBram Moolenaar     else if (argvars[1].v_type != VAR_UNKNOWN)
628ecaa70eaSBram Moolenaar     {
629ecaa70eaSBram Moolenaar 	char_u	buf[NUMBUFLEN];
6309b7bf9e9SBram Moolenaar 	char_u	*expected;
631631e8f93SBram Moolenaar 	char_u	*expected_str = NULL;
6329b7bf9e9SBram Moolenaar 	int	error_found = FALSE;
6339bd5d879SBram Moolenaar 	int	error_found_index = 1;
6349b7bf9e9SBram Moolenaar 	char_u	*actual = emsg_assert_fails_msg == NULL ? (char_u *)"[unknown]"
6359b7bf9e9SBram Moolenaar 						       : emsg_assert_fails_msg;
636ecaa70eaSBram Moolenaar 
6379b7bf9e9SBram Moolenaar 	if (argvars[1].v_type == VAR_STRING)
638ecaa70eaSBram Moolenaar 	{
6399b7bf9e9SBram Moolenaar 	    expected = tv_get_string_buf_chk(&argvars[1], buf);
6409b7bf9e9SBram Moolenaar 	    error_found = expected == NULL
6419b7bf9e9SBram Moolenaar 			   || strstr((char *)actual, (char *)expected) == NULL;
6429b7bf9e9SBram Moolenaar 	}
6439b7bf9e9SBram Moolenaar 	else if (argvars[1].v_type == VAR_LIST)
6449b7bf9e9SBram Moolenaar 	{
6459b7bf9e9SBram Moolenaar 	    list_T	*list = argvars[1].vval.v_list;
6469b7bf9e9SBram Moolenaar 	    typval_T	*tv;
6479b7bf9e9SBram Moolenaar 
6489b7bf9e9SBram Moolenaar 	    if (list == NULL || list->lv_len < 1 || list->lv_len > 2)
6499b7bf9e9SBram Moolenaar 	    {
65044d6652dSBram Moolenaar 		wrong_arg_msg = e_assert_fails_second_arg;
6519b7bf9e9SBram Moolenaar 		goto theend;
6529b7bf9e9SBram Moolenaar 	    }
6539b7bf9e9SBram Moolenaar 	    CHECK_LIST_MATERIALIZE(list);
6549b7bf9e9SBram Moolenaar 	    tv = &list->lv_first->li_tv;
6559b7bf9e9SBram Moolenaar 	    expected = tv_get_string_buf_chk(tv, buf);
6569b7bf9e9SBram Moolenaar 	    if (!pattern_match(expected, actual, FALSE))
6579b7bf9e9SBram Moolenaar 	    {
6589b7bf9e9SBram Moolenaar 		error_found = TRUE;
659631e8f93SBram Moolenaar 		expected_str = expected;
6609b7bf9e9SBram Moolenaar 	    }
6619b7bf9e9SBram Moolenaar 	    else if (list->lv_len == 2)
6629b7bf9e9SBram Moolenaar 	    {
6639b7bf9e9SBram Moolenaar 		tv = &list->lv_u.mat.lv_last->li_tv;
6649b7bf9e9SBram Moolenaar 		actual = get_vim_var_str(VV_ERRMSG);
6659b7bf9e9SBram Moolenaar 		expected = tv_get_string_buf_chk(tv, buf);
6669b7bf9e9SBram Moolenaar 		if (!pattern_match(expected, actual, FALSE))
667631e8f93SBram Moolenaar 		{
6689b7bf9e9SBram Moolenaar 		    error_found = TRUE;
669631e8f93SBram Moolenaar 		    expected_str = expected;
670631e8f93SBram Moolenaar 		}
6719b7bf9e9SBram Moolenaar 	    }
6729b7bf9e9SBram Moolenaar 	}
6739b7bf9e9SBram Moolenaar 	else
6749b7bf9e9SBram Moolenaar 	{
67544d6652dSBram Moolenaar 	    wrong_arg_msg = e_assert_fails_second_arg;
6769b7bf9e9SBram Moolenaar 	    goto theend;
6779b7bf9e9SBram Moolenaar 	}
6789b7bf9e9SBram Moolenaar 
6799b02d64cSBram Moolenaar 	if (!error_found && argvars[2].v_type != VAR_UNKNOWN
68044d6652dSBram Moolenaar 		&& argvars[3].v_type != VAR_UNKNOWN)
6819bd5d879SBram Moolenaar 	{
68244d6652dSBram Moolenaar 	    if (argvars[3].v_type != VAR_NUMBER)
68344d6652dSBram Moolenaar 	    {
68444d6652dSBram Moolenaar 		wrong_arg_msg = e_assert_fails_fourth_argument;
68544d6652dSBram Moolenaar 		goto theend;
68644d6652dSBram Moolenaar 	    }
68744d6652dSBram Moolenaar 	    else if (argvars[3].vval.v_number >= 0
6881d634542SBram Moolenaar 			 && argvars[3].vval.v_number != emsg_assert_fails_lnum)
6891d634542SBram Moolenaar 	    {
6901d634542SBram Moolenaar 		error_found = TRUE;
6919bd5d879SBram Moolenaar 		error_found_index = 3;
6929bd5d879SBram Moolenaar 	    }
69344d6652dSBram Moolenaar 	    if (!error_found && argvars[4].v_type != VAR_UNKNOWN)
69444d6652dSBram Moolenaar 	    {
69544d6652dSBram Moolenaar 		if (argvars[4].v_type != VAR_STRING)
69644d6652dSBram Moolenaar 		{
69744d6652dSBram Moolenaar 		    wrong_arg_msg = e_assert_fails_fifth_argument;
69844d6652dSBram Moolenaar 		    goto theend;
69944d6652dSBram Moolenaar 		}
70044d6652dSBram Moolenaar 		else if (argvars[4].vval.v_string != NULL
7019bd5d879SBram Moolenaar 		    && !pattern_match(argvars[4].vval.v_string,
7029bd5d879SBram Moolenaar 					     emsg_assert_fails_context, FALSE))
7039bd5d879SBram Moolenaar 		{
7049bd5d879SBram Moolenaar 		    error_found = TRUE;
7059bd5d879SBram Moolenaar 		    error_found_index = 4;
7069bd5d879SBram Moolenaar 		}
7071d634542SBram Moolenaar 	    }
70844d6652dSBram Moolenaar 	}
7091d634542SBram Moolenaar 
7109b7bf9e9SBram Moolenaar 	if (error_found)
7119b7bf9e9SBram Moolenaar 	{
7129b7bf9e9SBram Moolenaar 	    typval_T actual_tv;
7139b7bf9e9SBram Moolenaar 
714ecaa70eaSBram Moolenaar 	    prepare_assert_error(&ga);
7159bd5d879SBram Moolenaar 	    if (error_found_index == 3)
7161d634542SBram Moolenaar 	    {
7171d634542SBram Moolenaar 		actual_tv.v_type = VAR_NUMBER;
7181d634542SBram Moolenaar 		actual_tv.vval.v_number = emsg_assert_fails_lnum;
7191d634542SBram Moolenaar 	    }
7209bd5d879SBram Moolenaar 	    else if (error_found_index == 4)
7219bd5d879SBram Moolenaar 	    {
7229bd5d879SBram Moolenaar 		actual_tv.v_type = VAR_STRING;
7239bd5d879SBram Moolenaar 		actual_tv.vval.v_string = emsg_assert_fails_context;
7249bd5d879SBram Moolenaar 	    }
7251d634542SBram Moolenaar 	    else
7261d634542SBram Moolenaar 	    {
7279b7bf9e9SBram Moolenaar 		actual_tv.v_type = VAR_STRING;
7289b7bf9e9SBram Moolenaar 		actual_tv.vval.v_string = actual;
7291d634542SBram Moolenaar 	    }
730631e8f93SBram Moolenaar 	    fill_assert_error(&ga, &argvars[2], expected_str,
7319bd5d879SBram Moolenaar 			&argvars[error_found_index], &actual_tv, ASSERT_OTHER);
732ecaa70eaSBram Moolenaar 	    ga_concat(&ga, (char_u *)": ");
733ecaa70eaSBram Moolenaar 	    assert_append_cmd_or_arg(&ga, argvars, cmd);
734ecaa70eaSBram Moolenaar 	    assert_error(&ga);
735ecaa70eaSBram Moolenaar 	    ga_clear(&ga);
736ecaa70eaSBram Moolenaar 	    rettv->vval.v_number = 1;
737ecaa70eaSBram Moolenaar 	}
738ecaa70eaSBram Moolenaar     }
739ecaa70eaSBram Moolenaar 
7409b7bf9e9SBram Moolenaar theend:
741ecaa70eaSBram Moolenaar     trylevel = save_trylevel;
742ecaa70eaSBram Moolenaar     suppress_errthrow = FALSE;
74328ee892aSBram Moolenaar     in_assert_fails = FALSE;
74428ee892aSBram Moolenaar     did_emsg = FALSE;
74528ee892aSBram Moolenaar     msg_col = 0;
74628ee892aSBram Moolenaar     need_wait_return = FALSE;
747ecaa70eaSBram Moolenaar     emsg_on_display = FALSE;
74828ee892aSBram Moolenaar     msg_scrolled = 0;
74928ee892aSBram Moolenaar     lines_left = Rows;
7509b7bf9e9SBram Moolenaar     VIM_CLEAR(emsg_assert_fails_msg);
751ecaa70eaSBram Moolenaar     set_vim_var_string(VV_ERRMSG, NULL, 0);
75244d6652dSBram Moolenaar     if (wrong_arg_msg != NULL)
75344d6652dSBram Moolenaar 	emsg(_(wrong_arg_msg));
754ecaa70eaSBram Moolenaar }
755ecaa70eaSBram Moolenaar 
756ecaa70eaSBram Moolenaar /*
757ecaa70eaSBram Moolenaar  * "assert_false(actual[, msg])" function
758ecaa70eaSBram Moolenaar  */
759ecaa70eaSBram Moolenaar     void
f_assert_false(typval_T * argvars,typval_T * rettv)760ecaa70eaSBram Moolenaar f_assert_false(typval_T *argvars, typval_T *rettv)
761ecaa70eaSBram Moolenaar {
762ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_bool(argvars, FALSE);
763ecaa70eaSBram Moolenaar }
764ecaa70eaSBram Moolenaar 
765ecaa70eaSBram Moolenaar     static int
assert_inrange(typval_T * argvars)766ecaa70eaSBram Moolenaar assert_inrange(typval_T *argvars)
767ecaa70eaSBram Moolenaar {
768ecaa70eaSBram Moolenaar     garray_T	ga;
769ecaa70eaSBram Moolenaar     int		error = FALSE;
770ecaa70eaSBram Moolenaar     char_u	*tofree;
771ecaa70eaSBram Moolenaar     char	msg[200];
772ecaa70eaSBram Moolenaar     char_u	numbuf[NUMBUFLEN];
773ecaa70eaSBram Moolenaar 
774ecaa70eaSBram Moolenaar #ifdef FEAT_FLOAT
775ecaa70eaSBram Moolenaar     if (argvars[0].v_type == VAR_FLOAT
776ecaa70eaSBram Moolenaar 	    || argvars[1].v_type == VAR_FLOAT
777ecaa70eaSBram Moolenaar 	    || argvars[2].v_type == VAR_FLOAT)
778ecaa70eaSBram Moolenaar     {
779ecaa70eaSBram Moolenaar 	float_T flower = tv_get_float(&argvars[0]);
780ecaa70eaSBram Moolenaar 	float_T fupper = tv_get_float(&argvars[1]);
781ecaa70eaSBram Moolenaar 	float_T factual = tv_get_float(&argvars[2]);
782ecaa70eaSBram Moolenaar 
783ecaa70eaSBram Moolenaar 	if (factual < flower || factual > fupper)
784ecaa70eaSBram Moolenaar 	{
785ecaa70eaSBram Moolenaar 	    prepare_assert_error(&ga);
786ecaa70eaSBram Moolenaar 	    if (argvars[3].v_type != VAR_UNKNOWN)
787ecaa70eaSBram Moolenaar 	    {
788ecaa70eaSBram Moolenaar 		ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0));
789ecaa70eaSBram Moolenaar 		vim_free(tofree);
790ecaa70eaSBram Moolenaar 	    }
791ecaa70eaSBram Moolenaar 	    else
792ecaa70eaSBram Moolenaar 	    {
793ecaa70eaSBram Moolenaar 		vim_snprintf(msg, 200, "Expected range %g - %g, but got %g",
794ecaa70eaSBram Moolenaar 						      flower, fupper, factual);
795ecaa70eaSBram Moolenaar 		ga_concat(&ga, (char_u *)msg);
796ecaa70eaSBram Moolenaar 	    }
797ecaa70eaSBram Moolenaar 	    assert_error(&ga);
798ecaa70eaSBram Moolenaar 	    ga_clear(&ga);
799ecaa70eaSBram Moolenaar 	    return 1;
800ecaa70eaSBram Moolenaar 	}
801ecaa70eaSBram Moolenaar     }
802ecaa70eaSBram Moolenaar     else
803ecaa70eaSBram Moolenaar #endif
804ecaa70eaSBram Moolenaar     {
805ecaa70eaSBram Moolenaar 	varnumber_T	lower = tv_get_number_chk(&argvars[0], &error);
806ecaa70eaSBram Moolenaar 	varnumber_T	upper = tv_get_number_chk(&argvars[1], &error);
807ecaa70eaSBram Moolenaar 	varnumber_T	actual = tv_get_number_chk(&argvars[2], &error);
808ecaa70eaSBram Moolenaar 
809ecaa70eaSBram Moolenaar 	if (error)
810ecaa70eaSBram Moolenaar 	    return 0;
811ecaa70eaSBram Moolenaar 	if (actual < lower || actual > upper)
812ecaa70eaSBram Moolenaar 	{
813ecaa70eaSBram Moolenaar 	    prepare_assert_error(&ga);
814ecaa70eaSBram Moolenaar 	    if (argvars[3].v_type != VAR_UNKNOWN)
815ecaa70eaSBram Moolenaar 	    {
816ecaa70eaSBram Moolenaar 		ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0));
817ecaa70eaSBram Moolenaar 		vim_free(tofree);
818ecaa70eaSBram Moolenaar 	    }
819ecaa70eaSBram Moolenaar 	    else
820ecaa70eaSBram Moolenaar 	    {
821ecaa70eaSBram Moolenaar 		vim_snprintf(msg, 200, "Expected range %ld - %ld, but got %ld",
822ecaa70eaSBram Moolenaar 				       (long)lower, (long)upper, (long)actual);
823ecaa70eaSBram Moolenaar 		ga_concat(&ga, (char_u *)msg);
824ecaa70eaSBram Moolenaar 	    }
825ecaa70eaSBram Moolenaar 	    assert_error(&ga);
826ecaa70eaSBram Moolenaar 	    ga_clear(&ga);
827ecaa70eaSBram Moolenaar 	    return 1;
828ecaa70eaSBram Moolenaar 	}
829ecaa70eaSBram Moolenaar     }
830ecaa70eaSBram Moolenaar     return 0;
831ecaa70eaSBram Moolenaar }
832ecaa70eaSBram Moolenaar 
833ecaa70eaSBram Moolenaar /*
834ecaa70eaSBram Moolenaar  * "assert_inrange(lower, upper[, msg])" function
835ecaa70eaSBram Moolenaar  */
836ecaa70eaSBram Moolenaar     void
f_assert_inrange(typval_T * argvars,typval_T * rettv)837ecaa70eaSBram Moolenaar f_assert_inrange(typval_T *argvars, typval_T *rettv)
838ecaa70eaSBram Moolenaar {
839a764e73dSYegappan Lakshmanan     if (check_for_float_or_nr_arg(argvars, 0) == FAIL
840a764e73dSYegappan Lakshmanan 	    || check_for_float_or_nr_arg(argvars, 1) == FAIL
841a764e73dSYegappan Lakshmanan 	    || check_for_float_or_nr_arg(argvars, 2) == FAIL
842a764e73dSYegappan Lakshmanan 	    || check_for_opt_string_arg(argvars, 3) == FAIL)
843a764e73dSYegappan Lakshmanan 	return;
844a764e73dSYegappan Lakshmanan 
845ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_inrange(argvars);
846ecaa70eaSBram Moolenaar }
847ecaa70eaSBram Moolenaar 
848ecaa70eaSBram Moolenaar /*
849ecaa70eaSBram Moolenaar  * "assert_match(pattern, actual[, msg])" function
850ecaa70eaSBram Moolenaar  */
851ecaa70eaSBram Moolenaar     void
f_assert_match(typval_T * argvars,typval_T * rettv)852ecaa70eaSBram Moolenaar f_assert_match(typval_T *argvars, typval_T *rettv)
853ecaa70eaSBram Moolenaar {
854ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_match_common(argvars, ASSERT_MATCH);
855ecaa70eaSBram Moolenaar }
856ecaa70eaSBram Moolenaar 
857ecaa70eaSBram Moolenaar /*
858ecaa70eaSBram Moolenaar  * "assert_notmatch(pattern, actual[, msg])" function
859ecaa70eaSBram Moolenaar  */
860ecaa70eaSBram Moolenaar     void
f_assert_notmatch(typval_T * argvars,typval_T * rettv)861ecaa70eaSBram Moolenaar f_assert_notmatch(typval_T *argvars, typval_T *rettv)
862ecaa70eaSBram Moolenaar {
863ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_match_common(argvars, ASSERT_NOTMATCH);
864ecaa70eaSBram Moolenaar }
865ecaa70eaSBram Moolenaar 
866ecaa70eaSBram Moolenaar /*
867ecaa70eaSBram Moolenaar  * "assert_report(msg)" function
868ecaa70eaSBram Moolenaar  */
869ecaa70eaSBram Moolenaar     void
f_assert_report(typval_T * argvars,typval_T * rettv)870ecaa70eaSBram Moolenaar f_assert_report(typval_T *argvars, typval_T *rettv)
871ecaa70eaSBram Moolenaar {
872ecaa70eaSBram Moolenaar     garray_T	ga;
873ecaa70eaSBram Moolenaar 
874c72bdd28SYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
875c72bdd28SYegappan Lakshmanan 	return;
876c72bdd28SYegappan Lakshmanan 
877ecaa70eaSBram Moolenaar     prepare_assert_error(&ga);
878ecaa70eaSBram Moolenaar     ga_concat(&ga, tv_get_string(&argvars[0]));
879ecaa70eaSBram Moolenaar     assert_error(&ga);
880ecaa70eaSBram Moolenaar     ga_clear(&ga);
881ecaa70eaSBram Moolenaar     rettv->vval.v_number = 1;
882ecaa70eaSBram Moolenaar }
883ecaa70eaSBram Moolenaar 
884ecaa70eaSBram Moolenaar /*
885ecaa70eaSBram Moolenaar  * "assert_true(actual[, msg])" function
886ecaa70eaSBram Moolenaar  */
887ecaa70eaSBram Moolenaar     void
f_assert_true(typval_T * argvars,typval_T * rettv)888ecaa70eaSBram Moolenaar f_assert_true(typval_T *argvars, typval_T *rettv)
889ecaa70eaSBram Moolenaar {
890ecaa70eaSBram Moolenaar     rettv->vval.v_number = assert_bool(argvars, TRUE);
891ecaa70eaSBram Moolenaar }
892ecaa70eaSBram Moolenaar 
893ecaa70eaSBram Moolenaar /*
894ecaa70eaSBram Moolenaar  * "test_alloc_fail(id, countdown, repeat)" function
895ecaa70eaSBram Moolenaar  */
896ecaa70eaSBram Moolenaar     void
f_test_alloc_fail(typval_T * argvars,typval_T * rettv UNUSED)897ecaa70eaSBram Moolenaar f_test_alloc_fail(typval_T *argvars, typval_T *rettv UNUSED)
898ecaa70eaSBram Moolenaar {
899*4490ec4eSYegappan Lakshmanan     if (in_vim9script()
900*4490ec4eSYegappan Lakshmanan 	    && (check_for_number_arg(argvars, 0) == FAIL
901*4490ec4eSYegappan Lakshmanan 		|| check_for_number_arg(argvars, 1) == FAIL
902*4490ec4eSYegappan Lakshmanan 		|| check_for_number_arg(argvars, 2) == FAIL))
903*4490ec4eSYegappan Lakshmanan 	return;
904*4490ec4eSYegappan Lakshmanan 
905ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_NUMBER
906ecaa70eaSBram Moolenaar 	    || argvars[0].vval.v_number <= 0
907ecaa70eaSBram Moolenaar 	    || argvars[1].v_type != VAR_NUMBER
908ecaa70eaSBram Moolenaar 	    || argvars[1].vval.v_number < 0
909ecaa70eaSBram Moolenaar 	    || argvars[2].v_type != VAR_NUMBER)
910ecaa70eaSBram Moolenaar 	emsg(_(e_invarg));
911ecaa70eaSBram Moolenaar     else
912ecaa70eaSBram Moolenaar     {
913ecaa70eaSBram Moolenaar 	alloc_fail_id = argvars[0].vval.v_number;
914ecaa70eaSBram Moolenaar 	if (alloc_fail_id >= aid_last)
915ecaa70eaSBram Moolenaar 	    emsg(_(e_invarg));
916ecaa70eaSBram Moolenaar 	alloc_fail_countdown = argvars[1].vval.v_number;
917ecaa70eaSBram Moolenaar 	alloc_fail_repeat = argvars[2].vval.v_number;
918ecaa70eaSBram Moolenaar 	did_outofmem_msg = FALSE;
919ecaa70eaSBram Moolenaar     }
920ecaa70eaSBram Moolenaar }
921ecaa70eaSBram Moolenaar 
922ecaa70eaSBram Moolenaar /*
923ecaa70eaSBram Moolenaar  * "test_autochdir()"
924ecaa70eaSBram Moolenaar  */
925ecaa70eaSBram Moolenaar     void
f_test_autochdir(typval_T * argvars UNUSED,typval_T * rettv UNUSED)926ecaa70eaSBram Moolenaar f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
927ecaa70eaSBram Moolenaar {
928ecaa70eaSBram Moolenaar #if defined(FEAT_AUTOCHDIR)
929ecaa70eaSBram Moolenaar     test_autochdir = TRUE;
930ecaa70eaSBram Moolenaar #endif
931ecaa70eaSBram Moolenaar }
932ecaa70eaSBram Moolenaar 
933ecaa70eaSBram Moolenaar /*
934ecaa70eaSBram Moolenaar  * "test_feedinput()"
935ecaa70eaSBram Moolenaar  */
936ecaa70eaSBram Moolenaar     void
f_test_feedinput(typval_T * argvars,typval_T * rettv UNUSED)937ecaa70eaSBram Moolenaar f_test_feedinput(typval_T *argvars, typval_T *rettv UNUSED)
938ecaa70eaSBram Moolenaar {
939ecaa70eaSBram Moolenaar #ifdef USE_INPUT_BUF
940*4490ec4eSYegappan Lakshmanan     char_u	*val;
941ecaa70eaSBram Moolenaar 
942*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
943*4490ec4eSYegappan Lakshmanan 	return;
944*4490ec4eSYegappan Lakshmanan 
945*4490ec4eSYegappan Lakshmanan     val = tv_get_string_chk(&argvars[0]);
946272ca95fSBram Moolenaar # ifdef VIMDLL
947272ca95fSBram Moolenaar     // this doesn't work in the console
948272ca95fSBram Moolenaar     if (!gui.in_use)
949272ca95fSBram Moolenaar 	return;
950272ca95fSBram Moolenaar # endif
951272ca95fSBram Moolenaar 
952ecaa70eaSBram Moolenaar     if (val != NULL)
953ecaa70eaSBram Moolenaar     {
954ecaa70eaSBram Moolenaar 	trash_input_buf();
955ecaa70eaSBram Moolenaar 	add_to_input_buf_csi(val, (int)STRLEN(val));
956ecaa70eaSBram Moolenaar     }
957ecaa70eaSBram Moolenaar #endif
958ecaa70eaSBram Moolenaar }
959ecaa70eaSBram Moolenaar 
960ecaa70eaSBram Moolenaar /*
961ecaa70eaSBram Moolenaar  * "test_getvalue({name})" function
962ecaa70eaSBram Moolenaar  */
963ecaa70eaSBram Moolenaar     void
f_test_getvalue(typval_T * argvars,typval_T * rettv)964ecaa70eaSBram Moolenaar f_test_getvalue(typval_T *argvars, typval_T *rettv)
965ecaa70eaSBram Moolenaar {
966*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
967*4490ec4eSYegappan Lakshmanan 	return;
968*4490ec4eSYegappan Lakshmanan 
969ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_STRING)
970ecaa70eaSBram Moolenaar 	emsg(_(e_invarg));
971ecaa70eaSBram Moolenaar     else
972ecaa70eaSBram Moolenaar     {
973ecaa70eaSBram Moolenaar 	char_u *name = tv_get_string(&argvars[0]);
974ecaa70eaSBram Moolenaar 
975ecaa70eaSBram Moolenaar 	if (STRCMP(name, (char_u *)"need_fileinfo") == 0)
976ecaa70eaSBram Moolenaar 	    rettv->vval.v_number = need_fileinfo;
977ecaa70eaSBram Moolenaar 	else
978ecaa70eaSBram Moolenaar 	    semsg(_(e_invarg2), name);
979ecaa70eaSBram Moolenaar     }
980ecaa70eaSBram Moolenaar }
981ecaa70eaSBram Moolenaar 
982ecaa70eaSBram Moolenaar /*
983ecaa70eaSBram Moolenaar  * "test_option_not_set({name})" function
984ecaa70eaSBram Moolenaar  */
985ecaa70eaSBram Moolenaar     void
f_test_option_not_set(typval_T * argvars,typval_T * rettv UNUSED)986ecaa70eaSBram Moolenaar f_test_option_not_set(typval_T *argvars, typval_T *rettv UNUSED)
987ecaa70eaSBram Moolenaar {
988ecaa70eaSBram Moolenaar     char_u *name = (char_u *)"";
989ecaa70eaSBram Moolenaar 
990*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
991*4490ec4eSYegappan Lakshmanan 	return;
992*4490ec4eSYegappan Lakshmanan 
993ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_STRING)
994ecaa70eaSBram Moolenaar 	emsg(_(e_invarg));
995ecaa70eaSBram Moolenaar     else
996ecaa70eaSBram Moolenaar     {
997ecaa70eaSBram Moolenaar 	name = tv_get_string(&argvars[0]);
998ecaa70eaSBram Moolenaar 	if (reset_option_was_set(name) == FAIL)
999ecaa70eaSBram Moolenaar 	    semsg(_(e_invarg2), name);
1000ecaa70eaSBram Moolenaar     }
1001ecaa70eaSBram Moolenaar }
1002ecaa70eaSBram Moolenaar 
1003ecaa70eaSBram Moolenaar /*
1004ecaa70eaSBram Moolenaar  * "test_override({name}, {val})" function
1005ecaa70eaSBram Moolenaar  */
1006ecaa70eaSBram Moolenaar     void
f_test_override(typval_T * argvars,typval_T * rettv UNUSED)1007ecaa70eaSBram Moolenaar f_test_override(typval_T *argvars, typval_T *rettv UNUSED)
1008ecaa70eaSBram Moolenaar {
1009ecaa70eaSBram Moolenaar     char_u *name = (char_u *)"";
1010ecaa70eaSBram Moolenaar     int     val;
1011ecaa70eaSBram Moolenaar     static int save_starting = -1;
1012ecaa70eaSBram Moolenaar 
10131a71d31bSYegappan Lakshmanan     if (in_vim9script()
10141a71d31bSYegappan Lakshmanan 	    && (check_for_string_arg(argvars, 0) == FAIL
10151a71d31bSYegappan Lakshmanan 		|| check_for_number_arg(argvars, 1) == FAIL))
10161a71d31bSYegappan Lakshmanan 	return;
10171a71d31bSYegappan Lakshmanan 
1018ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_STRING
1019ecaa70eaSBram Moolenaar 	    || (argvars[1].v_type) != VAR_NUMBER)
1020ecaa70eaSBram Moolenaar 	emsg(_(e_invarg));
1021ecaa70eaSBram Moolenaar     else
1022ecaa70eaSBram Moolenaar     {
1023ecaa70eaSBram Moolenaar 	name = tv_get_string(&argvars[0]);
1024ecaa70eaSBram Moolenaar 	val = (int)tv_get_number(&argvars[1]);
1025ecaa70eaSBram Moolenaar 
1026ecaa70eaSBram Moolenaar 	if (STRCMP(name, (char_u *)"redraw") == 0)
1027ecaa70eaSBram Moolenaar 	    disable_redraw_for_testing = val;
1028ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"redraw_flag") == 0)
1029ecaa70eaSBram Moolenaar 	    ignore_redraw_flag_for_testing = val;
1030ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"char_avail") == 0)
1031ecaa70eaSBram Moolenaar 	    disable_char_avail_for_testing = val;
1032ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"starting") == 0)
1033ecaa70eaSBram Moolenaar 	{
1034ecaa70eaSBram Moolenaar 	    if (val)
1035ecaa70eaSBram Moolenaar 	    {
1036ecaa70eaSBram Moolenaar 		if (save_starting < 0)
1037ecaa70eaSBram Moolenaar 		    save_starting = starting;
1038ecaa70eaSBram Moolenaar 		starting = 0;
1039ecaa70eaSBram Moolenaar 	    }
1040ecaa70eaSBram Moolenaar 	    else
1041ecaa70eaSBram Moolenaar 	    {
1042ecaa70eaSBram Moolenaar 		starting = save_starting;
1043ecaa70eaSBram Moolenaar 		save_starting = -1;
1044ecaa70eaSBram Moolenaar 	    }
1045ecaa70eaSBram Moolenaar 	}
1046ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"nfa_fail") == 0)
1047ecaa70eaSBram Moolenaar 	    nfa_fail_for_testing = val;
1048ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"no_query_mouse") == 0)
1049ecaa70eaSBram Moolenaar 	    no_query_mouse_for_testing = val;
1050ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"no_wait_return") == 0)
1051ecaa70eaSBram Moolenaar 	    no_wait_return = val;
1052b340baedSBram Moolenaar 	else if (STRCMP(name, (char_u *)"ui_delay") == 0)
1053b340baedSBram Moolenaar 	    ui_delay_for_testing = val;
10540c0eddd3SBram Moolenaar 	else if (STRCMP(name, (char_u *)"term_props") == 0)
10550c0eddd3SBram Moolenaar 	    reset_term_props_on_termresponse = val;
1056f52f0606SBram Moolenaar 	else if (STRCMP(name, (char_u *)"uptime") == 0)
1057f52f0606SBram Moolenaar 	    override_sysinfo_uptime = val;
1058ecaa70eaSBram Moolenaar 	else if (STRCMP(name, (char_u *)"ALL") == 0)
1059ecaa70eaSBram Moolenaar 	{
1060ecaa70eaSBram Moolenaar 	    disable_char_avail_for_testing = FALSE;
1061ecaa70eaSBram Moolenaar 	    disable_redraw_for_testing = FALSE;
1062ecaa70eaSBram Moolenaar 	    ignore_redraw_flag_for_testing = FALSE;
1063ecaa70eaSBram Moolenaar 	    nfa_fail_for_testing = FALSE;
1064ecaa70eaSBram Moolenaar 	    no_query_mouse_for_testing = FALSE;
1065b340baedSBram Moolenaar 	    ui_delay_for_testing = 0;
10660c0eddd3SBram Moolenaar 	    reset_term_props_on_termresponse = FALSE;
1067f52f0606SBram Moolenaar 	    override_sysinfo_uptime = -1;
1068ecaa70eaSBram Moolenaar 	    if (save_starting >= 0)
1069ecaa70eaSBram Moolenaar 	    {
1070ecaa70eaSBram Moolenaar 		starting = save_starting;
1071ecaa70eaSBram Moolenaar 		save_starting = -1;
1072ecaa70eaSBram Moolenaar 	    }
1073ecaa70eaSBram Moolenaar 	}
1074ecaa70eaSBram Moolenaar 	else
1075ecaa70eaSBram Moolenaar 	    semsg(_(e_invarg2), name);
1076ecaa70eaSBram Moolenaar     }
1077ecaa70eaSBram Moolenaar }
1078ecaa70eaSBram Moolenaar 
1079ecaa70eaSBram Moolenaar /*
1080ecaa70eaSBram Moolenaar  * "test_refcount({expr})" function
1081ecaa70eaSBram Moolenaar  */
1082ecaa70eaSBram Moolenaar     void
f_test_refcount(typval_T * argvars,typval_T * rettv)1083ecaa70eaSBram Moolenaar f_test_refcount(typval_T *argvars, typval_T *rettv)
1084ecaa70eaSBram Moolenaar {
1085ecaa70eaSBram Moolenaar     int retval = -1;
1086ecaa70eaSBram Moolenaar 
1087ecaa70eaSBram Moolenaar     switch (argvars[0].v_type)
1088ecaa70eaSBram Moolenaar     {
1089ecaa70eaSBram Moolenaar 	case VAR_UNKNOWN:
10904c683750SBram Moolenaar 	case VAR_ANY:
10918a7d6542SBram Moolenaar 	case VAR_VOID:
1092ecaa70eaSBram Moolenaar 	case VAR_NUMBER:
10939b4a15d5SBram Moolenaar 	case VAR_BOOL:
10948a7d6542SBram Moolenaar 	case VAR_FLOAT:
1095ecaa70eaSBram Moolenaar 	case VAR_SPECIAL:
1096ecaa70eaSBram Moolenaar 	case VAR_STRING:
1097f18332fbSBram Moolenaar 	case VAR_INSTR:
1098ecaa70eaSBram Moolenaar 	    break;
1099ecaa70eaSBram Moolenaar 	case VAR_JOB:
1100ecaa70eaSBram Moolenaar #ifdef FEAT_JOB_CHANNEL
1101ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_job != NULL)
1102ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_job->jv_refcount - 1;
1103ecaa70eaSBram Moolenaar #endif
1104ecaa70eaSBram Moolenaar 	    break;
1105ecaa70eaSBram Moolenaar 	case VAR_CHANNEL:
1106ecaa70eaSBram Moolenaar #ifdef FEAT_JOB_CHANNEL
1107ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_channel != NULL)
1108ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_channel->ch_refcount - 1;
1109ecaa70eaSBram Moolenaar #endif
1110ecaa70eaSBram Moolenaar 	    break;
1111ecaa70eaSBram Moolenaar 	case VAR_FUNC:
1112ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_string != NULL)
1113ecaa70eaSBram Moolenaar 	    {
1114ecaa70eaSBram Moolenaar 		ufunc_T *fp;
1115ecaa70eaSBram Moolenaar 
11164c17ad94SBram Moolenaar 		fp = find_func(argvars[0].vval.v_string, FALSE, NULL);
1117ecaa70eaSBram Moolenaar 		if (fp != NULL)
1118ecaa70eaSBram Moolenaar 		    retval = fp->uf_refcount;
1119ecaa70eaSBram Moolenaar 	    }
1120ecaa70eaSBram Moolenaar 	    break;
1121ecaa70eaSBram Moolenaar 	case VAR_PARTIAL:
1122ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_partial != NULL)
1123ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_partial->pt_refcount - 1;
1124ecaa70eaSBram Moolenaar 	    break;
1125ecaa70eaSBram Moolenaar 	case VAR_BLOB:
1126ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_blob != NULL)
1127ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_blob->bv_refcount - 1;
1128ecaa70eaSBram Moolenaar 	    break;
1129ecaa70eaSBram Moolenaar 	case VAR_LIST:
1130ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_list != NULL)
1131ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_list->lv_refcount - 1;
1132ecaa70eaSBram Moolenaar 	    break;
1133ecaa70eaSBram Moolenaar 	case VAR_DICT:
1134ecaa70eaSBram Moolenaar 	    if (argvars[0].vval.v_dict != NULL)
1135ecaa70eaSBram Moolenaar 		retval = argvars[0].vval.v_dict->dv_refcount - 1;
1136ecaa70eaSBram Moolenaar 	    break;
1137ecaa70eaSBram Moolenaar     }
1138ecaa70eaSBram Moolenaar 
1139ecaa70eaSBram Moolenaar     rettv->v_type = VAR_NUMBER;
1140ecaa70eaSBram Moolenaar     rettv->vval.v_number = retval;
1141ecaa70eaSBram Moolenaar 
1142ecaa70eaSBram Moolenaar }
1143ecaa70eaSBram Moolenaar 
1144ecaa70eaSBram Moolenaar /*
1145ecaa70eaSBram Moolenaar  * "test_garbagecollect_now()" function
1146ecaa70eaSBram Moolenaar  */
1147ecaa70eaSBram Moolenaar     void
f_test_garbagecollect_now(typval_T * argvars UNUSED,typval_T * rettv UNUSED)1148ecaa70eaSBram Moolenaar f_test_garbagecollect_now(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
1149ecaa70eaSBram Moolenaar {
11500d6f5d97SBram Moolenaar     // This is dangerous, any Lists and Dicts used internally may be freed
11510d6f5d97SBram Moolenaar     // while still in use.
1152ecaa70eaSBram Moolenaar     garbage_collect(TRUE);
1153ecaa70eaSBram Moolenaar }
1154ecaa70eaSBram Moolenaar 
1155ecaa70eaSBram Moolenaar /*
1156ecaa70eaSBram Moolenaar  * "test_garbagecollect_soon()" function
1157ecaa70eaSBram Moolenaar  */
1158ecaa70eaSBram Moolenaar     void
f_test_garbagecollect_soon(typval_T * argvars UNUSED,typval_T * rettv UNUSED)1159ecaa70eaSBram Moolenaar f_test_garbagecollect_soon(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
1160ecaa70eaSBram Moolenaar {
1161ecaa70eaSBram Moolenaar     may_garbage_collect = TRUE;
1162ecaa70eaSBram Moolenaar }
1163ecaa70eaSBram Moolenaar 
1164ecaa70eaSBram Moolenaar /*
1165ecaa70eaSBram Moolenaar  * "test_ignore_error()" function
1166ecaa70eaSBram Moolenaar  */
1167ecaa70eaSBram Moolenaar     void
f_test_ignore_error(typval_T * argvars,typval_T * rettv UNUSED)1168ecaa70eaSBram Moolenaar f_test_ignore_error(typval_T *argvars, typval_T *rettv UNUSED)
1169ecaa70eaSBram Moolenaar {
1170*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
1171*4490ec4eSYegappan Lakshmanan 	return;
1172*4490ec4eSYegappan Lakshmanan 
11735b73992dSYegappan Lakshmanan     if (argvars[0].v_type != VAR_STRING)
11745b73992dSYegappan Lakshmanan 	emsg(_(e_invarg));
11755b73992dSYegappan Lakshmanan     else
1176ecaa70eaSBram Moolenaar 	ignore_error_for_testing(tv_get_string(&argvars[0]));
1177ecaa70eaSBram Moolenaar }
1178ecaa70eaSBram Moolenaar 
1179ecaa70eaSBram Moolenaar     void
f_test_null_blob(typval_T * argvars UNUSED,typval_T * rettv)1180ecaa70eaSBram Moolenaar f_test_null_blob(typval_T *argvars UNUSED, typval_T *rettv)
1181ecaa70eaSBram Moolenaar {
1182ecaa70eaSBram Moolenaar     rettv->v_type = VAR_BLOB;
1183ecaa70eaSBram Moolenaar     rettv->vval.v_blob = NULL;
1184ecaa70eaSBram Moolenaar }
1185ecaa70eaSBram Moolenaar 
1186ecaa70eaSBram Moolenaar #ifdef FEAT_JOB_CHANNEL
1187ecaa70eaSBram Moolenaar     void
f_test_null_channel(typval_T * argvars UNUSED,typval_T * rettv)1188ecaa70eaSBram Moolenaar f_test_null_channel(typval_T *argvars UNUSED, typval_T *rettv)
1189ecaa70eaSBram Moolenaar {
1190ecaa70eaSBram Moolenaar     rettv->v_type = VAR_CHANNEL;
1191ecaa70eaSBram Moolenaar     rettv->vval.v_channel = NULL;
1192ecaa70eaSBram Moolenaar }
1193ecaa70eaSBram Moolenaar #endif
1194ecaa70eaSBram Moolenaar 
1195ecaa70eaSBram Moolenaar     void
f_test_null_dict(typval_T * argvars UNUSED,typval_T * rettv)1196ecaa70eaSBram Moolenaar f_test_null_dict(typval_T *argvars UNUSED, typval_T *rettv)
1197ecaa70eaSBram Moolenaar {
1198ecaa70eaSBram Moolenaar     rettv_dict_set(rettv, NULL);
1199ecaa70eaSBram Moolenaar }
1200ecaa70eaSBram Moolenaar 
1201ecaa70eaSBram Moolenaar #ifdef FEAT_JOB_CHANNEL
1202ecaa70eaSBram Moolenaar     void
f_test_null_job(typval_T * argvars UNUSED,typval_T * rettv)1203ecaa70eaSBram Moolenaar f_test_null_job(typval_T *argvars UNUSED, typval_T *rettv)
1204ecaa70eaSBram Moolenaar {
1205ecaa70eaSBram Moolenaar     rettv->v_type = VAR_JOB;
1206ecaa70eaSBram Moolenaar     rettv->vval.v_job = NULL;
1207ecaa70eaSBram Moolenaar }
1208ecaa70eaSBram Moolenaar #endif
1209ecaa70eaSBram Moolenaar 
1210ecaa70eaSBram Moolenaar     void
f_test_null_list(typval_T * argvars UNUSED,typval_T * rettv)1211ecaa70eaSBram Moolenaar f_test_null_list(typval_T *argvars UNUSED, typval_T *rettv)
1212ecaa70eaSBram Moolenaar {
1213ecaa70eaSBram Moolenaar     rettv_list_set(rettv, NULL);
1214ecaa70eaSBram Moolenaar }
1215ecaa70eaSBram Moolenaar 
1216ecaa70eaSBram Moolenaar     void
f_test_null_function(typval_T * argvars UNUSED,typval_T * rettv)1217e69f6d04SBram Moolenaar f_test_null_function(typval_T *argvars UNUSED, typval_T *rettv)
1218e69f6d04SBram Moolenaar {
1219e69f6d04SBram Moolenaar     rettv->v_type = VAR_FUNC;
1220e69f6d04SBram Moolenaar     rettv->vval.v_string = NULL;
1221e69f6d04SBram Moolenaar }
1222e69f6d04SBram Moolenaar 
1223e69f6d04SBram Moolenaar     void
f_test_null_partial(typval_T * argvars UNUSED,typval_T * rettv)1224ecaa70eaSBram Moolenaar f_test_null_partial(typval_T *argvars UNUSED, typval_T *rettv)
1225ecaa70eaSBram Moolenaar {
1226ecaa70eaSBram Moolenaar     rettv->v_type = VAR_PARTIAL;
1227ecaa70eaSBram Moolenaar     rettv->vval.v_partial = NULL;
1228ecaa70eaSBram Moolenaar }
1229ecaa70eaSBram Moolenaar 
1230ecaa70eaSBram Moolenaar     void
f_test_null_string(typval_T * argvars UNUSED,typval_T * rettv)1231ecaa70eaSBram Moolenaar f_test_null_string(typval_T *argvars UNUSED, typval_T *rettv)
1232ecaa70eaSBram Moolenaar {
1233ecaa70eaSBram Moolenaar     rettv->v_type = VAR_STRING;
1234ecaa70eaSBram Moolenaar     rettv->vval.v_string = NULL;
1235ecaa70eaSBram Moolenaar }
1236ecaa70eaSBram Moolenaar 
12378ed04587SBram Moolenaar     void
f_test_unknown(typval_T * argvars UNUSED,typval_T * rettv)12388ed04587SBram Moolenaar f_test_unknown(typval_T *argvars UNUSED, typval_T *rettv)
12398ed04587SBram Moolenaar {
12408ed04587SBram Moolenaar     rettv->v_type = VAR_UNKNOWN;
12418ed04587SBram Moolenaar }
12428ed04587SBram Moolenaar 
12438ed04587SBram Moolenaar     void
f_test_void(typval_T * argvars UNUSED,typval_T * rettv)12448ed04587SBram Moolenaar f_test_void(typval_T *argvars UNUSED, typval_T *rettv)
12458ed04587SBram Moolenaar {
12468ed04587SBram Moolenaar     rettv->v_type = VAR_VOID;
12478ed04587SBram Moolenaar }
12488ed04587SBram Moolenaar 
1249ecaa70eaSBram Moolenaar #ifdef FEAT_GUI
1250ecaa70eaSBram Moolenaar     void
f_test_scrollbar(typval_T * argvars,typval_T * rettv UNUSED)1251ecaa70eaSBram Moolenaar f_test_scrollbar(typval_T *argvars, typval_T *rettv UNUSED)
1252ecaa70eaSBram Moolenaar {
1253ecaa70eaSBram Moolenaar     char_u	*which;
1254ecaa70eaSBram Moolenaar     long	value;
1255ecaa70eaSBram Moolenaar     int		dragging;
1256ecaa70eaSBram Moolenaar     scrollbar_T *sb = NULL;
1257ecaa70eaSBram Moolenaar 
12585bca906bSYegappan Lakshmanan     if (check_for_string_arg(argvars, 0) == FAIL
12595bca906bSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 1) == FAIL
12605bca906bSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 2) == FAIL)
12615bca906bSYegappan Lakshmanan 	return;
12625bca906bSYegappan Lakshmanan 
1263ecaa70eaSBram Moolenaar     if (argvars[0].v_type != VAR_STRING
1264ecaa70eaSBram Moolenaar 	    || (argvars[1].v_type) != VAR_NUMBER
1265ecaa70eaSBram Moolenaar 	    || (argvars[2].v_type) != VAR_NUMBER)
1266ecaa70eaSBram Moolenaar     {
1267ecaa70eaSBram Moolenaar 	emsg(_(e_invarg));
1268ecaa70eaSBram Moolenaar 	return;
1269ecaa70eaSBram Moolenaar     }
1270ecaa70eaSBram Moolenaar     which = tv_get_string(&argvars[0]);
1271ecaa70eaSBram Moolenaar     value = tv_get_number(&argvars[1]);
1272ecaa70eaSBram Moolenaar     dragging = tv_get_number(&argvars[2]);
1273ecaa70eaSBram Moolenaar 
1274ecaa70eaSBram Moolenaar     if (STRCMP(which, "left") == 0)
1275ecaa70eaSBram Moolenaar 	sb = &curwin->w_scrollbars[SBAR_LEFT];
1276ecaa70eaSBram Moolenaar     else if (STRCMP(which, "right") == 0)
1277ecaa70eaSBram Moolenaar 	sb = &curwin->w_scrollbars[SBAR_RIGHT];
1278ecaa70eaSBram Moolenaar     else if (STRCMP(which, "hor") == 0)
1279ecaa70eaSBram Moolenaar 	sb = &gui.bottom_sbar;
1280ecaa70eaSBram Moolenaar     if (sb == NULL)
1281ecaa70eaSBram Moolenaar     {
1282ecaa70eaSBram Moolenaar 	semsg(_(e_invarg2), which);
1283ecaa70eaSBram Moolenaar 	return;
1284ecaa70eaSBram Moolenaar     }
1285ecaa70eaSBram Moolenaar     gui_drag_scrollbar(sb, value, dragging);
1286ecaa70eaSBram Moolenaar # ifndef USE_ON_FLY_SCROLL
1287ecaa70eaSBram Moolenaar     // need to loop through normal_cmd() to handle the scroll events
1288ecaa70eaSBram Moolenaar     exec_normal(FALSE, TRUE, FALSE);
1289ecaa70eaSBram Moolenaar # endif
1290ecaa70eaSBram Moolenaar }
1291ecaa70eaSBram Moolenaar #endif
1292ecaa70eaSBram Moolenaar 
1293ecaa70eaSBram Moolenaar     void
f_test_setmouse(typval_T * argvars,typval_T * rettv UNUSED)1294ecaa70eaSBram Moolenaar f_test_setmouse(typval_T *argvars, typval_T *rettv UNUSED)
1295ecaa70eaSBram Moolenaar {
1296*4490ec4eSYegappan Lakshmanan     if (in_vim9script()
1297*4490ec4eSYegappan Lakshmanan 	    && (check_for_number_arg(argvars, 0) == FAIL
1298*4490ec4eSYegappan Lakshmanan 		|| check_for_number_arg(argvars, 1) == FAIL))
1299*4490ec4eSYegappan Lakshmanan 	return;
1300*4490ec4eSYegappan Lakshmanan 
13017237cab8SYegappan Lakshmanan     if (argvars[0].v_type != VAR_NUMBER || (argvars[1].v_type) != VAR_NUMBER)
13027237cab8SYegappan Lakshmanan     {
13037237cab8SYegappan Lakshmanan 	emsg(_(e_invarg));
13047237cab8SYegappan Lakshmanan 	return;
13057237cab8SYegappan Lakshmanan     }
13067237cab8SYegappan Lakshmanan 
1307ecaa70eaSBram Moolenaar     mouse_row = (time_t)tv_get_number(&argvars[0]) - 1;
1308ecaa70eaSBram Moolenaar     mouse_col = (time_t)tv_get_number(&argvars[1]) - 1;
1309ecaa70eaSBram Moolenaar }
1310ecaa70eaSBram Moolenaar 
1311ecaa70eaSBram Moolenaar     void
f_test_gui_mouse_event(typval_T * argvars UNUSED,typval_T * rettv UNUSED)1312f1e7449dSYegappan Lakshmanan f_test_gui_mouse_event(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
1313f1e7449dSYegappan Lakshmanan {
1314f1e7449dSYegappan Lakshmanan # ifdef FEAT_GUI
13157237cab8SYegappan Lakshmanan     int		button;
13167237cab8SYegappan Lakshmanan     int		row;
13177237cab8SYegappan Lakshmanan     int		col;
13187237cab8SYegappan Lakshmanan     int		repeated_click;
13197237cab8SYegappan Lakshmanan     int_u	mods;
13207237cab8SYegappan Lakshmanan 
132183494b4aSYegappan Lakshmanan     if (check_for_number_arg(argvars, 0) == FAIL
132283494b4aSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 1) == FAIL
132383494b4aSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 2) == FAIL
132483494b4aSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 3) == FAIL
132583494b4aSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 4) == FAIL)
13267237cab8SYegappan Lakshmanan 	return;
13277237cab8SYegappan Lakshmanan 
13287237cab8SYegappan Lakshmanan     button = tv_get_number(&argvars[0]);
13297237cab8SYegappan Lakshmanan     row = tv_get_number(&argvars[1]);
13307237cab8SYegappan Lakshmanan     col = tv_get_number(&argvars[2]);
13317237cab8SYegappan Lakshmanan     repeated_click = tv_get_number(&argvars[3]);
13327237cab8SYegappan Lakshmanan     mods = tv_get_number(&argvars[4]);
1333f1e7449dSYegappan Lakshmanan 
1334f1e7449dSYegappan Lakshmanan     gui_send_mouse_event(button, TEXT_X(col - 1), TEXT_Y(row - 1), repeated_click, mods);
1335f1e7449dSYegappan Lakshmanan # endif
1336f1e7449dSYegappan Lakshmanan }
1337f1e7449dSYegappan Lakshmanan 
1338f1e7449dSYegappan Lakshmanan     void
f_test_settime(typval_T * argvars,typval_T * rettv UNUSED)1339ecaa70eaSBram Moolenaar f_test_settime(typval_T *argvars, typval_T *rettv UNUSED)
1340ecaa70eaSBram Moolenaar {
1341*4490ec4eSYegappan Lakshmanan     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
1342*4490ec4eSYegappan Lakshmanan 	return;
1343*4490ec4eSYegappan Lakshmanan 
1344ecaa70eaSBram Moolenaar     time_for_testing = (time_t)tv_get_number(&argvars[0]);
1345ecaa70eaSBram Moolenaar }
1346ecaa70eaSBram Moolenaar 
134718d46587SYegappan Lakshmanan     void
f_test_gui_drop_files(typval_T * argvars UNUSED,typval_T * rettv UNUSED)134818d46587SYegappan Lakshmanan f_test_gui_drop_files(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
134918d46587SYegappan Lakshmanan {
13501d1ce613SBram Moolenaar #if defined(HAVE_DROP_FILE)
135118d46587SYegappan Lakshmanan     int		row;
135218d46587SYegappan Lakshmanan     int		col;
135318d46587SYegappan Lakshmanan     int_u	mods;
135418d46587SYegappan Lakshmanan     char_u	**fnames;
135518d46587SYegappan Lakshmanan     int		count = 0;
135618d46587SYegappan Lakshmanan     list_T	*l;
135718d46587SYegappan Lakshmanan     listitem_T	*li;
135818d46587SYegappan Lakshmanan 
13595bca906bSYegappan Lakshmanan     if (check_for_list_arg(argvars, 0) == FAIL
13605bca906bSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 1) == FAIL
13615bca906bSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 2) == FAIL
13625bca906bSYegappan Lakshmanan 	    || check_for_number_arg(argvars, 3) == FAIL)
136318d46587SYegappan Lakshmanan 	return;
136418d46587SYegappan Lakshmanan 
136518d46587SYegappan Lakshmanan     row = tv_get_number(&argvars[1]);
136618d46587SYegappan Lakshmanan     col = tv_get_number(&argvars[2]);
136718d46587SYegappan Lakshmanan     mods = tv_get_number(&argvars[3]);
136818d46587SYegappan Lakshmanan 
136918d46587SYegappan Lakshmanan     l = argvars[0].vval.v_list;
137018d46587SYegappan Lakshmanan     if (list_len(l) == 0)
137118d46587SYegappan Lakshmanan 	return;
137218d46587SYegappan Lakshmanan 
137318d46587SYegappan Lakshmanan     fnames = ALLOC_MULT(char_u *, list_len(l));
137418d46587SYegappan Lakshmanan     if (fnames == NULL)
137518d46587SYegappan Lakshmanan 	return;
137618d46587SYegappan Lakshmanan 
137718d46587SYegappan Lakshmanan     FOR_ALL_LIST_ITEMS(l, li)
137818d46587SYegappan Lakshmanan     {
137918d46587SYegappan Lakshmanan 	// ignore non-string items
138018d46587SYegappan Lakshmanan 	if (li->li_tv.v_type != VAR_STRING)
138118d46587SYegappan Lakshmanan 	    continue;
138218d46587SYegappan Lakshmanan 
138318d46587SYegappan Lakshmanan 	fnames[count] = vim_strsave(li->li_tv.vval.v_string);
138418d46587SYegappan Lakshmanan 	if (fnames[count] == NULL)
138518d46587SYegappan Lakshmanan 	{
138618d46587SYegappan Lakshmanan 	    while (--count >= 0)
138718d46587SYegappan Lakshmanan 		vim_free(fnames[count]);
138818d46587SYegappan Lakshmanan 	    vim_free(fnames);
138918d46587SYegappan Lakshmanan 	    return;
139018d46587SYegappan Lakshmanan 	}
139118d46587SYegappan Lakshmanan 	count++;
139218d46587SYegappan Lakshmanan     }
139318d46587SYegappan Lakshmanan 
139418d46587SYegappan Lakshmanan     if (count > 0)
139518d46587SYegappan Lakshmanan 	gui_handle_drop(TEXT_X(col - 1), TEXT_Y(row - 1), mods, fnames, count);
139618d46587SYegappan Lakshmanan     else
139718d46587SYegappan Lakshmanan 	vim_free(fnames);
139818d46587SYegappan Lakshmanan # endif
139918d46587SYegappan Lakshmanan }
1400ecaa70eaSBram Moolenaar 
1401ecaa70eaSBram Moolenaar #endif // defined(FEAT_EVAL)
1402