xref: /vim-8.2.3635/src/testdir/test_lua.vim (revision 11328bc7)
1d58f03b1SBram Moolenaar" Tests for Lua.
2d58f03b1SBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4c8970b94SBram Moolenaar
5c8970b94SBram Moolenaar" This test also works without the lua feature.
6c8970b94SBram Moolenaarfunc Test_skip_lua()
7c8970b94SBram Moolenaar  if 0
8c8970b94SBram Moolenaar    lua print("Not executed")
9c8970b94SBram Moolenaar  endif
10c8970b94SBram Moolenaarendfunc
11c8970b94SBram Moolenaar
12b46fecd3SBram MoolenaarCheckFeature lua
135feabe00SBram MoolenaarCheckFeature float
14d58f03b1SBram Moolenaar
15f65ed86fSBram Moolenaar" Depending on the lua version, the error messages are different.
16125ed274SBram Moolenaarlet [s:major, s:minor, s:patch] = luaeval('vim.lua_version')->split('\.')->map({-> str2nr(v:val)})
17e49b8e8dSBram Moolenaarlet s:lua_53_or_later = 0
18f65ed86fSBram Moolenaarlet s:lua_543_or_later = 0
19f65ed86fSBram Moolenaarif (s:major == 5 && s:minor >= 3) || s:major > 5
20e49b8e8dSBram Moolenaar  let s:lua_53_or_later = 1
21f65ed86fSBram Moolenaar  if (s:major == 5
22f65ed86fSBram Moolenaar        \ && ((s:minor == 4 && s:patch >= 3) || s:minor > 4))
23f65ed86fSBram Moolenaar        \ || s:major > 5
24f65ed86fSBram Moolenaar    let s:lua_543_or_later = 1
25f65ed86fSBram Moolenaar  endif
26e49b8e8dSBram Moolenaarendif
27e49b8e8dSBram Moolenaar
28e165f635SBram Moolenaarfunc TearDown()
29e165f635SBram Moolenaar  " Run garbage collection after each test to exercise luaV_setref().
30e165f635SBram Moolenaar  call test_garbagecollect_now()
31e165f635SBram Moolenaarendfunc
32e165f635SBram Moolenaar
334ff4814bSBram Moolenaar" Check that switching to another buffer does not trigger ml_get error.
345feabe00SBram Moolenaarfunc Test_lua_command_new_no_ml_get_error()
35d58f03b1SBram Moolenaar  new
36d58f03b1SBram Moolenaar  let wincount = winnr('$')
37d58f03b1SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
38d58f03b1SBram Moolenaar  luado vim.command("new")
39d58f03b1SBram Moolenaar  call assert_equal(wincount + 1, winnr('$'))
404ff4814bSBram Moolenaar  %bwipe!
414ff4814bSBram Moolenaarendfunc
424ff4814bSBram Moolenaar
434ff4814bSBram Moolenaar" Test vim.command()
445feabe00SBram Moolenaarfunc Test_lua_command()
454ff4814bSBram Moolenaar  new
464ff4814bSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
474ff4814bSBram Moolenaar  luado vim.command("1,2d_")
484ff4814bSBram Moolenaar  call assert_equal(['three'], getline(1, '$'))
49d58f03b1SBram Moolenaar  bwipe!
504ff4814bSBram Moolenaarendfunc
514ff4814bSBram Moolenaar
52e49b8e8dSBram Moolenaarfunc Test_lua_luado()
53e49b8e8dSBram Moolenaar  new
54e49b8e8dSBram Moolenaar  call setline(1, ['one', 'two'])
55e49b8e8dSBram Moolenaar  luado return(linenr)
56e49b8e8dSBram Moolenaar  call assert_equal(['1', '2'], getline(1, '$'))
57e49b8e8dSBram Moolenaar  close!
58e49b8e8dSBram Moolenaar
59e49b8e8dSBram Moolenaar  " Error cases
60e49b8e8dSBram Moolenaar  call assert_fails('luado string.format()',
61e49b8e8dSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'format' (string expected, got no value)")
62f65ed86fSBram Moolenaar  if s:lua_543_or_later
63f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: global 'func' is not callable (a nil value)"
64f65ed86fSBram Moolenaar  elseif s:lua_53_or_later
65f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: attempt to call a nil value (global 'func')"
66f65ed86fSBram Moolenaar  else
67f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: attempt to call global 'func' (a nil value)"
68f65ed86fSBram Moolenaar  endif
69f65ed86fSBram Moolenaar  call assert_fails('luado func()', msg)
70e49b8e8dSBram Moolenaar  call assert_fails('luado error("failed")', "[string \"vim chunk\"]:1: failed")
71e49b8e8dSBram Moolenaarendfunc
72e49b8e8dSBram Moolenaar
734ff4814bSBram Moolenaar" Test vim.eval()
745feabe00SBram Moolenaarfunc Test_lua_eval()
754ff4814bSBram Moolenaar  " lua.eval with a number
764ff4814bSBram Moolenaar  lua v = vim.eval('123')
774ff4814bSBram Moolenaar  call assert_equal('number', luaeval('vim.type(v)'))
78eb04f089SBram Moolenaar  call assert_equal(123, luaeval('v'))
794ff4814bSBram Moolenaar
804ff4814bSBram Moolenaar  " lua.eval with a string
814ff4814bSBram Moolenaar  lua v = vim.eval('"abc"')
8202b31110SBram Moolenaar  call assert_equal('string', 'vim.type(v)'->luaeval())
834ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('v'))
844ff4814bSBram Moolenaar
854ff4814bSBram Moolenaar  " lua.eval with a list
864ff4814bSBram Moolenaar  lua v = vim.eval("['a']")
874ff4814bSBram Moolenaar  call assert_equal('list', luaeval('vim.type(v)'))
884ff4814bSBram Moolenaar  call assert_equal(['a'], luaeval('v'))
894ff4814bSBram Moolenaar
904ff4814bSBram Moolenaar  " lua.eval with a dict
914ff4814bSBram Moolenaar  lua v = vim.eval("{'a':'b'}")
924ff4814bSBram Moolenaar  call assert_equal('dict', luaeval('vim.type(v)'))
934ff4814bSBram Moolenaar  call assert_equal({'a':'b'}, luaeval('v'))
944ff4814bSBram Moolenaar
95b7828690SBram Moolenaar  " lua.eval with a blob
96b7828690SBram Moolenaar  lua v = vim.eval("0z00112233.deadbeef")
97b7828690SBram Moolenaar  call assert_equal('blob', luaeval('vim.type(v)'))
98b7828690SBram Moolenaar  call assert_equal(0z00112233.deadbeef, luaeval('v'))
99b7828690SBram Moolenaar
100e49b8e8dSBram Moolenaar  " lua.eval with a float
101e49b8e8dSBram Moolenaar  lua v = vim.eval('3.14')
102e49b8e8dSBram Moolenaar  call assert_equal('number', luaeval('vim.type(v)'))
103e49b8e8dSBram Moolenaar  call assert_equal(3.14, luaeval('v'))
104e49b8e8dSBram Moolenaar
105e49b8e8dSBram Moolenaar  " lua.eval with a bool
106e49b8e8dSBram Moolenaar  lua v = vim.eval('v:true')
107e49b8e8dSBram Moolenaar  call assert_equal('number', luaeval('vim.type(v)'))
108e49b8e8dSBram Moolenaar  call assert_equal(1, luaeval('v'))
109e49b8e8dSBram Moolenaar  lua v = vim.eval('v:false')
110e49b8e8dSBram Moolenaar  call assert_equal('number', luaeval('vim.type(v)'))
111e49b8e8dSBram Moolenaar  call assert_equal(0, luaeval('v'))
112e49b8e8dSBram Moolenaar
113e49b8e8dSBram Moolenaar  " lua.eval with a null
114e49b8e8dSBram Moolenaar  lua v = vim.eval('v:null')
115e49b8e8dSBram Moolenaar  call assert_equal('nil', luaeval('vim.type(v)'))
116e49b8e8dSBram Moolenaar  call assert_equal(v:null, luaeval('v'))
117e49b8e8dSBram Moolenaar
1184ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(nil)',
1194ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got nil)")
1204ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(true)',
1214ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got boolean)")
1224ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval({})',
1234ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got table)")
1244ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(print)',
1254ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got function)")
1264ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(vim.buffer())',
1274ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got userdata)")
1284ff4814bSBram Moolenaar
1294ff4814bSBram Moolenaar  lua v = nil
1304ff4814bSBram Moolenaarendfunc
1314ff4814bSBram Moolenaar
13286c3a216SBram Moolenaar" Test luaeval() with lambda
13386c3a216SBram Moolenaarfunc Test_luaeval_with_lambda()
13486c3a216SBram Moolenaar  lua function hello_luaeval_lambda(a, cb) return a .. cb() end
13586c3a216SBram Moolenaar  call assert_equal('helloworld',
13686c3a216SBram Moolenaar        \ luaeval('hello_luaeval_lambda(_A[1], _A[2])',
13786c3a216SBram Moolenaar        \         ['hello', {->'world'}]))
13886c3a216SBram Moolenaar  lua hello_luaeval_lambda = nil
13986c3a216SBram Moolenaarendfunc
14086c3a216SBram Moolenaar
1414ff4814bSBram Moolenaar" Test vim.window()
1425feabe00SBram Moolenaarfunc Test_lua_window()
1434ff4814bSBram Moolenaar  e Xfoo2
1444ff4814bSBram Moolenaar  new Xfoo1
1454ff4814bSBram Moolenaar
1464ff4814bSBram Moolenaar  " Window 1 (top window) contains Xfoo1
1474ff4814bSBram Moolenaar  " Window 2 (bottom window) contains Xfoo2
1484ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.window(1):buffer().name'))
1494ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.window(2):buffer().name'))
1504ff4814bSBram Moolenaar
1514ff4814bSBram Moolenaar  " Window 3 does not exist so vim.window(3) should return nil
1524ff4814bSBram Moolenaar  call assert_equal('nil', luaeval('tostring(vim.window(3))'))
1534ff4814bSBram Moolenaar
154f65ed86fSBram Moolenaar  if s:lua_543_or_later
155f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: field 'xyz' is not callable (a nil value)"
156f65ed86fSBram Moolenaar  elseif s:lua_53_or_later
157f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call a nil value (field 'xyz')"
158f65ed86fSBram Moolenaar  else
159f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call field 'xyz' (a nil value)"
160f65ed86fSBram Moolenaar  endif
161f65ed86fSBram Moolenaar  call assert_fails("let n = luaeval('vim.window().xyz()')", msg)
162e49b8e8dSBram Moolenaar  call assert_fails('lua vim.window().xyz = 1',
163e49b8e8dSBram Moolenaar        \ "[string \"vim chunk\"]:1: invalid window property: `xyz'")
164e49b8e8dSBram Moolenaar
1654ff4814bSBram Moolenaar  %bwipe!
1664ff4814bSBram Moolenaarendfunc
1674ff4814bSBram Moolenaar
1684ff4814bSBram Moolenaar" Test vim.window().height
1695feabe00SBram Moolenaarfunc Test_lua_window_height()
1704ff4814bSBram Moolenaar  new
1714ff4814bSBram Moolenaar  lua vim.window().height = 2
1724ff4814bSBram Moolenaar  call assert_equal(2, winheight(0))
1734ff4814bSBram Moolenaar  lua vim.window().height = vim.window().height + 1
1744ff4814bSBram Moolenaar  call assert_equal(3, winheight(0))
1754ff4814bSBram Moolenaar  bwipe!
1764ff4814bSBram Moolenaarendfunc
1774ff4814bSBram Moolenaar
1784ff4814bSBram Moolenaar" Test vim.window().width
1795feabe00SBram Moolenaarfunc Test_lua_window_width()
1804ff4814bSBram Moolenaar  vert new
1814ff4814bSBram Moolenaar  lua vim.window().width = 2
1824ff4814bSBram Moolenaar  call assert_equal(2, winwidth(0))
1834ff4814bSBram Moolenaar  lua vim.window().width = vim.window().width + 1
1844ff4814bSBram Moolenaar  call assert_equal(3, winwidth(0))
1854ff4814bSBram Moolenaar  bwipe!
1864ff4814bSBram Moolenaarendfunc
1874ff4814bSBram Moolenaar
1884ff4814bSBram Moolenaar" Test vim.window().line and vim.window.col
1895feabe00SBram Moolenaarfunc Test_lua_window_line_col()
1904ff4814bSBram Moolenaar  new
1914ff4814bSBram Moolenaar  call setline(1, ['line1', 'line2', 'line3'])
1924ff4814bSBram Moolenaar  lua vim.window().line = 2
1934ff4814bSBram Moolenaar  lua vim.window().col = 4
1944ff4814bSBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos('.'))
1954ff4814bSBram Moolenaar  lua vim.window().line = vim.window().line + 1
1964ff4814bSBram Moolenaar  lua vim.window().col = vim.window().col - 1
1974ff4814bSBram Moolenaar  call assert_equal([0, 3, 3, 0], getpos('.'))
1984ff4814bSBram Moolenaar
1994ff4814bSBram Moolenaar  call assert_fails('lua vim.window().line = 10',
2004ff4814bSBram Moolenaar        \           '[string "vim chunk"]:1: line out of range')
2014ff4814bSBram Moolenaar  bwipe!
2024ff4814bSBram Moolenaarendfunc
2034ff4814bSBram Moolenaar
204eb04f089SBram Moolenaar" Test vim.call
205eb04f089SBram Moolenaarfunc Test_lua_call()
206eb04f089SBram Moolenaar  call assert_equal(has('lua'), luaeval('vim.call("has", "lua")'))
207eb04f089SBram Moolenaar  call assert_equal(printf("Hello %s", "vim"), luaeval('vim.call("printf", "Hello %s", "vim")'))
208e49b8e8dSBram Moolenaar
209e49b8e8dSBram Moolenaar  " Error cases
210e49b8e8dSBram Moolenaar  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)')",
211b898a029SBram Moolenaar        \ s:lua_53_or_later
212b898a029SBram Moolenaar        \ ? '[string "luaeval"]:1: Function called with too many arguments'
213b898a029SBram Moolenaar        \ : 'Function called with too many arguments')
214e49b8e8dSBram Moolenaar  lua co = coroutine.create(function () print("hi") end)
215e49b8e8dSBram Moolenaar  call assert_fails("call luaeval('vim.call(\"type\", co)')",
216b898a029SBram Moolenaar        \ s:lua_53_or_later
217b898a029SBram Moolenaar        \ ? '[string "luaeval"]:1: lua: cannot convert value'
218b898a029SBram Moolenaar        \ : 'lua: cannot convert value')
219e49b8e8dSBram Moolenaar  lua co = nil
220b898a029SBram Moolenaar  call assert_fails("call luaeval('vim.call(\"abc\")')",
221b898a029SBram Moolenaar        \ ['E117:', s:lua_53_or_later ? '\[string "luaeval"]:1: lua: call_vim_function failed'
222b898a029SBram Moolenaar        \                             : 'lua: call_vim_function failed'])
223eb04f089SBram Moolenaarendfunc
224eb04f089SBram Moolenaar
225eb04f089SBram Moolenaar" Test vim.fn.*
226eb04f089SBram Moolenaarfunc Test_lua_fn()
227eb04f089SBram Moolenaar  call assert_equal(has('lua'), luaeval('vim.fn.has("lua")'))
228eb04f089SBram Moolenaar  call assert_equal(printf("Hello %s", "vim"), luaeval('vim.fn.printf("Hello %s", "vim")'))
229eb04f089SBram Moolenaarendfunc
230eb04f089SBram Moolenaar
2314ff4814bSBram Moolenaar" Test setting the current window
2325feabe00SBram Moolenaarfunc Test_lua_window_set_current()
2334ff4814bSBram Moolenaar  new Xfoo1
2344ff4814bSBram Moolenaar  lua w1 = vim.window()
2354ff4814bSBram Moolenaar  new Xfoo2
2364ff4814bSBram Moolenaar  lua w2 = vim.window()
2374ff4814bSBram Moolenaar
2384ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
2394ff4814bSBram Moolenaar  lua w1()
2404ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
2414ff4814bSBram Moolenaar  lua w2()
2424ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
2434ff4814bSBram Moolenaar
2442f362bf7SBram Moolenaar  lua w1, w2 = nil
2454ff4814bSBram Moolenaar  %bwipe!
2464ff4814bSBram Moolenaarendfunc
2474ff4814bSBram Moolenaar
2484ff4814bSBram Moolenaar" Test vim.window().buffer
2495feabe00SBram Moolenaarfunc Test_lua_window_buffer()
2504ff4814bSBram Moolenaar  new Xfoo1
2514ff4814bSBram Moolenaar  lua w1 = vim.window()
2524ff4814bSBram Moolenaar  lua b1 = w1.buffer()
2534ff4814bSBram Moolenaar  new Xfoo2
2544ff4814bSBram Moolenaar  lua w2 = vim.window()
2554ff4814bSBram Moolenaar  lua b2 = w2.buffer()
2564ff4814bSBram Moolenaar
2574ff4814bSBram Moolenaar  lua b1()
2584ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
2594ff4814bSBram Moolenaar  lua b2()
2604ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
2614ff4814bSBram Moolenaar
2622f362bf7SBram Moolenaar  lua b1, b2, w1, w2 = nil
2634ff4814bSBram Moolenaar  %bwipe!
2644ff4814bSBram Moolenaarendfunc
2654ff4814bSBram Moolenaar
2664ff4814bSBram Moolenaar" Test vim.window():previous() and vim.window():next()
2675feabe00SBram Moolenaarfunc Test_lua_window_next_previous()
2684ff4814bSBram Moolenaar  new Xfoo1
2694ff4814bSBram Moolenaar  new Xfoo2
2704ff4814bSBram Moolenaar  new Xfoo3
2714ff4814bSBram Moolenaar  wincmd j
2724ff4814bSBram Moolenaar
2734ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.window().buffer().name'))
2744ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.window():next():buffer().name'))
2754ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('vim.window():previous():buffer().name'))
2764ff4814bSBram Moolenaar
2774ff4814bSBram Moolenaar  %bwipe!
2784ff4814bSBram Moolenaarendfunc
2794ff4814bSBram Moolenaar
2804ff4814bSBram Moolenaar" Test vim.window():isvalid()
2815feabe00SBram Moolenaarfunc Test_lua_window_isvalid()
2824ff4814bSBram Moolenaar  new Xfoo
2834ff4814bSBram Moolenaar  lua w = vim.window()
2844ff4814bSBram Moolenaar  call assert_true(luaeval('w:isvalid()'))
2854ff4814bSBram Moolenaar
2864ff4814bSBram Moolenaar  " FIXME: how to test the case when isvalid() returns v:false?
2874ff4814bSBram Moolenaar  " isvalid() gives errors when the window is deleted. Is it a bug?
2884ff4814bSBram Moolenaar
2894ff4814bSBram Moolenaar  lua w = nil
2904ff4814bSBram Moolenaar  bwipe!
2914ff4814bSBram Moolenaarendfunc
2924ff4814bSBram Moolenaar
2934ff4814bSBram Moolenaar" Test vim.buffer() with and without argument
2945feabe00SBram Moolenaarfunc Test_lua_buffer()
2954ff4814bSBram Moolenaar  new Xfoo1
2964ff4814bSBram Moolenaar  let bn1 = bufnr('%')
2974ff4814bSBram Moolenaar  new Xfoo2
2984ff4814bSBram Moolenaar  let bn2 = bufnr('%')
2994ff4814bSBram Moolenaar
3004ff4814bSBram Moolenaar  " Test vim.buffer() without argument.
3014ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer().name"))
3024ff4814bSBram Moolenaar
3034ff4814bSBram Moolenaar  " Test vim.buffer() with string argument.
3044ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval("vim.buffer('Xfoo1').name"))
3054ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer('Xfoo2').name"))
3064ff4814bSBram Moolenaar
3074ff4814bSBram Moolenaar  " Test vim.buffer() with integer argument.
3084ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
3094ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
3104ff4814bSBram Moolenaar
3112f362bf7SBram Moolenaar  lua bn1, bn2 = nil
3124ff4814bSBram Moolenaar  %bwipe!
3134ff4814bSBram Moolenaarendfunc
3144ff4814bSBram Moolenaar
3154ff4814bSBram Moolenaar" Test vim.buffer().name and vim.buffer().fname
3165feabe00SBram Moolenaarfunc Test_lua_buffer_name()
3174ff4814bSBram Moolenaar  new
318fe08df45SBram Moolenaar  call assert_equal('', luaeval('vim.buffer().name'))
319fe08df45SBram Moolenaar  call assert_equal('', luaeval('vim.buffer().fname'))
3204ff4814bSBram Moolenaar  bwipe!
3214ff4814bSBram Moolenaar
3224ff4814bSBram Moolenaar  new Xfoo
3234ff4814bSBram Moolenaar  call assert_equal('Xfoo', luaeval('vim.buffer().name'))
3244ff4814bSBram Moolenaar  call assert_equal(expand('%:p'), luaeval('vim.buffer().fname'))
3254ff4814bSBram Moolenaar  bwipe!
3264ff4814bSBram Moolenaarendfunc
3274ff4814bSBram Moolenaar
3284ff4814bSBram Moolenaar" Test vim.buffer().number
3295feabe00SBram Moolenaarfunc Test_lua_buffer_number()
3304ff4814bSBram Moolenaar  " All numbers in Lua are floating points number (no integers).
3314ff4814bSBram Moolenaar  call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number')))
3324ff4814bSBram Moolenaarendfunc
3334ff4814bSBram Moolenaar
3344ff4814bSBram Moolenaar" Test inserting lines in buffer.
3355feabe00SBram Moolenaarfunc Test_lua_buffer_insert()
3364ff4814bSBram Moolenaar  new
3374ff4814bSBram Moolenaar  lua vim.buffer()[1] = '3'
3384ff4814bSBram Moolenaar  lua vim.buffer():insert('1', 0)
3394ff4814bSBram Moolenaar  lua vim.buffer():insert('2', 1)
3404ff4814bSBram Moolenaar  lua vim.buffer():insert('4', 10)
3414ff4814bSBram Moolenaar
3424ff4814bSBram Moolenaar  call assert_equal(['1', '2', '3', '4'], getline(1, '$'))
343e49b8e8dSBram Moolenaar  call assert_equal('4', luaeval('vim.buffer()[4]'))
344e49b8e8dSBram Moolenaar  call assert_equal(v:null, luaeval('vim.buffer()[5]'))
345e49b8e8dSBram Moolenaar  call assert_equal(v:null, luaeval('vim.buffer()[{}]'))
346f65ed86fSBram Moolenaar  if s:lua_543_or_later
347f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: method 'xyz' is not callable (a nil value)"
348f65ed86fSBram Moolenaar  elseif s:lua_53_or_later
349f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: attempt to call a nil value (method 'xyz')"
350f65ed86fSBram Moolenaar  else
351f65ed86fSBram Moolenaar    let msg = "[string \"vim chunk\"]:1: attempt to call method 'xyz' (a nil value)"
352f65ed86fSBram Moolenaar  endif
353f65ed86fSBram Moolenaar  call assert_fails('lua vim.buffer():xyz()', msg)
354e49b8e8dSBram Moolenaar  call assert_fails('lua vim.buffer()[1] = {}',
355e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: wrong argument to change')
3564ff4814bSBram Moolenaar  bwipe!
3574ff4814bSBram Moolenaarendfunc
3584ff4814bSBram Moolenaar
3594ff4814bSBram Moolenaar" Test deleting line in buffer
3605feabe00SBram Moolenaarfunc Test_lua_buffer_delete()
3614ff4814bSBram Moolenaar  new
3624ff4814bSBram Moolenaar  call setline(1, ['1', '2', '3'])
363e49b8e8dSBram Moolenaar  call cursor(3, 1)
3644ff4814bSBram Moolenaar  lua vim.buffer()[2] = nil
3654ff4814bSBram Moolenaar  call assert_equal(['1', '3'], getline(1, '$'))
3664ff4814bSBram Moolenaar
3674ff4814bSBram Moolenaar  call assert_fails('lua vim.buffer()[3] = nil',
3684ff4814bSBram Moolenaar        \           '[string "vim chunk"]:1: invalid line number')
3694ff4814bSBram Moolenaar  bwipe!
3704ff4814bSBram Moolenaarendfunc
3714ff4814bSBram Moolenaar
3724ff4814bSBram Moolenaar" Test #vim.buffer() i.e. number of lines in buffer
3735feabe00SBram Moolenaarfunc Test_lua_buffer_number_lines()
3744ff4814bSBram Moolenaar  new
3754ff4814bSBram Moolenaar  call setline(1, ['a', 'b', 'c'])
376eb04f089SBram Moolenaar  call assert_equal(3, luaeval('#vim.buffer()'))
3774ff4814bSBram Moolenaar  bwipe!
3784ff4814bSBram Moolenaarendfunc
3794ff4814bSBram Moolenaar
3804ff4814bSBram Moolenaar" Test vim.buffer():next() and vim.buffer():previous()
3814ff4814bSBram Moolenaar" Note that these functions get the next or previous buffers
3824ff4814bSBram Moolenaar" but do not switch buffer.
3835feabe00SBram Moolenaarfunc Test_lua_buffer_next_previous()
3844ff4814bSBram Moolenaar  new Xfoo1
3854ff4814bSBram Moolenaar  new Xfoo2
3864ff4814bSBram Moolenaar  new Xfoo3
3874ff4814bSBram Moolenaar  b Xfoo2
3884ff4814bSBram Moolenaar
3894ff4814bSBram Moolenaar  lua bn = vim.buffer():next()
3904ff4814bSBram Moolenaar  lua bp = vim.buffer():previous()
3914ff4814bSBram Moolenaar
3924ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.buffer().name'))
3934ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('bp.name'))
3944ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('bn.name'))
3954ff4814bSBram Moolenaar
3964ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
3974ff4814bSBram Moolenaar
3984ff4814bSBram Moolenaar  lua bn()
3994ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('vim.buffer().name'))
4004ff4814bSBram Moolenaar  call assert_equal('Xfoo3', bufname('%'))
4014ff4814bSBram Moolenaar
4024ff4814bSBram Moolenaar  lua bp()
4034ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
4044ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
4054ff4814bSBram Moolenaar
4062f362bf7SBram Moolenaar  lua bn, bp = nil
4074ff4814bSBram Moolenaar  %bwipe!
4084ff4814bSBram Moolenaarendfunc
4094ff4814bSBram Moolenaar
4104ff4814bSBram Moolenaar" Test vim.buffer():isvalid()
4115feabe00SBram Moolenaarfunc Test_lua_buffer_isvalid()
4124ff4814bSBram Moolenaar  new Xfoo
4134ff4814bSBram Moolenaar  lua b = vim.buffer()
4144ff4814bSBram Moolenaar  call assert_true(luaeval('b:isvalid()'))
4154ff4814bSBram Moolenaar
4164ff4814bSBram Moolenaar  " FIXME: how to test the case when isvalid() returns v:false?
4174ff4814bSBram Moolenaar  " isvalid() gives errors when the buffer is wiped. Is it a bug?
4184ff4814bSBram Moolenaar
4194ff4814bSBram Moolenaar  lua b = nil
4204ff4814bSBram Moolenaar  bwipe!
4214ff4814bSBram Moolenaarendfunc
4224ff4814bSBram Moolenaar
4235feabe00SBram Moolenaarfunc Test_lua_list()
4244ff4814bSBram Moolenaar  call assert_equal([], luaeval('vim.list()'))
4254ff4814bSBram Moolenaar
4264ff4814bSBram Moolenaar  let l = []
4274ff4814bSBram Moolenaar  lua l = vim.eval('l')
4284ff4814bSBram Moolenaar  lua l:add(123)
4294ff4814bSBram Moolenaar  lua l:add('abc')
4304ff4814bSBram Moolenaar  lua l:add(true)
4314ff4814bSBram Moolenaar  lua l:add(false)
4329067cd6cSBram Moolenaar  lua l:add(nil)
4334ff4814bSBram Moolenaar  lua l:add(vim.eval("[1, 2, 3]"))
4344ff4814bSBram Moolenaar  lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
435eb04f089SBram Moolenaar  call assert_equal([123, 'abc', v:true, v:false, v:null, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
436eb04f089SBram Moolenaar  call assert_equal(7, luaeval('#l'))
437a8a60d0cSBram Moolenaar  call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
4384ff4814bSBram Moolenaar
439bd84617dSBram Moolenaar  lua l[1] = 124
440bd84617dSBram Moolenaar  lua l[6] = nil
4414ff4814bSBram Moolenaar  lua l:insert('first')
4424ff4814bSBram Moolenaar  lua l:insert('xx', 3)
443e49b8e8dSBram Moolenaar  call assert_fails('lua l:insert("xx", -20)',
444e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: invalid position')
445eb04f089SBram Moolenaar  call assert_equal(['first', 124, 'abc', 'xx', v:true, v:false, v:null, {'a': 1, 'b': 2, 'c': 3}], l)
4464ff4814bSBram Moolenaar
4472f362bf7SBram Moolenaar  lockvar 1 l
4482f362bf7SBram Moolenaar  call assert_fails('lua l:add("x")', '[string "vim chunk"]:1: list is locked')
449e49b8e8dSBram Moolenaar  call assert_fails('lua l:insert(2)', '[string "vim chunk"]:1: list is locked')
450e49b8e8dSBram Moolenaar  call assert_fails('lua l[9] = 1', '[string "vim chunk"]:1: list is locked')
451e49b8e8dSBram Moolenaar
452e49b8e8dSBram Moolenaar  unlockvar l
453e49b8e8dSBram Moolenaar  let l = [1, 2]
454e49b8e8dSBram Moolenaar  lua ll = vim.eval('l')
455e49b8e8dSBram Moolenaar  let x = luaeval("ll[3]")
456e49b8e8dSBram Moolenaar  call assert_equal(v:null, x)
457f65ed86fSBram Moolenaar  if s:lua_543_or_later
458f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: method 'xyz' is not callable (a nil value)"
459f65ed86fSBram Moolenaar  elseif s:lua_53_or_later
460f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call a nil value (method 'xyz')"
461f65ed86fSBram Moolenaar  else
462f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call method 'xyz' (a nil value)"
463f65ed86fSBram Moolenaar  endif
464f65ed86fSBram Moolenaar  call assert_fails('let x = luaeval("ll:xyz(3)")', msg)
465e49b8e8dSBram Moolenaar  let y = luaeval("ll[{}]")
466e49b8e8dSBram Moolenaar  call assert_equal(v:null, y)
4672f362bf7SBram Moolenaar
4684ff4814bSBram Moolenaar  lua l = nil
4694ff4814bSBram Moolenaarendfunc
4704ff4814bSBram Moolenaar
4715feabe00SBram Moolenaarfunc Test_lua_list_table()
4722f362bf7SBram Moolenaar  " See :help lua-vim
4732f362bf7SBram Moolenaar  " Non-numeric keys should not be used to initialize the list
4742f362bf7SBram Moolenaar  " so say = 'hi' should be ignored.
4752f362bf7SBram Moolenaar  lua t = {3.14, 'hello', false, true, say = 'hi'}
4762f362bf7SBram Moolenaar  call assert_equal([3.14, 'hello', v:false, v:true], luaeval('vim.list(t)'))
4772f362bf7SBram Moolenaar  lua t = nil
4782f362bf7SBram Moolenaar
4792f362bf7SBram Moolenaar  call assert_fails('lua vim.list(1)', '[string "vim chunk"]:1: table expected, got number')
4802f362bf7SBram Moolenaar  call assert_fails('lua vim.list("x")', '[string "vim chunk"]:1: table expected, got string')
4812f362bf7SBram Moolenaar  call assert_fails('lua vim.list(print)', '[string "vim chunk"]:1: table expected, got function')
4822f362bf7SBram Moolenaar  call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
4832f362bf7SBram Moolenaarendfunc
4842f362bf7SBram Moolenaar
485a1f9f866SBram Moolenaarfunc Test_lua_list_table_insert_remove()
486e49b8e8dSBram Moolenaar  if !s:lua_53_or_later
487a1f9f866SBram Moolenaar    throw 'Skipped: Lua version < 5.3'
488a1f9f866SBram Moolenaar  endif
489a1f9f866SBram Moolenaar
490a1f9f866SBram Moolenaar  let l = [1, 2]
491a1f9f866SBram Moolenaar  lua t = vim.eval('l')
492a1f9f866SBram Moolenaar  lua table.insert(t, 10)
493a1f9f866SBram Moolenaar  lua t[#t + 1] = 20
494a1f9f866SBram Moolenaar  lua table.insert(t, 2, 30)
495a1f9f866SBram Moolenaar  call assert_equal(l, [1, 30, 2, 10, 20])
496a1f9f866SBram Moolenaar  lua table.remove(t, 2)
497a1f9f866SBram Moolenaar  call assert_equal(l, [1, 2, 10, 20])
498a1f9f866SBram Moolenaar  lua t[3] = nil
499a1f9f866SBram Moolenaar  call assert_equal(l, [1, 2, 20])
500a1f9f866SBram Moolenaar  lua removed_value = table.remove(t, 3)
501a1f9f866SBram Moolenaar  call assert_equal(luaeval('removed_value'), 20)
502a1f9f866SBram Moolenaar  lua t = nil
503a1f9f866SBram Moolenaar  lua removed_value = nil
504a1f9f866SBram Moolenaar  unlet l
505a1f9f866SBram Moolenaarendfunc
506a1f9f866SBram Moolenaar
5074ff4814bSBram Moolenaar" Test l() i.e. iterator on list
5085feabe00SBram Moolenaarfunc Test_lua_list_iter()
5094ff4814bSBram Moolenaar  lua l = vim.list():add('foo'):add('bar')
5104ff4814bSBram Moolenaar  lua str = ''
5114ff4814bSBram Moolenaar  lua for v in l() do str = str .. v end
5124ff4814bSBram Moolenaar  call assert_equal('foobar', luaeval('str'))
5134ff4814bSBram Moolenaar
5142f362bf7SBram Moolenaar  lua str, l = nil
5154ff4814bSBram Moolenaarendfunc
5164ff4814bSBram Moolenaar
5175feabe00SBram Moolenaarfunc Test_lua_recursive_list()
5184ff4814bSBram Moolenaar  lua l = vim.list():add(1):add(2)
5194ff4814bSBram Moolenaar  lua l = l:add(l)
5204ff4814bSBram Moolenaar
521bd84617dSBram Moolenaar  call assert_equal(1, luaeval('l[1]'))
522bd84617dSBram Moolenaar  call assert_equal(2, luaeval('l[2]'))
5234ff4814bSBram Moolenaar
524bd84617dSBram Moolenaar  call assert_equal(1, luaeval('l[3][1]'))
525bd84617dSBram Moolenaar  call assert_equal(2, luaeval('l[3][2]'))
5264ff4814bSBram Moolenaar
527bd84617dSBram Moolenaar  call assert_equal(1, luaeval('l[3][3][1]'))
528bd84617dSBram Moolenaar  call assert_equal(2, luaeval('l[3][3][2]'))
5294ff4814bSBram Moolenaar
530eb04f089SBram Moolenaar  call assert_equal('[1, 2, [...]]', string(luaeval('l')))
5314ff4814bSBram Moolenaar
532a8a60d0cSBram Moolenaar  call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
533bd84617dSBram Moolenaar  call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[3])'))
5344ff4814bSBram Moolenaar
535bd84617dSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[3]'))
536bd84617dSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[3][3]'))
5374ff4814bSBram Moolenaar
5384ff4814bSBram Moolenaar  lua l = nil
5394ff4814bSBram Moolenaarendfunc
5404ff4814bSBram Moolenaar
5415feabe00SBram Moolenaarfunc Test_lua_dict()
5424ff4814bSBram Moolenaar  call assert_equal({}, luaeval('vim.dict()'))
5434ff4814bSBram Moolenaar
5444ff4814bSBram Moolenaar  let d = {}
5454ff4814bSBram Moolenaar  lua d = vim.eval('d')
5464ff4814bSBram Moolenaar  lua d[0] = 123
5474ff4814bSBram Moolenaar  lua d[1] = "abc"
5484ff4814bSBram Moolenaar  lua d[2] = true
5494ff4814bSBram Moolenaar  lua d[3] = false
5504ff4814bSBram Moolenaar  lua d[4] = vim.eval("[1, 2, 3]")
5514ff4814bSBram Moolenaar  lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
552eb04f089SBram Moolenaar  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)
553eb04f089SBram Moolenaar  call assert_equal(6, luaeval('#d'))
554a8a60d0cSBram Moolenaar  call assert_match('^dict: \%(0x\)\?\x\+$', luaeval('tostring(d)'))
5554ff4814bSBram Moolenaar
5564ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('d[1]'))
557e49b8e8dSBram Moolenaar  call assert_equal(v:null, luaeval('d[22]'))
5584ff4814bSBram Moolenaar
5594ff4814bSBram Moolenaar  lua d[0] = 124
5604ff4814bSBram Moolenaar  lua d[4] = nil
561eb04f089SBram Moolenaar  call assert_equal({'0':124, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
5624ff4814bSBram Moolenaar
5632f362bf7SBram Moolenaar  lockvar 1 d
5642f362bf7SBram Moolenaar  call assert_fails('lua d[6] = 1', '[string "vim chunk"]:1: dict is locked')
565e49b8e8dSBram Moolenaar  unlockvar d
566e49b8e8dSBram Moolenaar
567e49b8e8dSBram Moolenaar  " Error case
568e49b8e8dSBram Moolenaar  lua d = {}
569e49b8e8dSBram Moolenaar  lua d[''] = 10
570e49b8e8dSBram Moolenaar  call assert_fails("let t = luaeval('vim.dict(d)')",
571b898a029SBram Moolenaar        \ s:lua_53_or_later
572b898a029SBram Moolenaar        \ ? '[string "luaeval"]:1: table has empty key'
573b898a029SBram Moolenaar        \ : 'table has empty key')
574e49b8e8dSBram Moolenaar  let d = {}
575e49b8e8dSBram Moolenaar  lua x = vim.eval('d')
576e49b8e8dSBram Moolenaar  call assert_fails("lua x[''] = 10", '[string "vim chunk"]:1: empty key')
577e49b8e8dSBram Moolenaar  lua x['a'] = nil
578e49b8e8dSBram Moolenaar  call assert_equal({}, d)
579e49b8e8dSBram Moolenaar
580e49b8e8dSBram Moolenaar  " cannot assign funcrefs in the global scope
581e49b8e8dSBram Moolenaar  lua x = vim.eval('g:')
582e49b8e8dSBram Moolenaar  call assert_fails("lua x['min'] = vim.funcref('max')",
583e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: cannot assign funcref to builtin scope')
5842f362bf7SBram Moolenaar
5854ff4814bSBram Moolenaar  lua d = nil
5864ff4814bSBram Moolenaarendfunc
5874ff4814bSBram Moolenaar
5885feabe00SBram Moolenaarfunc Test_lua_dict_table()
5892f362bf7SBram Moolenaar  lua t = {key1 = 'x', key2 = 3.14, key3 = true, key4 = false}
5902f362bf7SBram Moolenaar  call assert_equal({'key1': 'x', 'key2': 3.14, 'key3': v:true, 'key4': v:false},
5912f362bf7SBram Moolenaar        \           luaeval('vim.dict(t)'))
5922f362bf7SBram Moolenaar
5932f362bf7SBram Moolenaar  " Same example as in :help lua-vim.
5942f362bf7SBram Moolenaar  lua t = {math.pi, false, say = 'hi'}
5952f362bf7SBram Moolenaar  " FIXME: commented out as it currently does not work as documented:
5962f362bf7SBram Moolenaar  " Expected {'say': 'hi'}
5972f362bf7SBram Moolenaar  " but got {'1': 3.141593, '2': v:false, 'say': 'hi'}
5982f362bf7SBram Moolenaar  " Is the documentation or the code wrong?
5992f362bf7SBram Moolenaar  "call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
6002f362bf7SBram Moolenaar  lua t = nil
6012f362bf7SBram Moolenaar
6022f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(1)', '[string "vim chunk"]:1: table expected, got number')
6032f362bf7SBram Moolenaar  call assert_fails('lua vim.dict("x")', '[string "vim chunk"]:1: table expected, got string')
6042f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(print)', '[string "vim chunk"]:1: table expected, got function')
6052f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(true)', '[string "vim chunk"]:1: table expected, got boolean')
6062f362bf7SBram Moolenaarendfunc
6072f362bf7SBram Moolenaar
6084ff4814bSBram Moolenaar" Test d() i.e. iterator on dictionary
6095feabe00SBram Moolenaarfunc Test_lua_dict_iter()
6104ff4814bSBram Moolenaar  let d = {'a': 1, 'b':2}
6114ff4814bSBram Moolenaar  lua d = vim.eval('d')
6124ff4814bSBram Moolenaar  lua str = ''
6134ff4814bSBram Moolenaar  lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
6144ff4814bSBram Moolenaar  call assert_equal('a:1,b:2,', luaeval('str'))
6154ff4814bSBram Moolenaar
6162f362bf7SBram Moolenaar  lua str, d = nil
6174ff4814bSBram Moolenaarendfunc
6184ff4814bSBram Moolenaar
6195feabe00SBram Moolenaarfunc Test_lua_blob()
620b7828690SBram Moolenaar  call assert_equal(0z, luaeval('vim.blob("")'))
621b7828690SBram Moolenaar  call assert_equal(0z31326162, luaeval('vim.blob("12ab")'))
622b7828690SBram Moolenaar  call assert_equal(0z00010203, luaeval('vim.blob("\x00\x01\x02\x03")'))
623b7828690SBram Moolenaar  call assert_equal(0z8081FEFF, luaeval('vim.blob("\x80\x81\xfe\xff")'))
624b7828690SBram Moolenaar
625b7828690SBram Moolenaar  lua b = vim.blob("\x00\x00\x00\x00")
626b7828690SBram Moolenaar  call assert_equal(0z00000000, luaeval('b'))
627eb04f089SBram Moolenaar  call assert_equal(4, luaeval('#b'))
628b7828690SBram Moolenaar  lua b[0], b[1], b[2], b[3] = 1, 32, 256, 0xff
629b7828690SBram Moolenaar  call assert_equal(0z012000ff, luaeval('b'))
630b7828690SBram Moolenaar  lua b[4] = string.byte("z", 1)
631b7828690SBram Moolenaar  call assert_equal(0z012000ff.7a, luaeval('b'))
632eb04f089SBram Moolenaar  call assert_equal(5, luaeval('#b'))
633b7828690SBram Moolenaar  call assert_fails('lua b[#b+1] = 0x80', '[string "vim chunk"]:1: index out of range')
634b7828690SBram Moolenaar  lua b:add("12ab")
635b7828690SBram Moolenaar  call assert_equal(0z012000ff.7a313261.62, luaeval('b'))
636eb04f089SBram Moolenaar  call assert_equal(9, luaeval('#b'))
637b7828690SBram Moolenaar  call assert_fails('lua b:add(nil)', '[string "vim chunk"]:1: string expected, got nil')
638b7828690SBram Moolenaar  call assert_fails('lua b:add(true)', '[string "vim chunk"]:1: string expected, got boolean')
639b7828690SBram Moolenaar  call assert_fails('lua b:add({})', '[string "vim chunk"]:1: string expected, got table')
640b7828690SBram Moolenaar  lua b = nil
641e49b8e8dSBram Moolenaar
642e49b8e8dSBram Moolenaar  let b = 0z0102
643e49b8e8dSBram Moolenaar  lua lb = vim.eval('b')
644e49b8e8dSBram Moolenaar  let n = luaeval('lb[1]')
645e49b8e8dSBram Moolenaar  call assert_equal(2, n)
646e49b8e8dSBram Moolenaar  let n = luaeval('lb[6]')
647e49b8e8dSBram Moolenaar  call assert_equal(v:null, n)
648f65ed86fSBram Moolenaar  if s:lua_543_or_later
649f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: method 'xyz' is not callable (a nil value)"
650f65ed86fSBram Moolenaar  elseif s:lua_53_or_later
651f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call a nil value (method 'xyz')"
652f65ed86fSBram Moolenaar  else
653f65ed86fSBram Moolenaar    let msg = "[string \"luaeval\"]:1: attempt to call method 'xyz' (a nil value)"
654f65ed86fSBram Moolenaar  endif
655f65ed86fSBram Moolenaar  call assert_fails('let x = luaeval("lb:xyz(3)")', msg)
656e49b8e8dSBram Moolenaar  let y = luaeval("lb[{}]")
657e49b8e8dSBram Moolenaar  call assert_equal(v:null, y)
658e49b8e8dSBram Moolenaar
659e49b8e8dSBram Moolenaar  lockvar b
660e49b8e8dSBram Moolenaar  call assert_fails('lua lb[1] = 2', '[string "vim chunk"]:1: blob is locked')
661e49b8e8dSBram Moolenaar  call assert_fails('lua lb:add("12")', '[string "vim chunk"]:1: blob is locked')
662e49b8e8dSBram Moolenaar
663e49b8e8dSBram Moolenaar  " Error cases
664e49b8e8dSBram Moolenaar  lua t = {}
665e49b8e8dSBram Moolenaar  call assert_fails('lua b = vim.blob(t)',
666e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: string expected, got table')
667b7828690SBram Moolenaarendfunc
668b7828690SBram Moolenaar
6695feabe00SBram Moolenaarfunc Test_lua_funcref()
670ca06da92SBram Moolenaar  function I(x)
671ca06da92SBram Moolenaar    return a:x
672ca06da92SBram Moolenaar  endfunction
673ca06da92SBram Moolenaar  let R = function('I')
674ca06da92SBram Moolenaar  lua i1 = vim.funcref"I"
675ca06da92SBram Moolenaar  lua i2 = vim.eval"R"
676ca06da92SBram Moolenaar  lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
677ca06da92SBram Moolenaar  lua msg = vim.funcref"tr"(msg, "|", " ")
678ca06da92SBram Moolenaar  call assert_equal("funcref test OK", luaeval('msg'))
679ca06da92SBram Moolenaar
680e49b8e8dSBram Moolenaar  " Error cases
681e49b8e8dSBram Moolenaar  call assert_fails('lua f1 = vim.funcref("")',
682e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: invalid function name: ')
683e49b8e8dSBram Moolenaar  call assert_fails('lua f1 = vim.funcref("10")',
684e49b8e8dSBram Moolenaar        \ '[string "vim chunk"]:1: invalid function name: 10')
685e49b8e8dSBram Moolenaar  let fname = test_null_string()
686e49b8e8dSBram Moolenaar  call assert_fails('lua f1 = vim.funcref(fname)',
687e49b8e8dSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'funcref' (string expected, got nil)")
688e49b8e8dSBram Moolenaar  call assert_fails('lua vim.funcref("abc")()',
689ecdd14a4SBram Moolenaar        \ ['E117:', '\[string "vim chunk"]:1: cannot call funcref'])
690e49b8e8dSBram Moolenaar
691ca06da92SBram Moolenaar  " dict funcref
692ca06da92SBram Moolenaar  function Mylen() dict
693ca06da92SBram Moolenaar    return len(self.data)
694ca06da92SBram Moolenaar  endfunction
695ca06da92SBram Moolenaar  let l = [0, 1, 2, 3]
696ca06da92SBram Moolenaar  let mydict = {'data': l}
697ca06da92SBram Moolenaar  lua d = vim.eval"mydict"
698ca06da92SBram Moolenaar  lua d.len = vim.funcref"Mylen" -- assign d as 'self'
699ca06da92SBram Moolenaar  lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
700ca06da92SBram Moolenaar  call assert_equal("OK", luaeval('res'))
7014eefe47eSBram Moolenaar  call assert_equal(function('Mylen', {'data': l, 'len': function('Mylen')}), mydict.len)
7022f362bf7SBram Moolenaar
7032f362bf7SBram Moolenaar  lua i1, i2, msg, d, res = nil
704ca06da92SBram Moolenaarendfunc
705ca06da92SBram Moolenaar
7064ff4814bSBram Moolenaar" Test vim.type()
7075feabe00SBram Moolenaarfunc Test_lua_type()
7084ff4814bSBram Moolenaar  " The following values are identical to Lua's type function.
7094ff4814bSBram Moolenaar  call assert_equal('string',   luaeval('vim.type("foo")'))
7104ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1)'))
7114ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1.2)'))
7124ff4814bSBram Moolenaar  call assert_equal('function', luaeval('vim.type(print)'))
7134ff4814bSBram Moolenaar  call assert_equal('table',    luaeval('vim.type({})'))
7144ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(true)'))
7154ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(false)'))
7164ff4814bSBram Moolenaar  call assert_equal('nil',      luaeval('vim.type(nil)'))
7174ff4814bSBram Moolenaar
7184ff4814bSBram Moolenaar  " The following values are specific to Vim.
7194ff4814bSBram Moolenaar  call assert_equal('window',   luaeval('vim.type(vim.window())'))
7204ff4814bSBram Moolenaar  call assert_equal('buffer',   luaeval('vim.type(vim.buffer())'))
7214ff4814bSBram Moolenaar  call assert_equal('list',     luaeval('vim.type(vim.list())'))
7224ff4814bSBram Moolenaar  call assert_equal('dict',     luaeval('vim.type(vim.dict())'))
723ca06da92SBram Moolenaar  call assert_equal('funcref',  luaeval('vim.type(vim.funcref("Test_type"))'))
7244ff4814bSBram Moolenaarendfunc
7254ff4814bSBram Moolenaar
7264ff4814bSBram Moolenaar" Test vim.open()
7275feabe00SBram Moolenaarfunc Test_lua_open()
7284ff4814bSBram Moolenaar  call assert_notmatch('XOpen', execute('ls'))
7294ff4814bSBram Moolenaar
7304ff4814bSBram Moolenaar  " Open a buffer XOpen1, but do not jump to it.
7314ff4814bSBram Moolenaar  lua b = vim.open('XOpen1')
7324ff4814bSBram Moolenaar  call assert_equal('XOpen1', luaeval('b.name'))
7334ff4814bSBram Moolenaar  call assert_equal('', bufname('%'))
7344ff4814bSBram Moolenaar
7354ff4814bSBram Moolenaar  call assert_match('XOpen1', execute('ls'))
7364ff4814bSBram Moolenaar  call assert_notequal('XOpen2', bufname('%'))
7374ff4814bSBram Moolenaar
7384ff4814bSBram Moolenaar  " Open a buffer XOpen2 and jump to it.
7394ff4814bSBram Moolenaar  lua b = vim.open('XOpen2')()
7404ff4814bSBram Moolenaar  call assert_equal('XOpen2', luaeval('b.name'))
7414ff4814bSBram Moolenaar  call assert_equal('XOpen2', bufname('%'))
7424ff4814bSBram Moolenaar
7434ff4814bSBram Moolenaar  lua b = nil
7444ff4814bSBram Moolenaar  %bwipe!
7454ff4814bSBram Moolenaarendfunc
7464ff4814bSBram Moolenaar
747788fbb47SBram Moolenaarfunc Test_update_package_paths()
748788fbb47SBram Moolenaar  set runtimepath+=./testluaplugin
749788fbb47SBram Moolenaar  call assert_equal("hello from lua", luaeval("require('testluaplugin').hello()"))
750788fbb47SBram Moolenaarendfunc
751788fbb47SBram Moolenaar
752801ab069SBram Moolenaarfunc Vim_func_call_lua_callback(Concat, Cb)
753801ab069SBram Moolenaar  let l:message = a:Concat("hello", "vim")
754801ab069SBram Moolenaar  call a:Cb(l:message)
755801ab069SBram Moolenaarendfunc
756801ab069SBram Moolenaar
757801ab069SBram Moolenaarfunc Test_pass_lua_callback_to_vim_from_lua()
758801ab069SBram Moolenaar  lua pass_lua_callback_to_vim_from_lua_result = ""
759801ab069SBram Moolenaar  call assert_equal("", luaeval("pass_lua_callback_to_vim_from_lua_result"))
760801ab069SBram Moolenaar  lua <<EOF
761801ab069SBram Moolenaar  vim.funcref('Vim_func_call_lua_callback')(
762801ab069SBram Moolenaar    function(greeting, message)
763801ab069SBram Moolenaar      return greeting .. " " .. message
764801ab069SBram Moolenaar    end,
765801ab069SBram Moolenaar    function(message)
766801ab069SBram Moolenaar      pass_lua_callback_to_vim_from_lua_result = message
767801ab069SBram Moolenaar    end)
768801ab069SBram MoolenaarEOF
769801ab069SBram Moolenaar  call assert_equal("hello vim", luaeval("pass_lua_callback_to_vim_from_lua_result"))
770801ab069SBram Moolenaarendfunc
771801ab069SBram Moolenaar
772801ab069SBram Moolenaarfunc Vim_func_call_metatable_lua_callback(Greet)
773801ab069SBram Moolenaar  return a:Greet("world")
774801ab069SBram Moolenaarendfunc
775801ab069SBram Moolenaar
776801ab069SBram Moolenaarfunc Test_pass_lua_metatable_callback_to_vim_from_lua()
777801ab069SBram Moolenaar  let result = luaeval("vim.funcref('Vim_func_call_metatable_lua_callback')(setmetatable({ space = ' '}, { __call = function(tbl, msg) return 'hello' .. tbl.space .. msg  end }) )")
778801ab069SBram Moolenaar  call assert_equal("hello world", result)
779801ab069SBram Moolenaarendfunc
780801ab069SBram Moolenaar
7814ff4814bSBram Moolenaar" Test vim.line()
7825feabe00SBram Moolenaarfunc Test_lua_line()
7834ff4814bSBram Moolenaar  new
7844ff4814bSBram Moolenaar  call setline(1, ['first line', 'second line'])
7854ff4814bSBram Moolenaar  1
7864ff4814bSBram Moolenaar  call assert_equal('first line', luaeval('vim.line()'))
7874ff4814bSBram Moolenaar  2
7884ff4814bSBram Moolenaar  call assert_equal('second line', luaeval('vim.line()'))
7894ff4814bSBram Moolenaar  bwipe!
7904ff4814bSBram Moolenaarendfunc
7914ff4814bSBram Moolenaar
7924ff4814bSBram Moolenaar" Test vim.beep()
7935feabe00SBram Moolenaarfunc Test_lua_beep()
7944ff4814bSBram Moolenaar  call assert_beeps('lua vim.beep()')
7954ff4814bSBram Moolenaarendfunc
7964ff4814bSBram Moolenaar
7974ff4814bSBram Moolenaar" Test errors in luaeval()
7984ff4814bSBram Moolenaarfunc Test_luaeval_error()
7994ff4814bSBram Moolenaar  " Compile error
8004ff4814bSBram Moolenaar  call assert_fails("call luaeval('-nil')",
8014ff4814bSBram Moolenaar  \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
8024ff4814bSBram Moolenaar  call assert_fails("call luaeval(']')",
8034ff4814bSBram Moolenaar  \ "[string \"luaeval\"]:1: unexpected symbol near ']'")
804e49b8e8dSBram Moolenaar  lua co = coroutine.create(function () print("hi") end)
805e49b8e8dSBram Moolenaar  call assert_fails('let i = luaeval("co")', 'luaeval: cannot convert value')
806e49b8e8dSBram Moolenaar  lua co = nil
807e49b8e8dSBram Moolenaar  call assert_fails('let m = luaeval("{}")', 'luaeval: cannot convert value')
8084ff4814bSBram Moolenaarendfunc
8094ff4814bSBram Moolenaar
8104ff4814bSBram Moolenaar" Test :luafile foo.lua
8114ff4814bSBram Moolenaarfunc Test_luafile()
8124ff4814bSBram Moolenaar  call delete('Xlua_file')
813eb04f089SBram Moolenaar  call writefile(["str = 'hello'", "num = 123" ], 'Xlua_file')
8144ff4814bSBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
8154ff4814bSBram Moolenaar
8164ff4814bSBram Moolenaar  luafile Xlua_file
8174ff4814bSBram Moolenaar  call assert_equal('hello', luaeval('str'))
818eb04f089SBram Moolenaar  call assert_equal(123, luaeval('num'))
8194ff4814bSBram Moolenaar
8202f362bf7SBram Moolenaar  lua str, num = nil
8214ff4814bSBram Moolenaar  call delete('Xlua_file')
8224ff4814bSBram Moolenaarendfunc
8234ff4814bSBram Moolenaar
8244ff4814bSBram Moolenaar" Test :luafile %
8254ff4814bSBram Moolenaarfunc Test_luafile_percent()
8264ff4814bSBram Moolenaar  new Xlua_file
8274ff4814bSBram Moolenaar  append
8284ff4814bSBram Moolenaar    str, num = 'foo', 321.0
8294ff4814bSBram Moolenaar    print(string.format('str=%s, num=%d', str, num))
8304ff4814bSBram Moolenaar.
8314ff4814bSBram Moolenaar  w!
8324ff4814bSBram Moolenaar  luafile %
8334ff4814bSBram Moolenaar  let msg = split(execute('message'), "\n")[-1]
8344ff4814bSBram Moolenaar  call assert_equal('str=foo, num=321', msg)
8354ff4814bSBram Moolenaar
8362f362bf7SBram Moolenaar  lua str, num = nil
8372f362bf7SBram Moolenaar  call delete('Xlua_file')
8382f362bf7SBram Moolenaar  bwipe!
8392f362bf7SBram Moolenaarendfunc
8402f362bf7SBram Moolenaar
8412f362bf7SBram Moolenaar" Test :luafile with syntax error
8422f362bf7SBram Moolenaarfunc Test_luafile_error()
8432f362bf7SBram Moolenaar  new Xlua_file
8442f362bf7SBram Moolenaar  call writefile(['nil = 0' ], 'Xlua_file')
8452f362bf7SBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
8462f362bf7SBram Moolenaar
8472f362bf7SBram Moolenaar  call assert_fails('luafile Xlua_file', "Xlua_file:1: unexpected symbol near 'nil'")
8482f362bf7SBram Moolenaar
8494ff4814bSBram Moolenaar  call delete('Xlua_file')
850d58f03b1SBram Moolenaar  bwipe!
851d58f03b1SBram Moolenaarendfunc
85253901442SBram Moolenaar
85378e006b9SBram Moolenaar" Test :luafile printing a long string
85478e006b9SBram Moolenaarfunc Test_luafile_print()
85578e006b9SBram Moolenaar  new Xlua_file
85678e006b9SBram Moolenaar  let lines =<< trim END
85778e006b9SBram Moolenaar      local data = ''
85878e006b9SBram Moolenaar      for i = 1, 130 do
85978e006b9SBram Moolenaar	data = data .. 'xxxxx asd as as dad sad sad xz cxz  czxcxzczxc ad ad asd asd asd asd asd'
86078e006b9SBram Moolenaar      end
86178e006b9SBram Moolenaar      print(data)
86278e006b9SBram Moolenaar  END
86378e006b9SBram Moolenaar  call setline(1, lines)
86478e006b9SBram Moolenaar  w
86578e006b9SBram Moolenaar  luafile %
86678e006b9SBram Moolenaar
86778e006b9SBram Moolenaar  call delete('Xlua_file')
86878e006b9SBram Moolenaar  bwipe!
86978e006b9SBram Moolenaarendfunc
87078e006b9SBram Moolenaar
871e49b8e8dSBram Moolenaar" Test for dealing with strings containing newlines and null character
872e49b8e8dSBram Moolenaarfunc Test_lua_string_with_newline()
8732a4bd00cSBram Moolenaar  let x = execute('lua print("Hello\nWorld", 2)')
8742a4bd00cSBram Moolenaar  call assert_equal("\nHello\nWorld 2", x)
875e49b8e8dSBram Moolenaar  new
876e49b8e8dSBram Moolenaar  lua k = vim.buffer(vim.eval('bufnr()'))
877e49b8e8dSBram Moolenaar  lua k:insert("Hello\0World", 0)
878e49b8e8dSBram Moolenaar  call assert_equal(["Hello\nWorld", ''], getline(1, '$'))
879e49b8e8dSBram Moolenaar  close!
880e49b8e8dSBram Moolenaarendfunc
881e49b8e8dSBram Moolenaar
8825feabe00SBram Moolenaarfunc Test_lua_set_cursor()
88353901442SBram Moolenaar  " Check that setting the cursor position works.
88453901442SBram Moolenaar  new
88553901442SBram Moolenaar  call setline(1, ['first line', 'second line'])
88653901442SBram Moolenaar  normal gg
8876c2b7b80SBram Moolenaar  lua << trim EOF
88853901442SBram Moolenaar    w = vim.window()
88953901442SBram Moolenaar    w.line = 1
89053901442SBram Moolenaar    w.col = 5
89153901442SBram Moolenaar  EOF
89253901442SBram Moolenaar  call assert_equal([1, 5], [line('.'), col('.')])
89353901442SBram Moolenaar
89453901442SBram Moolenaar  " Check that movement after setting cursor position keeps current column.
89553901442SBram Moolenaar  normal j
89653901442SBram Moolenaar  call assert_equal([2, 5], [line('.'), col('.')])
89753901442SBram Moolenaarendfunc
8986c2b7b80SBram Moolenaar
8996c2b7b80SBram Moolenaar" Test for various heredoc syntax
9006c2b7b80SBram Moolenaarfunc Test_lua_heredoc()
9016c2b7b80SBram Moolenaar  lua << END
9026c2b7b80SBram Moolenaarvim.command('let s = "A"')
9036c2b7b80SBram MoolenaarEND
9046c2b7b80SBram Moolenaar  lua <<
9056c2b7b80SBram Moolenaarvim.command('let s ..= "B"')
9066c2b7b80SBram Moolenaar.
9076c2b7b80SBram Moolenaar  lua << trim END
9086c2b7b80SBram Moolenaar    vim.command('let s ..= "C"')
9096c2b7b80SBram Moolenaar  END
9106c2b7b80SBram Moolenaar  lua << trim
9116c2b7b80SBram Moolenaar    vim.command('let s ..= "D"')
9126c2b7b80SBram Moolenaar  .
9136ab0953fSBram Moolenaar  lua << trim eof
9146ab0953fSBram Moolenaar    vim.command('let s ..= "E"')
9156ab0953fSBram Moolenaar  eof
9166ab0953fSBram Moolenaar  call assert_equal('ABCDE', s)
9176c2b7b80SBram Moolenaarendfunc
9186c2b7b80SBram Moolenaar
9199dc4bef8SYegappan Lakshmanan" Test for adding, accessing and removing global variables using the vim.g
9209dc4bef8SYegappan Lakshmanan" Lua table
9219dc4bef8SYegappan Lakshmananfunc Test_lua_global_var_table()
9229dc4bef8SYegappan Lakshmanan  " Access global variables with different types of values
9239dc4bef8SYegappan Lakshmanan  let g:Var1 = 10
9249dc4bef8SYegappan Lakshmanan  let g:Var2 = 'Hello'
9259dc4bef8SYegappan Lakshmanan  let g:Var3 = ['a', 'b']
9269dc4bef8SYegappan Lakshmanan  let g:Var4 = #{x: 'edit', y: 'run'}
9279dc4bef8SYegappan Lakshmanan  let g:Var5 = function('min')
9289dc4bef8SYegappan Lakshmanan  call assert_equal(10, luaeval('vim.g.Var1'))
9299dc4bef8SYegappan Lakshmanan  call assert_equal('Hello', luaeval('vim.g.Var2'))
9309dc4bef8SYegappan Lakshmanan  call assert_equal(['a', 'b'], luaeval('vim.g.Var3'))
9319dc4bef8SYegappan Lakshmanan  call assert_equal(#{x: 'edit', y: 'run'}, luaeval('vim.g.Var4'))
9329dc4bef8SYegappan Lakshmanan  call assert_equal(2, luaeval('vim.g.Var5')([5, 9, 2]))
9339dc4bef8SYegappan Lakshmanan
9349dc4bef8SYegappan Lakshmanan  " Access list of dictionaries and dictionary of lists
9359dc4bef8SYegappan Lakshmanan  let g:Var1 = [#{a: 10}, #{b: 20}]
9369dc4bef8SYegappan Lakshmanan  let g:Var2 = #{p: [5, 6], q: [1.1, 2.2]}
9379dc4bef8SYegappan Lakshmanan  call assert_equal([#{a: 10}, #{b: 20}], luaeval('vim.g.Var1'))
9389dc4bef8SYegappan Lakshmanan  call assert_equal(#{p: [5, 6], q: [1.1, 2.2]}, luaeval('vim.g.Var2'))
9399dc4bef8SYegappan Lakshmanan
9409dc4bef8SYegappan Lakshmanan  " Create new global variables with different types of values
9419dc4bef8SYegappan Lakshmanan  unlet g:Var1 g:Var2 g:Var3 g:Var4 g:Var5
9429dc4bef8SYegappan Lakshmanan  lua << trim END
9439dc4bef8SYegappan Lakshmanan    vim.g.Var1 = 34
9449dc4bef8SYegappan Lakshmanan    vim.g.Var2 = 'World'
9459dc4bef8SYegappan Lakshmanan    vim.g.Var3 = vim.list({'#', '$'})
9469dc4bef8SYegappan Lakshmanan    vim.g.Var4 = vim.dict({model='honda', year=2020})
9479dc4bef8SYegappan Lakshmanan    vim.g.Var5 = vim.funcref('max')
9489dc4bef8SYegappan Lakshmanan  END
9499dc4bef8SYegappan Lakshmanan  call assert_equal(34, g:Var1)
9509dc4bef8SYegappan Lakshmanan  call assert_equal('World', g:Var2)
9519dc4bef8SYegappan Lakshmanan  call assert_equal(['#', '$'], g:Var3)
9529dc4bef8SYegappan Lakshmanan  call assert_equal(#{model: 'honda', year: 2020}, g:Var4)
9539dc4bef8SYegappan Lakshmanan  call assert_equal(10, g:Var5([5, 10, 9]))
9549dc4bef8SYegappan Lakshmanan
9559dc4bef8SYegappan Lakshmanan  " Create list of dictionaries and dictionary of lists
9569dc4bef8SYegappan Lakshmanan  unlet g:Var1 g:Var2
9579dc4bef8SYegappan Lakshmanan  lua << trim END
9589dc4bef8SYegappan Lakshmanan    vim.g.Var1 = vim.list({vim.dict({a=10}), vim.dict({b=20})})
9599dc4bef8SYegappan Lakshmanan    vim.g.Var2 = vim.dict({p=vim.list({5, 6}), q=vim.list({1.1, 2.2})})
9609dc4bef8SYegappan Lakshmanan  END
9619dc4bef8SYegappan Lakshmanan  call assert_equal([#{a: 10}, #{b: 20}], luaeval('vim.g.Var1'))
9629dc4bef8SYegappan Lakshmanan  call assert_equal(#{p: [5, 6], q: [1.1, 2.2]}, luaeval('vim.g.Var2'))
9639dc4bef8SYegappan Lakshmanan
9649dc4bef8SYegappan Lakshmanan  " Modify a global variable with a list value or a dictionary value
9659dc4bef8SYegappan Lakshmanan  let g:Var1 = [10, 20]
9669dc4bef8SYegappan Lakshmanan  let g:Var2 = #{one: 'mercury', two: 'mars'}
9679dc4bef8SYegappan Lakshmanan  lua << trim END
9689dc4bef8SYegappan Lakshmanan    vim.g.Var1[2] = Nil
9699dc4bef8SYegappan Lakshmanan    vim.g.Var1[3] = 15
9709dc4bef8SYegappan Lakshmanan    vim.g.Var2['two'] = Nil
9719dc4bef8SYegappan Lakshmanan    vim.g.Var2['three'] = 'earth'
9729dc4bef8SYegappan Lakshmanan  END
9739dc4bef8SYegappan Lakshmanan  call assert_equal([10, 15], g:Var1)
9749dc4bef8SYegappan Lakshmanan  call assert_equal(#{one: 'mercury', three: 'earth'}, g:Var2)
9759dc4bef8SYegappan Lakshmanan
9769dc4bef8SYegappan Lakshmanan  " Remove global variables with different types of values
9779dc4bef8SYegappan Lakshmanan  let g:Var1 = 10
9789dc4bef8SYegappan Lakshmanan  let g:Var2 = 'Hello'
9799dc4bef8SYegappan Lakshmanan  let g:Var3 = ['a', 'b']
9809dc4bef8SYegappan Lakshmanan  let g:Var4 = #{x: 'edit', y: 'run'}
9819dc4bef8SYegappan Lakshmanan  let g:Var5 = function('min')
9829dc4bef8SYegappan Lakshmanan  lua << trim END
9839dc4bef8SYegappan Lakshmanan    vim.g.Var1 = Nil
9849dc4bef8SYegappan Lakshmanan    vim.g.Var2 = Nil
9859dc4bef8SYegappan Lakshmanan    vim.g.Var3 = Nil
9869dc4bef8SYegappan Lakshmanan    vim.g.Var4 = Nil
9879dc4bef8SYegappan Lakshmanan    vim.g.Var5 = Nil
9889dc4bef8SYegappan Lakshmanan  END
9899dc4bef8SYegappan Lakshmanan  call assert_false(exists('g:Var1'))
9909dc4bef8SYegappan Lakshmanan  call assert_false(exists('g:Var2'))
9919dc4bef8SYegappan Lakshmanan  call assert_false(exists('g:Var3'))
9929dc4bef8SYegappan Lakshmanan  call assert_false(exists('g:Var4'))
9939dc4bef8SYegappan Lakshmanan  call assert_false(exists('g:Var5'))
9949dc4bef8SYegappan Lakshmanan
9959dc4bef8SYegappan Lakshmanan  " Try to modify and remove a locked global variable
9969dc4bef8SYegappan Lakshmanan  let g:Var1 = 10
9979dc4bef8SYegappan Lakshmanan  lockvar g:Var1
9989dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.g.Var1 = 20', 'variable is locked')
9999dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.g.Var1 = Nil', 'variable is locked')
10009dc4bef8SYegappan Lakshmanan  unlockvar g:Var1
10019dc4bef8SYegappan Lakshmanan  let g:Var2 = [7, 14]
10029dc4bef8SYegappan Lakshmanan  lockvar 0 g:Var2
10039dc4bef8SYegappan Lakshmanan  lua vim.g.Var2[2] = Nil
10049dc4bef8SYegappan Lakshmanan  lua vim.g.Var2[3] = 21
10059dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.g.Var2 = Nil', 'variable is locked')
10069dc4bef8SYegappan Lakshmanan  call assert_equal([7, 21], g:Var2)
10079dc4bef8SYegappan Lakshmanan  lockvar 1 g:Var2
10089dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.g.Var2[2] = Nil', 'list is locked')
10099dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.g.Var2[3] = 21', 'list is locked')
10109dc4bef8SYegappan Lakshmanan  unlockvar g:Var2
10119dc4bef8SYegappan Lakshmanan
10124a01159dSBram Moolenaar  let g:TestFunc = function('len')
10134a01159dSBram Moolenaar  call assert_fails('lua vim.g.func = vim.g.TestFunc', ['E704:', 'Couldn''t add to dictionary'])
10144a01159dSBram Moolenaar  unlet g:TestFunc
10154a01159dSBram Moolenaar
10169dc4bef8SYegappan Lakshmanan  " Attempt to access a non-existing global variable
10179dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.g.NonExistingVar'))
10189dc4bef8SYegappan Lakshmanan  lua vim.g.NonExisting = Nil
10199dc4bef8SYegappan Lakshmanan
10209dc4bef8SYegappan Lakshmanan  unlet! g:Var1 g:Var2 g:Var3 g:Var4 g:Var5
10219dc4bef8SYegappan Lakshmananendfunc
10229dc4bef8SYegappan Lakshmanan
10239dc4bef8SYegappan Lakshmanan" Test for accessing and modifying predefined vim variables using the vim.v
10249dc4bef8SYegappan Lakshmanan" Lua table
10259dc4bef8SYegappan Lakshmananfunc Test_lua_predefined_var_table()
10269dc4bef8SYegappan Lakshmanan  call assert_equal(v:progpath, luaeval('vim.v.progpath'))
10279dc4bef8SYegappan Lakshmanan  let v:errmsg = 'SomeError'
10289dc4bef8SYegappan Lakshmanan  call assert_equal('SomeError', luaeval('vim.v.errmsg'))
10299dc4bef8SYegappan Lakshmanan  lua vim.v.errmsg = 'OtherError'
10309dc4bef8SYegappan Lakshmanan  call assert_equal('OtherError', v:errmsg)
10319dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.v.errmsg = Nil', 'variable is fixed')
10329dc4bef8SYegappan Lakshmanan  let v:oldfiles = ['one', 'two']
10339dc4bef8SYegappan Lakshmanan  call assert_equal(['one', 'two'], luaeval('vim.v.oldfiles'))
10349dc4bef8SYegappan Lakshmanan  lua vim.v.oldfiles = vim.list({})
10359dc4bef8SYegappan Lakshmanan  call assert_equal([], v:oldfiles)
10369dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.v.null'))
10379dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.v.argv[1] = Nil', 'list is locked')
10389dc4bef8SYegappan Lakshmanan  call assert_fails('lua vim.v.newvar = 1', 'Dictionary is locked')
10399dc4bef8SYegappan Lakshmananendfunc
10409dc4bef8SYegappan Lakshmanan
10419dc4bef8SYegappan Lakshmanan" Test for adding, accessing and modifying window-local variables using the
10429dc4bef8SYegappan Lakshmanan" vim.w Lua table
10439dc4bef8SYegappan Lakshmananfunc Test_lua_window_var_table()
10449dc4bef8SYegappan Lakshmanan  " Access window variables with different types of values
10459dc4bef8SYegappan Lakshmanan  new
10469dc4bef8SYegappan Lakshmanan  let w:wvar1 = 10
10479dc4bef8SYegappan Lakshmanan  let w:wvar2 = 'edit'
10489dc4bef8SYegappan Lakshmanan  let w:wvar3 = 3.14
10499dc4bef8SYegappan Lakshmanan  let w:wvar4 = 0zdeadbeef
10509dc4bef8SYegappan Lakshmanan  let w:wvar5 = ['a', 'b']
10519dc4bef8SYegappan Lakshmanan  let w:wvar6 = #{action: 'run'}
10529dc4bef8SYegappan Lakshmanan  call assert_equal(10, luaeval('vim.w.wvar1'))
10539dc4bef8SYegappan Lakshmanan  call assert_equal('edit', luaeval('vim.w.wvar2'))
10549dc4bef8SYegappan Lakshmanan  call assert_equal(3.14, luaeval('vim.w.wvar3'))
10559dc4bef8SYegappan Lakshmanan  call assert_equal(0zdeadbeef, luaeval('vim.w.wvar4'))
10569dc4bef8SYegappan Lakshmanan  call assert_equal(['a', 'b'], luaeval('vim.w.wvar5'))
10579dc4bef8SYegappan Lakshmanan  call assert_equal(#{action: 'run'}, luaeval('vim.w.wvar6'))
10589dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.w.NonExisting'))
10599dc4bef8SYegappan Lakshmanan
10609dc4bef8SYegappan Lakshmanan  " modify a window variable
10619dc4bef8SYegappan Lakshmanan  lua vim.w.wvar2 = 'paste'
10629dc4bef8SYegappan Lakshmanan  call assert_equal('paste', w:wvar2)
10639dc4bef8SYegappan Lakshmanan
10649dc4bef8SYegappan Lakshmanan  " change the type stored in a variable
10659dc4bef8SYegappan Lakshmanan  let w:wvar2 = [1, 2]
10669dc4bef8SYegappan Lakshmanan  lua vim.w.wvar2 = vim.dict({a=10, b=20})
10679dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: 10, b: 20}, w:wvar2)
10689dc4bef8SYegappan Lakshmanan
10699dc4bef8SYegappan Lakshmanan  " create a new window variable
10709dc4bef8SYegappan Lakshmanan  lua vim.w.wvar7 = vim.dict({a=vim.list({1, 2}), b=20})
10719dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: [1, 2], b: 20}, w:wvar7)
10729dc4bef8SYegappan Lakshmanan
10739dc4bef8SYegappan Lakshmanan  " delete a window variable
10749dc4bef8SYegappan Lakshmanan  lua vim.w.wvar2 = Nil
10759dc4bef8SYegappan Lakshmanan  call assert_false(exists('w:wvar2'))
10769dc4bef8SYegappan Lakshmanan
10779dc4bef8SYegappan Lakshmanan  new
10789dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.w.wvar1'))
10799dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.w.wvar2'))
10809dc4bef8SYegappan Lakshmanan  %bw!
10819dc4bef8SYegappan Lakshmananendfunc
10829dc4bef8SYegappan Lakshmanan
10839dc4bef8SYegappan Lakshmanan" Test for adding, accessing and modifying buffer-local variables using the
10849dc4bef8SYegappan Lakshmanan" vim.b Lua table
10859dc4bef8SYegappan Lakshmananfunc Test_lua_buffer_var_table()
10869dc4bef8SYegappan Lakshmanan  " Access buffer variables with different types of values
10879dc4bef8SYegappan Lakshmanan  let b:bvar1 = 10
10889dc4bef8SYegappan Lakshmanan  let b:bvar2 = 'edit'
10899dc4bef8SYegappan Lakshmanan  let b:bvar3 = 3.14
10909dc4bef8SYegappan Lakshmanan  let b:bvar4 = 0zdeadbeef
10919dc4bef8SYegappan Lakshmanan  let b:bvar5 = ['a', 'b']
10929dc4bef8SYegappan Lakshmanan  let b:bvar6 = #{action: 'run'}
10939dc4bef8SYegappan Lakshmanan  call assert_equal(10, luaeval('vim.b.bvar1'))
10949dc4bef8SYegappan Lakshmanan  call assert_equal('edit', luaeval('vim.b.bvar2'))
10959dc4bef8SYegappan Lakshmanan  call assert_equal(3.14, luaeval('vim.b.bvar3'))
10969dc4bef8SYegappan Lakshmanan  call assert_equal(0zdeadbeef, luaeval('vim.b.bvar4'))
10979dc4bef8SYegappan Lakshmanan  call assert_equal(['a', 'b'], luaeval('vim.b.bvar5'))
10989dc4bef8SYegappan Lakshmanan  call assert_equal(#{action: 'run'}, luaeval('vim.b.bvar6'))
10999dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.b.NonExisting'))
11009dc4bef8SYegappan Lakshmanan
11019dc4bef8SYegappan Lakshmanan  " modify a buffer variable
11029dc4bef8SYegappan Lakshmanan  lua vim.b.bvar2 = 'paste'
11039dc4bef8SYegappan Lakshmanan  call assert_equal('paste', b:bvar2)
11049dc4bef8SYegappan Lakshmanan
11059dc4bef8SYegappan Lakshmanan  " change the type stored in a variable
11069dc4bef8SYegappan Lakshmanan  let b:bvar2 = [1, 2]
11079dc4bef8SYegappan Lakshmanan  lua vim.b.bvar2 = vim.dict({a=10, b=20})
11089dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: 10, b: 20}, b:bvar2)
11099dc4bef8SYegappan Lakshmanan
11109dc4bef8SYegappan Lakshmanan  " create a new buffer variable
11119dc4bef8SYegappan Lakshmanan  lua vim.b.bvar7 = vim.dict({a=vim.list({1, 2}), b=20})
11129dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: [1, 2], b: 20}, b:bvar7)
11139dc4bef8SYegappan Lakshmanan
11149dc4bef8SYegappan Lakshmanan  " delete a buffer variable
11159dc4bef8SYegappan Lakshmanan  lua vim.b.bvar2 = Nil
11169dc4bef8SYegappan Lakshmanan  call assert_false(exists('b:bvar2'))
11179dc4bef8SYegappan Lakshmanan
11189dc4bef8SYegappan Lakshmanan  new
11199dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.b.bvar1'))
11209dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.b.bvar2'))
11219dc4bef8SYegappan Lakshmanan  %bw!
11229dc4bef8SYegappan Lakshmananendfunc
11239dc4bef8SYegappan Lakshmanan
11249dc4bef8SYegappan Lakshmanan" Test for adding, accessing and modifying tabpage-local variables using the
11259dc4bef8SYegappan Lakshmanan" vim.t Lua table
11269dc4bef8SYegappan Lakshmananfunc Test_lua_tabpage_var_table()
11279dc4bef8SYegappan Lakshmanan  " Access tabpage variables with different types of values
11289dc4bef8SYegappan Lakshmanan  let t:tvar1 = 10
11299dc4bef8SYegappan Lakshmanan  let t:tvar2 = 'edit'
11309dc4bef8SYegappan Lakshmanan  let t:tvar3 = 3.14
11319dc4bef8SYegappan Lakshmanan  let t:tvar4 = 0zdeadbeef
11329dc4bef8SYegappan Lakshmanan  let t:tvar5 = ['a', 'b']
11339dc4bef8SYegappan Lakshmanan  let t:tvar6 = #{action: 'run'}
11349dc4bef8SYegappan Lakshmanan  call assert_equal(10, luaeval('vim.t.tvar1'))
11359dc4bef8SYegappan Lakshmanan  call assert_equal('edit', luaeval('vim.t.tvar2'))
11369dc4bef8SYegappan Lakshmanan  call assert_equal(3.14, luaeval('vim.t.tvar3'))
11379dc4bef8SYegappan Lakshmanan  call assert_equal(0zdeadbeef, luaeval('vim.t.tvar4'))
11389dc4bef8SYegappan Lakshmanan  call assert_equal(['a', 'b'], luaeval('vim.t.tvar5'))
11399dc4bef8SYegappan Lakshmanan  call assert_equal(#{action: 'run'}, luaeval('vim.t.tvar6'))
11409dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.t.NonExisting'))
11419dc4bef8SYegappan Lakshmanan
11429dc4bef8SYegappan Lakshmanan  " modify a tabpage variable
11439dc4bef8SYegappan Lakshmanan  lua vim.t.tvar2 = 'paste'
11449dc4bef8SYegappan Lakshmanan  call assert_equal('paste', t:tvar2)
11459dc4bef8SYegappan Lakshmanan
11469dc4bef8SYegappan Lakshmanan  " change the type stored in a variable
11479dc4bef8SYegappan Lakshmanan  let t:tvar2 = [1, 2]
11489dc4bef8SYegappan Lakshmanan  lua vim.t.tvar2 = vim.dict({a=10, b=20})
11499dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: 10, b: 20}, t:tvar2)
11509dc4bef8SYegappan Lakshmanan
11519dc4bef8SYegappan Lakshmanan  " create a new tabpage variable
11529dc4bef8SYegappan Lakshmanan  lua vim.t.tvar7 = vim.dict({a=vim.list({1, 2}), b=20})
11539dc4bef8SYegappan Lakshmanan  call assert_equal(#{a: [1, 2], b: 20}, t:tvar7)
11549dc4bef8SYegappan Lakshmanan
11559dc4bef8SYegappan Lakshmanan  " delete a tabpage variable
11569dc4bef8SYegappan Lakshmanan  lua vim.t.tvar2 = Nil
11579dc4bef8SYegappan Lakshmanan  call assert_false(exists('t:tvar2'))
11589dc4bef8SYegappan Lakshmanan
11599dc4bef8SYegappan Lakshmanan  tabnew
11609dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.t.tvar1'))
11619dc4bef8SYegappan Lakshmanan  call assert_equal(v:null, luaeval('vim.t.tvar2'))
11629dc4bef8SYegappan Lakshmanan  %bw!
11639dc4bef8SYegappan Lakshmananendfunc
11649dc4bef8SYegappan Lakshmanan
1165*11328bc7SYegappan Lakshmanan" Test for vim.version()
1166*11328bc7SYegappan Lakshmananfunc Test_lua_vim_version()
1167*11328bc7SYegappan Lakshmanan  lua << trim END
1168*11328bc7SYegappan Lakshmanan    vimver = vim.version()
1169*11328bc7SYegappan Lakshmanan    vimver_n = vimver.major * 100 + vimver.minor
1170*11328bc7SYegappan Lakshmanan  END
1171*11328bc7SYegappan Lakshmanan  call assert_equal(v:version, luaeval('vimver_n'))
1172*11328bc7SYegappan Lakshmananendfunc
1173*11328bc7SYegappan Lakshmanan
1174*11328bc7SYegappan Lakshmanan" Test for running multiple commands using vim.command()
1175*11328bc7SYegappan Lakshmananfunc Test_lua_multiple_commands()
1176*11328bc7SYegappan Lakshmanan  lua << trim END
1177*11328bc7SYegappan Lakshmanan    vim.command([[
1178*11328bc7SYegappan Lakshmanan        let Var1 = []
1179*11328bc7SYegappan Lakshmanan        for i in range(3)
1180*11328bc7SYegappan Lakshmanan          let Var1 += [#{name: 'x'}]
1181*11328bc7SYegappan Lakshmanan        endfor
1182*11328bc7SYegappan Lakshmanan        augroup Luagroup
1183*11328bc7SYegappan Lakshmanan          autocmd!
1184*11328bc7SYegappan Lakshmanan          autocmd User Luatest echo 'Hello'
1185*11328bc7SYegappan Lakshmanan        augroup END
1186*11328bc7SYegappan Lakshmanan      ]])
1187*11328bc7SYegappan Lakshmanan  END
1188*11328bc7SYegappan Lakshmanan  call assert_equal([{'name': 'x'}, {'name': 'x'}, {'name': 'x'}], Var1)
1189*11328bc7SYegappan Lakshmanan  call assert_true(exists('#Luagroup'))
1190*11328bc7SYegappan Lakshmanan  call assert_true(exists('#Luagroup#User#Luatest'))
1191*11328bc7SYegappan Lakshmanan  augroup Luagroup
1192*11328bc7SYegappan Lakshmanan    autocmd!
1193*11328bc7SYegappan Lakshmanan  augroup END
1194*11328bc7SYegappan Lakshmanan  augroup! Luagroup
1195*11328bc7SYegappan Lakshmananendfunc
1196*11328bc7SYegappan Lakshmanan
11976c2b7b80SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1198