mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #23191 from zeertzjq/vim-9.0.1007
vim-patch:9.0.{0369,0372,0426,0514,0545,0560,0561,1005,1007,1008,1009,1010,1012,1020,1021,1034}
This commit is contained in:
commit
c218109744
1
.gitignore
vendored
1
.gitignore
vendored
@ -43,6 +43,7 @@ compile_commands.json
|
|||||||
/test/old/testdir/test*.res
|
/test/old/testdir/test*.res
|
||||||
/test/old/testdir/test*.log
|
/test/old/testdir/test*.log
|
||||||
/test/old/testdir/messages
|
/test/old/testdir/messages
|
||||||
|
/test/old/testdir/starttime
|
||||||
/test/old/testdir/viminfo
|
/test/old/testdir/viminfo
|
||||||
/test/old/testdir/test.ok
|
/test/old/testdir/test.ok
|
||||||
/test/old/testdir/*.failed
|
/test/old/testdir/*.failed
|
||||||
|
@ -506,6 +506,7 @@ submatch({nr} [, {list}]) String or List
|
|||||||
specific match in ":s" or substitute()
|
specific match in ":s" or substitute()
|
||||||
substitute({expr}, {pat}, {sub}, {flags})
|
substitute({expr}, {pat}, {sub}, {flags})
|
||||||
String all {pat} in {expr} replaced with {sub}
|
String all {pat} in {expr} replaced with {sub}
|
||||||
|
swapfilelist() List swap files found in 'directory'
|
||||||
swapinfo({fname}) Dict information about swap file {fname}
|
swapinfo({fname}) Dict information about swap file {fname}
|
||||||
swapname({buf}) String swap file of buffer {buf}
|
swapname({buf}) String swap file of buffer {buf}
|
||||||
synID({lnum}, {col}, {trans}) Number syntax ID at {lnum} and {col}
|
synID({lnum}, {col}, {trans}) Number syntax ID at {lnum} and {col}
|
||||||
@ -8417,6 +8418,17 @@ substitute({string}, {pat}, {sub}, {flags}) *substitute()*
|
|||||||
Can also be used as a |method|: >
|
Can also be used as a |method|: >
|
||||||
GetString()->substitute(pat, sub, flags)
|
GetString()->substitute(pat, sub, flags)
|
||||||
|
|
||||||
|
swapfilelist() *swapfilelist()*
|
||||||
|
Returns a list of swap file names, like what "vim -r" shows.
|
||||||
|
See the |-r| command argument. The 'directory' option is used
|
||||||
|
for the directories to inspect. If you only want to get a
|
||||||
|
list of swap files in the current directory then temporarily
|
||||||
|
set 'directory' to a dot: >
|
||||||
|
let save_dir = &directory
|
||||||
|
let &directory = '.'
|
||||||
|
let swapfiles = swapfilelist()
|
||||||
|
let &directory = save_dir
|
||||||
|
|
||||||
swapinfo({fname}) *swapinfo()*
|
swapinfo({fname}) *swapinfo()*
|
||||||
The result is a dictionary, which holds information about the
|
The result is a dictionary, which holds information about the
|
||||||
swapfile {fname}. The available fields are:
|
swapfile {fname}. The available fields are:
|
||||||
|
@ -883,6 +883,7 @@ Buffers, windows and the argument list:
|
|||||||
getwininfo() get a list with window information
|
getwininfo() get a list with window information
|
||||||
getchangelist() get a list of change list entries
|
getchangelist() get a list of change list entries
|
||||||
getjumplist() get a list of jump list entries
|
getjumplist() get a list of jump list entries
|
||||||
|
swapfilelist() list of existing swap files in 'directory'
|
||||||
swapinfo() information about a swap file
|
swapinfo() information about a swap file
|
||||||
swapname() get the swap file path of a buffer
|
swapname() get the swap file path of a buffer
|
||||||
|
|
||||||
|
@ -5712,8 +5712,7 @@ void get_xdg_var_list(const XDGVarType xdg, typval_T *rettv)
|
|||||||
if (dir != NULL && dir_len > 0) {
|
if (dir != NULL && dir_len > 0) {
|
||||||
char *dir_with_nvim = xmemdupz(dir, dir_len);
|
char *dir_with_nvim = xmemdupz(dir, dir_len);
|
||||||
dir_with_nvim = concat_fnames_realloc(dir_with_nvim, appname, true);
|
dir_with_nvim = concat_fnames_realloc(dir_with_nvim, appname, true);
|
||||||
tv_list_append_string(list, dir_with_nvim, (ssize_t)strlen(dir_with_nvim));
|
tv_list_append_allocated_string(list, dir_with_nvim);
|
||||||
xfree(dir_with_nvim);
|
|
||||||
}
|
}
|
||||||
} while (iter != NULL);
|
} while (iter != NULL);
|
||||||
xfree(dirs);
|
xfree(dirs);
|
||||||
|
@ -400,6 +400,7 @@ return {
|
|||||||
strwidth={args=1, base=1, fast=true},
|
strwidth={args=1, base=1, fast=true},
|
||||||
submatch={args={1, 2}, base=1},
|
submatch={args={1, 2}, base=1},
|
||||||
substitute={args=4, base=1},
|
substitute={args=4, base=1},
|
||||||
|
swapfilelist={},
|
||||||
swapinfo={args=1, base=1},
|
swapinfo={args=1, base=1},
|
||||||
swapname={args=1, base=1},
|
swapname={args=1, base=1},
|
||||||
synID={args=3},
|
synID={args=3},
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "nvim/eval/executor.h"
|
#include "nvim/eval/executor.h"
|
||||||
#include "nvim/eval/funcs.h"
|
#include "nvim/eval/funcs.h"
|
||||||
#include "nvim/eval/typval.h"
|
#include "nvim/eval/typval.h"
|
||||||
|
#include "nvim/eval/typval_defs.h"
|
||||||
#include "nvim/eval/userfunc.h"
|
#include "nvim/eval/userfunc.h"
|
||||||
#include "nvim/eval/vars.h"
|
#include "nvim/eval/vars.h"
|
||||||
#include "nvim/eval/window.h"
|
#include "nvim/eval/window.h"
|
||||||
@ -3850,8 +3851,7 @@ static void f_insert(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// "interrupt()" function
|
/// "interrupt()" function
|
||||||
static void f_interrupt(typval_T *argvars FUNC_ATTR_UNUSED, typval_T *rettv FUNC_ATTR_UNUSED,
|
static void f_interrupt(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||||
EvalFuncData fptr FUNC_ATTR_UNUSED)
|
|
||||||
{
|
{
|
||||||
got_int = true;
|
got_int = true;
|
||||||
}
|
}
|
||||||
@ -8523,6 +8523,13 @@ static void f_substitute(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// "swapfilelist()" function
|
||||||
|
static void f_swapfilelist(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||||
|
{
|
||||||
|
tv_list_alloc_ret(rettv, kListLenUnknown);
|
||||||
|
recover_names(NULL, false, rettv->vval.v_list, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/// "swapinfo(swap_filename)" function
|
/// "swapinfo(swap_filename)" function
|
||||||
static void f_swapinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
static void f_swapinfo(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||||
{
|
{
|
||||||
|
@ -466,7 +466,7 @@ int main(int argc, char **argv)
|
|||||||
// Recovery mode without a file name: List swap files.
|
// Recovery mode without a file name: List swap files.
|
||||||
// Uses the 'dir' option, therefore it must be after the initializations.
|
// Uses the 'dir' option, therefore it must be after the initializations.
|
||||||
if (recoverymode && fname == NULL) {
|
if (recoverymode && fname == NULL) {
|
||||||
recover_names(NULL, true, 0, NULL);
|
recover_names(NULL, true, NULL, 0, NULL);
|
||||||
os_exit(0);
|
os_exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,7 +762,7 @@ void ml_recover(bool checkext)
|
|||||||
directly = false;
|
directly = false;
|
||||||
|
|
||||||
// count the number of matching swap files
|
// count the number of matching swap files
|
||||||
len = recover_names(fname, false, 0, NULL);
|
len = recover_names(fname, false, NULL, 0, NULL);
|
||||||
if (len == 0) { // no swap files found
|
if (len == 0) { // no swap files found
|
||||||
semsg(_("E305: No swap file found for %s"), fname);
|
semsg(_("E305: No swap file found for %s"), fname);
|
||||||
goto theend;
|
goto theend;
|
||||||
@ -772,7 +772,7 @@ void ml_recover(bool checkext)
|
|||||||
i = 1;
|
i = 1;
|
||||||
} else { // several swap files found, choose
|
} else { // several swap files found, choose
|
||||||
// list the names of the swap files
|
// list the names of the swap files
|
||||||
(void)recover_names(fname, true, 0, NULL);
|
(void)recover_names(fname, true, NULL, 0, NULL);
|
||||||
msg_putchar('\n');
|
msg_putchar('\n');
|
||||||
msg_puts(_("Enter number of swap file to use (0 to quit): "));
|
msg_puts(_("Enter number of swap file to use (0 to quit): "));
|
||||||
i = get_number(false, NULL);
|
i = get_number(false, NULL);
|
||||||
@ -781,7 +781,7 @@ void ml_recover(bool checkext)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// get the swap file name that will be used
|
// get the swap file name that will be used
|
||||||
(void)recover_names(fname, false, i, &fname_used);
|
(void)recover_names(fname, false, NULL, i, &fname_used);
|
||||||
}
|
}
|
||||||
if (fname_used == NULL) {
|
if (fname_used == NULL) {
|
||||||
goto theend; // user chose invalid number.
|
goto theend; // user chose invalid number.
|
||||||
@ -1200,13 +1200,15 @@ theend:
|
|||||||
/// - list the swap files for "vim -r"
|
/// - list the swap files for "vim -r"
|
||||||
/// - count the number of swap files when recovering
|
/// - count the number of swap files when recovering
|
||||||
/// - list the swap files when recovering
|
/// - list the swap files when recovering
|
||||||
|
/// - list the swap files for swapfilelist()
|
||||||
/// - find the name of the n'th swap file when recovering
|
/// - find the name of the n'th swap file when recovering
|
||||||
///
|
///
|
||||||
/// @param fname base for swap file name
|
/// @param fname base for swap file name
|
||||||
/// @param list when true, list the swap file names
|
/// @param do_list when true, list the swap file names
|
||||||
|
/// @param ret_list when not NULL add file names to it
|
||||||
/// @param nr when non-zero, return nr'th swap file name
|
/// @param nr when non-zero, return nr'th swap file name
|
||||||
/// @param fname_out result when "nr" > 0
|
/// @param fname_out result when "nr" > 0
|
||||||
int recover_names(char *fname, int list, int nr, char **fname_out)
|
int recover_names(char *fname, bool do_list, list_T *ret_list, int nr, char **fname_out)
|
||||||
{
|
{
|
||||||
int num_names;
|
int num_names;
|
||||||
char *(names[6]);
|
char *(names[6]);
|
||||||
@ -1230,7 +1232,7 @@ int recover_names(char *fname, int list, int nr, char **fname_out)
|
|||||||
fname_res = fname;
|
fname_res = fname;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list) {
|
if (do_list) {
|
||||||
// use msg() to start the scrolling properly
|
// use msg() to start the scrolling properly
|
||||||
msg(_("Swap files found:"));
|
msg(_("Swap files found:"));
|
||||||
msg_putchar('\n');
|
msg_putchar('\n');
|
||||||
@ -1306,9 +1308,11 @@ int recover_names(char *fname, int list, int nr, char **fname_out)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove swapfile name of the current buffer, it must be ignored
|
// Remove swapfile name of the current buffer, it must be ignored.
|
||||||
|
// But keep it for swapfilelist().
|
||||||
if (curbuf->b_ml.ml_mfp != NULL
|
if (curbuf->b_ml.ml_mfp != NULL
|
||||||
&& (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL) {
|
&& (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL
|
||||||
|
&& ret_list == NULL) {
|
||||||
for (int i = 0; i < num_files; i++) {
|
for (int i = 0; i < num_files; i++) {
|
||||||
// Do not expand wildcards, on Windows would try to expand
|
// Do not expand wildcards, on Windows would try to expand
|
||||||
// "%tmp%" in "%tmp%file"
|
// "%tmp%" in "%tmp%file"
|
||||||
@ -1333,7 +1337,7 @@ int recover_names(char *fname, int list, int nr, char **fname_out)
|
|||||||
*fname_out = xstrdup(files[nr - 1 + num_files - file_count]);
|
*fname_out = xstrdup(files[nr - 1 + num_files - file_count]);
|
||||||
dirp = ""; // stop searching
|
dirp = ""; // stop searching
|
||||||
}
|
}
|
||||||
} else if (list) {
|
} else if (do_list) {
|
||||||
if (dir_name[0] == '.' && dir_name[1] == NUL) {
|
if (dir_name[0] == '.' && dir_name[1] == NUL) {
|
||||||
if (fname == NULL) {
|
if (fname == NULL) {
|
||||||
msg_puts(_(" In current directory:\n"));
|
msg_puts(_(" In current directory:\n"));
|
||||||
@ -1359,6 +1363,13 @@ int recover_names(char *fname, int list, int nr, char **fname_out)
|
|||||||
msg_puts(_(" -- none --\n"));
|
msg_puts(_(" -- none --\n"));
|
||||||
}
|
}
|
||||||
ui_flush();
|
ui_flush();
|
||||||
|
} else if (ret_list != NULL) {
|
||||||
|
for (int i = 0; i < num_files; i++) {
|
||||||
|
char *name = concat_fnames(dir_name, files[i], true);
|
||||||
|
if (name != NULL) {
|
||||||
|
tv_list_append_allocated_string(ret_list, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
file_count += num_files;
|
file_count += num_files;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ report:
|
|||||||
then echo TEST FAILURE; exit 1; \
|
then echo TEST FAILURE; exit 1; \
|
||||||
else echo ALL DONE; \
|
else echo ALL DONE; \
|
||||||
fi"
|
fi"
|
||||||
|
@rm -f starttime
|
||||||
|
|
||||||
test1.out: $(NVIM_PRG)
|
test1.out: $(NVIM_PRG)
|
||||||
|
|
||||||
@ -86,10 +87,13 @@ fixff:
|
|||||||
-$(NVIM_PRG) $(NO_INITS) -u unix.vim "+argdo set ff=dos|upd" +q \
|
-$(NVIM_PRG) $(NO_INITS) -u unix.vim "+argdo set ff=dos|upd" +q \
|
||||||
dotest.in
|
dotest.in
|
||||||
|
|
||||||
|
# File to delete when testing starts
|
||||||
|
CLEANUP_FILES = test.log messages starttime
|
||||||
|
|
||||||
# Execute an individual new style test, e.g.:
|
# Execute an individual new style test, e.g.:
|
||||||
# make test_largefile
|
# make test_largefile
|
||||||
$(NEW_TESTS):
|
$(NEW_TESTS):
|
||||||
rm -f $@.res test.log messages
|
rm -f $@.res $(CLEANUP_FILES)
|
||||||
@MAKEFLAGS=--no-print-directory $(MAKE) -f Makefile $@.res
|
@MAKEFLAGS=--no-print-directory $(MAKE) -f Makefile $@.res
|
||||||
@cat messages
|
@cat messages
|
||||||
@if test -f test.log; then \
|
@if test -f test.log; then \
|
||||||
@ -108,9 +112,8 @@ CLEAN_FILES := *.out \
|
|||||||
*.rej \
|
*.rej \
|
||||||
*.orig \
|
*.orig \
|
||||||
*.tlog \
|
*.tlog \
|
||||||
test.log \
|
|
||||||
test_result.log \
|
test_result.log \
|
||||||
messages \
|
$(CLEANUP_FILES) \
|
||||||
$(RM_ON_RUN) \
|
$(RM_ON_RUN) \
|
||||||
$(RM_ON_START) \
|
$(RM_ON_START) \
|
||||||
valgrind.* \
|
valgrind.* \
|
||||||
@ -132,7 +135,7 @@ test1.out: .gdbinit test1.in
|
|||||||
|
|
||||||
nolog:
|
nolog:
|
||||||
@echo "[OLDTEST-PREP] Removing test.log and messages"
|
@echo "[OLDTEST-PREP] Removing test.log and messages"
|
||||||
@rm -f test.log messages
|
@rm -f test_result.log $(CLEANUP_FILES)
|
||||||
|
|
||||||
|
|
||||||
# New style of tests uses Vim script with assert calls. These are easier
|
# New style of tests uses Vim script with assert calls. These are easier
|
||||||
|
@ -61,7 +61,16 @@ if &lines < 24 || &columns < 80
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if has('reltime')
|
if has('reltime')
|
||||||
let s:start_time = reltime()
|
let s:run_start_time = reltime()
|
||||||
|
|
||||||
|
if !filereadable('starttime')
|
||||||
|
" first test, store the overall test starting time
|
||||||
|
let s:test_start_time = localtime()
|
||||||
|
call writefile([string(s:test_start_time)], 'starttime')
|
||||||
|
else
|
||||||
|
" second or later test, read the overall test starting time
|
||||||
|
let s:test_start_time = readfile('starttime')[0]->str2nr()
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Always use forward slashes.
|
" Always use forward slashes.
|
||||||
@ -121,6 +130,7 @@ if has('mac')
|
|||||||
let $BASH_SILENCE_DEPRECATION_WARNING = 1
|
let $BASH_SILENCE_DEPRECATION_WARNING = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
" Prepare for calling test_garbagecollect_now().
|
" Prepare for calling test_garbagecollect_now().
|
||||||
let v:testing = 1
|
let v:testing = 1
|
||||||
|
|
||||||
@ -139,10 +149,57 @@ func GetAllocId(name)
|
|||||||
return lnum - top - 1
|
return lnum - top - 1
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func RunTheTest(test)
|
|
||||||
echo 'Executing ' . a:test
|
|
||||||
if has('reltime')
|
if has('reltime')
|
||||||
let func_start = reltime()
|
let g:func_start = reltime()
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Get the list of swap files in the current directory.
|
||||||
|
func s:GetSwapFileList()
|
||||||
|
let save_dir = &directory
|
||||||
|
let &directory = '.'
|
||||||
|
let files = swapfilelist()
|
||||||
|
let &directory = save_dir
|
||||||
|
|
||||||
|
" remove a match with runtest.vim
|
||||||
|
let idx = indexof(files, 'v:val =~ "runtest.vim."')
|
||||||
|
if idx >= 0
|
||||||
|
call remove(files, idx)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return files
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" A previous (failed) test run may have left swap files behind. Delete them
|
||||||
|
" before running tests again, they might interfere.
|
||||||
|
for name in s:GetSwapFileList()
|
||||||
|
call delete(name)
|
||||||
|
endfor
|
||||||
|
unlet name
|
||||||
|
|
||||||
|
|
||||||
|
" Invoked when a test takes too much time.
|
||||||
|
func TestTimeout(id)
|
||||||
|
split test.log
|
||||||
|
call append(line('$'), '')
|
||||||
|
call append(line('$'), 'Test timed out: ' .. g:testfunc)
|
||||||
|
write
|
||||||
|
call add(v:errors, 'Test timed out: ' . g:testfunc)
|
||||||
|
|
||||||
|
cquit! 42
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func RunTheTest(test)
|
||||||
|
let prefix = ''
|
||||||
|
if has('reltime')
|
||||||
|
let prefix = strftime('%M:%S', localtime() - s:test_start_time) .. ' '
|
||||||
|
let g:func_start = reltime()
|
||||||
|
endif
|
||||||
|
echo prefix .. 'Executing ' .. a:test
|
||||||
|
|
||||||
|
if has('timers')
|
||||||
|
" No test should take longer than 30 seconds. If it takes longer we
|
||||||
|
" assume we are stuck and need to break out.
|
||||||
|
let test_timeout_timer = timer_start(30000, 'TestTimeout')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Avoid stopping at the "hit enter" prompt
|
" Avoid stopping at the "hit enter" prompt
|
||||||
@ -193,6 +250,11 @@ func RunTheTest(test)
|
|||||||
endif
|
endif
|
||||||
au! VimLeavePre
|
au! VimLeavePre
|
||||||
|
|
||||||
|
if a:test =~ '_terminal_'
|
||||||
|
" Terminal tests sometimes hang, give extra information
|
||||||
|
echoconsole 'After executing ' .. a:test
|
||||||
|
endif
|
||||||
|
|
||||||
" In case 'insertmode' was set and something went wrong, make sure it is
|
" In case 'insertmode' was set and something went wrong, make sure it is
|
||||||
" reset to avoid trouble with anything else.
|
" reset to avoid trouble with anything else.
|
||||||
set noinsertmode
|
set noinsertmode
|
||||||
@ -205,6 +267,10 @@ func RunTheTest(test)
|
|||||||
endtry
|
endtry
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if has('timers')
|
||||||
|
call timer_stop(test_timeout_timer)
|
||||||
|
endif
|
||||||
|
|
||||||
" Clear any autocommands and put back the catch-all for SwapExists.
|
" Clear any autocommands and put back the catch-all for SwapExists.
|
||||||
au!
|
au!
|
||||||
au SwapExists * call HandleSwapExists()
|
au SwapExists * call HandleSwapExists()
|
||||||
@ -234,20 +300,54 @@ func RunTheTest(test)
|
|||||||
|
|
||||||
exe 'cd ' . save_cwd
|
exe 'cd ' . save_cwd
|
||||||
|
|
||||||
|
if a:test =~ '_terminal_'
|
||||||
|
" Terminal tests sometimes hang, give extra information
|
||||||
|
echoconsole 'Finished ' . a:test
|
||||||
|
endif
|
||||||
|
|
||||||
let message = 'Executed ' . a:test
|
let message = 'Executed ' . a:test
|
||||||
if has('reltime')
|
if has('reltime')
|
||||||
let message ..= repeat(' ', 50 - len(message))
|
let message ..= repeat(' ', 50 - len(message))
|
||||||
let time = reltime(func_start)
|
let time = reltime(g:func_start)
|
||||||
if has('float') && reltimefloat(time) > 0.1
|
if reltimefloat(time) > 0.1
|
||||||
let message = s:t_bold .. message
|
let message = s:t_bold .. message
|
||||||
endif
|
endif
|
||||||
let message ..= ' in ' .. reltimestr(time) .. ' seconds'
|
let message ..= ' in ' .. reltimestr(time) .. ' seconds'
|
||||||
if has('float') && reltimefloat(time) > 0.1
|
if reltimefloat(time) > 0.1
|
||||||
let message ..= s:t_normal
|
let message ..= s:t_normal
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
call add(s:messages, message)
|
call add(s:messages, message)
|
||||||
let s:done += 1
|
let s:done += 1
|
||||||
|
|
||||||
|
" close any split windows
|
||||||
|
while winnr('$') > 1
|
||||||
|
bwipe!
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" May be editing some buffer, wipe it out. Then we may end up in another
|
||||||
|
" buffer, continue until we end up in an empty no-name buffer without a swap
|
||||||
|
" file.
|
||||||
|
while bufname() != '' || execute('swapname') !~ 'No swap file'
|
||||||
|
let bn = bufnr()
|
||||||
|
|
||||||
|
noswapfile bwipe!
|
||||||
|
|
||||||
|
if bn == bufnr()
|
||||||
|
" avoid getting stuck in the same buffer
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Check if the test has left any swap files behind. Delete them before
|
||||||
|
" running tests again, they might interfere.
|
||||||
|
let swapfiles = s:GetSwapFileList()
|
||||||
|
if len(swapfiles) > 0
|
||||||
|
call add(s:messages, "Found swap files: " .. string(swapfiles))
|
||||||
|
for name in swapfiles
|
||||||
|
call delete(name)
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func AfterTheTest(func_name)
|
func AfterTheTest(func_name)
|
||||||
@ -314,7 +414,7 @@ func FinishTesting()
|
|||||||
endif
|
endif
|
||||||
if s:done > 0 && has('reltime')
|
if s:done > 0 && has('reltime')
|
||||||
let message = s:t_bold .. message .. repeat(' ', 40 - len(message))
|
let message = s:t_bold .. message .. repeat(' ', 40 - len(message))
|
||||||
let message ..= ' in ' .. reltimestr(reltime(s:start_time)) .. ' seconds'
|
let message ..= ' in ' .. reltimestr(reltime(s:run_start_time)) .. ' seconds'
|
||||||
let message ..= s:t_normal
|
let message ..= s:t_normal
|
||||||
endif
|
endif
|
||||||
echo message
|
echo message
|
||||||
@ -434,6 +534,7 @@ for g:testfunc in sort(s:tests)
|
|||||||
" A test can set g:test_is_flaky to retry running the test.
|
" A test can set g:test_is_flaky to retry running the test.
|
||||||
let g:test_is_flaky = 0
|
let g:test_is_flaky = 0
|
||||||
|
|
||||||
|
let starttime = strftime("%H:%M:%S")
|
||||||
call RunTheTest(g:testfunc)
|
call RunTheTest(g:testfunc)
|
||||||
|
|
||||||
" Repeat a flaky test. Give up when:
|
" Repeat a flaky test. Give up when:
|
||||||
@ -445,10 +546,11 @@ for g:testfunc in sort(s:tests)
|
|||||||
\ && (index(s:flaky_tests, g:testfunc) >= 0
|
\ && (index(s:flaky_tests, g:testfunc) >= 0
|
||||||
\ || g:test_is_flaky)
|
\ || g:test_is_flaky)
|
||||||
while 1
|
while 1
|
||||||
call add(s:messages, 'Found errors in ' . g:testfunc . ':')
|
call add(s:messages, 'Found errors in ' .. g:testfunc .. ':')
|
||||||
call extend(s:messages, v:errors)
|
call extend(s:messages, v:errors)
|
||||||
|
|
||||||
call add(total_errors, 'Run ' . g:run_nr . ':')
|
let endtime = strftime("%H:%M:%S")
|
||||||
|
call add(total_errors, $'Run {g:run_nr}, {starttime} - {endtime}:')
|
||||||
call extend(total_errors, v:errors)
|
call extend(total_errors, v:errors)
|
||||||
|
|
||||||
if g:run_nr >= 5 || prev_error == v:errors[0]
|
if g:run_nr >= 5 || prev_error == v:errors[0]
|
||||||
@ -468,6 +570,7 @@ for g:testfunc in sort(s:tests)
|
|||||||
let v:errors = []
|
let v:errors = []
|
||||||
let g:run_nr += 1
|
let g:run_nr += 1
|
||||||
|
|
||||||
|
let starttime = strftime("%H:%M:%S")
|
||||||
call RunTheTest(g:testfunc)
|
call RunTheTest(g:testfunc)
|
||||||
|
|
||||||
if len(v:errors) == 0
|
if len(v:errors) == 0
|
||||||
|
@ -110,16 +110,16 @@ func RunServer(cmd, testfunc, args)
|
|||||||
try
|
try
|
||||||
let g:currentJob = RunCommand(pycmd)
|
let g:currentJob = RunCommand(pycmd)
|
||||||
|
|
||||||
" Wait for up to 2 seconds for the port number to be there.
|
" Wait for some time for the port number to be there.
|
||||||
let port = GetPort()
|
let port = GetPort()
|
||||||
if port == 0
|
if port == 0
|
||||||
call assert_false(1, "Can't start " . a:cmd)
|
call assert_report(strftime("%H:%M:%S") .. " Can't start " .. a:cmd)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call call(function(a:testfunc), [port])
|
call call(function(a:testfunc), [port])
|
||||||
catch
|
catch
|
||||||
call assert_false(1, 'Caught exception: "' . v:exception . '" in ' . v:throwpoint)
|
call assert_report('Caught exception: "' . v:exception . '" in ' . v:throwpoint)
|
||||||
finally
|
finally
|
||||||
call s:kill_server(a:cmd)
|
call s:kill_server(a:cmd)
|
||||||
endtry
|
endtry
|
||||||
|
@ -3156,7 +3156,7 @@ func Test_autocmd_FileReadCmd()
|
|||||||
\ 'v:cmdarg = ++ff=mac',
|
\ 'v:cmdarg = ++ff=mac',
|
||||||
\ 'v:cmdarg = ++enc=utf-8'], getline(1, '$'))
|
\ 'v:cmdarg = ++enc=utf-8'], getline(1, '$'))
|
||||||
|
|
||||||
close!
|
bwipe!
|
||||||
augroup FileReadCmdTest
|
augroup FileReadCmdTest
|
||||||
au!
|
au!
|
||||||
augroup END
|
augroup END
|
||||||
|
@ -115,8 +115,19 @@ func Test_swapinfo()
|
|||||||
w
|
w
|
||||||
let fname = s:swapname()
|
let fname = s:swapname()
|
||||||
call assert_match('Xswapinfo', fname)
|
call assert_match('Xswapinfo', fname)
|
||||||
let info = fname->swapinfo()
|
|
||||||
|
|
||||||
|
" Check the tail appears in the list from swapfilelist(). The path depends
|
||||||
|
" on the system.
|
||||||
|
let tail = fnamemodify(fname, ":t")->fnameescape()
|
||||||
|
let nr = 0
|
||||||
|
for name in swapfilelist()
|
||||||
|
if name =~ tail .. '$'
|
||||||
|
let nr += 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
call assert_equal(1, nr, 'not found in ' .. string(swapfilelist()))
|
||||||
|
|
||||||
|
let info = fname->swapinfo()
|
||||||
let ver = printf('VIM %d.%d', v:version / 100, v:version % 100)
|
let ver = printf('VIM %d.%d', v:version / 100, v:version % 100)
|
||||||
call assert_equal(ver, info.version)
|
call assert_equal(ver, info.version)
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ func Test_invalid_name()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_ownsyntax()
|
func Test_ownsyntax()
|
||||||
new Xfoo
|
new XfooOwnSyntax
|
||||||
call setline(1, '#define FOO')
|
call setline(1, '#define FOO')
|
||||||
syntax on
|
syntax on
|
||||||
set filetype=c
|
set filetype=c
|
||||||
|
@ -5983,6 +5983,9 @@ endfunc
|
|||||||
|
|
||||||
" interrupt right before a catch is invoked in a script
|
" interrupt right before a catch is invoked in a script
|
||||||
func Test_ignore_catch_after_intr_1()
|
func Test_ignore_catch_after_intr_1()
|
||||||
|
" for unknown reasons this test sometimes fails on MS-Windows.
|
||||||
|
let g:test_is_flaky = 1
|
||||||
|
|
||||||
XpathINIT
|
XpathINIT
|
||||||
let lines =<< trim [CODE]
|
let lines =<< trim [CODE]
|
||||||
try
|
try
|
||||||
@ -6021,6 +6024,9 @@ endfunc
|
|||||||
|
|
||||||
" interrupt right before a catch is invoked inside a function.
|
" interrupt right before a catch is invoked inside a function.
|
||||||
func Test_ignore_catch_after_intr_2()
|
func Test_ignore_catch_after_intr_2()
|
||||||
|
" for unknown reasons this test sometimes fails on MS-Windows.
|
||||||
|
let g:test_is_flaky = 1
|
||||||
|
|
||||||
XpathINIT
|
XpathINIT
|
||||||
func F()
|
func F()
|
||||||
try
|
try
|
||||||
|
@ -119,10 +119,9 @@ endfunc
|
|||||||
|
|
||||||
" Test the ":wincmd ^" and "<C-W>^" commands.
|
" Test the ":wincmd ^" and "<C-W>^" commands.
|
||||||
func Test_window_split_edit_alternate()
|
func Test_window_split_edit_alternate()
|
||||||
|
|
||||||
" Test for failure when the alternate buffer/file no longer exists.
|
" Test for failure when the alternate buffer/file no longer exists.
|
||||||
edit Xfoo | %bw
|
edit Xfoo | %bw
|
||||||
call assert_fails(':wincmd ^', 'E23')
|
call assert_fails(':wincmd ^', 'E23:')
|
||||||
|
|
||||||
" Test for the expected behavior when we have two named buffers.
|
" Test for the expected behavior when we have two named buffers.
|
||||||
edit Xfoo | edit Xbar
|
edit Xfoo | edit Xbar
|
||||||
@ -152,12 +151,11 @@ endfunc
|
|||||||
|
|
||||||
" Test the ":[count]wincmd ^" and "[count]<C-W>^" commands.
|
" Test the ":[count]wincmd ^" and "[count]<C-W>^" commands.
|
||||||
func Test_window_split_edit_bufnr()
|
func Test_window_split_edit_bufnr()
|
||||||
|
|
||||||
%bwipeout
|
%bwipeout
|
||||||
let l:nr = bufnr('%') + 1
|
let l:nr = bufnr('%') + 1
|
||||||
call assert_fails(':execute "normal! ' . l:nr . '\<C-W>\<C-^>"', 'E92')
|
call assert_fails(':execute "normal! ' . l:nr . '\<C-W>\<C-^>"', 'E92:')
|
||||||
call assert_fails(':' . l:nr . 'wincmd ^', 'E16')
|
call assert_fails(':' . l:nr . 'wincmd ^', 'E16:')
|
||||||
call assert_fails(':0wincmd ^', 'E16')
|
call assert_fails(':0wincmd ^', 'E16:')
|
||||||
|
|
||||||
edit Xfoo | edit Xbar | edit Xbaz
|
edit Xfoo | edit Xbar | edit Xbaz
|
||||||
let l:foo_nr = bufnr('Xfoo')
|
let l:foo_nr = bufnr('Xfoo')
|
||||||
|
Loading…
Reference in New Issue
Block a user