summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-05 20:38:22 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-05 20:38:22 +0100
commit07ada5ff2fd8f22ed3233ae5c4ddf87c7b3f56fe (patch)
tree0be9740166fea1f37b2a447558c7eed059b5a671
parent94255df057afa0b7dde77612f3274d4440871bd1 (diff)
patch 8.2.0212: missing search/substitute pattern hardly testedv8.2.0212
Problem: Missing search/substitute pattern hardly tested. Solution: Add test_clear_search_pat() and tests. (Yegappan Lakshmanan, closes #5579)
-rw-r--r--runtime/doc/eval.txt1
-rw-r--r--runtime/doc/testing.txt5
-rw-r--r--runtime/doc/usr_41.txt1
-rw-r--r--src/evalfunc.c1
-rw-r--r--src/proto/regexp.pro1
-rw-r--r--src/proto/search.pro1
-rw-r--r--src/proto/testing.pro1
-rw-r--r--src/regexp.c9
-rw-r--r--src/search.c6
-rw-r--r--src/testdir/test_quickfix.vim4
-rw-r--r--src/testdir/test_search.vim41
-rw-r--r--src/testdir/test_sort.vim2
-rw-r--r--src/testdir/test_substitute.vim15
-rw-r--r--src/testing.c13
-rw-r--r--src/version.c2
15 files changed, 103 insertions, 0 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 1d282d286b..26e7d12de4 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2848,6 +2848,7 @@ term_wait({buf} [, {time}]) Number wait for screen to be updated
test_alloc_fail({id}, {countdown}, {repeat})
none make memory allocation fail
test_autochdir() none enable 'autochdir' during startup
+test_clear_search_pat() none clears the last used search pattern
test_feedinput({string}) none add key sequence to input buffer
test_garbagecollect_now() none free memory right now for testing
test_garbagecollect_soon() none free memory soon for testing
diff --git a/runtime/doc/testing.txt b/runtime/doc/testing.txt
index c5fa2e83cc..7fb24e6307 100644
--- a/runtime/doc/testing.txt
+++ b/runtime/doc/testing.txt
@@ -52,6 +52,11 @@ test_autochdir() *test_autochdir()*
startup has finished.
+test_clear_search_pat() *test_clear_search_pat()*
+ Clears the last used search pattern (|/|) and the substitute
+ pattern (|:s|). This is useful for testing conditions where
+ these patterns are not set previously.
+
test_feedinput({string}) *test_feedinput()*
Characters in {string} are queued for processing as if they
were typed by the user. This uses a low level input buffer.
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
index 1bed01f418..316eebcaea 100644
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -963,6 +963,7 @@ Testing: *test-functions*
assert_report() report a test failure
test_alloc_fail() make memory allocation fail
test_autochdir() enable 'autochdir' during startup
+ test_clear_search_pat() clears the last used search pattern
test_override() test with Vim internal overrides
test_garbagecollect_now() free memory right now
test_getvalue() get value of an internal variable
diff --git a/src/evalfunc.c b/src/evalfunc.c
index a79cc89329..aac8ee9058 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -810,6 +810,7 @@ static funcentry_T global_functions[] =
#endif
{"test_alloc_fail", 3, 3, FEARG_1, &t_void, f_test_alloc_fail},
{"test_autochdir", 0, 0, 0, &t_void, f_test_autochdir},
+ {"test_clear_search_pat", 0, 0, 0, &t_void, f_test_clear_search_pat},
{"test_feedinput", 1, 1, FEARG_1, &t_void, f_test_feedinput},
{"test_garbagecollect_now", 0, 0, 0, &t_void, f_test_garbagecollect_now},
{"test_garbagecollect_soon", 0, 0, 0, &t_void, f_test_garbagecollect_soon},
diff --git a/src/proto/regexp.pro b/src/proto/regexp.pro
index 01f1fff0d7..5e8e1a58a6 100644
--- a/src/proto/regexp.pro
+++ b/src/proto/regexp.pro
@@ -12,6 +12,7 @@ int vim_regcomp_had_eol(void);
regprog_T *vim_regcomp(char_u *expr_arg, int re_flags);
void vim_regfree(regprog_T *prog);
void free_regexp_stuff(void);
+void free_regexp_prev_sub(void);
int regprog_in_use(regprog_T *prog);
int vim_regexec_prog(regprog_T **prog, int ignore_case, char_u *line, colnr_T col);
int vim_regexec(regmatch_T *rmp, char_u *line, colnr_T col);
diff --git a/src/proto/search.pro b/src/proto/search.pro
index e6ac11b2cb..3b46c0662c 100644
--- a/src/proto/search.pro
+++ b/src/proto/search.pro
@@ -9,6 +9,7 @@ void free_search_patterns(void);
void save_last_search_pattern(void);
void restore_last_search_pattern(void);
char_u *last_search_pattern(void);
+void free_last_pat(int idx);
int ignorecase(char_u *pat);
int ignorecase_opt(char_u *pat, int ic_in, int scs);
int pat_has_uppercase(char_u *pat);
diff --git a/src/proto/testing.pro b/src/proto/testing.pro
index 2b001a543a..209abf3486 100644
--- a/src/proto/testing.pro
+++ b/src/proto/testing.pro
@@ -13,6 +13,7 @@ void f_assert_report(typval_T *argvars, typval_T *rettv);
void f_assert_true(typval_T *argvars, typval_T *rettv);
void f_test_alloc_fail(typval_T *argvars, typval_T *rettv);
void f_test_autochdir(typval_T *argvars, typval_T *rettv);
+void f_test_clear_search_pat(typval_T *argvars, typval_T *rettv);
void f_test_feedinput(typval_T *argvars, typval_T *rettv);
void f_test_getvalue(typval_T *argvars, typval_T *rettv);
void f_test_option_not_set(typval_T *argvars, typval_T *rettv);
diff --git a/src/regexp.c b/src/regexp.c
index ef3896c0a4..7aeddb83cd 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -2663,6 +2663,15 @@ free_regexp_stuff(void)
}
#endif
+/*
+ * Free the previously used substitute search pattern.
+ */
+ void
+free_regexp_prev_sub(void)
+{
+ VIM_CLEAR(reg_prev_sub);
+}
+
#ifdef FEAT_EVAL
static void
report_re_switch(char_u *pat)
diff --git a/src/search.c b/src/search.c
index 3b310dc2a9..08915578fc 100644
--- a/src/search.c
+++ b/src/search.c
@@ -380,6 +380,12 @@ last_search_pattern(void)
}
#endif
+ void
+free_last_pat(int idx)
+{
+ VIM_CLEAR(spats[idx].pat);
+}
+
/*
* Return TRUE when case should be ignored for search pattern "pat".
* Uses the 'ignorecase' and 'smartcase' options.
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 129b1cfccb..79ad82d2d6 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -2718,6 +2718,10 @@ func XvimgrepTests(cchar)
call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
call assert_equal([], getbufinfo('Xtestfile2'))
+ " Test with the last search pattern not set
+ call test_clear_search_pat()
+ call assert_fails('Xvimgrep // *', 'E35:')
+
call delete('Xtestfile1')
call delete('Xtestfile2')
endfunc
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 89ca6e1314..69d007354e 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1455,3 +1455,44 @@ func Test_search_special()
set t_PE=
exe "norm /\x80PS"
endfunc
+
+" Test for command failures when the last search pattern is not set.
+func Test_search_with_no_last_pat()
+ call test_clear_search_pat()
+ call assert_fails("normal i\<C-R>/\e", 'E35:')
+ call assert_fails("exe '/'", 'E35:')
+ call assert_fails("exe '?'", 'E35:')
+ call assert_fails("/", 'E35:')
+ call assert_fails("?", 'E35:')
+ call assert_fails("normal n", 'E35:')
+ call assert_fails("normal N", 'E35:')
+ call assert_fails("normal gn", 'E35:')
+ call assert_fails("normal gN", 'E35:')
+ call assert_fails("normal cgn", 'E35:')
+ call assert_fails("normal cgN", 'E35:')
+ let p = []
+ let p = @/
+ call assert_equal('', p)
+ call assert_fails("normal :\<C-R>/", 'E35:')
+ call assert_fails("//p", 'E35:')
+ call assert_fails(";//p", 'E35:')
+ call assert_fails("??p", 'E35:')
+ call assert_fails(";??p", 'E35:')
+ call assert_fails('g//p', 'E476:')
+ call assert_fails('v//p', 'E476:')
+endfunc
+
+" Test for using tilde (~) atom in search. This should use the last used
+" substitute pattern
+func Test_search_tilde_pat()
+ call test_clear_search_pat()
+ set regexpengine=1
+ call assert_fails('exe "normal /~\<CR>"', 'E33:')
+ call assert_fails('exe "normal ?~\<CR>"', 'E33:')
+ set regexpengine=2
+ call assert_fails('exe "normal /~\<CR>"', 'E383:')
+ call assert_fails('exe "normal ?~\<CR>"', 'E383:')
+ set regexpengine&
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_sort.vim b/src/testdir/test_sort.vim
index b7c68f072f..f6ad87af18 100644
--- a/src/testdir/test_sort.vim
+++ b/src/testdir/test_sort.vim
@@ -1383,6 +1383,8 @@ func Test_sort_last_search_pat()
call setline(1, ['3b', '1c', '2a'])
sort //
call assert_equal(['2a', '3b', '1c'], getline(1, '$'))
+ call test_clear_search_pat()
+ call assert_fails('sort //', 'E35:')
close!
endfunc
diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim
index 4db7b3ea4c..acc59cf564 100644
--- a/src/testdir/test_substitute.vim
+++ b/src/testdir/test_substitute.vim
@@ -803,4 +803,19 @@ func Test_sub_expand_text()
close!
endfunc
+" Test for command failures when the last substitute pattern is not set.
+func Test_sub_with_no_last_pat()
+ call test_clear_search_pat()
+ call assert_fails('~', 'E33:')
+ call assert_fails('s//abc/g', 'E476:')
+ call assert_fails('s\/bar', 'E476:')
+ call assert_fails('s\&bar&', 'E476:')
+
+ call test_clear_search_pat()
+ let save_cpo = &cpo
+ set cpo+=/
+ call assert_fails('s/abc/%/', 'E33:')
+ let &cpo = save_cpo
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testing.c b/src/testing.c
index 5dacf073b3..c2b382b8b6 100644
--- a/src/testing.c
+++ b/src/testing.c
@@ -632,6 +632,19 @@ f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
}
/*
+ * "test_clear_search_pat()"
+ * Free the last search and substitute patterns
+ */
+ void
+f_test_clear_search_pat(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+ free_last_pat(RE_SUBST);
+ free_last_pat(RE_SEARCH);
+ set_old_sub(NULL);
+ free_regexp_prev_sub();
+}
+
+/*
* "test_feedinput()"
*/
void
diff --git a/src/version.c b/src/version.c
index a482b034a6..af6ecdfda9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 212,
+/**/
211,
/**/
210,