testing

testing.txt 适用于 Vim 9.0 版本。 最近更新: 2023年2月 VIM 参考手册 by Bram Moolenaar 译者: Willis 测试 Vim 和 Vim 脚本 testing-support eval.txt 说明表达式的计算。此文件描述 Vim 脚本中编写测试的细节。这可用于 Vim 自身和插件的测试。 1. 测试 Vim testing 2. 测试函数 test-functions-details 3. 断言函数 assert-functions-details

1. 测试 Vim testing

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。

2. 测试函数 test-functions-details

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" 移动或拖动滚动条。 "key" 发送低层键盘事件。 "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 时点击滚动条。 "key": 发送低层键盘事件 (如释放键或按下键)。 目前只支持 MS-Windows。 {args} 里支持的项目是: event: 支持的字符串值是: keyup 生成 keyup 事件 keydown 生成 keydown 事件 keycode: keyup 或 keydown 事件使用的键码。 E1291 "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_mswin_event({event}, {args}) test_mswin_event() 生成低层 MS-Windows {event},使用参数 {args},用于测试 Vim 功 能。支持 MS-Windows GUI 和控制台。 {event} 是字符串,支持的值是: "mouse" 鼠标事件。 "key" 键盘事件。 "mouse": 注入鼠标按钮点击或鼠标移动事件。{args} 里支持的项目是: button: 鼠标按钮。支持的值是: 0 鼠标右键 1 鼠标中键 2 鼠标左键 3 鼠标键释放 4 鼠标滚轮下滚 5 鼠标滚轮上滚 6 鼠标滚轮左滚 7 鼠标滚轮右滚 row: 鼠标点击行号。Vim 窗口的首行为 1,末行为 'lines'。 col: 鼠标点击列号。{col} 的最大值为 'columns'注意: 控制台应用里 row 和 col 总解释为屏幕单元 格。GUI 里取决于 "cell",也可能解释为像素值。 multiclick: 设为 1 时注入多点击鼠标事件。 modifiers: 键修饰符。支持的值是: 4 按了 shift 8 按了 alt 16 按了 ctrl move: 可选;如果给出且为 TRUE,生成鼠标移动事件。 只使用 {args} 里 row: 和 col: 且为必须。 仅当置位了 'mousemoveevent' 或弹出窗口使用鼠标 移动事件时才生成事件。 cell: GUI 可选: 如果给出且为 TRUE,"move" 使用屏幕单 元格而不是像素位置。控制台不使用。 "key": 发送低层键盘事件 (如释放键或按下键)。 {args} 里支持的项目是: event: 支持的字符串值是: keyup 生成 keyup 事件 keydown 生成 keydown 事件 keycode: keyup 或 keydown 事件使用的键码。 modifiers: 可选;键修饰符。 支持的值是: 2 按了 shift 4 按了 ctrl 8 按了 alt 注意: 这些值和鼠标修饰符的不同。 execute: 可选。类似于 feedkeys() 模式 x。 包含且设为真 (非零) 时,Vim 会处理任何缓冲的未 处理的键盘事件。设置且为真时,其它的 {args} 项目均可选。 成功加入或执行事件后返回 TRUE,出错时返回 FALSE。 也可用作 method : GetEvent()->test_mswin_event({args}) 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 类型的值。仅用于测试。

3. 断言函数 assert-functions-details

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: