diff options
-rw-r--r-- | runtime/doc/eval.txt | 20 | ||||
-rw-r--r-- | src/eval.c | 33 | ||||
-rw-r--r-- | src/evalfunc.c | 11 | ||||
-rw-r--r-- | src/proto/eval.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_assert.vim | 13 | ||||
-rw-r--r-- | src/testdir/test_man.vim | 21 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 86 insertions, 15 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index fa3c756a7..11cd8bbaf 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.4. Last change: 2016 Jul 22 +*eval.txt* For Vim version 7.4. Last change: 2016 Jul 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1947,6 +1947,8 @@ assert_equal({exp}, {act} [, {msg}]) none assert {exp} is equal to {act} assert_exception({error} [, {msg}]) none assert {error} is in v:exception assert_fails({cmd} [, {error}]) none assert {cmd} fails assert_false({actual} [, {msg}]) none assert {actual} is false +assert_inrange({lower}, {upper}, {actual} [, {msg}]) + none assert {actual} is inside the range assert_match({pat}, {text} [, {msg}]) none assert {pat} matches {text} assert_notequal({exp}, {act} [, {msg}]) none assert {exp} is not equal {act} assert_notmatch({pat}, {text} [, {msg}]) none assert {pat} not matches {text} @@ -2478,8 +2480,16 @@ assert_false({actual} [, {msg}]) *assert_false()* |v:errors|, like with |assert_equal()|. A value is false when it is zero. When {actual} is not a number the assert fails. - When {msg} is omitted an error in the form "Expected False but - got {actual}" is produced. + When {msg} is omitted an error in the form + "Expected False but got {actual}" is produced. + +assert_inrange({lower}, {upper}, {actual} [, {msg}]) *assert_inrange()* + This asserts number values. When {actual} is lower than + {lower} or higher than {upper} an error message is added to + |v:errors|. + When {msg} is omitted an error in the form + "Expected range {lower} - {upper}, but got {actual}" is + produced. *assert_match()* assert_match({pattern}, {actual} [, {msg}]) @@ -2494,8 +2504,8 @@ assert_match({pattern}, {actual} [, {msg}]) Use "^" and "$" to match with the start and end of the text. Use both to match the whole text. - When {msg} is omitted an error in the form "Pattern {pattern} - does not match {actual}" is produced. + When {msg} is omitted an error in the form + "Pattern {pattern} does not match {actual}" is produced. Example: > assert_match('^f.*o$', 'foobar') < Will result in a string to be added to |v:errors|: diff --git a/src/eval.c b/src/eval.c index 53c188bae..3bc2afdb1 100644 --- a/src/eval.c +++ b/src/eval.c @@ -8992,6 +8992,39 @@ assert_match_common(typval_T *argvars, assert_type_T atype) } } + void +assert_inrange(typval_T *argvars) +{ + garray_T ga; + int error = FALSE; + varnumber_T lower = get_tv_number_chk(&argvars[0], &error); + varnumber_T upper = get_tv_number_chk(&argvars[1], &error); + varnumber_T actual = get_tv_number_chk(&argvars[2], &error); + char_u *tofree; + char msg[200]; + char_u numbuf[NUMBUFLEN]; + + if (error) + return; + if (actual < lower || actual > upper) + { + prepare_assert_error(&ga); + if (argvars[3].v_type != VAR_UNKNOWN) + { + ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0)); + vim_free(tofree); + } + else + { + vim_snprintf(msg, 200, "Expected range %ld - %ld, but got %ld", + (long)lower, (long)upper, (long)actual); + ga_concat(&ga, (char_u *)msg); + } + assert_error(&ga); + ga_clear(&ga); + } +} + /* * Common for assert_true() and assert_false(). */ diff --git a/src/evalfunc.c b/src/evalfunc.c index 61dce74fd..ec347c112 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -48,6 +48,7 @@ static void f_assert_equal(typval_T *argvars, typval_T *rettv); static void f_assert_exception(typval_T *argvars, typval_T *rettv); static void f_assert_fails(typval_T *argvars, typval_T *rettv); static void f_assert_false(typval_T *argvars, typval_T *rettv); +static void f_assert_inrange(typval_T *argvars, typval_T *rettv); static void f_assert_match(typval_T *argvars, typval_T *rettv); static void f_assert_notequal(typval_T *argvars, typval_T *rettv); static void f_assert_notmatch(typval_T *argvars, typval_T *rettv); @@ -460,6 +461,7 @@ static struct fst {"assert_exception", 1, 2, f_assert_exception}, {"assert_fails", 1, 2, f_assert_fails}, {"assert_false", 1, 2, f_assert_false}, + {"assert_inrange", 2, 3, f_assert_inrange}, {"assert_match", 2, 3, f_assert_match}, {"assert_notequal", 2, 3, f_assert_notequal}, {"assert_notmatch", 2, 3, f_assert_notmatch}, @@ -1278,6 +1280,15 @@ f_assert_false(typval_T *argvars, typval_T *rettv UNUSED) } /* + * "assert_inrange(lower, upper[, msg])" function + */ + static void +f_assert_inrange(typval_T *argvars, typval_T *rettv UNUSED) +{ + assert_inrange(argvars); +} + +/* * "assert_match(pattern, actual[, msg])" function */ static void diff --git a/src/proto/eval.pro b/src/proto/eval.pro index e9ec97df4..5d9b35c62 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -121,6 +121,7 @@ void prepare_assert_error(garray_T *gap); void assert_error(garray_T *gap); void assert_equal_common(typval_T *argvars, assert_type_T atype); void assert_match_common(typval_T *argvars, assert_type_T atype); +void assert_inrange(typval_T *argvars); void assert_bool(typval_T *argvars, int isTrue); void assert_exception(typval_T *argvars); void assert_fails(typval_T *argvars); diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim index d7fb6385f..0ab664ad3 100644 --- a/src/testdir/test_assert.vim +++ b/src/testdir/test_assert.vim @@ -105,6 +105,19 @@ func Test_assert_fail_fails() call remove(v:errors, 0) endfunc +func Test_assert_inrange() + call assert_inrange(7, 7, 7) + call assert_inrange(5, 7, 5) + call assert_inrange(5, 7, 6) + call assert_inrange(5, 7, 7) + + call assert_inrange(5, 7, 4) + call assert_match("Expected range 5 - 7, but got 4", v:errors[0]) + call remove(v:errors, 0) + call assert_inrange(5, 7, 8) + call assert_match("Expected range 5 - 7, but got 8", v:errors[0]) + call remove(v:errors, 0) +endfunc func Test_user_is_happy() smile diff --git a/src/testdir/test_man.vim b/src/testdir/test_man.vim index f2c48a405..1485ec321 100644 --- a/src/testdir/test_man.vim +++ b/src/testdir/test_man.vim @@ -1,19 +1,20 @@ runtime ftplugin/man.vim function Test_g_ft_man_open_mode() - let l:w = winwidth(1) vnew let l:h = winheight(1) q + let l:w = winwidth(1) " split horizontally let wincnt = winnr('$') - Man 'vim' + Man vim if wincnt == winnr('$') " Vim manual page cannot be found. return endif - call assert_equal(l:w, winwidth(1)) + + call assert_inrange(l:w - 2, l:w + 2, winwidth(1)) call assert_true(l:h > winheight(1)) call assert_equal(1, tabpagenr('$')) call assert_equal(1, tabpagenr()) @@ -21,8 +22,8 @@ function Test_g_ft_man_open_mode() " split horizontally let g:ft_man_open_mode = "horz" - Man 'vim' - call assert_equal(l:w, winwidth(1)) + Man vim + call assert_inrange(l:w - 2, l:w + 2, winwidth(1)) call assert_true(l:h > winheight(1)) call assert_equal(1, tabpagenr('$')) call assert_equal(1, tabpagenr()) @@ -30,7 +31,7 @@ function Test_g_ft_man_open_mode() " split vertically let g:ft_man_open_mode = "vert" - Man 'vim' + Man vim call assert_true(l:w > winwidth(1)) call assert_equal(l:h, winheight(1)) call assert_equal(1, tabpagenr('$')) @@ -39,9 +40,9 @@ function Test_g_ft_man_open_mode() " separate tab let g:ft_man_open_mode = "tab" - Man 'vim' - call assert_equal(l:w, winwidth(1)) - call assert_equal(l:h, winheight(1)) + Man vim + call assert_inrange(l:w - 2, l:w + 2, winwidth(1)) + call assert_inrange(l:h - 1, l:h + 1, winheight(1)) call assert_equal(2, tabpagenr('$')) call assert_equal(2, tabpagenr()) q @@ -49,7 +50,7 @@ endfunction function Test_nomodifiable() let wincnt = winnr('$') - Man 'vim' + Man vim if wincnt == winnr('$') " Vim manual page cannot be found. return diff --git a/src/version.c b/src/version.c index 0110c1d28..757590cb5 100644 --- a/src/version.c +++ b/src/version.c @@ -759,6 +759,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2095, +/**/ 2094, /**/ 2093, |