2017-01-29 22:48:45 +01:00
|
|
|
" Tests for Lua.
|
|
|
|
|
2019-06-15 17:58:09 +02:00
|
|
|
source check.vim
|
2020-10-26 20:18:08 +01:00
|
|
|
|
|
|
|
" This test also works without the lua feature.
|
|
|
|
func Test_skip_lua()
|
|
|
|
if 0
|
|
|
|
lua print("Not executed")
|
|
|
|
endif
|
|
|
|
endfunc
|
|
|
|
|
2019-06-15 17:58:09 +02:00
|
|
|
CheckFeature lua
|
2017-01-29 22:48:45 +01:00
|
|
|
|
2021-04-03 14:13:33 +02:00
|
|
|
" Depending on the lua version, the error messages are different.
|
2021-04-07 20:11:12 +02:00
|
|
|
let [s:major, s:minor, s:patch] = luaeval('vim.lua_version')->split('\.')->map({-> str2nr(v:val)})
|
2021-04-03 14:13:33 +02:00
|
|
|
let s:lua_53_or_later = 0
|
2022-01-28 17:20:03 +00:00
|
|
|
let s:lua_543 = 0
|
2021-04-03 14:13:33 +02:00
|
|
|
if (s:major == 5 && s:minor >= 3) || s:major > 5
|
2020-07-01 13:52:55 +02:00
|
|
|
let s:lua_53_or_later = 1
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:major == 5 && s:minor == 4 && s:patch == 3
|
|
|
|
let s:lua_543 = 1
|
2021-04-03 14:13:33 +02:00
|
|
|
endif
|
2020-07-01 13:52:55 +02:00
|
|
|
endif
|
|
|
|
|
2019-03-10 09:48:59 +01:00
|
|
|
func TearDown()
|
|
|
|
" Run garbage collection after each test to exercise luaV_setref().
|
|
|
|
call test_garbagecollect_now()
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Check that switching to another buffer does not trigger ml_get error.
|
2024-01-29 19:32:39 +01:00
|
|
|
func Test_lua_luado_change_buffer()
|
2017-01-29 22:48:45 +01:00
|
|
|
new
|
2024-01-29 19:32:39 +01:00
|
|
|
|
2017-01-29 22:48:45 +01:00
|
|
|
let wincount = winnr('$')
|
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
luado vim.command("new")
|
|
|
|
call assert_equal(wincount + 1, winnr('$'))
|
2024-01-29 19:32:39 +01:00
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
2024-01-29 19:32:39 +01:00
|
|
|
" Check that :luado deleting lines does not trigger ml_get error.
|
|
|
|
func Test_lua_luado_delete_lines()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
2024-01-29 19:32:39 +01:00
|
|
|
|
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
luado vim.command("%d_")
|
|
|
|
call assert_equal([''], getline(1, '$'))
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
luado vim.command("1,2d_")
|
|
|
|
call assert_equal(['three'], getline(1, '$'))
|
2024-01-29 19:32:39 +01:00
|
|
|
|
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
luado vim.command("2,3d_"); return "REPLACED"
|
|
|
|
call assert_equal(['REPLACED'], getline(1, '$'))
|
|
|
|
|
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
2,3luado vim.command("1,2d_"); return "REPLACED"
|
|
|
|
call assert_equal(['three'], getline(1, '$'))
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
2020-07-01 13:52:55 +02:00
|
|
|
func Test_lua_luado()
|
|
|
|
new
|
|
|
|
call setline(1, ['one', 'two'])
|
|
|
|
luado return(linenr)
|
|
|
|
call assert_equal(['1', '2'], getline(1, '$'))
|
|
|
|
close!
|
|
|
|
|
|
|
|
" Error cases
|
|
|
|
call assert_fails('luado string.format()',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'format' (string expected, got no value)")
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:lua_543
|
2021-04-03 14:13:33 +02:00
|
|
|
let msg = "[string \"vim chunk\"]:1: global 'func' is not callable (a nil value)"
|
|
|
|
elseif s:lua_53_or_later
|
|
|
|
let msg = "[string \"vim chunk\"]:1: attempt to call a nil value (global 'func')"
|
|
|
|
else
|
|
|
|
let msg = "[string \"vim chunk\"]:1: attempt to call global 'func' (a nil value)"
|
|
|
|
endif
|
|
|
|
call assert_fails('luado func()', msg)
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_fails('luado error("failed")', "[string \"vim chunk\"]:1: failed")
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test vim.eval()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_eval()
|
2018-06-30 21:50:25 +02:00
|
|
|
" lua.eval with a number
|
|
|
|
lua v = vim.eval('123')
|
|
|
|
call assert_equal('number', luaeval('vim.type(v)'))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(123, luaeval('v'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
|
|
|
" lua.eval with a string
|
|
|
|
lua v = vim.eval('"abc"')
|
2019-08-31 22:16:38 +02:00
|
|
|
call assert_equal('string', 'vim.type(v)'->luaeval())
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_equal('abc', luaeval('v'))
|
|
|
|
|
|
|
|
" lua.eval with a list
|
|
|
|
lua v = vim.eval("['a']")
|
|
|
|
call assert_equal('list', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(['a'], luaeval('v'))
|
|
|
|
|
|
|
|
" lua.eval with a dict
|
|
|
|
lua v = vim.eval("{'a':'b'}")
|
|
|
|
call assert_equal('dict', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal({'a':'b'}, luaeval('v'))
|
|
|
|
|
2019-03-23 13:57:02 +01:00
|
|
|
" lua.eval with a blob
|
|
|
|
lua v = vim.eval("0z00112233.deadbeef")
|
|
|
|
call assert_equal('blob', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(0z00112233.deadbeef, luaeval('v'))
|
|
|
|
|
2020-07-01 13:52:55 +02:00
|
|
|
" lua.eval with a float
|
|
|
|
lua v = vim.eval('3.14')
|
|
|
|
call assert_equal('number', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(3.14, luaeval('v'))
|
|
|
|
|
|
|
|
" lua.eval with a bool
|
|
|
|
lua v = vim.eval('v:true')
|
2024-11-09 18:30:10 +01:00
|
|
|
call assert_equal('boolean', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(v:true, luaeval('v'))
|
2020-07-01 13:52:55 +02:00
|
|
|
lua v = vim.eval('v:false')
|
2024-11-09 18:30:10 +01:00
|
|
|
call assert_equal('boolean', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(v:false, luaeval('v'))
|
2020-07-01 13:52:55 +02:00
|
|
|
|
|
|
|
" lua.eval with a null
|
|
|
|
lua v = vim.eval('v:null')
|
|
|
|
call assert_equal('nil', luaeval('vim.type(v)'))
|
|
|
|
call assert_equal(v:null, luaeval('v'))
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_fails('lua v = vim.eval(nil)',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got nil)")
|
|
|
|
call assert_fails('lua v = vim.eval(true)',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got boolean)")
|
|
|
|
call assert_fails('lua v = vim.eval({})',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got table)")
|
|
|
|
call assert_fails('lua v = vim.eval(print)',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got function)")
|
|
|
|
call assert_fails('lua v = vim.eval(vim.buffer())',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got userdata)")
|
|
|
|
|
|
|
|
lua v = nil
|
|
|
|
endfunc
|
|
|
|
|
2021-03-08 19:50:24 +01:00
|
|
|
" Test luaeval() with lambda
|
|
|
|
func Test_luaeval_with_lambda()
|
|
|
|
lua function hello_luaeval_lambda(a, cb) return a .. cb() end
|
|
|
|
call assert_equal('helloworld',
|
|
|
|
\ luaeval('hello_luaeval_lambda(_A[1], _A[2])',
|
|
|
|
\ ['hello', {->'world'}]))
|
|
|
|
lua hello_luaeval_lambda = nil
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test vim.window()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window()
|
2018-06-30 21:50:25 +02:00
|
|
|
e Xfoo2
|
|
|
|
new Xfoo1
|
|
|
|
|
|
|
|
" Window 1 (top window) contains Xfoo1
|
|
|
|
" Window 2 (bottom window) contains Xfoo2
|
|
|
|
call assert_equal('Xfoo1', luaeval('vim.window(1):buffer().name'))
|
|
|
|
call assert_equal('Xfoo2', luaeval('vim.window(2):buffer().name'))
|
|
|
|
|
|
|
|
" Window 3 does not exist so vim.window(3) should return nil
|
|
|
|
call assert_equal('nil', luaeval('tostring(vim.window(3))'))
|
|
|
|
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:lua_543
|
2021-04-03 14:13:33 +02:00
|
|
|
let msg = "[string \"luaeval\"]:1: field 'xyz' is not callable (a nil value)"
|
|
|
|
elseif s:lua_53_or_later
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call a nil value (field 'xyz')"
|
|
|
|
else
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call field 'xyz' (a nil value)"
|
|
|
|
endif
|
|
|
|
call assert_fails("let n = luaeval('vim.window().xyz()')", msg)
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_fails('lua vim.window().xyz = 1',
|
|
|
|
\ "[string \"vim chunk\"]:1: invalid window property: `xyz'")
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window().height
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_height()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
lua vim.window().height = 2
|
|
|
|
call assert_equal(2, winheight(0))
|
|
|
|
lua vim.window().height = vim.window().height + 1
|
|
|
|
call assert_equal(3, winheight(0))
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window().width
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_width()
|
2018-06-30 21:50:25 +02:00
|
|
|
vert new
|
|
|
|
lua vim.window().width = 2
|
|
|
|
call assert_equal(2, winwidth(0))
|
|
|
|
lua vim.window().width = vim.window().width + 1
|
|
|
|
call assert_equal(3, winwidth(0))
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window().line and vim.window.col
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_line_col()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
call setline(1, ['line1', 'line2', 'line3'])
|
|
|
|
lua vim.window().line = 2
|
|
|
|
lua vim.window().col = 4
|
|
|
|
call assert_equal([0, 2, 4, 0], getpos('.'))
|
|
|
|
lua vim.window().line = vim.window().line + 1
|
|
|
|
lua vim.window().col = vim.window().col - 1
|
|
|
|
call assert_equal([0, 3, 3, 0], getpos('.'))
|
|
|
|
|
|
|
|
call assert_fails('lua vim.window().line = 10',
|
|
|
|
\ '[string "vim chunk"]:1: line out of range')
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
2020-05-17 14:32:35 +02:00
|
|
|
" Test vim.call
|
|
|
|
func Test_lua_call()
|
|
|
|
call assert_equal(has('lua'), luaeval('vim.call("has", "lua")'))
|
|
|
|
call assert_equal(printf("Hello %s", "vim"), luaeval('vim.call("printf", "Hello %s", "vim")'))
|
2020-07-01 13:52:55 +02:00
|
|
|
|
|
|
|
" Error cases
|
|
|
|
call assert_fails("call luaeval('vim.call(\"min\", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)')",
|
2020-07-12 18:33:53 +02:00
|
|
|
\ s:lua_53_or_later
|
|
|
|
\ ? '[string "luaeval"]:1: Function called with too many arguments'
|
|
|
|
\ : 'Function called with too many arguments')
|
2020-07-01 13:52:55 +02:00
|
|
|
lua co = coroutine.create(function () print("hi") end)
|
|
|
|
call assert_fails("call luaeval('vim.call(\"type\", co)')",
|
2020-07-12 18:33:53 +02:00
|
|
|
\ s:lua_53_or_later
|
|
|
|
\ ? '[string "luaeval"]:1: lua: cannot convert value'
|
|
|
|
\ : 'lua: cannot convert value')
|
2020-07-01 13:52:55 +02:00
|
|
|
lua co = nil
|
2020-07-12 18:33:53 +02:00
|
|
|
call assert_fails("call luaeval('vim.call(\"abc\")')",
|
|
|
|
\ ['E117:', s:lua_53_or_later ? '\[string "luaeval"]:1: lua: call_vim_function failed'
|
|
|
|
\ : 'lua: call_vim_function failed'])
|
2020-05-17 14:32:35 +02:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.fn.*
|
|
|
|
func Test_lua_fn()
|
|
|
|
call assert_equal(has('lua'), luaeval('vim.fn.has("lua")'))
|
|
|
|
call assert_equal(printf("Hello %s", "vim"), luaeval('vim.fn.printf("Hello %s", "vim")'))
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test setting the current window
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_set_current()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo1
|
|
|
|
lua w1 = vim.window()
|
|
|
|
new Xfoo2
|
|
|
|
lua w2 = vim.window()
|
|
|
|
|
|
|
|
call assert_equal('Xfoo2', bufname('%'))
|
|
|
|
lua w1()
|
|
|
|
call assert_equal('Xfoo1', bufname('%'))
|
|
|
|
lua w2()
|
|
|
|
call assert_equal('Xfoo2', bufname('%'))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua w1, w2 = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window().buffer
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_buffer()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo1
|
|
|
|
lua w1 = vim.window()
|
|
|
|
lua b1 = w1.buffer()
|
|
|
|
new Xfoo2
|
|
|
|
lua w2 = vim.window()
|
|
|
|
lua b2 = w2.buffer()
|
|
|
|
|
|
|
|
lua b1()
|
|
|
|
call assert_equal('Xfoo1', bufname('%'))
|
|
|
|
lua b2()
|
|
|
|
call assert_equal('Xfoo2', bufname('%'))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua b1, b2, w1, w2 = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window():previous() and vim.window():next()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_next_previous()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo1
|
|
|
|
new Xfoo2
|
|
|
|
new Xfoo3
|
|
|
|
wincmd j
|
|
|
|
|
|
|
|
call assert_equal('Xfoo2', luaeval('vim.window().buffer().name'))
|
|
|
|
call assert_equal('Xfoo1', luaeval('vim.window():next():buffer().name'))
|
|
|
|
call assert_equal('Xfoo3', luaeval('vim.window():previous():buffer().name'))
|
|
|
|
|
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.window():isvalid()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_window_isvalid()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo
|
|
|
|
lua w = vim.window()
|
|
|
|
call assert_true(luaeval('w:isvalid()'))
|
|
|
|
|
|
|
|
" FIXME: how to test the case when isvalid() returns v:false?
|
|
|
|
" isvalid() gives errors when the window is deleted. Is it a bug?
|
|
|
|
|
|
|
|
lua w = nil
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.buffer() with and without argument
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo1
|
|
|
|
let bn1 = bufnr('%')
|
|
|
|
new Xfoo2
|
|
|
|
let bn2 = bufnr('%')
|
|
|
|
|
|
|
|
" Test vim.buffer() without argument.
|
|
|
|
call assert_equal('Xfoo2', luaeval("vim.buffer().name"))
|
|
|
|
|
|
|
|
" Test vim.buffer() with string argument.
|
|
|
|
call assert_equal('Xfoo1', luaeval("vim.buffer('Xfoo1').name"))
|
|
|
|
call assert_equal('Xfoo2', luaeval("vim.buffer('Xfoo2').name"))
|
|
|
|
|
|
|
|
" Test vim.buffer() with integer argument.
|
|
|
|
call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
|
|
|
|
call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua bn1, bn2 = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.buffer().name and vim.buffer().fname
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_name()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
2018-07-07 23:07:41 +02:00
|
|
|
call assert_equal('', luaeval('vim.buffer().name'))
|
|
|
|
call assert_equal('', luaeval('vim.buffer().fname'))
|
2018-06-30 21:50:25 +02:00
|
|
|
bwipe!
|
|
|
|
|
|
|
|
new Xfoo
|
|
|
|
call assert_equal('Xfoo', luaeval('vim.buffer().name'))
|
|
|
|
call assert_equal(expand('%:p'), luaeval('vim.buffer().fname'))
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.buffer().number
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_number()
|
2018-06-30 21:50:25 +02:00
|
|
|
" All numbers in Lua are floating points number (no integers).
|
|
|
|
call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number')))
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test inserting lines in buffer.
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_insert()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
lua vim.buffer()[1] = '3'
|
|
|
|
lua vim.buffer():insert('1', 0)
|
|
|
|
lua vim.buffer():insert('2', 1)
|
|
|
|
lua vim.buffer():insert('4', 10)
|
|
|
|
|
|
|
|
call assert_equal(['1', '2', '3', '4'], getline(1, '$'))
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_equal('4', luaeval('vim.buffer()[4]'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.buffer()[5]'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.buffer()[{}]'))
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:lua_543
|
2021-04-03 14:13:33 +02:00
|
|
|
let msg = "[string \"vim chunk\"]:1: method 'xyz' is not callable (a nil value)"
|
|
|
|
elseif s:lua_53_or_later
|
|
|
|
let msg = "[string \"vim chunk\"]:1: attempt to call a nil value (method 'xyz')"
|
|
|
|
else
|
|
|
|
let msg = "[string \"vim chunk\"]:1: attempt to call method 'xyz' (a nil value)"
|
|
|
|
endif
|
|
|
|
call assert_fails('lua vim.buffer():xyz()', msg)
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_fails('lua vim.buffer()[1] = {}',
|
|
|
|
\ '[string "vim chunk"]:1: wrong argument to change')
|
2018-06-30 21:50:25 +02:00
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test deleting line in buffer
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_delete()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
call setline(1, ['1', '2', '3'])
|
2020-07-01 13:52:55 +02:00
|
|
|
call cursor(3, 1)
|
2018-06-30 21:50:25 +02:00
|
|
|
lua vim.buffer()[2] = nil
|
|
|
|
call assert_equal(['1', '3'], getline(1, '$'))
|
|
|
|
|
|
|
|
call assert_fails('lua vim.buffer()[3] = nil',
|
|
|
|
\ '[string "vim chunk"]:1: invalid line number')
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test #vim.buffer() i.e. number of lines in buffer
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_number_lines()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
call setline(1, ['a', 'b', 'c'])
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(3, luaeval('#vim.buffer()'))
|
2018-06-30 21:50:25 +02:00
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.buffer():next() and vim.buffer():previous()
|
|
|
|
" Note that these functions get the next or previous buffers
|
|
|
|
" but do not switch buffer.
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_next_previous()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo1
|
|
|
|
new Xfoo2
|
|
|
|
new Xfoo3
|
|
|
|
b Xfoo2
|
|
|
|
|
|
|
|
lua bn = vim.buffer():next()
|
|
|
|
lua bp = vim.buffer():previous()
|
|
|
|
|
|
|
|
call assert_equal('Xfoo2', luaeval('vim.buffer().name'))
|
|
|
|
call assert_equal('Xfoo1', luaeval('bp.name'))
|
|
|
|
call assert_equal('Xfoo3', luaeval('bn.name'))
|
|
|
|
|
|
|
|
call assert_equal('Xfoo2', bufname('%'))
|
|
|
|
|
|
|
|
lua bn()
|
|
|
|
call assert_equal('Xfoo3', luaeval('vim.buffer().name'))
|
|
|
|
call assert_equal('Xfoo3', bufname('%'))
|
|
|
|
|
|
|
|
lua bp()
|
|
|
|
call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
|
|
|
|
call assert_equal('Xfoo1', bufname('%'))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua bn, bp = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.buffer():isvalid()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_buffer_isvalid()
|
2018-06-30 21:50:25 +02:00
|
|
|
new Xfoo
|
|
|
|
lua b = vim.buffer()
|
|
|
|
call assert_true(luaeval('b:isvalid()'))
|
|
|
|
|
|
|
|
" FIXME: how to test the case when isvalid() returns v:false?
|
|
|
|
" isvalid() gives errors when the buffer is wiped. Is it a bug?
|
|
|
|
|
|
|
|
lua b = nil
|
2017-01-29 22:48:45 +01:00
|
|
|
bwipe!
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_list()
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_equal([], luaeval('vim.list()'))
|
|
|
|
|
|
|
|
let l = []
|
|
|
|
lua l = vim.eval('l')
|
|
|
|
lua l:add(123)
|
|
|
|
lua l:add('abc')
|
|
|
|
lua l:add(true)
|
|
|
|
lua l:add(false)
|
2019-01-01 00:41:54 +01:00
|
|
|
lua l:add(nil)
|
2018-06-30 21:50:25 +02:00
|
|
|
lua l:add(vim.eval("[1, 2, 3]"))
|
|
|
|
lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal([123, 'abc', v:true, v:false, v:null, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
|
|
|
|
call assert_equal(7, luaeval('#l'))
|
2018-07-02 22:54:36 +02:00
|
|
|
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2020-06-27 12:32:57 +02:00
|
|
|
lua l[1] = 124
|
|
|
|
lua l[6] = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
lua l:insert('first')
|
|
|
|
lua l:insert('xx', 3)
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_fails('lua l:insert("xx", -20)',
|
|
|
|
\ '[string "vim chunk"]:1: invalid position')
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(['first', 124, 'abc', 'xx', v:true, v:false, v:null, {'a': 1, 'b': 2, 'c': 3}], l)
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lockvar 1 l
|
|
|
|
call assert_fails('lua l:add("x")', '[string "vim chunk"]:1: list is locked')
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_fails('lua l:insert(2)', '[string "vim chunk"]:1: list is locked')
|
|
|
|
call assert_fails('lua l[9] = 1', '[string "vim chunk"]:1: list is locked')
|
|
|
|
|
|
|
|
unlockvar l
|
|
|
|
let l = [1, 2]
|
|
|
|
lua ll = vim.eval('l')
|
|
|
|
let x = luaeval("ll[3]")
|
|
|
|
call assert_equal(v:null, x)
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:lua_543
|
2021-04-03 14:13:33 +02:00
|
|
|
let msg = "[string \"luaeval\"]:1: method 'xyz' is not callable (a nil value)"
|
|
|
|
elseif s:lua_53_or_later
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call a nil value (method 'xyz')"
|
|
|
|
else
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call method 'xyz' (a nil value)"
|
|
|
|
endif
|
|
|
|
call assert_fails('let x = luaeval("ll:xyz(3)")', msg)
|
2020-07-01 13:52:55 +02:00
|
|
|
let y = luaeval("ll[{}]")
|
|
|
|
call assert_equal(v:null, y)
|
2018-07-01 19:49:27 +02:00
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
lua l = nil
|
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_list_table()
|
2018-07-01 19:49:27 +02:00
|
|
|
" See :help lua-vim
|
|
|
|
" Non-numeric keys should not be used to initialize the list
|
|
|
|
" so say = 'hi' should be ignored.
|
|
|
|
lua t = {3.14, 'hello', false, true, say = 'hi'}
|
|
|
|
call assert_equal([3.14, 'hello', v:false, v:true], luaeval('vim.list(t)'))
|
|
|
|
lua t = nil
|
|
|
|
|
|
|
|
call assert_fails('lua vim.list(1)', '[string "vim chunk"]:1: table expected, got number')
|
|
|
|
call assert_fails('lua vim.list("x")', '[string "vim chunk"]:1: table expected, got string')
|
|
|
|
call assert_fails('lua vim.list(print)', '[string "vim chunk"]:1: table expected, got function')
|
|
|
|
call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
|
|
|
|
endfunc
|
|
|
|
|
2020-06-28 22:41:26 +02:00
|
|
|
func Test_lua_list_table_insert_remove()
|
2020-07-01 13:52:55 +02:00
|
|
|
if !s:lua_53_or_later
|
2020-06-28 22:41:26 +02:00
|
|
|
throw 'Skipped: Lua version < 5.3'
|
|
|
|
endif
|
|
|
|
|
2021-04-03 14:13:33 +02:00
|
|
|
let l = [1, 2]
|
2020-06-28 22:41:26 +02:00
|
|
|
lua t = vim.eval('l')
|
|
|
|
lua table.insert(t, 10)
|
|
|
|
lua t[#t + 1] = 20
|
|
|
|
lua table.insert(t, 2, 30)
|
|
|
|
call assert_equal(l, [1, 30, 2, 10, 20])
|
|
|
|
lua table.remove(t, 2)
|
|
|
|
call assert_equal(l, [1, 2, 10, 20])
|
|
|
|
lua t[3] = nil
|
|
|
|
call assert_equal(l, [1, 2, 20])
|
|
|
|
lua removed_value = table.remove(t, 3)
|
|
|
|
call assert_equal(luaeval('removed_value'), 20)
|
|
|
|
lua t = nil
|
|
|
|
lua removed_value = nil
|
|
|
|
unlet l
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test l() i.e. iterator on list
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_list_iter()
|
2018-06-30 21:50:25 +02:00
|
|
|
lua l = vim.list():add('foo'):add('bar')
|
|
|
|
lua str = ''
|
|
|
|
lua for v in l() do str = str .. v end
|
|
|
|
call assert_equal('foobar', luaeval('str'))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua str, l = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_recursive_list()
|
2018-06-30 21:50:25 +02:00
|
|
|
lua l = vim.list():add(1):add(2)
|
|
|
|
lua l = l:add(l)
|
|
|
|
|
2020-06-27 12:32:57 +02:00
|
|
|
call assert_equal(1, luaeval('l[1]'))
|
|
|
|
call assert_equal(2, luaeval('l[2]'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2020-06-27 12:32:57 +02:00
|
|
|
call assert_equal(1, luaeval('l[3][1]'))
|
|
|
|
call assert_equal(2, luaeval('l[3][2]'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2020-06-27 12:32:57 +02:00
|
|
|
call assert_equal(1, luaeval('l[3][3][1]'))
|
|
|
|
call assert_equal(2, luaeval('l[3][3][2]'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal('[1, 2, [...]]', string(luaeval('l')))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2018-07-02 22:54:36 +02:00
|
|
|
call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
|
2020-06-27 12:32:57 +02:00
|
|
|
call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[3])'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2020-06-27 12:32:57 +02:00
|
|
|
call assert_equal(luaeval('l'), luaeval('l[3]'))
|
|
|
|
call assert_equal(luaeval('l'), luaeval('l[3][3]'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
|
|
|
lua l = nil
|
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_dict()
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_equal({}, luaeval('vim.dict()'))
|
|
|
|
|
|
|
|
let d = {}
|
|
|
|
lua d = vim.eval('d')
|
|
|
|
lua d[0] = 123
|
|
|
|
lua d[1] = "abc"
|
|
|
|
lua d[2] = true
|
|
|
|
lua d[3] = false
|
|
|
|
lua d[4] = vim.eval("[1, 2, 3]")
|
|
|
|
lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal({'0':123, '1':'abc', '2':v:true, '3':v:false, '4': [1, 2, 3], '5': {'a':1, 'b':2, 'c':3}}, d)
|
|
|
|
call assert_equal(6, luaeval('#d'))
|
2018-07-02 22:54:36 +02:00
|
|
|
call assert_match('^dict: \%(0x\)\?\x\+$', luaeval('tostring(d)'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
|
|
|
call assert_equal('abc', luaeval('d[1]'))
|
2020-07-01 13:52:55 +02:00
|
|
|
call assert_equal(v:null, luaeval('d[22]'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
|
|
|
lua d[0] = 124
|
|
|
|
lua d[4] = nil
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal({'0':124, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lockvar 1 d
|
|
|
|
call assert_fails('lua d[6] = 1', '[string "vim chunk"]:1: dict is locked')
|
2020-07-01 13:52:55 +02:00
|
|
|
unlockvar d
|
|
|
|
|
|
|
|
" Error case
|
|
|
|
lua d = {}
|
|
|
|
lua d[''] = 10
|
|
|
|
call assert_fails("let t = luaeval('vim.dict(d)')",
|
2020-07-12 18:33:53 +02:00
|
|
|
\ s:lua_53_or_later
|
|
|
|
\ ? '[string "luaeval"]:1: table has empty key'
|
|
|
|
\ : 'table has empty key')
|
2020-07-01 13:52:55 +02:00
|
|
|
let d = {}
|
|
|
|
lua x = vim.eval('d')
|
|
|
|
call assert_fails("lua x[''] = 10", '[string "vim chunk"]:1: empty key')
|
|
|
|
lua x['a'] = nil
|
|
|
|
call assert_equal({}, d)
|
|
|
|
|
|
|
|
" cannot assign funcrefs in the global scope
|
|
|
|
lua x = vim.eval('g:')
|
|
|
|
call assert_fails("lua x['min'] = vim.funcref('max')",
|
|
|
|
\ '[string "vim chunk"]:1: cannot assign funcref to builtin scope')
|
2018-07-01 19:49:27 +02:00
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
lua d = nil
|
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_dict_table()
|
2018-07-01 19:49:27 +02:00
|
|
|
lua t = {key1 = 'x', key2 = 3.14, key3 = true, key4 = false}
|
|
|
|
call assert_equal({'key1': 'x', 'key2': 3.14, 'key3': v:true, 'key4': v:false},
|
|
|
|
\ luaeval('vim.dict(t)'))
|
|
|
|
|
|
|
|
" Same example as in :help lua-vim.
|
|
|
|
lua t = {math.pi, false, say = 'hi'}
|
|
|
|
" FIXME: commented out as it currently does not work as documented:
|
|
|
|
" Expected {'say': 'hi'}
|
|
|
|
" but got {'1': 3.141593, '2': v:false, 'say': 'hi'}
|
|
|
|
" Is the documentation or the code wrong?
|
|
|
|
"call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
|
|
|
|
lua t = nil
|
|
|
|
|
|
|
|
call assert_fails('lua vim.dict(1)', '[string "vim chunk"]:1: table expected, got number')
|
|
|
|
call assert_fails('lua vim.dict("x")', '[string "vim chunk"]:1: table expected, got string')
|
|
|
|
call assert_fails('lua vim.dict(print)', '[string "vim chunk"]:1: table expected, got function')
|
|
|
|
call assert_fails('lua vim.dict(true)', '[string "vim chunk"]:1: table expected, got boolean')
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test d() i.e. iterator on dictionary
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_dict_iter()
|
2018-06-30 21:50:25 +02:00
|
|
|
let d = {'a': 1, 'b':2}
|
|
|
|
lua d = vim.eval('d')
|
|
|
|
lua str = ''
|
|
|
|
lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
|
|
|
|
call assert_equal('a:1,b:2,', luaeval('str'))
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua str, d = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_blob()
|
2019-03-23 13:57:02 +01:00
|
|
|
call assert_equal(0z, luaeval('vim.blob("")'))
|
|
|
|
call assert_equal(0z31326162, luaeval('vim.blob("12ab")'))
|
Updated runtime files
This is a collection of various PRs from github that all require a minor
patch number:
1) https://github.com/vim/vim/pull/12612
Do not conflate dictionary key with end of block
2) https://github.com/vim/vim/pull/12729:
When saving and restoring 'undolevels', the constructs `&undolevels` and
`:set undolevels` are problematic.
The construct `&undolevels` reads an unpredictable value; it will be the
local option value (if one has been set), or the global option value
(otherwise), making it unsuitable for saving a value for later
restoration.
Similarly, if a local option value has been set for 'undolevels',
temporarily modifying the option via `:set undolevels` changes the local
value as well as the global value, requiring extra work to restore both
values.
Saving and restoring the option value in one step via the construct
`:let &undolevels = &undolevels` appears to make no changes to the
'undolevels' option, but if a local option has been set to a different
value than the global option, it has the unintended effect of changing
the global 'undolevels' value to the local value.
Update the documentation to explain these issues and recommend explicit
use of global and local option values when saving and restoring. Update
some unit tests to use `g:undolevels`.
3) https://github.com/vim/vim/pull/12702:
Problem: Pip requirements files are not recognized.
Solution: Add a pattern to match pip requirements files.
4) https://github.com/vim/vim/pull/12688:
Add indent file and tests for ABB Rapid
5) https://github.com/vim/vim/pull/12668:
Use Lua 5.1 numeric escapes in tests and add to CI
Only Lua 5.2+ and LuaJIT understand hexadecimal escapes in strings. Lua
5.1 only supports decimal escapes:
> A character in a string can also be specified by its numerical value
> using the escape sequence \ddd, where ddd is a sequence of up to three
> decimal digits. (Note that if a numerical escape is to be followed by a
> digit, it must be expressed using exactly three digits.) Strings in Lua
> can contain any 8-bit value, including embedded zeros, which can be
> specified as '\0'.
To make sure this works with Lua 5.4 and Lua 5.1 change the Vim CI to
run with Lua 5.1 as well as Lua 5.4
6) https://github.com/vim/vim/pull/12631:
Add hurl filetype detection
7) https://github.com/vim/vim/pull/12573:
Problem: Files for haskell persistent library are not recognized
Solution: Add pattern persistentmodels for haskell persistent library
closes: #12612
closes: #12729
closes: #12702
closes: #12688
closes: #12668
closes: #12631
closes: #12573
Co-authored-by: lacygoill <lacygoill@lacygoill.me>
Co-authored-by: Michael Henry <drmikehenry@drmikehenry.com>
Co-authored-by: ObserverOfTime <chronobserver@disroot.org>
Co-authored-by: KnoP-01 <knosowski@graeffrobotics.de>
Co-authored-by: James McCoy <jamessan@jamessan.com>
Co-authored-by: Jacob Pfeifer <jacob@pfeifer.dev>
Co-authored-by: Borys Lykah <lykahb@fastmail.com>
2023-08-10 05:44:25 +02:00
|
|
|
call assert_equal(0z00010203, luaeval('vim.blob("\000\001\002\003")'))
|
|
|
|
call assert_equal(0z8081FEFF, luaeval('vim.blob("\128\129\254\255")'))
|
2019-03-23 13:57:02 +01:00
|
|
|
|
Updated runtime files
This is a collection of various PRs from github that all require a minor
patch number:
1) https://github.com/vim/vim/pull/12612
Do not conflate dictionary key with end of block
2) https://github.com/vim/vim/pull/12729:
When saving and restoring 'undolevels', the constructs `&undolevels` and
`:set undolevels` are problematic.
The construct `&undolevels` reads an unpredictable value; it will be the
local option value (if one has been set), or the global option value
(otherwise), making it unsuitable for saving a value for later
restoration.
Similarly, if a local option value has been set for 'undolevels',
temporarily modifying the option via `:set undolevels` changes the local
value as well as the global value, requiring extra work to restore both
values.
Saving and restoring the option value in one step via the construct
`:let &undolevels = &undolevels` appears to make no changes to the
'undolevels' option, but if a local option has been set to a different
value than the global option, it has the unintended effect of changing
the global 'undolevels' value to the local value.
Update the documentation to explain these issues and recommend explicit
use of global and local option values when saving and restoring. Update
some unit tests to use `g:undolevels`.
3) https://github.com/vim/vim/pull/12702:
Problem: Pip requirements files are not recognized.
Solution: Add a pattern to match pip requirements files.
4) https://github.com/vim/vim/pull/12688:
Add indent file and tests for ABB Rapid
5) https://github.com/vim/vim/pull/12668:
Use Lua 5.1 numeric escapes in tests and add to CI
Only Lua 5.2+ and LuaJIT understand hexadecimal escapes in strings. Lua
5.1 only supports decimal escapes:
> A character in a string can also be specified by its numerical value
> using the escape sequence \ddd, where ddd is a sequence of up to three
> decimal digits. (Note that if a numerical escape is to be followed by a
> digit, it must be expressed using exactly three digits.) Strings in Lua
> can contain any 8-bit value, including embedded zeros, which can be
> specified as '\0'.
To make sure this works with Lua 5.4 and Lua 5.1 change the Vim CI to
run with Lua 5.1 as well as Lua 5.4
6) https://github.com/vim/vim/pull/12631:
Add hurl filetype detection
7) https://github.com/vim/vim/pull/12573:
Problem: Files for haskell persistent library are not recognized
Solution: Add pattern persistentmodels for haskell persistent library
closes: #12612
closes: #12729
closes: #12702
closes: #12688
closes: #12668
closes: #12631
closes: #12573
Co-authored-by: lacygoill <lacygoill@lacygoill.me>
Co-authored-by: Michael Henry <drmikehenry@drmikehenry.com>
Co-authored-by: ObserverOfTime <chronobserver@disroot.org>
Co-authored-by: KnoP-01 <knosowski@graeffrobotics.de>
Co-authored-by: James McCoy <jamessan@jamessan.com>
Co-authored-by: Jacob Pfeifer <jacob@pfeifer.dev>
Co-authored-by: Borys Lykah <lykahb@fastmail.com>
2023-08-10 05:44:25 +02:00
|
|
|
lua b = vim.blob("\000\000\000\000")
|
2019-03-23 13:57:02 +01:00
|
|
|
call assert_equal(0z00000000, luaeval('b'))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(4, luaeval('#b'))
|
2019-03-23 13:57:02 +01:00
|
|
|
lua b[0], b[1], b[2], b[3] = 1, 32, 256, 0xff
|
|
|
|
call assert_equal(0z012000ff, luaeval('b'))
|
|
|
|
lua b[4] = string.byte("z", 1)
|
|
|
|
call assert_equal(0z012000ff.7a, luaeval('b'))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(5, luaeval('#b'))
|
2019-03-23 13:57:02 +01:00
|
|
|
call assert_fails('lua b[#b+1] = 0x80', '[string "vim chunk"]:1: index out of range')
|
|
|
|
lua b:add("12ab")
|
|
|
|
call assert_equal(0z012000ff.7a313261.62, luaeval('b'))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(9, luaeval('#b'))
|
2019-03-23 13:57:02 +01:00
|
|
|
call assert_fails('lua b:add(nil)', '[string "vim chunk"]:1: string expected, got nil')
|
|
|
|
call assert_fails('lua b:add(true)', '[string "vim chunk"]:1: string expected, got boolean')
|
|
|
|
call assert_fails('lua b:add({})', '[string "vim chunk"]:1: string expected, got table')
|
|
|
|
lua b = nil
|
2020-07-01 13:52:55 +02:00
|
|
|
|
|
|
|
let b = 0z0102
|
|
|
|
lua lb = vim.eval('b')
|
|
|
|
let n = luaeval('lb[1]')
|
|
|
|
call assert_equal(2, n)
|
|
|
|
let n = luaeval('lb[6]')
|
|
|
|
call assert_equal(v:null, n)
|
2022-01-28 17:20:03 +00:00
|
|
|
if s:lua_543
|
2021-04-03 14:13:33 +02:00
|
|
|
let msg = "[string \"luaeval\"]:1: method 'xyz' is not callable (a nil value)"
|
|
|
|
elseif s:lua_53_or_later
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call a nil value (method 'xyz')"
|
|
|
|
else
|
|
|
|
let msg = "[string \"luaeval\"]:1: attempt to call method 'xyz' (a nil value)"
|
|
|
|
endif
|
|
|
|
call assert_fails('let x = luaeval("lb:xyz(3)")', msg)
|
2020-07-01 13:52:55 +02:00
|
|
|
let y = luaeval("lb[{}]")
|
|
|
|
call assert_equal(v:null, y)
|
|
|
|
|
|
|
|
lockvar b
|
|
|
|
call assert_fails('lua lb[1] = 2', '[string "vim chunk"]:1: blob is locked')
|
|
|
|
call assert_fails('lua lb:add("12")', '[string "vim chunk"]:1: blob is locked')
|
|
|
|
|
|
|
|
" Error cases
|
|
|
|
lua t = {}
|
|
|
|
call assert_fails('lua b = vim.blob(t)',
|
|
|
|
\ '[string "vim chunk"]:1: string expected, got table')
|
2019-03-23 13:57:02 +01:00
|
|
|
endfunc
|
|
|
|
|
2022-06-17 19:23:34 +01:00
|
|
|
def Vim9Test(Callback: func())
|
|
|
|
Callback()
|
|
|
|
enddef
|
|
|
|
|
|
|
|
func Test_call_lua_func_from_vim9_func()
|
|
|
|
" this only tests that Vim doesn't crash
|
|
|
|
lua << EOF
|
|
|
|
vim.fn.Vim9Test(function () print('Hello') end)
|
|
|
|
EOF
|
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_funcref()
|
2018-07-01 15:12:05 +02:00
|
|
|
function I(x)
|
|
|
|
return a:x
|
|
|
|
endfunction
|
|
|
|
let R = function('I')
|
|
|
|
lua i1 = vim.funcref"I"
|
|
|
|
lua i2 = vim.eval"R"
|
|
|
|
lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
|
|
|
|
lua msg = vim.funcref"tr"(msg, "|", " ")
|
|
|
|
call assert_equal("funcref test OK", luaeval('msg'))
|
|
|
|
|
2020-07-01 13:52:55 +02:00
|
|
|
" Error cases
|
|
|
|
call assert_fails('lua f1 = vim.funcref("")',
|
|
|
|
\ '[string "vim chunk"]:1: invalid function name: ')
|
|
|
|
call assert_fails('lua f1 = vim.funcref("10")',
|
|
|
|
\ '[string "vim chunk"]:1: invalid function name: 10')
|
|
|
|
let fname = test_null_string()
|
|
|
|
call assert_fails('lua f1 = vim.funcref(fname)',
|
|
|
|
\ "[string \"vim chunk\"]:1: bad argument #1 to 'funcref' (string expected, got nil)")
|
|
|
|
call assert_fails('lua vim.funcref("abc")()',
|
2020-07-11 22:49:59 +02:00
|
|
|
\ ['E117:', '\[string "vim chunk"]:1: cannot call funcref'])
|
2020-07-01 13:52:55 +02:00
|
|
|
|
2018-07-01 15:12:05 +02:00
|
|
|
" dict funcref
|
|
|
|
function Mylen() dict
|
|
|
|
return len(self.data)
|
|
|
|
endfunction
|
|
|
|
let l = [0, 1, 2, 3]
|
|
|
|
let mydict = {'data': l}
|
|
|
|
lua d = vim.eval"mydict"
|
|
|
|
lua d.len = vim.funcref"Mylen" -- assign d as 'self'
|
|
|
|
lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
|
|
|
|
call assert_equal("OK", luaeval('res'))
|
2019-03-19 21:59:19 +01:00
|
|
|
call assert_equal(function('Mylen', {'data': l, 'len': function('Mylen')}), mydict.len)
|
2018-07-01 19:49:27 +02:00
|
|
|
|
|
|
|
lua i1, i2, msg, d, res = nil
|
2018-07-01 15:12:05 +02:00
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test vim.type()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_type()
|
2018-06-30 21:50:25 +02:00
|
|
|
" The following values are identical to Lua's type function.
|
|
|
|
call assert_equal('string', luaeval('vim.type("foo")'))
|
|
|
|
call assert_equal('number', luaeval('vim.type(1)'))
|
|
|
|
call assert_equal('number', luaeval('vim.type(1.2)'))
|
|
|
|
call assert_equal('function', luaeval('vim.type(print)'))
|
|
|
|
call assert_equal('table', luaeval('vim.type({})'))
|
|
|
|
call assert_equal('boolean', luaeval('vim.type(true)'))
|
|
|
|
call assert_equal('boolean', luaeval('vim.type(false)'))
|
|
|
|
call assert_equal('nil', luaeval('vim.type(nil)'))
|
|
|
|
|
|
|
|
" The following values are specific to Vim.
|
|
|
|
call assert_equal('window', luaeval('vim.type(vim.window())'))
|
|
|
|
call assert_equal('buffer', luaeval('vim.type(vim.buffer())'))
|
|
|
|
call assert_equal('list', luaeval('vim.type(vim.list())'))
|
|
|
|
call assert_equal('dict', luaeval('vim.type(vim.dict())'))
|
2018-07-01 15:12:05 +02:00
|
|
|
call assert_equal('funcref', luaeval('vim.type(vim.funcref("Test_type"))'))
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.open()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_open()
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_notmatch('XOpen', execute('ls'))
|
|
|
|
|
|
|
|
" Open a buffer XOpen1, but do not jump to it.
|
|
|
|
lua b = vim.open('XOpen1')
|
|
|
|
call assert_equal('XOpen1', luaeval('b.name'))
|
|
|
|
call assert_equal('', bufname('%'))
|
|
|
|
|
|
|
|
call assert_match('XOpen1', execute('ls'))
|
|
|
|
call assert_notequal('XOpen2', bufname('%'))
|
|
|
|
|
|
|
|
" Open a buffer XOpen2 and jump to it.
|
|
|
|
lua b = vim.open('XOpen2')()
|
|
|
|
call assert_equal('XOpen2', luaeval('b.name'))
|
|
|
|
call assert_equal('XOpen2', bufname('%'))
|
|
|
|
|
|
|
|
lua b = nil
|
|
|
|
%bwipe!
|
|
|
|
endfunc
|
|
|
|
|
2020-05-31 14:08:12 +02:00
|
|
|
func Test_update_package_paths()
|
|
|
|
set runtimepath+=./testluaplugin
|
|
|
|
call assert_equal("hello from lua", luaeval("require('testluaplugin').hello()"))
|
|
|
|
endfunc
|
|
|
|
|
2020-06-25 19:27:56 +02:00
|
|
|
func Vim_func_call_lua_callback(Concat, Cb)
|
|
|
|
let l:message = a:Concat("hello", "vim")
|
|
|
|
call a:Cb(l:message)
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_pass_lua_callback_to_vim_from_lua()
|
|
|
|
lua pass_lua_callback_to_vim_from_lua_result = ""
|
|
|
|
call assert_equal("", luaeval("pass_lua_callback_to_vim_from_lua_result"))
|
|
|
|
lua <<EOF
|
|
|
|
vim.funcref('Vim_func_call_lua_callback')(
|
|
|
|
function(greeting, message)
|
|
|
|
return greeting .. " " .. message
|
|
|
|
end,
|
|
|
|
function(message)
|
|
|
|
pass_lua_callback_to_vim_from_lua_result = message
|
|
|
|
end)
|
|
|
|
EOF
|
|
|
|
call assert_equal("hello vim", luaeval("pass_lua_callback_to_vim_from_lua_result"))
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Vim_func_call_metatable_lua_callback(Greet)
|
|
|
|
return a:Greet("world")
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_pass_lua_metatable_callback_to_vim_from_lua()
|
|
|
|
let result = luaeval("vim.funcref('Vim_func_call_metatable_lua_callback')(setmetatable({ space = ' '}, { __call = function(tbl, msg) return 'hello' .. tbl.space .. msg end }) )")
|
|
|
|
call assert_equal("hello world", result)
|
|
|
|
endfunc
|
|
|
|
|
2018-06-30 21:50:25 +02:00
|
|
|
" Test vim.line()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_line()
|
2018-06-30 21:50:25 +02:00
|
|
|
new
|
|
|
|
call setline(1, ['first line', 'second line'])
|
|
|
|
1
|
|
|
|
call assert_equal('first line', luaeval('vim.line()'))
|
|
|
|
2
|
|
|
|
call assert_equal('second line', luaeval('vim.line()'))
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test vim.beep()
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_beep()
|
2018-06-30 21:50:25 +02:00
|
|
|
call assert_beeps('lua vim.beep()')
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test errors in luaeval()
|
|
|
|
func Test_luaeval_error()
|
|
|
|
" Compile error
|
|
|
|
call assert_fails("call luaeval('-nil')",
|
|
|
|
\ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
|
|
|
|
call assert_fails("call luaeval(']')",
|
|
|
|
\ "[string \"luaeval\"]:1: unexpected symbol near ']'")
|
2020-07-01 13:52:55 +02:00
|
|
|
lua co = coroutine.create(function () print("hi") end)
|
|
|
|
call assert_fails('let i = luaeval("co")', 'luaeval: cannot convert value')
|
|
|
|
lua co = nil
|
|
|
|
call assert_fails('let m = luaeval("{}")', 'luaeval: cannot convert value')
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test :luafile foo.lua
|
|
|
|
func Test_luafile()
|
2022-09-29 21:01:57 +01:00
|
|
|
call writefile(["str = 'hello'", "num = 123" ], 'Xlua_file', 'D')
|
2018-06-30 21:50:25 +02:00
|
|
|
call setfperm('Xlua_file', 'r-xr-xr-x')
|
|
|
|
|
|
|
|
luafile Xlua_file
|
|
|
|
call assert_equal('hello', luaeval('str'))
|
2020-05-17 14:32:35 +02:00
|
|
|
call assert_equal(123, luaeval('num'))
|
2018-06-30 21:50:25 +02:00
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua str, num = nil
|
2018-06-30 21:50:25 +02:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test :luafile %
|
|
|
|
func Test_luafile_percent()
|
|
|
|
new Xlua_file
|
|
|
|
append
|
|
|
|
str, num = 'foo', 321.0
|
|
|
|
print(string.format('str=%s, num=%d', str, num))
|
|
|
|
.
|
|
|
|
w!
|
|
|
|
luafile %
|
|
|
|
let msg = split(execute('message'), "\n")[-1]
|
|
|
|
call assert_equal('str=foo, num=321', msg)
|
|
|
|
|
2018-07-01 19:49:27 +02:00
|
|
|
lua str, num = nil
|
|
|
|
call delete('Xlua_file')
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test :luafile with syntax error
|
|
|
|
func Test_luafile_error()
|
|
|
|
new Xlua_file
|
2022-09-29 21:01:57 +01:00
|
|
|
call writefile(['nil = 0' ], 'Xlua_file', 'D')
|
2018-07-01 19:49:27 +02:00
|
|
|
call setfperm('Xlua_file', 'r-xr-xr-x')
|
|
|
|
|
|
|
|
call assert_fails('luafile Xlua_file', "Xlua_file:1: unexpected symbol near 'nil'")
|
|
|
|
|
2017-01-29 22:48:45 +01:00
|
|
|
bwipe!
|
|
|
|
endfunc
|
2018-07-25 22:02:36 +02:00
|
|
|
|
2021-07-28 15:07:01 +02:00
|
|
|
" Test :luafile printing a long string
|
|
|
|
func Test_luafile_print()
|
|
|
|
new Xlua_file
|
|
|
|
let lines =<< trim END
|
|
|
|
local data = ''
|
|
|
|
for i = 1, 130 do
|
|
|
|
data = data .. 'xxxxx asd as as dad sad sad xz cxz czxcxzczxc ad ad asd asd asd asd asd'
|
|
|
|
end
|
|
|
|
print(data)
|
|
|
|
END
|
|
|
|
call setline(1, lines)
|
|
|
|
w
|
|
|
|
luafile %
|
|
|
|
|
|
|
|
call delete('Xlua_file')
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
|
|
|
|
2020-07-01 13:52:55 +02:00
|
|
|
" Test for dealing with strings containing newlines and null character
|
|
|
|
func Test_lua_string_with_newline()
|
2021-07-28 21:48:59 +02:00
|
|
|
let x = execute('lua print("Hello\nWorld", 2)')
|
|
|
|
call assert_equal("\nHello\nWorld 2", x)
|
2020-07-01 13:52:55 +02:00
|
|
|
new
|
|
|
|
lua k = vim.buffer(vim.eval('bufnr()'))
|
|
|
|
lua k:insert("Hello\0World", 0)
|
|
|
|
call assert_equal(["Hello\nWorld", ''], getline(1, '$'))
|
|
|
|
close!
|
|
|
|
endfunc
|
|
|
|
|
2020-01-30 18:24:53 +01:00
|
|
|
func Test_lua_set_cursor()
|
2018-07-25 22:02:36 +02:00
|
|
|
" Check that setting the cursor position works.
|
|
|
|
new
|
|
|
|
call setline(1, ['first line', 'second line'])
|
|
|
|
normal gg
|
2020-04-14 20:15:49 +02:00
|
|
|
lua << trim EOF
|
|
|
|
w = vim.window()
|
|
|
|
w.line = 1
|
|
|
|
w.col = 5
|
|
|
|
EOF
|
2018-07-25 22:02:36 +02:00
|
|
|
call assert_equal([1, 5], [line('.'), col('.')])
|
|
|
|
|
|
|
|
" Check that movement after setting cursor position keeps current column.
|
|
|
|
normal j
|
|
|
|
call assert_equal([2, 5], [line('.'), col('.')])
|
|
|
|
endfunc
|
2020-04-14 20:15:49 +02:00
|
|
|
|
|
|
|
" Test for various heredoc syntax
|
|
|
|
func Test_lua_heredoc()
|
|
|
|
lua << END
|
|
|
|
vim.command('let s = "A"')
|
|
|
|
END
|
|
|
|
lua <<
|
|
|
|
vim.command('let s ..= "B"')
|
|
|
|
.
|
|
|
|
lua << trim END
|
|
|
|
vim.command('let s ..= "C"')
|
|
|
|
END
|
|
|
|
lua << trim
|
|
|
|
vim.command('let s ..= "D"')
|
|
|
|
.
|
2020-05-01 14:10:13 +02:00
|
|
|
lua << trim eof
|
|
|
|
vim.command('let s ..= "E"')
|
|
|
|
eof
|
2025-02-03 18:56:16 +01:00
|
|
|
lua << trimm
|
|
|
|
vim.command('let s ..= "F"')
|
|
|
|
trimm
|
|
|
|
call assert_equal('ABCDEF', s)
|
2020-04-14 20:15:49 +02:00
|
|
|
endfunc
|
|
|
|
|
2021-08-04 21:12:52 +02:00
|
|
|
" Test for adding, accessing and removing global variables using the vim.g
|
|
|
|
" Lua table
|
|
|
|
func Test_lua_global_var_table()
|
|
|
|
" Access global variables with different types of values
|
|
|
|
let g:Var1 = 10
|
|
|
|
let g:Var2 = 'Hello'
|
|
|
|
let g:Var3 = ['a', 'b']
|
|
|
|
let g:Var4 = #{x: 'edit', y: 'run'}
|
|
|
|
let g:Var5 = function('min')
|
|
|
|
call assert_equal(10, luaeval('vim.g.Var1'))
|
|
|
|
call assert_equal('Hello', luaeval('vim.g.Var2'))
|
|
|
|
call assert_equal(['a', 'b'], luaeval('vim.g.Var3'))
|
|
|
|
call assert_equal(#{x: 'edit', y: 'run'}, luaeval('vim.g.Var4'))
|
|
|
|
call assert_equal(2, luaeval('vim.g.Var5')([5, 9, 2]))
|
|
|
|
|
|
|
|
" Access list of dictionaries and dictionary of lists
|
|
|
|
let g:Var1 = [#{a: 10}, #{b: 20}]
|
|
|
|
let g:Var2 = #{p: [5, 6], q: [1.1, 2.2]}
|
|
|
|
call assert_equal([#{a: 10}, #{b: 20}], luaeval('vim.g.Var1'))
|
|
|
|
call assert_equal(#{p: [5, 6], q: [1.1, 2.2]}, luaeval('vim.g.Var2'))
|
|
|
|
|
|
|
|
" Create new global variables with different types of values
|
|
|
|
unlet g:Var1 g:Var2 g:Var3 g:Var4 g:Var5
|
|
|
|
lua << trim END
|
|
|
|
vim.g.Var1 = 34
|
|
|
|
vim.g.Var2 = 'World'
|
|
|
|
vim.g.Var3 = vim.list({'#', '$'})
|
|
|
|
vim.g.Var4 = vim.dict({model='honda', year=2020})
|
|
|
|
vim.g.Var5 = vim.funcref('max')
|
|
|
|
END
|
|
|
|
call assert_equal(34, g:Var1)
|
|
|
|
call assert_equal('World', g:Var2)
|
|
|
|
call assert_equal(['#', '$'], g:Var3)
|
|
|
|
call assert_equal(#{model: 'honda', year: 2020}, g:Var4)
|
|
|
|
call assert_equal(10, g:Var5([5, 10, 9]))
|
|
|
|
|
|
|
|
" Create list of dictionaries and dictionary of lists
|
|
|
|
unlet g:Var1 g:Var2
|
|
|
|
lua << trim END
|
|
|
|
vim.g.Var1 = vim.list({vim.dict({a=10}), vim.dict({b=20})})
|
|
|
|
vim.g.Var2 = vim.dict({p=vim.list({5, 6}), q=vim.list({1.1, 2.2})})
|
|
|
|
END
|
|
|
|
call assert_equal([#{a: 10}, #{b: 20}], luaeval('vim.g.Var1'))
|
|
|
|
call assert_equal(#{p: [5, 6], q: [1.1, 2.2]}, luaeval('vim.g.Var2'))
|
|
|
|
|
|
|
|
" Modify a global variable with a list value or a dictionary value
|
|
|
|
let g:Var1 = [10, 20]
|
|
|
|
let g:Var2 = #{one: 'mercury', two: 'mars'}
|
|
|
|
lua << trim END
|
2023-09-24 23:13:51 +02:00
|
|
|
vim.g.Var1[2] = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
vim.g.Var1[3] = 15
|
2023-09-24 23:13:51 +02:00
|
|
|
vim.g.Var2['two'] = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
vim.g.Var2['three'] = 'earth'
|
|
|
|
END
|
|
|
|
call assert_equal([10, 15], g:Var1)
|
|
|
|
call assert_equal(#{one: 'mercury', three: 'earth'}, g:Var2)
|
|
|
|
|
|
|
|
" Remove global variables with different types of values
|
|
|
|
let g:Var1 = 10
|
|
|
|
let g:Var2 = 'Hello'
|
|
|
|
let g:Var3 = ['a', 'b']
|
|
|
|
let g:Var4 = #{x: 'edit', y: 'run'}
|
|
|
|
let g:Var5 = function('min')
|
|
|
|
lua << trim END
|
2023-09-24 23:13:51 +02:00
|
|
|
vim.g.Var1 = nil
|
|
|
|
vim.g.Var2 = nil
|
|
|
|
vim.g.Var3 = nil
|
|
|
|
vim.g.Var4 = nil
|
|
|
|
vim.g.Var5 = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
END
|
|
|
|
call assert_false(exists('g:Var1'))
|
|
|
|
call assert_false(exists('g:Var2'))
|
|
|
|
call assert_false(exists('g:Var3'))
|
|
|
|
call assert_false(exists('g:Var4'))
|
|
|
|
call assert_false(exists('g:Var5'))
|
|
|
|
|
|
|
|
" Try to modify and remove a locked global variable
|
|
|
|
let g:Var1 = 10
|
|
|
|
lockvar g:Var1
|
|
|
|
call assert_fails('lua vim.g.Var1 = 20', 'variable is locked')
|
2023-09-24 23:13:51 +02:00
|
|
|
call assert_fails('lua vim.g.Var1 = nil', 'variable is locked')
|
2021-08-04 21:12:52 +02:00
|
|
|
unlockvar g:Var1
|
|
|
|
let g:Var2 = [7, 14]
|
|
|
|
lockvar 0 g:Var2
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.g.Var2[2] = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
lua vim.g.Var2[3] = 21
|
2023-09-24 23:13:51 +02:00
|
|
|
call assert_fails('lua vim.g.Var2 = nil', 'variable is locked')
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_equal([7, 21], g:Var2)
|
|
|
|
lockvar 1 g:Var2
|
2023-09-24 23:13:51 +02:00
|
|
|
call assert_fails('lua vim.g.Var2[2] = nil', 'list is locked')
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_fails('lua vim.g.Var2[3] = 21', 'list is locked')
|
|
|
|
unlockvar g:Var2
|
|
|
|
|
2021-08-05 15:11:08 +02:00
|
|
|
let g:TestFunc = function('len')
|
|
|
|
call assert_fails('lua vim.g.func = vim.g.TestFunc', ['E704:', 'Couldn''t add to dictionary'])
|
|
|
|
unlet g:TestFunc
|
|
|
|
|
2021-08-04 21:12:52 +02:00
|
|
|
" Attempt to access a non-existing global variable
|
|
|
|
call assert_equal(v:null, luaeval('vim.g.NonExistingVar'))
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.g.NonExisting = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
|
|
|
|
unlet! g:Var1 g:Var2 g:Var3 g:Var4 g:Var5
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for accessing and modifying predefined vim variables using the vim.v
|
|
|
|
" Lua table
|
|
|
|
func Test_lua_predefined_var_table()
|
|
|
|
call assert_equal(v:progpath, luaeval('vim.v.progpath'))
|
|
|
|
let v:errmsg = 'SomeError'
|
|
|
|
call assert_equal('SomeError', luaeval('vim.v.errmsg'))
|
|
|
|
lua vim.v.errmsg = 'OtherError'
|
|
|
|
call assert_equal('OtherError', v:errmsg)
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.v.errmsg = 42
|
|
|
|
call assert_equal('42', v:errmsg)
|
|
|
|
call assert_fails('lua vim.v.errmsg = nil', 'variable is fixed')
|
2021-08-04 21:12:52 +02:00
|
|
|
let v:oldfiles = ['one', 'two']
|
|
|
|
call assert_equal(['one', 'two'], luaeval('vim.v.oldfiles'))
|
|
|
|
lua vim.v.oldfiles = vim.list({})
|
|
|
|
call assert_equal([], v:oldfiles)
|
2023-09-24 23:13:51 +02:00
|
|
|
call assert_fails('lua vim.v.oldfiles = "a"',
|
|
|
|
\ 'Setting v:oldfiles to value with wrong type')
|
|
|
|
call assert_equal([], v:oldfiles)
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_equal(v:null, luaeval('vim.v.null'))
|
2023-09-24 23:13:51 +02:00
|
|
|
call assert_fails('lua vim.v.argv[1] = nil', 'list is locked')
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_fails('lua vim.v.newvar = 1', 'Dictionary is locked')
|
2023-09-24 23:13:51 +02:00
|
|
|
|
|
|
|
new
|
|
|
|
call setline(1, ' foo foo foo')
|
|
|
|
/foo
|
|
|
|
call assert_equal([0, 1, 2, 0, 2], getcurpos())
|
|
|
|
call assert_equal(1, v:searchforward)
|
|
|
|
normal! n
|
|
|
|
call assert_equal([0, 1, 6, 0, 6], getcurpos())
|
|
|
|
lua vim.v.searchforward = 0
|
|
|
|
call assert_equal(0, v:searchforward)
|
|
|
|
normal! n
|
|
|
|
call assert_equal([0, 1, 2, 0, 2], getcurpos())
|
|
|
|
lua vim.v.searchforward = 1
|
|
|
|
call assert_equal(1, v:searchforward)
|
|
|
|
normal! n
|
|
|
|
call assert_equal([0, 1, 6, 0, 6], getcurpos())
|
|
|
|
bwipe!
|
2021-08-04 21:12:52 +02:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for adding, accessing and modifying window-local variables using the
|
|
|
|
" vim.w Lua table
|
|
|
|
func Test_lua_window_var_table()
|
|
|
|
" Access window variables with different types of values
|
|
|
|
new
|
|
|
|
let w:wvar1 = 10
|
|
|
|
let w:wvar2 = 'edit'
|
|
|
|
let w:wvar3 = 3.14
|
|
|
|
let w:wvar4 = 0zdeadbeef
|
|
|
|
let w:wvar5 = ['a', 'b']
|
|
|
|
let w:wvar6 = #{action: 'run'}
|
|
|
|
call assert_equal(10, luaeval('vim.w.wvar1'))
|
|
|
|
call assert_equal('edit', luaeval('vim.w.wvar2'))
|
|
|
|
call assert_equal(3.14, luaeval('vim.w.wvar3'))
|
|
|
|
call assert_equal(0zdeadbeef, luaeval('vim.w.wvar4'))
|
|
|
|
call assert_equal(['a', 'b'], luaeval('vim.w.wvar5'))
|
|
|
|
call assert_equal(#{action: 'run'}, luaeval('vim.w.wvar6'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.w.NonExisting'))
|
|
|
|
|
|
|
|
" modify a window variable
|
|
|
|
lua vim.w.wvar2 = 'paste'
|
|
|
|
call assert_equal('paste', w:wvar2)
|
|
|
|
|
|
|
|
" change the type stored in a variable
|
|
|
|
let w:wvar2 = [1, 2]
|
|
|
|
lua vim.w.wvar2 = vim.dict({a=10, b=20})
|
|
|
|
call assert_equal(#{a: 10, b: 20}, w:wvar2)
|
|
|
|
|
|
|
|
" create a new window variable
|
|
|
|
lua vim.w.wvar7 = vim.dict({a=vim.list({1, 2}), b=20})
|
|
|
|
call assert_equal(#{a: [1, 2], b: 20}, w:wvar7)
|
|
|
|
|
|
|
|
" delete a window variable
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.w.wvar2 = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_false(exists('w:wvar2'))
|
|
|
|
|
|
|
|
new
|
|
|
|
call assert_equal(v:null, luaeval('vim.w.wvar1'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.w.wvar2'))
|
|
|
|
%bw!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for adding, accessing and modifying buffer-local variables using the
|
|
|
|
" vim.b Lua table
|
|
|
|
func Test_lua_buffer_var_table()
|
|
|
|
" Access buffer variables with different types of values
|
|
|
|
let b:bvar1 = 10
|
|
|
|
let b:bvar2 = 'edit'
|
|
|
|
let b:bvar3 = 3.14
|
|
|
|
let b:bvar4 = 0zdeadbeef
|
|
|
|
let b:bvar5 = ['a', 'b']
|
|
|
|
let b:bvar6 = #{action: 'run'}
|
|
|
|
call assert_equal(10, luaeval('vim.b.bvar1'))
|
|
|
|
call assert_equal('edit', luaeval('vim.b.bvar2'))
|
|
|
|
call assert_equal(3.14, luaeval('vim.b.bvar3'))
|
|
|
|
call assert_equal(0zdeadbeef, luaeval('vim.b.bvar4'))
|
|
|
|
call assert_equal(['a', 'b'], luaeval('vim.b.bvar5'))
|
|
|
|
call assert_equal(#{action: 'run'}, luaeval('vim.b.bvar6'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.b.NonExisting'))
|
|
|
|
|
|
|
|
" modify a buffer variable
|
|
|
|
lua vim.b.bvar2 = 'paste'
|
|
|
|
call assert_equal('paste', b:bvar2)
|
|
|
|
|
|
|
|
" change the type stored in a variable
|
|
|
|
let b:bvar2 = [1, 2]
|
|
|
|
lua vim.b.bvar2 = vim.dict({a=10, b=20})
|
|
|
|
call assert_equal(#{a: 10, b: 20}, b:bvar2)
|
|
|
|
|
|
|
|
" create a new buffer variable
|
|
|
|
lua vim.b.bvar7 = vim.dict({a=vim.list({1, 2}), b=20})
|
|
|
|
call assert_equal(#{a: [1, 2], b: 20}, b:bvar7)
|
|
|
|
|
|
|
|
" delete a buffer variable
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.b.bvar2 = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_false(exists('b:bvar2'))
|
|
|
|
|
|
|
|
new
|
|
|
|
call assert_equal(v:null, luaeval('vim.b.bvar1'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.b.bvar2'))
|
|
|
|
%bw!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for adding, accessing and modifying tabpage-local variables using the
|
|
|
|
" vim.t Lua table
|
|
|
|
func Test_lua_tabpage_var_table()
|
|
|
|
" Access tabpage variables with different types of values
|
|
|
|
let t:tvar1 = 10
|
|
|
|
let t:tvar2 = 'edit'
|
|
|
|
let t:tvar3 = 3.14
|
|
|
|
let t:tvar4 = 0zdeadbeef
|
|
|
|
let t:tvar5 = ['a', 'b']
|
|
|
|
let t:tvar6 = #{action: 'run'}
|
|
|
|
call assert_equal(10, luaeval('vim.t.tvar1'))
|
|
|
|
call assert_equal('edit', luaeval('vim.t.tvar2'))
|
|
|
|
call assert_equal(3.14, luaeval('vim.t.tvar3'))
|
|
|
|
call assert_equal(0zdeadbeef, luaeval('vim.t.tvar4'))
|
|
|
|
call assert_equal(['a', 'b'], luaeval('vim.t.tvar5'))
|
|
|
|
call assert_equal(#{action: 'run'}, luaeval('vim.t.tvar6'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.t.NonExisting'))
|
|
|
|
|
|
|
|
" modify a tabpage variable
|
|
|
|
lua vim.t.tvar2 = 'paste'
|
|
|
|
call assert_equal('paste', t:tvar2)
|
|
|
|
|
|
|
|
" change the type stored in a variable
|
|
|
|
let t:tvar2 = [1, 2]
|
|
|
|
lua vim.t.tvar2 = vim.dict({a=10, b=20})
|
|
|
|
call assert_equal(#{a: 10, b: 20}, t:tvar2)
|
|
|
|
|
|
|
|
" create a new tabpage variable
|
|
|
|
lua vim.t.tvar7 = vim.dict({a=vim.list({1, 2}), b=20})
|
|
|
|
call assert_equal(#{a: [1, 2], b: 20}, t:tvar7)
|
|
|
|
|
|
|
|
" delete a tabpage variable
|
2023-09-24 23:13:51 +02:00
|
|
|
lua vim.t.tvar2 = nil
|
2021-08-04 21:12:52 +02:00
|
|
|
call assert_false(exists('t:tvar2'))
|
|
|
|
|
|
|
|
tabnew
|
|
|
|
call assert_equal(v:null, luaeval('vim.t.tvar1'))
|
|
|
|
call assert_equal(v:null, luaeval('vim.t.tvar2'))
|
|
|
|
%bw!
|
|
|
|
endfunc
|
|
|
|
|
2021-08-06 21:34:38 +02:00
|
|
|
" Test for vim.version()
|
|
|
|
func Test_lua_vim_version()
|
|
|
|
lua << trim END
|
|
|
|
vimver = vim.version()
|
|
|
|
vimver_n = vimver.major * 100 + vimver.minor
|
|
|
|
END
|
|
|
|
call assert_equal(v:version, luaeval('vimver_n'))
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test for running multiple commands using vim.command()
|
|
|
|
func Test_lua_multiple_commands()
|
|
|
|
lua << trim END
|
|
|
|
vim.command([[
|
|
|
|
let Var1 = []
|
|
|
|
for i in range(3)
|
|
|
|
let Var1 += [#{name: 'x'}]
|
|
|
|
endfor
|
|
|
|
augroup Luagroup
|
|
|
|
autocmd!
|
|
|
|
autocmd User Luatest echo 'Hello'
|
|
|
|
augroup END
|
|
|
|
]])
|
|
|
|
END
|
|
|
|
call assert_equal([{'name': 'x'}, {'name': 'x'}, {'name': 'x'}], Var1)
|
|
|
|
call assert_true(exists('#Luagroup'))
|
|
|
|
call assert_true(exists('#Luagroup#User#Luatest'))
|
|
|
|
augroup Luagroup
|
|
|
|
autocmd!
|
|
|
|
augroup END
|
|
|
|
augroup! Luagroup
|
|
|
|
endfunc
|
|
|
|
|
2022-03-20 11:46:01 +00:00
|
|
|
func Test_lua_debug()
|
|
|
|
CheckRunVimInTerminal
|
|
|
|
|
|
|
|
let buf = RunVimInTerminal('', {'rows': 10})
|
|
|
|
call term_sendkeys(buf, ":lua debug.debug()\n")
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> ', term_getline(buf, 10))})
|
|
|
|
|
|
|
|
call term_sendkeys(buf, "foo = 42\n")
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> foo = 42', term_getline(buf, 9))})
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> ', term_getline(buf, 10))})
|
|
|
|
|
|
|
|
call term_sendkeys(buf, "print(foo)\n")
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> print(foo)', term_getline(buf, 8))})
|
|
|
|
call WaitForAssert({-> assert_equal('42', term_getline(buf, 9))})
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> ', term_getline(buf, 10))})
|
|
|
|
|
2022-03-22 21:14:55 +00:00
|
|
|
call term_sendkeys(buf, "-\n")
|
|
|
|
call WaitForAssert({-> assert_equal("(debug command):1: unexpected symbol near '-'",
|
|
|
|
\ term_getline(buf, 9))})
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> ', term_getline(buf, 10))})
|
|
|
|
|
2022-03-20 11:46:01 +00:00
|
|
|
call term_sendkeys(buf, "cont\n")
|
|
|
|
call WaitForAssert({-> assert_match(' All$', term_getline(buf, 10))})
|
|
|
|
|
2022-03-22 21:14:55 +00:00
|
|
|
" Entering an empty line also exits the debugger.
|
|
|
|
call term_sendkeys(buf, ":lua debug.debug()\n")
|
|
|
|
call WaitForAssert({-> assert_equal('lua_debug> ', term_getline(buf, 10))})
|
|
|
|
call term_sendkeys(buf, "\n")
|
|
|
|
call WaitForAssert({-> assert_match(' All$', term_getline(buf, 10))})
|
|
|
|
|
2022-03-20 11:46:01 +00:00
|
|
|
call StopVimInTerminal(buf)
|
|
|
|
endfunc
|
|
|
|
|
2023-08-13 22:05:45 -04:00
|
|
|
" Test for a crash when a Lua funcref is invoked with parameters from Vim
|
|
|
|
func Test_lua_funcref_with_params()
|
|
|
|
let Lua_funcref = luaeval('function(d) local s = "in Lua callback" end')
|
|
|
|
call Lua_funcref({'a' : 'b'})
|
|
|
|
call assert_true(v:true)
|
|
|
|
endfunc
|
|
|
|
|
2020-04-14 20:15:49 +02:00
|
|
|
" vim: shiftwidth=2 sts=2 expandtab
|