aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/functional/api/server_requests_spec.lua18
-rw-r--r--test/functional/api/vim_spec.lua145
-rw-r--r--test/functional/eval/buf_functions_spec.lua5
-rw-r--r--test/functional/eval/match_functions_spec.lua7
-rw-r--r--test/functional/eval/server_spec.lua16
-rw-r--r--test/functional/ex_cmds/digraphs_spec.lua38
-rw-r--r--test/functional/legacy/file_perm_spec.lua2
-rw-r--r--test/functional/lua/luaeval_spec.lua8
-rw-r--r--test/functional/ui/cmdline_spec.lua21
-rw-r--r--test/functional/ui/screen_basic_spec.lua99
10 files changed, 305 insertions, 54 deletions
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
index 18229b54ff..e79a60fb10 100644
--- a/test/functional/api/server_requests_spec.lua
+++ b/test/functional/api/server_requests_spec.lua
@@ -11,6 +11,7 @@ local ok = helpers.ok
local meths = helpers.meths
local spawn, nvim_argv = helpers.spawn, helpers.nvim_argv
local set_session = helpers.set_session
+local expect_err = helpers.expect_err
describe('server -> client', function()
local cid
@@ -221,9 +222,8 @@ describe('server -> client', function()
end)
it('returns an error if the request failed', function()
- local status, err = pcall(eval, "rpcrequest(vim, 'does-not-exist')")
- eq(false, status)
- ok(nil ~= string.match(err, 'Failed to evaluate expression'))
+ expect_err('Vim:Invalid method name',
+ eval, "rpcrequest(vim, 'does-not-exist')")
end)
end)
@@ -250,7 +250,7 @@ describe('server -> client', function()
end)
after_each(function()
- funcs.jobstop(jobid)
+ pcall(funcs.jobstop, jobid)
end)
if helpers.pending_win32(pending) then return end
@@ -261,7 +261,7 @@ describe('server -> client', function()
eq({'notification', 'pong', {}}, next_msg())
eq("done!",funcs.rpcrequest(jobid, "write_stderr", "fluff\n"))
eq({'notification', 'stderr', {0, {'fluff', ''}}}, next_msg())
- funcs.rpcrequest(jobid, "exit")
+ pcall(funcs.rpcrequest, jobid, "exit")
eq({'notification', 'stderr', {0, {''}}}, next_msg())
eq({'notification', 'exit', {0, 0}}, next_msg())
end)
@@ -308,8 +308,8 @@ describe('server -> client', function()
it('via ipv4 address', function()
local server = spawn(nvim_argv)
set_session(server)
- local address = funcs.serverstart("127.0.0.1:")
- if #address == 0 then
+ local status, address = pcall(funcs.serverstart, "127.0.0.1:")
+ if not status then
pending('no ipv4 stack', function() end)
return
end
@@ -320,8 +320,8 @@ describe('server -> client', function()
it('via ipv6 address', function()
local server = spawn(nvim_argv)
set_session(server)
- local address = funcs.serverstart('::1:')
- if #address == 0 then
+ local status, address = pcall(funcs.serverstart, '::1:')
+ if not status then
pending('no ipv6 stack', function() end)
return
end
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index 599280d684..71fa6632c7 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -4,17 +4,20 @@ local global_helpers = require('test.helpers')
local NIL = helpers.NIL
local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq
+local command = helpers.command
+local eval = helpers.eval
+local funcs = helpers.funcs
+local iswin = helpers.iswin
+local meth_pcall = helpers.meth_pcall
+local meths = helpers.meths
local ok, nvim_async, feed = helpers.ok, helpers.nvim_async, helpers.feed
local os_name = helpers.os_name
-local meths = helpers.meths
-local funcs = helpers.funcs
local request = helpers.request
-local meth_pcall = helpers.meth_pcall
-local command = helpers.command
-local iswin = helpers.iswin
+local source = helpers.source
-local intchar2lua = global_helpers.intchar2lua
+local expect_err = global_helpers.expect_err
local format_string = global_helpers.format_string
+local intchar2lua = global_helpers.intchar2lua
local mergedicts_copy = global_helpers.mergedicts_copy
describe('api', function()
@@ -38,20 +41,20 @@ describe('api', function()
os.remove(fname)
end)
- it("parse error: fails (specific error), does NOT update v:errmsg", function()
- -- Most API methods return generic errors (or no error) if a VimL
- -- expression fails; nvim_command returns the VimL error details.
+ it('VimL validation error: fails with specific error', function()
local status, rv = pcall(nvim, "command", "bogus_command")
eq(false, status) -- nvim_command() failed.
eq("E492:", string.match(rv, "E%d*:")) -- VimL error was returned.
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated.
+ eq('', eval('v:exception'))
end)
- it("runtime error: fails (specific error)", function()
+ it('VimL execution error: fails with specific error', function()
local status, rv = pcall(nvim, "command_output", "buffer 23487")
eq(false, status) -- nvim_command() failed.
eq("E86: Buffer 23487 does not exist", string.match(rv, "E%d*:.*"))
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ eq('', eval('v:exception'))
end)
end)
@@ -107,21 +110,21 @@ describe('api', function()
eq(':!echo foo\r\n\nfoo'..win_lf..'\n', nvim('command_output', [[!echo foo]]))
end)
- it("parse error: fails (specific error), does NOT update v:errmsg", function()
+ it('VimL validation error: fails with specific error', function()
local status, rv = pcall(nvim, "command_output", "bogus commannnd")
eq(false, status) -- nvim_command_output() failed.
eq("E492: Not an editor command: bogus commannnd",
string.match(rv, "E%d*:.*"))
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
-- Verify NO hit-enter prompt.
eq({mode='n', blocking=false}, nvim("get_mode"))
end)
- it("runtime error: fails (specific error)", function()
+ it('VimL execution error: fails with specific error', function()
local status, rv = pcall(nvim, "command_output", "buffer 42")
eq(false, status) -- nvim_command_output() failed.
eq("E86: Buffer 42 does not exist", string.match(rv, "E%d*:.*"))
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
-- Verify NO hit-enter prompt.
eq({mode='n', blocking=false}, nvim("get_mode"))
end)
@@ -143,11 +146,10 @@ describe('api', function()
eq(2, request("vim_eval", "1+1"))
end)
- it("VimL error: fails (generic error), does NOT update v:errmsg", function()
- local status, rv = pcall(nvim, "eval", "bogus expression")
- eq(false, status) -- nvim_eval() failed.
- ok(nil ~= string.find(rv, "Failed to evaluate expression"))
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ it("VimL error: returns error details, does NOT update v:errmsg", function()
+ expect_err('E121: Undefined variable: bogus', request,
+ 'nvim_eval', 'bogus expression')
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
end)
end)
@@ -159,11 +161,100 @@ describe('api', function()
eq('foo', nvim('call_function', 'simplify', {'this/./is//redundant/../../../foo'}))
end)
- it("VimL error: fails (generic error), does NOT update v:errmsg", function()
- local status, rv = pcall(nvim, "call_function", "bogus function", {"arg1"})
- eq(false, status) -- nvim_call_function() failed.
- ok(nil ~= string.find(rv, "Error calling function"))
- eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
+ it("VimL validation error: returns specific error, does NOT update v:errmsg", function()
+ expect_err('E117: Unknown function: bogus function', request,
+ 'nvim_call_function', 'bogus function', {'arg1'})
+ expect_err('E119: Not enough arguments for function: atan', request,
+ 'nvim_call_function', 'atan', {})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it("VimL error: returns error details, does NOT update v:errmsg", function()
+ expect_err('E808: Number or Float required', request,
+ 'nvim_call_function', 'atan', {'foo'})
+ expect_err('Invalid channel stream "xxx"', request,
+ 'nvim_call_function', 'chanclose', {999, 'xxx'})
+ expect_err('E900: Invalid channel id', request,
+ 'nvim_call_function', 'chansend', {999, 'foo'})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it("VimL exception: returns exception details, does NOT update v:errmsg", function()
+ source([[
+ function! Foo() abort
+ throw 'wtf'
+ endfunction
+ ]])
+ expect_err('wtf', request,
+ 'nvim_call_function', 'Foo', {})
+ eq('', eval('v:exception'))
+ eq('', eval('v:errmsg')) -- v:errmsg was not updated.
+ end)
+
+ it('validates args', function()
+ local too_many_args = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' }
+ source([[
+ function! Foo(...) abort
+ echo a:000
+ endfunction
+ ]])
+ -- E740
+ expect_err('Function called with too many arguments', request,
+ 'nvim_call_function', 'Foo', too_many_args)
+ end)
+ end)
+
+ describe('nvim_call_dict_function', function()
+ it('invokes VimL dict function', function()
+ source([[
+ function! F(name) dict
+ return self.greeting.', '.a:name.'!'
+ endfunction
+ let g:test_dict_fn = { 'greeting':'Hello', 'F':function('F') }
+
+ let g:test_dict_fn2 = { 'greeting':'Hi' }
+ function g:test_dict_fn2.F2(name)
+ return self.greeting.', '.a:name.' ...'
+ endfunction
+ ]])
+
+ -- :help Dictionary-function
+ eq('Hello, World!', nvim('call_dict_function', 'g:test_dict_fn', 'F', {'World'}))
+ -- Funcref is sent as NIL over RPC.
+ eq({ greeting = 'Hello', F = NIL }, nvim('get_var', 'test_dict_fn'))
+
+ -- :help numbered-function
+ eq('Hi, Moon ...', nvim('call_dict_function', 'g:test_dict_fn2', 'F2', {'Moon'}))
+ -- Funcref is sent as NIL over RPC.
+ eq({ greeting = 'Hi', F2 = NIL }, nvim('get_var', 'test_dict_fn2'))
+
+ -- Function specified via RPC dict.
+ source('function! G() dict\n return "@".(self.result)."@"\nendfunction')
+ eq('@it works@', nvim('call_dict_function', { result = 'it works', G = 'G'}, 'G', {}))
+ end)
+
+ it('validates args', function()
+ command('let g:d={"baz":"zub","meep":[]}')
+ expect_err('Not found: bogus', request,
+ 'nvim_call_dict_function', 'g:d', 'bogus', {1,2})
+ expect_err('Not a function: baz', request,
+ 'nvim_call_dict_function', 'g:d', 'baz', {1,2})
+ expect_err('Not a function: meep', request,
+ 'nvim_call_dict_function', 'g:d', 'meep', {1,2})
+ expect_err('E117: Unknown function: f', request,
+ 'nvim_call_dict_function', { f = '' }, 'f', {1,2})
+ expect_err('Not a function: f', request,
+ 'nvim_call_dict_function', "{ 'f': '' }", 'f', {1,2})
+ expect_err('dict argument type must be String or Dictionary', request,
+ 'nvim_call_dict_function', 42, 'f', {1,2})
+ expect_err('Failed to evaluate dict expression', request,
+ 'nvim_call_dict_function', 'foo', 'f', {1,2})
+ expect_err('dict not found', request,
+ 'nvim_call_dict_function', '42', 'f', {1,2})
+ expect_err('Invalid %(empty%) function name', request,
+ 'nvim_call_dict_function', "{ 'f': '' }", '', {1,2})
end)
end)
@@ -301,7 +392,7 @@ describe('api', function()
'\tLast set from API client %(channel id %d+%)'))
nvim('execute_lua', 'vim.api.nvim_set_option("equalalways", true)', {})
- local status, rv = pcall(nvim, 'command_output',
+ status, rv = pcall(nvim, 'command_output',
'verbose set equalalways?')
eq(true, status)
eq(' equalalways\n\tLast set from Lua', rv)
diff --git a/test/functional/eval/buf_functions_spec.lua b/test/functional/eval/buf_functions_spec.lua
index 7de58766b9..c0e264d4c9 100644
--- a/test/functional/eval/buf_functions_spec.lua
+++ b/test/functional/eval/buf_functions_spec.lua
@@ -15,6 +15,7 @@ local curwinmeths = helpers.curwinmeths
local curtabmeths = helpers.curtabmeths
local get_pathsep = helpers.get_pathsep
local rmdir = helpers.rmdir
+local expect_err = helpers.expect_err
local fname = 'Xtest-functional-eval-buf_functions'
local fname2 = fname .. '.2'
@@ -296,8 +297,8 @@ describe('setbufvar() function', function()
eq('Vim(call):E461: Illegal variable name: b:',
exc_exec('call setbufvar(1, "", 0)'))
eq(true, bufmeths.get_var(buf1, 'number'))
- funcs.setbufvar(1, 'changedtick', true)
- -- eq(true, bufmeths.get_var(buf1, 'changedtick'))
+ expect_err('Vim:E46: Cannot change read%-only variable "b:changedtick"',
+ funcs.setbufvar, 1, 'changedtick', true)
eq(2, funcs.getbufvar(1, 'changedtick'))
end)
end)
diff --git a/test/functional/eval/match_functions_spec.lua b/test/functional/eval/match_functions_spec.lua
index 7989b22b5e..0ec465a34c 100644
--- a/test/functional/eval/match_functions_spec.lua
+++ b/test/functional/eval/match_functions_spec.lua
@@ -6,6 +6,7 @@ local clear = helpers.clear
local funcs = helpers.funcs
local command = helpers.command
local exc_exec = helpers.exc_exec
+local expect_err = helpers.expect_err
before_each(clear)
@@ -40,9 +41,11 @@ describe('setmatches()', function()
end)
it('fails with -1 if highlight group is not defined', function()
- eq(-1, funcs.setmatches({{group=1, pattern=2, id=3, priority=4}}))
+ expect_err('E28: No such highlight group name: 1', funcs.setmatches,
+ {{group=1, pattern=2, id=3, priority=4}})
eq({}, funcs.getmatches())
- eq(-1, funcs.setmatches({{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}}))
+ expect_err('E28: No such highlight group name: 1', funcs.setmatches,
+ {{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}})
eq({}, funcs.getmatches())
end)
end)
diff --git a/test/functional/eval/server_spec.lua b/test/functional/eval/server_spec.lua
index 4e4aed864b..563e619b39 100644
--- a/test/functional/eval/server_spec.lua
+++ b/test/functional/eval/server_spec.lua
@@ -5,6 +5,7 @@ local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
local iswin = helpers.iswin
local ok = helpers.ok
local matches = helpers.matches
+local expect_err = helpers.expect_err
local function clear_serverlist()
for _, server in pairs(funcs.serverlist()) do
@@ -86,22 +87,23 @@ describe('server', function()
local expected = {}
local v4 = '127.0.0.1:12345'
- s = funcs.serverstart(v4)
- if #s > 0 then
+ local status, _ = pcall(funcs.serverstart, v4)
+ if status then
table.insert(expected, v4)
- funcs.serverstart(v4) -- exists already; ignore
+ pcall(funcs.serverstart, v4) -- exists already; ignore
end
local v6 = '::1:12345'
- s = funcs.serverstart(v6)
- if #s > 0 then
+ status, _ = pcall(funcs.serverstart, v6)
+ if status then
table.insert(expected, v6)
- funcs.serverstart(v6) -- exists already; ignore
+ pcall(funcs.serverstart, v6) -- exists already; ignore
end
eq(expected, funcs.serverlist())
clear_serverlist()
- funcs.serverstart('127.0.0.1:65536') -- invalid port
+ expect_err('Failed to start server: invalid argument',
+ funcs.serverstart, '127.0.0.1:65536') -- invalid port
eq({}, funcs.serverlist())
end)
diff --git a/test/functional/ex_cmds/digraphs_spec.lua b/test/functional/ex_cmds/digraphs_spec.lua
new file mode 100644
index 0000000000..f2d0b76739
--- /dev/null
+++ b/test/functional/ex_cmds/digraphs_spec.lua
@@ -0,0 +1,38 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local feed = helpers.feed
+local Screen = require('test.functional.ui.screen')
+
+describe(':digraphs', function()
+ local screen
+ before_each(function()
+ clear()
+ screen = Screen.new(65, 8)
+ screen:set_default_attr_ids({
+ [1] = {bold = true, foreground = Screen.colors.Blue1},
+ [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
+ [3] = {bold = true, foreground = Screen.colors.SeaGreen4},
+ [4] = {bold = true},
+ [5] = {background = Screen.colors.LightGrey},
+ [6] = {foreground = Screen.colors.Blue1},
+ [7] = {bold = true, reverse = true},
+ })
+ screen:attach()
+ end)
+
+ it('displays digraphs', function()
+ feed(':digraphs<CR>')
+ screen:expect([[
+ A@ {6:Å} 197 E` {6:È} 200 E^ {6:Ê} 202 E" {6:Ë} 203 I` {6:Ì} 204 |
+ I^ {6:Î} 206 I" {6:Ï} 207 N~ {6:Ñ} 209 O` {6:Ò} 210 O^ {6:Ô} 212 |
+ O~ {6:Õ} 213 /\ {6:×} 215 U` {6:Ù} 217 U^ {6:Û} 219 Ip {6:Þ} 222 |
+ a` {6:à} 224 a^ {6:â} 226 a~ {6:ã} 227 a" {6:ä} 228 a@ {6:å} 229 |
+ e` {6:è} 232 e^ {6:ê} 234 e" {6:ë} 235 i` {6:ì} 236 i^ {6:î} 238 |
+ n~ {6:ñ} 241 o` {6:ò} 242 o^ {6:ô} 244 o~ {6:õ} 245 u` {6:ù} 249 |
+ u^ {6:û} 251 y" {6:ÿ} 255 |
+ {3:Press ENTER or type command to continue}^ |
+ ]])
+ end)
+
+end)
+
diff --git a/test/functional/legacy/file_perm_spec.lua b/test/functional/legacy/file_perm_spec.lua
index 77e82352c5..d61fdc9b83 100644
--- a/test/functional/legacy/file_perm_spec.lua
+++ b/test/functional/legacy/file_perm_spec.lua
@@ -15,7 +15,7 @@ describe('Test getting and setting file permissions', function()
it('file permissions', function()
eq('', call('getfperm', tempfile))
- eq(0, call('setfperm', tempfile, 'r------'))
+ eq(0, call('setfperm', tempfile, 'r--------'))
call('writefile', {'one'}, tempfile)
eq(9, call('len', call('getfperm', tempfile)))
diff --git a/test/functional/lua/luaeval_spec.lua b/test/functional/lua/luaeval_spec.lua
index 6da0001cea..760105df6b 100644
--- a/test/functional/lua/luaeval_spec.lua
+++ b/test/functional/lua/luaeval_spec.lua
@@ -51,12 +51,12 @@ describe('luaeval()', function()
end)
describe('recursive lua values', function()
it('are successfully transformed', function()
- funcs.luaeval('rawset(_G, "d", {})')
- funcs.luaeval('rawset(d, "d", d)')
+ command('lua rawset(_G, "d", {})')
+ command('lua rawset(d, "d", d)')
eq('\n{\'d\': {...@0}}', funcs.execute('echo luaeval("d")'))
- funcs.luaeval('rawset(_G, "l", {})')
- funcs.luaeval('table.insert(l, l)')
+ command('lua rawset(_G, "l", {})')
+ command('lua table.insert(l, l)')
eq('\n[[...@0]]', funcs.execute('echo luaeval("l")'))
end)
end)
diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua
index f8680678ef..41c290a462 100644
--- a/test/functional/ui/cmdline_spec.lua
+++ b/test/functional/ui/cmdline_spec.lua
@@ -157,6 +157,27 @@ describe('external cmdline', function()
end)
end)
+ it("redraws statusline on entering", function()
+ command('set laststatus=2')
+ command('set statusline=%{mode()}')
+ feed(':')
+ screen:expect([[
+ |
+ {1:~ }|
+ {1:~ }|
+ {3:c^ }|
+ |
+ ]], nil, nil, function()
+ eq({{
+ content = { { {}, "" } },
+ firstc = ":",
+ indent = 0,
+ pos = 0,
+ prompt = ""
+ }}, cmdline)
+ end)
+ end)
+
it("works with input()", function()
feed(':call input("input", "default")<cr>')
screen:expect([[
diff --git a/test/functional/ui/screen_basic_spec.lua b/test/functional/ui/screen_basic_spec.lua
index 7fafd6b352..06e4a19354 100644
--- a/test/functional/ui/screen_basic_spec.lua
+++ b/test/functional/ui/screen_basic_spec.lua
@@ -240,8 +240,8 @@ describe('Screen', function()
end)
end)
- describe('tabnew', function()
- it('creates a new buffer', function()
+ describe('tabs', function()
+ it('tabnew creates a new buffer', function()
command('sp')
command('vsp')
command('vsp')
@@ -299,6 +299,62 @@ describe('Screen', function()
|
]])
end)
+
+ it('tabline is redrawn after messages', function()
+ command('tabnew')
+ screen:expect([[
+ {4: [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+
+ feed(':echo "'..string.rep('x\\n', 11)..'"<cr>')
+ screen:expect([[
+ {1: }|
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ x |
+ |
+ {7:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed('<cr>')
+ screen:expect([[
+ {4: [No Name] }{2: [No Name] }{3: }{4:X}|
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
end)
describe('insert mode', function()
@@ -645,4 +701,43 @@ describe('Screen', function()
]])
end)
end)
+
+ -- Regression test for #8357
+ it('does not have artifacts after temporary chars in insert mode', function()
+ command('inoremap jk <esc>')
+ feed('ifooj')
+ screen:expect([[
+ foo^j |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {2:-- INSERT --} |
+ ]])
+ feed('k')
+ screen:expect([[
+ fo^o |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
end)