diff options
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 86 |
1 files changed, 85 insertions, 1 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 57d7002739..0bae48562a 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -376,6 +376,7 @@ static struct vimvar { {VV_NAME("option_new", VAR_STRING), VV_RO}, {VV_NAME("option_old", VAR_STRING), VV_RO}, {VV_NAME("option_type", VAR_STRING), VV_RO}, + {VV_NAME("errors", VAR_LIST), 0}, {VV_NAME("msgpack_types", VAR_DICT), VV_RO}, }; @@ -7099,7 +7100,10 @@ static struct fst { {"argidx", 0, 0, f_argidx}, {"arglistid", 0, 2, f_arglistid}, {"argv", 0, 1, f_argv}, - {"asin", 1, 1, f_asin}, /* WJMc */ + {"asin", 1, 1, f_asin}, // WJMc + {"assertEqual", 2, 3, f_assertEqual}, + {"assertFalse", 1, 2, f_assertFalse}, + {"assertTrue", 1, 2, f_assertTrue}, {"atan", 1, 1, f_atan}, {"atan2", 2, 2, f_atan2}, {"browse", 4, 4, f_browse}, @@ -7981,6 +7985,86 @@ static void f_argv(typval_T *argvars, typval_T *rettv) } } +// Add an assert error to v:errors. +static void assertError(garray_T *gap) +{ + struct vimvar *vp = &vimvars[VV_ERRORS]; + + if (vp->vv_type != VAR_LIST || vimvars[VV_ERRORS].vv_list == NULL) { + // Make sure v:errors is a list. + set_vim_var_list(VV_ERRORS, list_alloc()); + } + list_append_string(vimvars[VV_ERRORS].vv_list, + gap->ga_data, gap->ga_len); +} + +static void prepareForAssertError(garray_T *gap) +{ + char buf[NUMBUFLEN]; + + ga_init(gap, 1, 100); + ga_concat(gap, sourcing_name); + vim_snprintf(buf, ARRAY_SIZE(buf), " line %ld", (long)sourcing_lnum); + ga_concat(gap, (char_u *)buf); +} + +// "assertEqual(expected, actual[, msg])" function +static void f_assertEqual(typval_T *argvars, typval_T *rettv) +{ + garray_T ga; + char_u *tofree; + + if (!tv_equal(&argvars[0], &argvars[1], false, false)) { + prepareForAssertError(&ga); + ga_concat(&ga, (char_u *)": Expected "); + tofree = (char_u *) tv2string(&argvars[0], NULL); + ga_concat(&ga, tofree); + xfree(tofree); + ga_concat(&ga, (char_u *)" but got "); + tofree = (char_u *) tv2string(&argvars[1], NULL); + ga_concat(&ga, tofree); + xfree(tofree); + assertError(&ga); + ga_clear(&ga); + } +} + +static void assertBool(typval_T *argvars, bool isTrue) +{ + int error = (int)false; + garray_T ga; + char_u *tofree; + + if (argvars[0].v_type != VAR_NUMBER || + (get_tv_number_chk(&argvars[0], &error) == 0) == isTrue || error) { + prepareForAssertError(&ga); + ga_concat(&ga, (char_u *)": Expected "); + if (isTrue) { + ga_concat(&ga, (char_u *)"True "); + } else { + ga_concat(&ga, (char_u *)"False "); + } + ga_concat(&ga, (char_u *)"but got "); + tofree = (char_u *) tv2string(&argvars[0], NULL); + ga_concat(&ga, tofree); + xfree(tofree); + assertError(&ga); + ga_clear(&ga); + } +} + +// "assertFalse(actual[, msg])" function +static void f_assertFalse(typval_T *argvars, typval_T *rettv) +{ + assertBool(argvars, false); +} + +// "assertTrue(actual[, msg])" function +static void f_assertTrue(typval_T *argvars, typval_T *rettv) +{ + assertBool(argvars, true); +} + /* * "asin()" function */ |