Skip to content

Commit b50e5f5

Browse files
committed
patch 7.4.1703
Problem: Can't assert for not equal and not matching. Solution: Add assert_notmatch() and assert_notequal().
1 parent 4afc7c5 commit b50e5f5

File tree

4 files changed

+107
-20
lines changed

4 files changed

+107
-20
lines changed

runtime/doc/eval.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1801,11 +1801,13 @@ arglistid( [{winnr} [, {tabnr}]])
18011801
Number argument list id
18021802
argv( {nr}) String {nr} entry of the argument list
18031803
argv() List the argument list
1804-
assert_equal( {exp}, {act} [, {msg}]) none assert {exp} equals {act}
1804+
assert_equal( {exp}, {act} [, {msg}]) none assert {exp} is equal to {act}
18051805
assert_exception( {error} [, {msg}]) none assert {error} is in v:exception
18061806
assert_fails( {cmd} [, {error}]) none assert {cmd} fails
18071807
assert_false( {actual} [, {msg}]) none assert {actual} is false
18081808
assert_match( {pat}, {text} [, {msg}]) none assert {pat} matches {text}
1809+
assert_notequal( {exp}, {act} [, {msg}]) none assert {exp} is not equal {act}
1810+
assert_notmatch( {pat}, {text} [, {msg}]) none assert {pat} not matches {text}
18091811
assert_true( {actual} [, {msg}]) none assert {actual} is true
18101812
asin( {expr}) Float arc sine of {expr}
18111813
atan( {expr}) Float arc tangent of {expr}
@@ -2338,6 +2340,16 @@ assert_match({pattern}, {actual} [, {msg}])
23382340
< Will result in a string to be added to |v:errors|:
23392341
test.vim line 12: Pattern '^f.*o$' does not match 'foobar' ~
23402342

2343+
*assert_notequal()*
2344+
assert_notequal({expected}, {actual} [, {msg}])
2345+
The opposite of `assert_equal()`: add an error message to
2346+
|v:errors| when {expected} and {actual} are equal.
2347+
2348+
*assert_notmatch()*
2349+
assert_notmatch({pattern}, {actual} [, {msg}])
2350+
The opposite of `assert_match()`: add an error message to
2351+
|v:errors| when {pattern} matches {actual}.
2352+
23412353
assert_true({actual} [, {msg}]) *assert_true()*
23422354
When {actual} is not true an error message is added to
23432355
|v:errors|, like with |assert_equal()|.

src/eval.c

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ static void f_assert_exception(typval_T *argvars, typval_T *rettv);
476476
static void f_assert_fails(typval_T *argvars, typval_T *rettv);
477477
static void f_assert_false(typval_T *argvars, typval_T *rettv);
478478
static void f_assert_match(typval_T *argvars, typval_T *rettv);
479+
static void f_assert_notequal(typval_T *argvars, typval_T *rettv);
480+
static void f_assert_notmatch(typval_T *argvars, typval_T *rettv);
479481
static void f_assert_true(typval_T *argvars, typval_T *rettv);
480482
#ifdef FEAT_FLOAT
481483
static void f_asin(typval_T *argvars, typval_T *rettv);
@@ -8182,6 +8184,8 @@ static struct fst
81828184
{"assert_fails", 1, 2, f_assert_fails},
81838185
{"assert_false", 1, 2, f_assert_false},
81848186
{"assert_match", 2, 3, f_assert_match},
8187+
{"assert_notequal", 2, 3, f_assert_notequal},
8188+
{"assert_notmatch", 2, 3, f_assert_notmatch},
81858189
{"assert_true", 1, 2, f_assert_true},
81868190
#ifdef FEAT_FLOAT
81878191
{"atan", 1, 1, f_atan},
@@ -9323,8 +9327,17 @@ f_argv(typval_T *argvars, typval_T *rettv)
93239327
alist_name(&ARGLIST[idx]), -1);
93249328
}
93259329

9330+
typedef enum
9331+
{
9332+
ASSERT_EQUAL,
9333+
ASSERT_NOTEQUAL,
9334+
ASSERT_MATCH,
9335+
ASSERT_NOTMATCH,
9336+
ASSERT_OTHER,
9337+
} assert_type_T;
9338+
93269339
static void prepare_assert_error(garray_T*gap);
9327-
static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv, int is_match);
9340+
static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv, assert_type_T is_match);
93289341
static void assert_error(garray_T *gap);
93299342
static void assert_bool(typval_T *argvars, int isTrue);
93309343

@@ -9400,7 +9413,7 @@ fill_assert_error(
94009413
char_u *exp_str,
94019414
typval_T *exp_tv,
94029415
typval_T *got_tv,
9403-
int is_match)
9416+
assert_type_T atype)
94049417
{
94059418
char_u numbuf[NUMBUFLEN];
94069419
char_u *tofree;
@@ -9412,7 +9425,7 @@ fill_assert_error(
94129425
}
94139426
else
94149427
{
9415-
if (is_match)
9428+
if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH)
94169429
ga_concat(gap, (char_u *)"Pattern ");
94179430
else
94189431
ga_concat(gap, (char_u *)"Expected ");
@@ -9423,8 +9436,12 @@ fill_assert_error(
94239436
}
94249437
else
94259438
ga_concat_esc(gap, exp_str);
9426-
if (is_match)
9439+
if (atype == ASSERT_MATCH)
94279440
ga_concat(gap, (char_u *)" does not match ");
9441+
else if (atype == ASSERT_NOTMATCH)
9442+
ga_concat(gap, (char_u *)" does match ");
9443+
else if (atype == ASSERT_NOTEQUAL)
9444+
ga_concat(gap, (char_u *)" differs from ");
94289445
else
94299446
ga_concat(gap, (char_u *)" but got ");
94309447
ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
@@ -9446,24 +9463,40 @@ assert_error(garray_T *gap)
94469463
list_append_string(vimvars[VV_ERRORS].vv_list, gap->ga_data, gap->ga_len);
94479464
}
94489465

9449-
/*
9450-
* "assert_equal(expected, actual[, msg])" function
9451-
*/
94529466
static void
9453-
f_assert_equal(typval_T *argvars, typval_T *rettv UNUSED)
9467+
assert_equal_common(typval_T *argvars, assert_type_T atype)
94549468
{
94559469
garray_T ga;
94569470

9457-
if (!tv_equal(&argvars[0], &argvars[1], FALSE, FALSE))
9471+
if (tv_equal(&argvars[0], &argvars[1], FALSE, FALSE)
9472+
!= (atype == ASSERT_EQUAL))
94589473
{
94599474
prepare_assert_error(&ga);
94609475
fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9461-
FALSE);
9476+
atype);
94629477
assert_error(&ga);
94639478
ga_clear(&ga);
94649479
}
94659480
}
94669481

9482+
/*
9483+
* "assert_equal(expected, actual[, msg])" function
9484+
*/
9485+
static void
9486+
f_assert_equal(typval_T *argvars, typval_T *rettv UNUSED)
9487+
{
9488+
assert_equal_common(argvars, ASSERT_EQUAL);
9489+
}
9490+
9491+
/*
9492+
* "assert_notequal(expected, actual[, msg])" function
9493+
*/
9494+
static void
9495+
f_assert_notequal(typval_T *argvars, typval_T *rettv UNUSED)
9496+
{
9497+
assert_equal_common(argvars, ASSERT_NOTEQUAL);
9498+
}
9499+
94679500
/*
94689501
* "assert_exception(string[, msg])" function
94699502
*/
@@ -9486,7 +9519,7 @@ f_assert_exception(typval_T *argvars, typval_T *rettv UNUSED)
94869519
{
94879520
prepare_assert_error(&ga);
94889521
fill_assert_error(&ga, &argvars[1], NULL, &argvars[0],
9489-
&vimvars[VV_EXCEPTION].vv_tv, FALSE);
9522+
&vimvars[VV_EXCEPTION].vv_tv, ASSERT_OTHER);
94909523
assert_error(&ga);
94919524
ga_clear(&ga);
94929525
}
@@ -9523,7 +9556,7 @@ f_assert_fails(typval_T *argvars, typval_T *rettv UNUSED)
95239556
{
95249557
prepare_assert_error(&ga);
95259558
fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
9526-
&vimvars[VV_ERRMSG].vv_tv, FALSE);
9559+
&vimvars[VV_ERRMSG].vv_tv, ASSERT_OTHER);
95279560
assert_error(&ga);
95289561
ga_clear(&ga);
95299562
}
@@ -9555,7 +9588,7 @@ assert_bool(typval_T *argvars, int isTrue)
95559588
prepare_assert_error(&ga);
95569589
fill_assert_error(&ga, &argvars[1],
95579590
(char_u *)(isTrue ? "True" : "False"),
9558-
NULL, &argvars[0], FALSE);
9591+
NULL, &argvars[0], ASSERT_OTHER);
95599592
assert_error(&ga);
95609593
ga_clear(&ga);
95619594
}
@@ -9570,11 +9603,8 @@ f_assert_false(typval_T *argvars, typval_T *rettv UNUSED)
95709603
assert_bool(argvars, FALSE);
95719604
}
95729605

9573-
/*
9574-
* "assert_match(pattern, actual[, msg])" function
9575-
*/
95769606
static void
9577-
f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
9607+
assert_match_common(typval_T *argvars, assert_type_T atype)
95789608
{
95799609
garray_T ga;
95809610
char_u buf1[NUMBUFLEN];
@@ -9584,16 +9614,34 @@ f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
95849614

95859615
if (pat == NULL || text == NULL)
95869616
EMSG(_(e_invarg));
9587-
else if (!pattern_match(pat, text, FALSE))
9617+
else if (pattern_match(pat, text, FALSE) != (atype == ASSERT_MATCH))
95889618
{
95899619
prepare_assert_error(&ga);
95909620
fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9591-
TRUE);
9621+
atype);
95929622
assert_error(&ga);
95939623
ga_clear(&ga);
95949624
}
95959625
}
95969626

9627+
/*
9628+
* "assert_match(pattern, actual[, msg])" function
9629+
*/
9630+
static void
9631+
f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
9632+
{
9633+
assert_match_common(argvars, ASSERT_MATCH);
9634+
}
9635+
9636+
/*
9637+
* "assert_notmatch(pattern, actual[, msg])" function
9638+
*/
9639+
static void
9640+
f_assert_notmatch(typval_T *argvars, typval_T *rettv UNUSED)
9641+
{
9642+
assert_match_common(argvars, ASSERT_NOTMATCH);
9643+
}
9644+
95979645
/*
95989646
* "assert_true(actual[, msg])" function
95999647
*/

src/testdir/test_assert.vim

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ func Test_assert_equal()
1818
call assert_equal(4, n)
1919
let l = [1, 2, 3]
2020
call assert_equal([1, 2, 3], l)
21+
22+
let s = 'foo'
23+
call assert_equal('bar', s)
24+
call assert_match("Expected 'bar' but got 'foo'", v:errors[0])
25+
call remove(v:errors, 0)
26+
endfunc
27+
28+
func Test_assert_notequal()
29+
let n = 4
30+
call assert_notequal('foo', n)
31+
let s = 'foo'
32+
call assert_notequal([1, 2, 3], s)
33+
34+
call assert_notequal('foo', s)
35+
call assert_match("Expected 'foo' differs from 'foo'", v:errors[0])
36+
call remove(v:errors, 0)
2137
endfunc
2238

2339
func Test_assert_exception()
@@ -74,6 +90,15 @@ func Test_match()
7490
call remove(v:errors, 0)
7591
endfunc
7692

93+
func Test_notmatch()
94+
call assert_notmatch('foo', 'bar')
95+
call assert_notmatch('^foobar$', 'foobars')
96+
97+
call assert_notmatch('foo', 'foobar')
98+
call assert_match("Pattern 'foo' does match 'foobar'", v:errors[0])
99+
call remove(v:errors, 0)
100+
endfunc
101+
77102
func Test_assert_fail_fails()
78103
call assert_fails('xxx', {})
79104
call assert_match("Expected {} but got 'E731:", v:errors[0])

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,8 @@ static char *(features[]) =
748748

749749
static int included_patches[] =
750750
{ /* Add new patch number below this line */
751+
/**/
752+
1703,
751753
/**/
752754
1702,
753755
/**/

0 commit comments

Comments
 (0)