Vim 在编译后可以进行测试,通常用 "make test" 进行。
这些测试位于目录 "src/testdir"。
在不同的时间点,加入了两种不同类型的测试:
test20.in 最老的,只用于微小和小编译版本
test_something.vim 新风格测试
new-style-testing
新写的测试需用新风格的测试。测试脚本命名方式为 test_<feature>
.vim (把
<feature>
换成待测试的功能名)。这些测试使用 assert_equal() 之类的函数,以便
在同一处地方维护测试命令和期待的结果。
old-style-testing
这些测试只用于在没有 +eval 特性时测试 Vim。
更多信息可见文件 src/testdir/README.txt。
test_alloc_fail({id}
, {countdown}
, {repeat}
) test_alloc_fail()
用于测试: 如果调用了 {id}
指定的内存分配,{countdown}
减一,到
零时,让内存分配失败 {repeat}
次。如果 {repeat}
小于一,失败一
次。
也可用作 method :
GetAllocId()->test_alloc_fail()
test_autochdir() test_autochdir()
设置标志位,在 Vim 启动过程结束之前,打开 'autochdir' 的效果。
test_feedinput({string}
) test_feedinput()
{string}
中的字符会如果是用户键入的那样,排队依次等待处理。使
用一个低层输入缓冲区。此函数只适用于 +unix 或 GUI 运行时。
也可用作 method :
GetText()->test_feedinput()
test_garbagecollect_now() test_garbagecollect_now()
类似于 garbagecollect(),但立即执行。只能通过直接调用,以避免
内部保存任何结构,而调用任何函数前,必须置位 v:testing 。
E1142
不能在 :def 函数里调用,因为堆栈上的变量会被释放。
test_garbagecollect_soon() test_garbagecollect_soon()
就像在 main 循环中那样,设置标志位来调用垃圾清理器。仅用于测
试。
test_getvalue({name}
) test_getvalue()
取得内部变量的值。支持以下的 {name}
值:
need_fileinfo
也可用作 method :
GetName()->test_getvalue()
test_gui_event()
test_gui_event({event}
, {args}
)
生成 GUI {event}
,使用参数 {args}
,用于测试 Vim 功能。只在 GUI
运行时才能用此函数。
{event}
是字符串,支持的值是:
"dropfiles" 在窗口上放置一个或多个文件。
"findrepl" 搜索和替代文本。
"mouse" 鼠标按钮点击事件。
"scrollbar" 移动或拖动滚动条。
"tabline" 用鼠标选择标签页。
"tabmenu" 选择标签页行的菜单项。
{args}
为字典,包含事件需要的参数。
"dropfiles":
在指定窗口上放置一个或多个文件。{args}
里支持的项目是:
files: 文件名列表
row: 窗口行号
col: 窗口列号
modifiers: 键修饰符。支持的值是:
0x4 Shift
0x8 Alt
0x10 Ctrl
文件会加入 argument-list ,在窗口里编辑 {files}
的首个文
件。详见 drag-n-drop 。仅当 drop_file 特性存在时才能使用
此事件。
"findrepl":
{仅当 GUI 有查找/替代对话框时才可用}
执行文本的搜索和替代。{args}
里支持的项目是:
find_text: 搜索的文本。
repl_text: 替代文本。
flags: 控制搜索/替代的标志位。支持的值是:
1 搜索下个字符串 (搜索对话框)
2 搜索下个字符串 (替代对话框)
3 替代字符串一次
4 替代全部字符串
8 只匹配完整单词
16 匹配大小写
forward: 设为 1 时正向搜索。
"mouse":
注入鼠标按钮点击或鼠标移动事件。{args}
里支持的项目是:
button: 鼠标按钮。支持的值是:
0 鼠标右键
1 鼠标中键
2 鼠标左键
3 鼠标键释放
4 鼠标滚轮下滚
5 鼠标滚轮上滚
6 鼠标滚轮左滚
7 鼠标滚轮右滚
row: 鼠标点击行号。Vim 窗口的首行为 1,末行为
'lines'。
col: 鼠标点击列号。{col}
的最大值为 'columns'。
multiclick: 设为 1 时注入多点击鼠标事件。
modifiers: 键修饰符。支持的值是:
4 按了 shift
8 按了 alt
16 按了 ctrl
move: 可选;如果给出且为 TRUE,生成鼠标移动事件。
只使用 {args}
里 row: 和 col: 且为必须;取决于
"cell",它们被解释为像素或屏幕单元格。
仅当置位了 'mousemoveevent' 或弹出窗口使用鼠标
移动事件时才生成事件。
cell: 可选: 如果给出且为 TRUE,"move" 使用屏幕单元格
而不是像素位置
"scrollbar":
设置或拖动左侧、右侧或水平滚动条。仅当滚动条确实存在时才可用。
{args}
里支持的项目是:
which: 滚动条。支持的值是:
left 当前窗口的左侧滚动条
right 当前窗口的右侧滚动条
hor 水平滚动条
value: 滚动量。对垂直滚动条而言,{value}
可取值 1 到
缓冲区行数。对水平滚动条而言,{value}
可取值 1
到最大的行长,假定 'wrap' 未置位。
dragging: 为 1 时拖动滚动条,为 0 时点击滚动条。
"tabline":
在标签页行上注入鼠标点击事件以选择标签页。{args}
里支持的项
目是:
tabnr: 标签页号
"tabmenu":
注入事件以选择标签页行的菜单项。{args}
里支持的项目是:
tabnr: 标签页号
item: 标签页菜单项号。1 代表首个菜单项,2 代表第二个
项目,依此类推。
注入 GUI 事件后,可能应调用 feedkeys() 以处理这些事件,如:
call feedkeys("y", 'Lx!')
成功加入事件后返回 TRUE,出错时返回 FALSE。
也可用作 method :
GetEvent()->test_gui_event({args})
test_ignore_error({expr}
) test_ignore_error()
忽略包含 {expr}
的任何错误。显示正常的消息来替代。
只用于测试,因为那里 try/catch 不能用于捕捉错误 (因为跳过了下
面的代码)。
{expr}
按本义使用,不用作模式。
如果 {expr}
为字符串 "RESET",清空忽略错误的列表。
也可用作 method :
GetErrorText()->test_ignore_error()
test_null_blob() test_null_blob()
返回 null Blob 。仅用于测试。
test_null_channel() test_null_channel()
返回 null Channel 。仅用于测试。
{仅当编译时加入 +channel 特性才有效}
test_null_dict() test_null_dict()
返回 null Dict 。仅用于测试。
test_null_function() test_null_function()
返回 null Funcref 。仅用于测试。
test_null_job() test_null_job()
返回 null Job 。仅用于测试。
{仅当编译时加入 +job 特性才有效}
test_null_list() test_null_list()
返回 null List 。仅用于测试。
test_null_partial() test_null_partial()
返回 null Partial 。仅用于测试。
test_null_string() test_null_string()
返回 null String 。仅用于测试。
test_option_not_set({name}
) test_option_not_set()
复位指示选项 {name}
已设置过的标志位。就像看起来此选项还使用缺
省值那样。这样来用:
set ambiwidth=double
call test_option_not_set('ambiwidth')
现在 'ambiwidth' 选项的行为就像它从未被改变过一样,即使它的值
是 "double"。
仅用于测试!
也可用作 method :
GetOptionName()->test_option_not_set()
test_override({name}
, {val}
) test_override()
覆盖 Vim 内部处理的部分行为,用于运行测试。只能用于 Vim 测试!
如果 {val}
非零,打开覆盖行为,{val}
为零时,关闭覆盖行为。
{name}
目前支持的值是:
{name}
{val}
非零的效果
alloc_lines 在已分配内存内为每个缓冲区行复制备份,以便
valgrind 可以发现内存访问错误
autoload `import autoload` 会立即载入脚本,而不是延迟到项
目使用时
char_avail 屏蔽 char_avail() 函数
nfa_fail 使 NFA 正则表达式引擎失败以强制回归到旧引擎
no_query_mouse "dec" 终端不查询鼠标位置
no_wait_return 置位 "no_wait_return" 标志位。不被 "ALL" 复
位。
redraw 屏蔽 redrawing() 函数
redraw_flag 忽略 RedrawingDisabled 标志位
starting 复位 "starting" 变量,见下
term_props 检测到版本字符串时,复位所有终端属性
ui_delay 用于 ui_delay() 的以毫秒计的时间;覆盖缺省使用的
不多于 3 秒的消息等待时间
uptime 覆盖 sysinfo.uptime
vterm_title 用终端窗口运行中的作业来设置窗口标题
ALL 复位所有覆盖 (不使用 {val}
)
"starting" 用于假定初始化已经完成的测试。因为测试的运行是通过
运行一个 "starting" 变量为非零的脚本进行的。这通常有好处 (测试
更快),但有时会改变行为,使测试不能正常工作。
以下操作:
call test_override('starting', 1)
保存 "starting" 的值。以下操作恢复之:
call test_override('starting', 0)
也可用作 method :
GetOverrideVal()-> test_override('starting')
test_refcount({expr}
) test_refcount()
返回 {expr}
的引用计数。如果 {expr}
是没有引用计数的类型,返回
-1。仅用于测试。
也可用作 method :
GetVarname()->test_refcount()
test_setmouse({row}
, {col}
) test_setmouse()
设置下个鼠标活动所用的鼠标位置。
{row}
和 {col}
从 1 开始。
示例:
call test_setmouse(4, 20)
call feedkeys("\<LeftMouse>", "xt")
test_settime({expr}
) test_settime()
设置 Vim 内部使用的时间。目前只用于历史中的时间戳,用于
viminfo 和撤销。
值为 1 使 Vim 在警告
或信息后不睡眠。
{expr}
计算结果必须为数值。值为零时恢复正常行为。
也可用作 method :
GetTime()->test_settime()
test_srand_seed([seed]) test_srand_seed()
[seed]
给出时用来设置 srand() 使用的种子值。不给出时,删除此
测试用种子。
test_unknown() test_unknown()
返回未知类型的值。仅用于测试。
test_void() test_void()
返回 void 类型的值。仅用于测试。
assert_beeps({cmd}
) assert_beeps()
执行 {cmd}
,如果 不
响铃或可视响铃,加入错误信息到
v:errors 。
另见 assert_fails() 、 assert_nobeep() 和 assert-return 。
也可用作 method :
GetCmd()->assert_beeps()
assert_equal()
assert_equal({expected}
, {actual}
[, {msg}
])
{expected}
不等于 {actual}
时,加入错误信息到 v:errors ,并反
回 1。否则返回零 assert-return 。
没有自动转换,字符串 "4" 不同于数值 4。数值 4 又不同于浮点数
4.0。不适用 'ignorecase',大小写永远敏感。
省略 {msg}
则生成形如 "Expected {expected}
but got {actual}
"
的错误。
示例:
assert_equal('foo', 'bar')
会在 v:errors 加入字符串:
test.vim line 12: Expected 'foo'
but got 'bar'
也可用作 method ,基是作为第二个参数传递的:
mylist->assert_equal([1, 2, 3])
assert_equalfile()
assert_equalfile({fname-one}
, {fname-two}
[, {msg}
])
文件 {fname-one}
和 {fname-two}
不包含相同文本时,加入错误信息
到 v:errors 。
另见 assert-return 。
文件 {fname-one}
或 {fname-two}
不存在时,错误信息说明这一点。
最常用于 terminal-diff 。
也可用作 method :
GetLog()->assert_equalfile('expected.log')
assert_exception({error}
[, {msg}
]) assert_exception()
v:exception 不包含 {error}
时,加入错误信息到 v:errors 。另见
assert-return 。
可用于断言命令抛出例外。使用错误号后加冒号,就不用担心翻译的问
题:
try
commandthatfails
call assert_false(1, 'command should have failed')
catch
call assert_exception('E492:')
endtry
assert_fails()
assert_fails({cmd}
[, {error}
[, {msg}
[, {lnum}
[, {context}
]]]])
执行 {cmd}
,如果 不
出错或错误信息中找不到 {error}
,加入错误信
息到 v:errors 。另见 assert-return 。
E856
{error}
如为字符串,必须按本义在首个报告的错误中找到。这里最普
遍的情况是使用错误代码并带上冒号,如 "E123:"。
assert_fails('bad cmd', 'E987:')
{error}
如为带一或两个字符串的 List ,它们被用作模式。首个模
式匹配首个报告的错误:
assert_fails('cmd', ['E987:.*expected bool'])
第二个模式,如果提供,则匹配末个报告的错误。
如果只有一个错误,则两个模式必须都匹配。这可用于检查是否只有一
个错误。
要只匹配末个错误,使用空串作为首错模式:
assert_fails('cmd', ['', 'E987:'])
{msg}
为空时不使用之。可用于传入 {lnum}
参数而获得缺省信息。
E1115
{lnum}
存在且非负,且 {error}
参数存在且匹配时,则和错误报告所
在的行号相比较。这可以是函数中的行号或脚本中的行号。
E1116
{context}
存在时,用作模式来匹配 {lnum}
所在的上下文 (脚本名或
函数名)。
注意
响铃不作为错误处理,而有些出错的命令只会响铃。为此,可用
assert_beeps() 断言。
也可用作 method :
GetCmd()->assert_fails('E99:')
assert_false({actual}
[, {msg}
]) assert_false()
{actual}
不为假时,加入错误信息到 v:errors ,其余类同
assert_equal() 。
另见 assert-return 。
零值为假值。{actual}
不是数值时,断言失败。
省略 {msg}
则生成形如 "Expected False but got {actual}
" 的错
误。
也可用作 method :
GetResult()->assert_false()
assert_inrange({lower}
, {upper}
, {actual}
[, {msg}
]) assert_inrange()
对数值和 Float 值进行断言。{actual}
小于 {lower}
会大于
{upper}
时,加入错误信息到 v:errors 。另见 assert-return 。
省略 {msg}
则生成形如 "Expected range {lower}
- {upper}
, but
got {actual}
" 的错误。
assert_match()
assert_match({pattern}
, {actual}
[, {msg}
])
{pattern}
不匹配 {actual}
时,加入错误信息到 v:errors 。另见
assert-return 。
{pattern}
的用法类同于 =~
: 匹配总是假定 'magic' 置位而
'cpoptions' 为空,而忽略 'magic' 或 'cpoptions' 的实际值。
{actual}
作字符串使用,适用自动转换。
"^" 和 "$" 可用来匹配文本的开始和结尾。两者皆用则可匹配整个文
本。
省略 {msg}
则生成形如 "Pattern {pattern}
does not match
{actual}
" 的错误。
示例:
assert_match('^f.*o$', 'foobar')
会在 v:errors 加入字符串:
test.vim line 12: Pattern '^f.*o$' does not match 'foobar'
也可用作 method :
getFile()->assert_match('foo.*')
assert_nobeep({cmd}
) assert_nobeep()
运行 {cmd}
,如果导致鸣叫或可视响铃,加入错误信息到
v:errors 。
另见 assert_beeps() 。
也可用作 method :
GetCmd()->assert_nobeep()
assert_notequal()
assert_notequal({expected}
, {actual}
[, {msg}
])
和 assert_equal() 相反: {expected}
等于 {actual}
时,加入错
误信息到 v:errors 。
另见 assert-return 。
也可用作 method :
mylist->assert_notequal([1, 2, 3])
assert_notmatch()
assert_notmatch({pattern}
, {actual}
[, {msg}
])
和 assert_match() 相反: {pattern}
匹配 {actual}
时,加入错
误信息到 v:errors 。
另见 assert-return 。
也可用作 method :
getFile()->assert_notmatch('bar.*')
assert_report({msg}
) assert_report()
直接报告测试失败,用字符串 {msg}
。总返回一。
也可用作 method :
GetMessage()->assert_report()
assert_true({actual}
[, {msg}
]) assert_true()
{actual}
不为真时,加入错误信息到 v:errors ,余类同
assert_equal() 。
另见 assert-return 。
非零值为真值。{actual}
不是数值时,断言失败。
省略 {msg}
则生成形如 "Expected True but got {actual}
" 的错
误。
也可用作 method :
GetResult()->assert_true()
vim:tw=78:ts=8:noet:ft=help:norl: