From 5f69fee26e0688c1646c8724ab794cb0c8d7c44d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 11:58:40 +0100 Subject: [PATCH 1/9] patch 8.0.0434: clang version not correctly detected Problem: Clang version not correctly detected. Solution: Adjust the configure script. (Kazunobu Kuriyama) --- src/auto/configure | 33 ++++++++++++++++++++++++++------- src/configure.ac | 20 ++++++++++++++++---- src/version.c | 2 ++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/auto/configure b/src/auto/configure index b4745ea80a..34770f8baf 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -4114,9 +4114,9 @@ if test "$GCC" = yes; then fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for recent clang version" >&5 -$as_echo_n "checking for recent clang version... " >&6; } -CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang version" >&5 +$as_echo_n "checking for clang version... " >&6; } +CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'` if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_MAJOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*/\1/p'` CLANG_MINOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*/\1/p'` @@ -4124,12 +4124,19 @@ if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_VERSION=`expr $CLANG_MAJOR '*' 1000000 '+' $CLANG_MINOR '*' 1000 '+' $CLANG_REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLANG_VERSION" >&5 $as_echo "$CLANG_VERSION" >&6; } - if test "$CLANG_VERSION" -ge 500002075 ; then - CFLAGS=`echo "$CFLAGS" | sed -n -e 's/-fno-strength-reduce/ /p'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if clang supports -fno-strength-reduce" >&5 +$as_echo_n "checking if clang supports -fno-strength-reduce... " >&6; } + if test "$CLANG_VERSION" -ge 500002075 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: N/A" >&5 +$as_echo "N/A" >&6; } fi CROSS_COMPILING= @@ -10094,6 +10101,18 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /proc/self/exe" >&5 +$as_echo_n "checking for /proc/self/exe... " >&6; } +if test -L "/proc/self/exe"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_PROC_SELF_EXE 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CYGWIN or MSYS environment" >&5 $as_echo_n "checking for CYGWIN or MSYS environment... " >&6; } case `uname` in diff --git a/src/configure.ac b/src/configure.ac index 1706a8d9a4..113fad1d21 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -67,8 +67,8 @@ dnl clang-500.2.75 or around has abandoned -f[no-]strength-reduce and issues a dnl warning when that flag is passed to. Accordingly, adjust CFLAGS based on dnl the version number of the clang in use. dnl Note that this does not work to get the version of clang 3.1 or 3.2. -AC_MSG_CHECKING(for recent clang version) -CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang.*\([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\).*$/\1/p'` +AC_MSG_CHECKING(for clang version) +CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang[[^0-9]]*\([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\).*$/\1/p'` if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_MAJOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/\([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*/\1/p'` CLANG_MINOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*/\1/p'` @@ -79,11 +79,15 @@ if test x"$CLANG_VERSION_STRING" != x"" ; then dnl change the constant 500002075 below appropriately. To get the dnl integer corresponding to a version number, refer to the dnl definition of CLANG_VERSION above. + AC_MSG_CHECKING(if clang supports -fno-strength-reduce) if test "$CLANG_VERSION" -ge 500002075 ; then - CFLAGS=`echo "$CFLAGS" | sed -n -e 's/-fno-strength-reduce/ /p'` + AC_MSG_RESULT(no) + CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` + else + AC_MSG_RESULT(yes) fi else - AC_MSG_RESULT(no) + AC_MSG_RESULT(N/A) fi dnl If configure thinks we are cross compiling, there might be something @@ -3016,6 +3020,14 @@ dnl --------------------------------------------------------------------------- dnl end of GUI-checking dnl --------------------------------------------------------------------------- +AC_MSG_CHECKING([for /proc/self/exe]) +if test -L "/proc/self/exe"; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PROC_SELF_EXE) +else + AC_MSG_RESULT(no) +fi + dnl Check for Cygwin, which needs an extra source file if not using X11 AC_MSG_CHECKING(for CYGWIN or MSYS environment) case `uname` in diff --git a/src/version.c b/src/version.c index cbb1bba284..2a032c5bec 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 434, /**/ 433, /**/ From 41042f3cfdb91f946e553456278a995e61dd8578 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 12:09:32 +0100 Subject: [PATCH 2/9] patch 8.0.0435: some functions are not tested Problem: Some functions are not tested. Solution: Add more tests for functions. (Dominique Pelle, closes #1541) --- src/testdir/test_functions.vim | 248 +++++++++++++++++++++++++++++++++ src/version.c | 2 + 2 files changed, 250 insertions(+) diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index cd58f63fd0..af877e49b1 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -27,6 +27,13 @@ func Test_empty() call assert_equal(1, empty(v:false)) call assert_equal(0, empty(v:true)) + if has('channel') + call assert_equal(1, empty(test_null_channel())) + endif + if has('job') + call assert_equal(1, empty(test_null_job())) + endif + call assert_equal(0, empty(function('Test_empty'))) endfunc @@ -467,6 +474,247 @@ func Test_getbufvar() set fileformats& endfunc +func Test_bufexists() + call assert_equal(0, bufexists('does_not_exist')) + call assert_equal(1, bufexists(bufnr('%'))) + call assert_equal(0, bufexists(0)) + new Xfoo + let bn = bufnr('%') + call assert_equal(1, bufexists(bn)) + call assert_equal(1, bufexists('Xfoo')) + call assert_equal(1, bufexists(getcwd() . '/Xfoo')) + call assert_equal(1, bufexists(0)) + bw + call assert_equal(0, bufexists(bn)) + call assert_equal(0, bufexists('Xfoo')) +endfunc + +func Test_last_buffer_nr() + call assert_equal(bufnr('$'), last_buffer_nr()) +endfunc + +func Test_stridx() + call assert_equal(-1, stridx('', 'l')) + call assert_equal(0, stridx('', '')) + call assert_equal(0, stridx('hello', '')) + call assert_equal(-1, stridx('hello', 'L')) + call assert_equal(2, stridx('hello', 'l', -1)) + call assert_equal(2, stridx('hello', 'l', 0)) + call assert_equal(2, stridx('hello', 'l', 1)) + call assert_equal(3, stridx('hello', 'l', 3)) + call assert_equal(-1, stridx('hello', 'l', 4)) + call assert_equal(-1, stridx('hello', 'l', 10)) + call assert_equal(2, stridx('hello', 'll')) + call assert_equal(-1, stridx('hello', 'hello world')) +endfunc + +func Test_strridx() + call assert_equal(-1, strridx('', 'l')) + call assert_equal(0, strridx('', '')) + call assert_equal(5, strridx('hello', '')) + call assert_equal(-1, strridx('hello', 'L')) + call assert_equal(3, strridx('hello', 'l')) + call assert_equal(3, strridx('hello', 'l', 10)) + call assert_equal(3, strridx('hello', 'l', 3)) + call assert_equal(2, strridx('hello', 'l', 2)) + call assert_equal(-1, strridx('hello', 'l', 1)) + call assert_equal(-1, strridx('hello', 'l', 0)) + call assert_equal(-1, strridx('hello', 'l', -1)) + call assert_equal(2, strridx('hello', 'll')) + call assert_equal(-1, strridx('hello', 'hello world')) +endfunc + +func Test_matchend() + call assert_equal(7, matchend('testing', 'ing')) + call assert_equal(7, matchend('testing', 'ing', 2)) + call assert_equal(-1, matchend('testing', 'ing', 5)) +endfunc + +func Test_nextnonblank_prevnonblank() + new +insert +This + + +is + +a +Test +. + call assert_equal(0, nextnonblank(-1)) + call assert_equal(0, nextnonblank(0)) + call assert_equal(1, nextnonblank(1)) + call assert_equal(4, nextnonblank(2)) + call assert_equal(4, nextnonblank(3)) + call assert_equal(4, nextnonblank(4)) + call assert_equal(6, nextnonblank(5)) + call assert_equal(6, nextnonblank(6)) + call assert_equal(7, nextnonblank(7)) + call assert_equal(0, nextnonblank(8)) + + call assert_equal(0, prevnonblank(-1)) + call assert_equal(0, prevnonblank(0)) + call assert_equal(1, prevnonblank(1)) + call assert_equal(1, prevnonblank(2)) + call assert_equal(1, prevnonblank(3)) + call assert_equal(4, prevnonblank(4)) + call assert_equal(4, prevnonblank(5)) + call assert_equal(6, prevnonblank(6)) + call assert_equal(7, prevnonblank(7)) + call assert_equal(0, prevnonblank(8)) + bw! +endfunc + +func Test_byte2line_line2byte() + new + call setline(1, ['a', 'bc', 'd']) + + set fileformat=unix + call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], + \ map(range(-1, 8), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 3, 6, 8, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat=mac + call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], + \ map(range(-1, 8), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 3, 6, 8, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat=dos + call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], + \ map(range(-1, 11), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 4, 8, 11, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat& + bw! +endfunc + +func Test_count() + let l = ['a', 'a', 'A', 'b'] + call assert_equal(2, count(l, 'a')) + call assert_equal(1, count(l, 'A')) + call assert_equal(1, count(l, 'b')) + call assert_equal(0, count(l, 'B')) + + call assert_equal(2, count(l, 'a', 0)) + call assert_equal(1, count(l, 'A', 0)) + call assert_equal(1, count(l, 'b', 0)) + call assert_equal(0, count(l, 'B', 0)) + + call assert_equal(3, count(l, 'a', 1)) + call assert_equal(3, count(l, 'A', 1)) + call assert_equal(1, count(l, 'b', 1)) + call assert_equal(1, count(l, 'B', 1)) + call assert_equal(0, count(l, 'c', 1)) + + call assert_equal(1, count(l, 'a', 0, 1)) + call assert_equal(2, count(l, 'a', 1, 1)) + call assert_fails('call count(l, "a", 0, 10)', 'E684:') + + let d = {1: 'a', 2: 'a', 3: 'A', 4: 'b'} + call assert_equal(2, count(d, 'a')) + call assert_equal(1, count(d, 'A')) + call assert_equal(1, count(d, 'b')) + call assert_equal(0, count(d, 'B')) + + call assert_equal(2, count(d, 'a', 0)) + call assert_equal(1, count(d, 'A', 0)) + call assert_equal(1, count(d, 'b', 0)) + call assert_equal(0, count(d, 'B', 0)) + + call assert_equal(3, count(d, 'a', 1)) + call assert_equal(3, count(d, 'A', 1)) + call assert_equal(1, count(d, 'b', 1)) + call assert_equal(1, count(d, 'B', 1)) + call assert_equal(0, count(d, 'c', 1)) + + call assert_fails('call count(d, "a", 0, 1)', 'E474:') + call assert_fails('call count("a", "a")', 'E712:') +endfunc + +func Test_changenr() + new Xchangenr + call assert_equal(0, changenr()) + norm ifoo + call assert_equal(1, changenr()) + set undolevels=10 + norm Sbar + call assert_equal(2, changenr()) + undo + call assert_equal(1, changenr()) + redo + call assert_equal(2, changenr()) + bw! + set undolevels& +endfunc + +func Test_filewritable() + new Xfilewritable + write! + call assert_equal(1, filewritable('Xfilewritable')) + + call assert_notequal(0, setfperm('Xfilewritable', 'r--r-----')) + call assert_equal(0, filewritable('Xfilewritable')) + + call assert_notequal(0, setfperm('Xfilewritable', 'rw-r-----')) + call assert_equal(1, filewritable('Xfilewritable')) + + call assert_equal(0, filewritable('doesnotexist')) + + call delete('Xfilewritable') + bw! +endfunc + +func Test_hostname() + let hostname_vim = hostname() + if has('unix') + let hostname_system = systemlist('uname -n')[0] + call assert_equal(hostname_vim, hostname_system) + endif +endfunc + +func Test_getpid() + " getpid() always returns the same value within a vim instance. + call assert_equal(getpid(), getpid()) + if has('unix') + call assert_equal(systemlist('echo $PPID')[0], string(getpid())) + endif +endfunc + +func Test_hlexists() + call assert_equal(0, hlexists('does_not_exist')) + call assert_equal(0, hlexists('Number')) + call assert_equal(0, highlight_exists('does_not_exist')) + call assert_equal(0, highlight_exists('Number')) + syntax on + call assert_equal(0, hlexists('does_not_exist')) + call assert_equal(1, hlexists('Number')) + call assert_equal(0, highlight_exists('does_not_exist')) + call assert_equal(1, highlight_exists('Number')) + syntax off +endfunc + +func Test_col() + new + call setline(1, 'abcdef') + norm gg4|mx6|mY2| + call assert_equal(2, col('.')) + call assert_equal(7, col('$')) + call assert_equal(4, col("'x")) + call assert_equal(6, col("'Y")) + call assert_equal(2, col([1, 2])) + call assert_equal(7, col([1, '$'])) + + call assert_equal(0, col('')) + call assert_equal(0, col('x')) + call assert_equal(0, col([2, '$'])) + call assert_equal(0, col([1, 100])) + call assert_equal(0, col([1])) + bw! +endfunc + func Test_balloon_show() if has('balloon_eval') " This won't do anything but must not crash either. diff --git a/src/version.c b/src/version.c index 2a032c5bec..1eea36e91c 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 435, /**/ 434, /**/ From ee1dd1cdc1f9a07e53b792e8762f515213b10c8a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 13:55:01 +0100 Subject: [PATCH 3/9] patch 8.0.0436: running the options test sometimes resizes the terminal Problem: Running the options test sometimes resizes the terminal. Solution: Clear out t_WS. --- src/testdir/gen_opt_test.vim | 3 +++ src/version.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim index 4701981ee8..16723be04c 100644 --- a/src/testdir/gen_opt_test.vim +++ b/src/testdir/gen_opt_test.vim @@ -7,10 +7,13 @@ if 1 set nomore +" The terminal size is restored at the end. +" Clear out t_WS, we don't want to resize the actual terminal. let script = [ \ 'let save_columns = &columns', \ 'let save_lines = &lines', \ 'let save_term = &term', + \ 'set t_WS=', \ ] /#define p_term diff --git a/src/version.c b/src/version.c index 1eea36e91c..870b66b46e 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 436, /**/ 435, /**/ From 644df41c44cbdfacdedbba55ef77a6c6031eccd8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 13:58:02 +0100 Subject: [PATCH 4/9] patch 8.0.0437: packadd test does not fully work Problem: The packadd test does not create the symlink correctly and does not test the right thing. Solution: Create the directory and symlink correctly. --- src/testdir/test_packadd.vim | 5 +++-- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim index 9d4c6d8fe1..7dcaa60622 100644 --- a/src/testdir/test_packadd.vim +++ b/src/testdir/test_packadd.vim @@ -71,11 +71,12 @@ endfunc func Test_packadd_symlink_dir() if !has('unix') - return + return endif let top2_dir = s:topdir . '/Xdir2' let real_dir = s:topdir . '/Xsym' - exec "silent !ln -s" real_dir top2_dir + call mkdir(real_dir, 'p') + exec "silent !ln -s Xsym" top2_dir let &rtp = top2_dir . ',' . top2_dir . '/after' let &packpath = &rtp diff --git a/src/version.c b/src/version.c index 870b66b46e..413c2c1de5 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 437, /**/ 436, /**/ From 056f700031602a2734b1ddf45f6bc2817e49b996 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 14:00:27 +0100 Subject: [PATCH 5/9] patch 8.0.0438: the fnamemodify test may cause later tests to fail Problem: The fnamemodify test changes 'shell' in a way later tests may not be able to use system(). Solution: Save and restore 'shell'. --- src/testdir/test_fnamemodify.vim | 6 +++++- src/version.c | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_fnamemodify.vim b/src/testdir/test_fnamemodify.vim index 2267e18e3b..1c2a80d0ee 100644 --- a/src/testdir/test_fnamemodify.vim +++ b/src/testdir/test_fnamemodify.vim @@ -1,6 +1,8 @@ " Test filename modifiers. func Test_fnamemodify() + let save_home = $HOME + let save_shell = &shell let $HOME = fnamemodify('.', ':p:h:h') set shell=sh @@ -39,7 +41,9 @@ func Test_fnamemodify() call assert_equal("'abc\ndef'", fnamemodify("abc\ndef", ':S')) set shell=tcsh call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S')) - set shell& + + let $HOME = save_home + let &shell = save_shell endfunc func Test_expand() diff --git a/src/version.c b/src/version.c index 413c2c1de5..811a3d6a98 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 438, /**/ 437, /**/ From 69a92fb5aecdf2f9d5f6947790b18991b22d0e4c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 15:58:30 +0100 Subject: [PATCH 6/9] patch 8.0.0439: ":%argdel" gives an error for an empty arglist Problem: Using ":%argdel" while the argument list is already empty gives an error. (Pavol Juhas) Solution: Don't give an error. (closes #1546) --- src/ex_cmds2.c | 9 ++++++++- src/testdir/test_arglist.vim | 4 ++++ src/version.c | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 5ecb1f3d6b..f8d35dc73d 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2832,8 +2832,15 @@ ex_argdelete(exarg_T *eap) if (eap->line2 > ARGCOUNT) eap->line2 = ARGCOUNT; n = eap->line2 - eap->line1 + 1; - if (*eap->arg != NUL || n <= 0) + if (*eap->arg != NUL) + /* Can't have both a range and an argument. */ EMSG(_(e_invarg)); + else if (n <= 0) + { + /* Don't give an error for ":%argdel" if the list is empty. */ + if (eap->line1 != 1 || eap->line2 != 0) + EMSG(_(e_invrange)); + } else { for (i = eap->line1; i <= eap->line2; ++i) diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim index 0caead8482..d18035b3b4 100644 --- a/src/testdir/test_arglist.vim +++ b/src/testdir/test_arglist.vim @@ -6,6 +6,10 @@ func Test_argidx() call assert_equal(2, argidx()) %argdelete call assert_equal(0, argidx()) + " doing it again doesn't result in an error + %argdelete + call assert_equal(0, argidx()) + call assert_fails('2argdelete', 'E16:') args a b c call assert_equal(0, argidx()) diff --git a/src/version.c b/src/version.c index 811a3d6a98..277f2d99e3 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 439, /**/ 438, /**/ From eb992cb90fd79c77ad2743459ac898e6ac3de939 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 18:20:16 +0100 Subject: [PATCH 7/9] patch 8.0.0440: not enough test coverage in Insert mode Problem: Not enough test coverage in Insert mode. Solution: Add lots of tests. Add test_override(). (Christian Brabandt, closes #1521) --- runtime/doc/eval.txt | 2 +- src/Makefile | 1 + src/edit.c | 5 +- src/evalfunc.c | 32 +- src/globals.h | 2 + src/screen.c | 7 +- src/testdir/Make_all.mak | 1 + src/testdir/runtest.vim | 5 +- src/testdir/test_assert.vim | 8 + src/testdir/test_cursor_func.vim | 4 +- src/testdir/test_edit.vim | 1324 ++++++++++++++++++++++++++++++ src/testdir/test_search.vim | 8 +- src/version.c | 2 + 13 files changed, 1386 insertions(+), 15 deletions(-) create mode 100644 src/testdir/test_edit.vim diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 48c1a78e88..f731fba2eb 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2360,7 +2360,6 @@ tempname() String name for a temporary file test_alloc_fail({id}, {countdown}, {repeat}) none make memory allocation fail test_autochdir() none enable 'autochdir' during startup -test_disable_char_avail({expr}) none test without typeahead test_garbagecollect_now() none free memory right now for testing test_ignore_error({expr}) none ignore a specific error test_null_channel() Channel null value for testing @@ -2369,6 +2368,7 @@ test_null_job() Job null value for testing test_null_list() List null value for testing test_null_partial() Funcref null value for testing test_null_string() String null value for testing +test_override({expr}, {val}) none test with Vim internal overrides test_settime({expr}) none set current time for testing timer_info([{id}]) List information about timers timer_pause({id}, {pause}) none pause or unpause a timer diff --git a/src/Makefile b/src/Makefile index 2df360a2b4..02388364a2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2111,6 +2111,7 @@ test_arglist \ test_digraph \ test_functions \ test_display \ + test_edit \ test_ex_undo \ test_execute_func \ test_expand \ diff --git a/src/edit.c b/src/edit.c index 6621515b57..065b030f6b 100644 --- a/src/edit.c +++ b/src/edit.c @@ -2262,7 +2262,10 @@ has_compl_option(int dict_opt) vim_beep(BO_COMPL); setcursor(); out_flush(); - ui_delay(2000L, FALSE); +#ifdef FEAT_EVAL + if (!get_vim_var_nr(VV_TESTING)) +#endif + ui_delay(2000L, FALSE); } return FALSE; } diff --git a/src/evalfunc.c b/src/evalfunc.c index 20c5f8975c..c30b57ba14 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -390,7 +390,7 @@ static void f_tagfiles(typval_T *argvars, typval_T *rettv); static void f_tempname(typval_T *argvars, typval_T *rettv); static void f_test_alloc_fail(typval_T *argvars, typval_T *rettv); static void f_test_autochdir(typval_T *argvars, typval_T *rettv); -static void f_test_disable_char_avail(typval_T *argvars, typval_T *rettv); +static void f_test_override(typval_T *argvars, typval_T *rettv); static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv); static void f_test_ignore_error(typval_T *argvars, typval_T *rettv); #ifdef FEAT_JOB_CHANNEL @@ -828,7 +828,6 @@ static struct fst {"tempname", 0, 0, f_tempname}, {"test_alloc_fail", 3, 3, f_test_alloc_fail}, {"test_autochdir", 0, 0, f_test_autochdir}, - {"test_disable_char_avail", 1, 1, f_test_disable_char_avail}, {"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now}, {"test_ignore_error", 1, 1, f_test_ignore_error}, #ifdef FEAT_JOB_CHANNEL @@ -841,6 +840,7 @@ static struct fst {"test_null_list", 0, 0, f_test_null_list}, {"test_null_partial", 0, 0, f_test_null_partial}, {"test_null_string", 0, 0, f_test_null_string}, + {"test_override", 2, 2, f_test_override}, {"test_settime", 1, 1, f_test_settime}, #ifdef FEAT_TIMERS {"timer_info", 0, 1, f_timer_info}, @@ -12326,12 +12326,34 @@ f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED) } /* - * "test_disable_char_avail({expr})" function + * "test_disable({name}, {val})" function */ static void -f_test_disable_char_avail(typval_T *argvars, typval_T *rettv UNUSED) +f_test_override(typval_T *argvars, typval_T *rettv UNUSED) { - disable_char_avail_for_testing = (int)get_tv_number(&argvars[0]); + char_u *name = (char_u *)""; + int val; + + if (argvars[0].v_type != VAR_STRING + || (argvars[1].v_type) != VAR_NUMBER) + EMSG(_(e_invarg)); + else + { + name = get_tv_string_chk(&argvars[0]); + val = (int)get_tv_number(&argvars[1]); + + if (STRCMP(name, (char_u *)"redraw") == 0) + disable_redraw_for_testing = val; + else if (STRCMP(name, (char_u *)"char_avail") == 0) + disable_char_avail_for_testing = val; + else if (STRCMP(name, (char_u *)"ALL") == 0) + { + disable_char_avail_for_testing = FALSE; + disable_redraw_for_testing = FALSE; + } + else + EMSG2(_(e_invarg2), name); + } } /* diff --git a/src/globals.h b/src/globals.h index 831cbf1d89..f8186630fa 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1648,7 +1648,9 @@ EXTERN int alloc_fail_countdown INIT(= -1); /* set by alloc_fail(), number of times alloc() returns NULL */ EXTERN int alloc_fail_repeat INIT(= 0); +/* flags set by test_override() */ EXTERN int disable_char_avail_for_testing INIT(= 0); +EXTERN int disable_redraw_for_testing INIT(= 0); EXTERN int in_free_unref_items INIT(= FALSE); #endif diff --git a/src/screen.c b/src/screen.c index 20a778a68a..564eba3978 100644 --- a/src/screen.c +++ b/src/screen.c @@ -10580,7 +10580,12 @@ fillchar_vsep(int *attr) int redrawing(void) { - return (!RedrawingDisabled +#ifdef FEAT_EVAL + if (disable_redraw_for_testing) + return 0; + else +#endif + return (!RedrawingDisabled && !(p_lz && char_avail() && !KeyTyped && !do_redraw)); } diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index a0f0036f3c..2642958848 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -151,6 +151,7 @@ NEW_TESTS = test_arabic.res \ test_diffmode.res \ test_digraph.res \ test_display.res \ + test_edit.res \ test_farsi.res \ test_fnameescape.res \ test_fold.res \ diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim index d750da5693..732cc0e9a5 100644 --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -49,7 +49,7 @@ source setup.vim " This also enables use of line continuation. set nocp viminfo+=nviminfo -" Use utf-8 or latin1 be default, instead of whatever the system default +" Use utf-8 or latin1 by default, instead of whatever the system default " happens to be. Individual tests can overrule this at the top of the file. if has('multi_byte') set encoding=utf-8 @@ -96,6 +96,9 @@ function RunTheTest(test) " mode message. set noshowmode + " Clear any overrides. + call test_override('ALL', 0) + if exists("*SetUp") try call SetUp() diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim index 986f0d9a7e..0edcf58839 100644 --- a/src/testdir/test_assert.vim +++ b/src/testdir/test_assert.vim @@ -127,6 +127,14 @@ func Test_assert_with_msg() call remove(v:errors, 0) endfunc +func Test_override() + call test_override('char_avail', 1) + call test_override('redraw', 1) + call test_override('ALL', 0) + call assert_fails("call test_override('xxx', 1)", 'E475') + call assert_fails("call test_override('redraw', 'yes')", 'E474') +endfunc + func Test_user_is_happy() smile sleep 300m diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim index 4b2a9b8f80..355354198d 100644 --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -44,9 +44,9 @@ func Test_curswant_with_autocommand() new call setline(1, ['func()', '{', '}', '----']) autocmd! CursorMovedI * call s:Highlight_Matching_Pair() - call test_disable_char_avail(1) + call test_override("char_avail", 1) exe "normal! 3Ga\X\" - call test_disable_char_avail(0) + call test_override("char_avail", 0) call assert_equal('-X---', getline(4)) autocmd! CursorMovedI * quit! diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim new file mode 100644 index 0000000000..086e2e4587 --- /dev/null +++ b/src/testdir/test_edit.vim @@ -0,0 +1,1324 @@ +" Test for edit functions +" +if exists("+t_kD") + let &t_kD="[3;*~" +endif +set belloff= + +" Needed for testing basic rightleft: Test_edit_rightleft +source view_util.vim + +" Needs to come first until the bug in getchar() is +" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ +func! Test_edit_00b() + new + call setline(1, ['abc ']) + inoreabbr h here some more + call cursor(1, 4) + " expands the abbreviation and ends insertmode + call feedkeys(":set im\ h\:set noim\", 'tix') + call assert_equal(['abc here some more '], getline(1,'$')) + iunabbr h + bw! +endfunc + +func! Test_edit_01() + " set for Travis CI? + " set nocp noesckeys + new + set belloff=backspace + " 1) empty buffer + call assert_equal([''], getline(1,'$')) + " 2) delete in an empty line + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + " 3) delete one character + call setline(1, 'a') + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + " 4) delete a multibyte character + if has("multi_byte") + call setline(1, "\u0401") + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + endif + " 5.1) delete linebreak with 'bs' option containing eol + let _bs=&bs + set bs=eol + call setline(1, ["abc def", "ghi jkl"]) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal(['abc defghi jkl'], getline(1, 2)) + %d + " 5.2) delete linebreak with backspace option w/out eol + set bs= + call setline(1, ["abc def", "ghi jkl"]) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal(["abc def", "ghi jkl"], getline(1, 2)) + set belloff= + let &bs=_bs + bw! +endfunc + +func! Test_edit_02() + " Change cursor position in InsertCharPre command + new + call setline(1, 'abc') + call cursor(1, 1) + fu! DoIt(...) + call cursor(1, 4) + if len(a:000) + let v:char=a:1 + endif + endfu + au InsertCharPre :call DoIt('y') + call feedkeys("ix\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + " Setting in InsertCharPre + au! InsertCharPre :call DoIt("\n") + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['abc', ''], getline(1, '$')) + %d + au! InsertCharPre + " Change cursor position in InsertEnter command + " 1) when setting v:char, keeps changed cursor position + au! InsertEnter :call DoIt('y') + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['abxc'], getline(1, '$')) + " 2) when not setting v:char, restores changed cursor position + au! InsertEnter :call DoIt() + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['xabc'], getline(1, '$')) + au! InsertEnter + delfu DoIt + bw! +endfunc + +func! Test_edit_03() + " Change cursor after command to end of line + new + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\$y\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + %d + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\80|y\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + %d + call setline(1, 'abc') + call feedkeys("Ad\:s/$/efg/\hij", 'tnix') + call assert_equal(['hijabcdefg'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_04() + " test for :stopinsert + new + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\:stopinsert\$", 'tnix') + call feedkeys("aX\", 'tnix') + call assert_equal(['abcX'], getline(1, '$')) + %d + bw! +endfunc + +func! Test_edit_05() + " test for folds being opened + new + call setline(1, ['abcX', 'abcX', 'zzzZ']) + call cursor(1, 1) + set foldmethod=manual foldopen+=insert + " create fold for those two lines + norm! Vjzf + call feedkeys("$ay\", 'tnix') + call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) + %d + call setline(1, ['abcX', 'abcX', 'zzzZ']) + call cursor(1, 1) + set foldmethod=manual foldopen-=insert + " create fold for those two lines + norm! Vjzf + call feedkeys("$ay\", 'tnix') + call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) + %d + bw! +endfunc + +func! Test_edit_06() + " Test in diff mode + if !has("diff") || !executable("diff") + return + endif + new + call setline(1, ['abc', 'xxx', 'yyy']) + vnew + call setline(1, ['abc', 'zzz', 'xxx', 'yyy']) + wincmd p + diffthis + wincmd p + diffthis + wincmd p + call cursor(2, 1) + norm! zt + call feedkeys("Ozzz\", 'tnix') + call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$')) + bw! + bw! +endfunc + +func! Test_edit_07() + " 1) Test with completion when popupmenu is visible + new + call setline(1, 'J') + + func! ListMonths() + call complete(col('.')-1, ['January', 'February', 'March', + \ 'April', 'May', 'June', 'July', 'August', 'September', + \ 'October', 'November', 'December']) + return '' + endfunc + inoremap =ListMonths() + + call feedkeys("A\\". repeat("\", 6)."\\\\", 'tx') + call assert_equal(['July'], getline(1,'$')) + " 1) Test completion when InsertCharPre kicks in + %d + call setline(1, 'J') + fu! DoIt() + if v:char=='u' + let v:char='an' + endif + endfu + au InsertCharPre :call DoIt() + call feedkeys("A\\u\\\", 'tx') + call assert_equal(["Jan\",''], getline(1,'$')) + %d + call setline(1, 'J') + call feedkeys("A\\u\\\", 'tx') + call assert_equal(["January"], getline(1,'$')) + + delfu ListMonths + delfu DoIt + iunmap + bw! +endfunc + +func! Test_edit_08() + " reset insertmode from i_ctrl-r_= + new + call setline(1, ['abc']) + call cursor(1, 4) + call feedkeys(":set im\ZZZ\=setbufvar(1,'&im', 0)\",'tnix') + call assert_equal(['abZZZc'], getline(1,'$')) + call assert_equal([0, 1, 1, 0], getpos('.')) + call assert_false(0, '&im') + bw! +endfunc + +func! Test_edit_09() + " test i_CTRL-\ combinations + new + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 1) + " 1) CTRL-\ CTLR-N + call feedkeys(":set im\\\ccABC\", 'txin') + call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$')) + call setline(1, ['ABC', 'def', 'ghi']) + " 2) CTRL-\ CTLR-G + call feedkeys("j0\\ZZZ\\", 'txin') + call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + call feedkeys("I\\YYY\", 'txin') + call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$')) + set noinsertmode + " 3) CTRL-\ CTRL-O + call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) + call cursor(1, 1) + call feedkeys("A\ix", 'txin') + call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + call feedkeys("A\\ix", 'txin') + call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + " 4) CTRL-\ a (should be inserted literally, not special after + call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) + call cursor(1, 1) + call feedkeys("A\a", 'txin') + call assert_equal(["ABC\a", 'ZZZ', 'def', 'ghi'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_10() + " Test for starting selectmode + new + set selectmode=key keymodel=startsel + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 4) + call feedkeys("A\start\", 'txin') + call assert_equal(['startdef', 'ghi'], getline(1, '$')) + set selectmode= keymodel= + bw! +endfunc + +func! Test_edit_11() + " Test that indenting kicks in + new + set cindent + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\int c;", "/* comment */"], getline(1, '$')) + " added changed cindentkeys slightly + set cindent cinkeys+=*/ + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\int c;", "\/* comment */"], getline(1, '$')) + set cindent cinkeys+==end + call feedkeys("oend\\", 'tnix') + call assert_equal(['{', "\int c;", "\/* comment */", "\tend", ''], getline(1, '$')) + set cinkeys-==end + %d + " Use indentexpr instead of cindenting + func! Do_Indent() + if v:lnum == 3 + return 3*shiftwidth() + else + return 2*shiftwidth() + endif + endfunc + setl indentexpr=Do_Indent() indentkeys+=*/ + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\\int c;", "\\\/* comment */"], getline(1, '$')) + set cinkeys&vim indentkeys&vim + set nocindent indentexpr= + delfu Do_Indent + bw! +endfunc + +func! Test_edit_12() + " Test changing indent in replace mode + new + call setline(1, ["\tabc", "\tdef"]) + call cursor(2, 4) + call feedkeys("R^\", 'tnix') + call assert_equal(["\tabc", "def"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R^\", 'tnix') + call assert_equal(["\tabc", "def"], getline(1, '$')) + call assert_equal([0, 2, 1, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + bw! + 10vnew + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + set sw=4 + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + set et + set sw& et& + %d + call setline(1, ["\t/*"]) + set formatoptions=croql + call cursor(1, 3) + call feedkeys("A\\/", 'tnix') + call assert_equal(["\t/*", " *", " */"], getline(1, '$')) + set formatoptions& + bw! +endfunc + +func! Test_edit_13() + " Test smartindenting + if exists("+smartindent") + new + set smartindent autoindent + call setline(1, ["\tabc"]) + call feedkeys("A {\more\}\", 'tnix') + call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$')) + set smartindent& autoindent& + bw! + endif +endfunc + +func! Test_edit_CR() + " Test for in insert mode + " basically only in quickfix mode ist tested, the rest + " has been taken care of by other tests + if !has("quickfix") + return + endif + botright new + call writefile(range(1, 10), 'Xqflist.txt') + call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}]) + copen + set modifiable + call feedkeys("A\", 'tnix') + call assert_equal('Xqflist.txt', bufname('')) + call assert_equal(2, line('.')) + cclose + botright new + call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}]) + lopen + set modifiable + call feedkeys("A\", 'tnix') + call assert_equal('Xqflist.txt', bufname('')) + call assert_equal(10, line('.')) + call feedkeys("A\", 'tnix') + call feedkeys("A\", 'tnix') + call feedkeys("A\n", 'tnix') + call feedkeys("A\r", 'tnix') + call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$')) + bw! + lclose + call delete('Xqflist.txt') +endfunc + +func! Test_edit_CTRL_() + " disabled for Windows builds, why? + if !has("multi_byte") || !has("rightleft") || has("win32") + return + endif + let _encoding=&encoding + set encoding=utf-8 + " Test for CTRL-_ + new + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["\xyzabc"], getline(1, '$')) + call assert_false(&revins) + set ari + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["æèñabc"], getline(1, '$')) + call assert_true(&revins) + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["xyzabc"], getline(1, '$')) + call assert_false(&revins) + set noari + let &encoding=_encoding + bw! +endfunc + +" needs to come first, to have the @. register empty +func! Test_edit_00a_CTRL_A() + " Test pressing CTRL-A + new + call setline(1, repeat([''], 5)) + call cursor(1, 1) + set belloff=all + try + call feedkeys("A\", 'tnix') + catch /^Vim\%((\a\+)\)\=:E29/ + call assert_true(1, 'E29 error caught') + endtry + set belloff= + call cursor(1, 1) + call feedkeys("Afoobar \", 'tnix') + call cursor(2, 1) + call feedkeys("A\more\", 'tnix') + call cursor(3, 1) + call feedkeys("A\and more\", 'tnix') + call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$')) + bw! +endfunc + +func! Test_edit_CTRL_EY() + " Ctrl-E/ Ctrl-Y in insert mode completion to scroll + 10new + call setline(1, range(1, 100)) + call cursor(30, 1) + norm! z. + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(30, winsaveview()['topline']) + call assert_equal([0, 30, 2, 0], getpos('.')) + call feedkeys("A\\\\\\", 'tnix') + call feedkeys("A\".repeat("\", 10), 'tnix') + call assert_equal(21, winsaveview()['topline']) + call assert_equal([0, 30, 2, 0], getpos('.')) + bw! +endfunc + +func! Test_edit_CTRL_G() + new + set belloff=all + call setline(1, ['foobar', 'foobar', 'foobar']) + call cursor(2, 4) + call feedkeys("ioooooooo\k\.\", 'tnix') + call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$')) + call assert_equal([0, 1, 11, 0], getpos('.')) + call feedkeys("i\k\", 'tnix') + call assert_equal([0, 1, 10, 0], getpos('.')) + call cursor(2, 4) + call feedkeys("i\jzzzz\", 'tnix') + call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$')) + call assert_equal([0, 3, 7, 0], getpos('.')) + call feedkeys("i\j\", 'tnix') + call assert_equal([0, 3, 6, 0], getpos('.')) + set belloff= + bw! +endfunc + +func! Test_edit_CTRL_I() + " Tab in completion mode + let path=expand("%:p:h") + new + call setline(1, [path."/", '']) + call feedkeys("Ate\\\\\", 'tnix') + call assert_match('test1\.in', getline(1)) + %d + call writefile(['one', 'two', 'three'], 'Xinclude.txt') + let include='#include Xinclude.txt' + call setline(1, [include, '']) + call cursor(2, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal([include, 'one', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\", 'tnix') + call assert_equal([include, 'two', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\\", 'tnix') + call assert_equal([include, 'three', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\\\", 'tnix') + call assert_equal([include, '', ''], getline(1, '$')) + call delete("Xinclude.txt") + bw! +endfunc + +func! Test_edit_CTRL_K() + " Test pressing CTRL-K (basically only dictionary completion and digraphs + " the rest is already covered + call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt') + set dictionary=Xdictionary.txt + new + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['AA', ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['AAA'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(['AAAA'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(['A'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\\\", 'tnix') + call assert_equal(['AA'], getline(1, '$')) + + " press an unexecpted key after dictionary completion + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['AA', ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(["AA\", ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(["AA\", ''], getline(1, '$')) + + set dictionary= + %d + call setline(1, 'A') + call cursor(1, 1) + set belloff=all + let v:testing = 1 + try + call feedkeys("A\\\", 'tnix') + catch + " error sleeps 2 seconds, when v:testing is not set + let v:testing = 0 + endtry + set belloff= + call delete('Xdictionary.txt') + + if has("multi_byte") + call test_override("char_avail", 1) + set showcmd + %d + call feedkeys("A\a:\", 'tnix') + call assert_equal(['ä'], getline(1, '$')) + call test_override("char_avail", 0) + set noshowcmd + endif + bw! +endfunc + +func! Test_edit_CTRL_L() + " Test Ctrl-X Ctrl-L (line completion) + new + set complete=. + call setline(1, ['one', 'two', 'three', '', '', '', '']) + call cursor(4, 1) + call feedkeys("A\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + set complete= + call cursor(5, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', "\\\", '', ''], getline(1, '$')) + set complete& + %d + if has("conceal") && has("syntax") + call setline(1, ['foo', 'bar', 'foobar']) + call test_override("char_avail", 1) + set conceallevel=2 concealcursor=n + syn on + syn match ErrorMsg "^bar" + call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'}) + func! DoIt() + let g:change=1 + endfunc + au! TextChangedI :call DoIt() + + call cursor(2, 1) + call assert_false(exists("g:change")) + call feedkeys("A \", 'tnix') + call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$')) + call assert_equal(1, g:change) + + call test_override("char_avail", 0) + call clearmatches() + syn off + au! TextChangedI + delfu DoIt + unlet! g:change + endif + bw! +endfunc + +func! Test_edit_CTRL_N() + " Check keyword completion + new + set complete=. + call setline(1, ['INFER', 'loWER', '', '', ]) + call cursor(3, 1) + call feedkeys("Ai\\\", "tnix") + call feedkeys("ILO\\\", 'tnix') + call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$')) + %d + call setline(1, ['INFER', 'loWER', '', '', ]) + call cursor(3, 1) + set ignorecase infercase + call feedkeys("Ii\\\", "tnix") + call feedkeys("ILO\\\", 'tnix') + call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$')) + + set noignorecase noinfercase complete& + bw! +endfunc + +func! Test_edit_CTRL_O() + " Check for CTRL-O in insert mode + new + inoreabbr h here some more + call setline(1, ['abc', 'def']) + call cursor(1, 1) + " Ctrl-O after an abbreviation + exe "norm A h\:set nu\ text" + call assert_equal(['abc here some more text', 'def'], getline(1, '$')) + call assert_true(&nu) + set nonu + iunabbr h + " Ctrl-O at end of line with 've'=onemore + call cursor(1, 1) + call feedkeys("A\:let g:a=getpos('.')\\", 'tnix') + call assert_equal([0, 1, 23, 0], g:a) + call cursor(1, 1) + set ve=onemore + call feedkeys("A\:let g:a=getpos('.')\\", 'tnix') + call assert_equal([0, 1, 24, 0], g:a) + set ve= + unlet! g:a + bw! +endfunc + +func! Test_edit_CTRL_R() + " Insert Register + new + call test_override("ALL", 1) + set showcmd + call feedkeys("AFOOBAR eins zwei\", 'tnix') + call feedkeys("O\.", 'tnix') + call feedkeys("O\=10*500\\", 'tnix') + call feedkeys("O\=getreg('=', 1)\\", 'tnix') + call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$')) + call test_override("ALL", 0) + set noshowcmd + bw! +endfunc + +func! Test_edit_CTRL_S() + " Test pressing CTRL-S (basically only spellfile completion) + " the rest is already covered + new + if !has("spell") + call setline(1, 'vim') + call feedkeys("A\ss\\", 'tnix') + call assert_equal(['vims', ''], getline(1, '$')) + bw! + return + endif + call setline(1, 'vim') + " spell option not yet set + try + call feedkeys("A\\\\", 'tnix') + catch /^Vim\%((\a\+)\)\=:E756/ + call assert_true(1, 'error caught') + endtry + call assert_equal(['vim', ''], getline(1, '$')) + %d + setl spell spelllang=en + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['Vim', ''], getline(1, '$')) + %d + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['Aim'], getline(1, '$')) + %d + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['vim', ''], getline(1, '$')) + %d + " empty buffer + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['', ''], getline(1, '$')) + setl nospell + bw! +endfunc + +func! Test_edit_CTRL_T() + " Check for CTRL-T and CTRL-X CTRL-T in insert mode + " 1) increase indent + new + call setline(1, "abc") + call cursor(1, 1) + call feedkeys("A\xyz", 'tnix') + call assert_equal(["\abcxyz"], getline(1, '$')) + " 2) also when paste option is set + set paste + call setline(1, "abc") + call cursor(1, 1) + call feedkeys("A\xyz", 'tnix') + call assert_equal(["\abcxyz"], getline(1, '$')) + set nopaste + " CTRL-X CTRL-T (thesaurus complete) + call writefile(['angry furious mad enraged'], 'Xthesaurus') + set thesaurus=Xthesaurus + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['angry', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(['furious', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(['enraged', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + " Using when 'complete' is empty + set complete= + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['angry', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + set complete& + + set thesaurus= + %d + call setline(1, 'mad') + call cursor(1, 1) + set belloff=all + let v:testing = 1 + try + call feedkeys("A\\\", 'tnix') + catch + " error sleeps 2 seconds, when v:testing is not set + let v:testing = 0 + endtry + set belloff= + call assert_equal(['mad'], getline(1, '$')) + call delete('Xthesaurus') + bw! +endfunc + +func! Test_edit_CTRL_U() + " Test 'completefunc' + new + " -1, -2 and -3 are special return values + let g:special=0 + fun! CompleteMonths(findstart, base) + if a:findstart + " locate the start of the word + return g:special + else + " find months matching with "a:base" + let res = [] + for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") + if m =~ '^\c'.a:base + call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0}) + endif + endfor + return {'words': res, 'refresh': 'always'} + endif + endfun + set completefunc=CompleteMonths + call setline(1, ['', '']) + call cursor(1, 1) + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', '', ''], getline(1, '$')) + %d + let g:special=-1 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['XJan', ''], getline(1, '$')) + %d + let g:special=-2 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', ''], getline(1, '$')) + %d + let g:special=-3 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', ''], getline(1, '$')) + %d + let g:special=0 + call feedkeys("AM\\\\", 'tnix') + call assert_equal(['Mar', ''], getline(1, '$')) + %d + call feedkeys("AM\\\\\", 'tnix') + call assert_equal(['May', ''], getline(1, '$')) + %d + call feedkeys("AM\\\\\\", 'tnix') + call assert_equal(['M', ''], getline(1, '$')) + delfu CompleteMonths + %d + try + call feedkeys("A\\", 'tnix') + call assert_fails(1, 'unknown completion function') + catch /^Vim\%((\a\+)\)\=:E117/ + call assert_true(1, 'E117 error caught') + endtry + set completefunc= + bw! +endfunc + +func! Test_edit_CTRL_Z() + " Ctrl-Z when insertmode is not set inserts it literally + new + call setline(1, 'abc') + call feedkeys("A\\", 'tnix') + call assert_equal(["abc\"], getline(1,'$')) + bw! + " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend? +endfunc + +func! Test_edit_DROP() + if !has("dnd") + return + endif + new + call setline(1, ['abc def ghi']) + call cursor(1, 1) + try + call feedkeys("i\\", 'tnix') + call assert_fails(1, 'Invalid register name') + catch /^Vim\%((\a\+)\)\=:E353/ + call assert_true(1, 'error caught') + endtry + bw! +endfunc + +func! Test_edit_CTRL_V() + if has("ebcdic") + return + endif + new + call setline(1, ['abc']) + call cursor(2, 1) + " force some redraws + set showmode showcmd + "call test_override_char_avail(1) + call test_override('ALL', 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) + + if has("rightleft") && exists("+rl") + set rl + call setline(1, ['abc']) + call cursor(2, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) + set norl + endif + + call test_override('ALL', 0) + set noshowmode showcmd + bw! +endfunc + +func! Test_edit_F1() + " Pressing + new + call feedkeys(":set im\\\", 'tnix') + set noinsertmode + call assert_equal('help', &buftype) + bw + bw +endfunc + +func! Test_edit_F21() + " Pressing + " sends a netbeans command + if has("netbeans_intg") + new + " I have no idea what this is supposed to do :) + call feedkeys("A\\\", 'tnix') + bw + endif +endfunc + +func! Test_edit_HOME_END() + " Test Home/End Keys + new + set foldopen+=hor + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("AX\Y\", 'tnix') + call cursor(2, 1) + call feedkeys("iZ\Y\", 'tnix') + call assert_equal(['YabcX', 'ZdefY'], getline(1, '$')) + + set foldopen-=hor + bw! +endfunc + +func! Test_edit_INS() + " Test for Pressing + new + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("i\ZYX>", 'tnix') + call assert_equal(['ZYX>', 'def'], getline(1, '$')) + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("i\Z\YX>", 'tnix') + call assert_equal(['ZYX>bc', 'def'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_LEFT_RIGHT() + " Left, Shift-Left, Right, Shift-Right + new + set belloff=all + call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX']) + let _ww=&ww + set ww= + call cursor(2, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 2, 1, 0], getpos('.')) + " Is this a bug, does not respect whichwrap option + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 8, 0], getpos('.')) + call feedkeys("i". repeat("\", 3). "\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call feedkeys("i\\\", 'tnix') + call assert_equal([0, 1, 2, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 2, 4, 0], getpos('.')) + call cursor(3, 11) + call feedkeys("A\\", 'tnix') + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 11, 0], getpos('.')) + call cursor(2, 11) + " does not respect 'whichwrap' option + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + " Check motion when 'whichwrap' contains cursor keys for insert mode + set ww+=[,] + call cursor(2, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 11, 0], getpos('.')) + call cursor(2, 11) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + call cursor(2, 11) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + let &ww = _ww + set belloff= + bw! +endfunc + +func! Test_edit_MOUSE() + " This is a simple test, since we not really using the mouse here + if !has("mouse") + return + endif + 10new + call setline(1, range(1, 100)) + call cursor(1, 1) + set mouse=a + call feedkeys("A\\", 'tnix') + call assert_equal([0, 4, 1, 0], getpos('.')) + " This should move by one pageDown, but only moves + " by one line when the test is run... + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + set nostartofline + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call cursor(1, 100) + norm! zt + " this should move by a screen up, but when the test + " is run, it moves up to the top of the buffer... + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call cursor(1, 30) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call cursor(1, 30) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + %d + call setline(1, repeat(["12345678901234567890"], 100)) + call cursor(2, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + set mouse& startofline + bw! +endfunc + +func! Test_edit_PAGEUP_PAGEDOWN() + set belloff=all + 10new + call setline(1, repeat(['abc def ghi'], 30)) + call cursor(1, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 9, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 17, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 25, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + " is the same as + " is the same as + call cursor(1, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 9, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 17, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 25, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + set nostartofline + call cursor(30, 11) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 9, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 17, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 25, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + " is the same as + " is the same as + call cursor(30, 11) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 9, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 17, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 25, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + set startofline belloff= + bw! +endfunc + +func! Test_edit_forbidden() + set belloff=error,esc + new + " 1) edit in the sandbox is not allowed + call setline(1, 'a') + com! Sandbox :sandbox call feedkeys("i\\", 'tnix') + call assert_fails(':Sandbox', 'E48:') + com! Sandbox :sandbox exe "norm! i\" + call assert_fails(':Sandbox', 'E48:') + delcom Sandbox + call assert_equal(['a'], getline(1,'$')) + " 2) edit with textlock set + fu! DoIt() + call feedkeys("i\\", 'tnix') + endfu + au InsertCharPre :call DoIt() + try + call feedkeys("ix\", 'tnix') + call assert_fails(1, 'textlock') + catch /^Vim\%((\a\+)\)\=:E523/ " catch E523: not allowed here + endtry + " TODO: Might be a bug: should x really be inserted here + call assert_equal(['xa'], getline(1, '$')) + delfu DoIt + try + call feedkeys("ix\", 'tnix') + call assert_fails(1, 'unknown function') + catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function + endtry + au! InsertCharPre + " 3) edit when completion is shown + fun! Complete(findstart, base) + if a:findstart + return col('.') + else + call feedkeys("i\\", 'tnix') + return [] + endif + endfun + set completefunc=Complete + try + call feedkeys("i\\\", 'tnix') + call assert_fails(1, 'change in complete function') + catch /^Vim\%((\a\+)\)\=:E523/ " catch E523 + endtry + delfu Complete + set completefunc= + if has("rightleft") && exists("+fkmap") + " 4) 'R' when 'fkmap' and 'revins' is set. + set revins fkmap + try + normal Ri + call assert_fails(1, "R with 'fkmap' and 'ri' set") + catch + finally + set norevins nofkmap + endtry + endif + set belloff= + bw! +endfunc + +func! Test_edit_rightleft() + " Cursor in rightleft mode moves differently + if !exists("+rightleft") + return + endif + call NewWindow(10, 20) + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 2) + set rightleft + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" cba", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + " 2) right moves to the left + call feedkeys("i\\x", 'txin') + call assert_equal(['bc', 'def', 'ghi'], getline(1,'$')) + call cursor(1, 2) + call feedkeys("i\\", 'txin') + call cursor(1, 2) + call feedkeys("i\\", 'txin') + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" cb", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + " 2) left moves to the right + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 2) + call feedkeys("i\\x", 'txin') + call assert_equal(['ac', 'def', 'ghi'], getline(1,'$')) + call cursor(1, 2) + call feedkeys("i\\", 'txin') + call cursor(1, 2) + call feedkeys("i\\", 'txin') + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" ca", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + set norightleft + bw! +endfunc diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index 7f4f7e0ec9..730e683911 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -7,7 +7,7 @@ func Test_search_cmdline() endif " need to disable char_avail, " so that expansion of commandline works - call test_disable_char_avail(1) + call test_override("char_avail", 1) new call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar']) " Test 1 @@ -194,7 +194,7 @@ func Test_search_cmdline() call assert_equal(' 3 the', getline('.')) " clean up - call test_disable_char_avail(0) + call test_override("char_avail", 0) bw! endfunc @@ -204,7 +204,7 @@ func Test_search_cmdline2() endif " need to disable char_avail, " so that expansion of commandline works - call test_disable_char_avail(1) + call test_override("char_avail", 1) new call setline(1, [' 1', ' 2 these', ' 3 the theother']) " Test 1 @@ -266,7 +266,7 @@ func Test_search_cmdline2() " clean up set noincsearch - call test_disable_char_avail(0) + call test_override("char_avail", 0) bw! endfunc diff --git a/src/version.c b/src/version.c index 277f2d99e3..1bc45d6acd 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 440, /**/ 439, /**/ From ad2cfb54b78523435b31de7234081ff70a53e736 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 18:59:14 +0100 Subject: [PATCH 8/9] patch 8.0.0441: dead code in #ifdef Problem: Dead code in #ifdef. Solution: Remove the #ifdef and #else part. --- src/option.c | 9 --------- src/version.c | 2 ++ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/option.c b/src/option.c index b0baf50185..2e2f0f1a64 100644 --- a/src/option.c +++ b/src/option.c @@ -4129,7 +4129,6 @@ set_init_3(void) options[idx3].def_val[VI_DEFAULT] = p_shcf; } -# ifdef WIN3264 /* Somehow Win32 requires the quotes around the redirection too */ idx3 = findoption((char_u *)"sxq"); if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) @@ -4137,14 +4136,6 @@ set_init_3(void) p_sxq = (char_u *)"\""; options[idx3].def_val[VI_DEFAULT] = p_sxq; } -# else - idx3 = findoption((char_u *)"shq"); - if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) - { - p_shq = (char_u *)"\""; - options[idx3].def_val[VI_DEFAULT] = p_shq; - } -# endif } else if (strstr((char *)gettail(p_sh), "cmd.exe") != NULL) { diff --git a/src/version.c b/src/version.c index 1bc45d6acd..aee70ef655 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 441, /**/ 440, /**/ From 1ef73e33c9414eb02c229d8234aafd9d481a8856 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 9 Mar 2017 19:21:30 +0100 Subject: [PATCH 9/9] patch 8.0.0442: patch shell command not well escaped Problem: Patch shell command uses double quotes around the argument, which allows for $HOME to be expanded. (Etienne) Solution: Use single quotes on Unix. (closes #1543) --- src/diff.c | 7 ++++++- src/testdir/test_diffmode.vim | 17 ++++++++++++++--- src/version.c | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/diff.c b/src/diff.c index b64b45ce96..7b81feba7a 100644 --- a/src/diff.c +++ b/src/diff.c @@ -977,7 +977,12 @@ ex_diffpatch(exarg_T *eap) { /* Build the patch command and execute it. Ignore errors. Switch to * cooked mode to allow the user to respond to prompts. */ - vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"", + vim_snprintf((char *)buf, buflen, +#ifdef UNIX + "patch -o %s %s < '%s'", +#else + "patch -o %s %s < \"%s\"", +#endif tmp_new, tmp_orig, # ifdef UNIX fullname != NULL ? fullname : diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index 73f944bcea..c23e8a1da5 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -318,9 +318,20 @@ func Test_diffpatch() bwipe! new call assert_fails('diffpatch Xpatch', 'E816:') - call setline(1, ['1', '2', '3']) - diffpatch Xpatch - call assert_equal(['1', '2x', '3', '4'], getline(1, '$')) + + for name in ['Xpatch', 'Xpatch$HOME'] + call setline(1, ['1', '2', '3']) + if name != 'Xpatch' + call rename('Xpatch', name) + endif + exe 'diffpatch ' . escape(name, '$') + call assert_equal(['1', '2x', '3', '4'], getline(1, '$')) + if name != 'Xpatch' + call rename(name, 'Xpatch') + endif + bwipe! + endfor + call delete('Xpatch') bwipe! endfunc diff --git a/src/version.c b/src/version.c index aee70ef655..0f7b4e499f 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 442, /**/ 441, /**/