diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-25 20:48:33 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-25 20:48:33 +0100 |
commit | 865767126e97d9ac65e052a657b29bbc32dcb512 (patch) | |
tree | 6f6a74f88ed36f13c18f42c8308f8ddb40525bd7 | |
parent | 240583869ae477202494dd01ef1e8e2bac650f10 (diff) |
patch 8.1.0819: a failed assert with a long string is hard to readv8.1.0819
Problem: A failed assert with a long string is hard to read.
Solution: Shorten the assert message.
-rw-r--r-- | src/eval.c | 88 | ||||
-rw-r--r-- | src/testdir/test_assert.vim | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 72 insertions, 22 deletions
diff --git a/src/eval.c b/src/eval.c index 67a006ec95..82de63e1f8 100644 --- a/src/eval.c +++ b/src/eval.c @@ -9495,14 +9495,54 @@ assert_fails(typval_T *argvars) } /* + * Append "p[clen]" to "gap", escaping unprintable characters. + * Changes NL to \n, CR to \r, etc. + */ + static void +ga_concat_esc(garray_T *gap, char_u *p, int clen) +{ + char_u buf[NUMBUFLEN]; + + if (clen > 1) + { + mch_memmove(buf, p, clen); + buf[clen] = NUL; + ga_concat(gap, buf); + } + else switch (*p) + { + case BS: ga_concat(gap, (char_u *)"\\b"); break; + case ESC: ga_concat(gap, (char_u *)"\\e"); break; + case FF: ga_concat(gap, (char_u *)"\\f"); break; + case NL: ga_concat(gap, (char_u *)"\\n"); break; + case TAB: ga_concat(gap, (char_u *)"\\t"); break; + case CAR: ga_concat(gap, (char_u *)"\\r"); break; + case '\\': ga_concat(gap, (char_u *)"\\\\"); break; + default: + if (*p < ' ') + { + vim_snprintf((char *)buf, NUMBUFLEN, "\\x%02x", *p); + ga_concat(gap, buf); + } + else + ga_append(gap, *p); + break; + } +} + +/* * Append "str" to "gap", escaping unprintable characters. * Changes NL to \n, CR to \r, etc. */ static void -ga_concat_esc(garray_T *gap, char_u *str) +ga_concat_shorten_esc(garray_T *gap, char_u *str) { char_u *p; + char_u *s; + int c; + int clen; char_u buf[NUMBUFLEN]; + int same_len; if (str == NULL) { @@ -9511,25 +9551,29 @@ ga_concat_esc(garray_T *gap, char_u *str) } for (p = str; *p != NUL; ++p) - switch (*p) - { - case BS: ga_concat(gap, (char_u *)"\\b"); break; - case ESC: ga_concat(gap, (char_u *)"\\e"); break; - case FF: ga_concat(gap, (char_u *)"\\f"); break; - case NL: ga_concat(gap, (char_u *)"\\n"); break; - case TAB: ga_concat(gap, (char_u *)"\\t"); break; - case CAR: ga_concat(gap, (char_u *)"\\r"); break; - case '\\': ga_concat(gap, (char_u *)"\\\\"); break; - default: - if (*p < ' ') - { - vim_snprintf((char *)buf, NUMBUFLEN, "\\x%02x", *p); - ga_concat(gap, buf); - } - else - ga_append(gap, *p); - break; + { + same_len = 1; + s = p; + c = mb_ptr2char_adv(&s); + clen = s - p; + while (*s != NUL && c == mb_ptr2char(s)) + { + ++same_len; + s += clen; + } + if (same_len > 20) + { + ga_concat(gap, (char_u *)"\\["); + ga_concat_esc(gap, p, clen); + ga_concat(gap, (char_u *)" occurs "); + vim_snprintf((char *)buf, NUMBUFLEN, "%d", same_len); + ga_concat(gap, buf); + ga_concat(gap, (char_u *)" times]"); + p = s - 1; } + else + ga_concat_esc(gap, p, clen); + } } /* @@ -9562,11 +9606,11 @@ fill_assert_error( ga_concat(gap, (char_u *)"Expected "); if (exp_str == NULL) { - ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0)); + ga_concat_shorten_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0)); vim_free(tofree); } else - ga_concat_esc(gap, exp_str); + ga_concat_shorten_esc(gap, exp_str); if (atype != ASSERT_NOTEQUAL) { if (atype == ASSERT_MATCH) @@ -9575,7 +9619,7 @@ fill_assert_error( ga_concat(gap, (char_u *)" does match "); else ga_concat(gap, (char_u *)" but got "); - ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0)); + ga_concat_shorten_esc(gap, tv2string(got_tv, &tofree, numbuf, 0)); vim_free(tofree); } } diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim index fb31478aa4..298a6db15a 100644 --- a/src/testdir/test_assert.vim +++ b/src/testdir/test_assert.vim @@ -31,6 +31,10 @@ func Test_assert_equal() call assert_equal(1, assert_equal('bar', s)) call assert_match("Expected 'bar' but got 'foo'", v:errors[0]) call remove(v:errors, 0) + + call assert_equal('XxxxxxxxxxxxxxxxxxxxxxX', 'XyyyyyyyyyyyyyyyyyyyyyyyyyX') + call assert_match("Expected 'X\\\\\\[x occurs 21 times]X' but got 'X\\\\\\[y occurs 25 times]X'", v:errors[0]) + call remove(v:errors, 0) endfunc func Test_assert_equalfile() diff --git a/src/version.c b/src/version.c index 4beae276fd..3a75c99fc4 100644 --- a/src/version.c +++ b/src/version.c @@ -788,6 +788,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 819, +/**/ 818, /**/ 817, |