xref: /vim-8.2.3635/src/testdir/test_lua.vim (revision 2f362bf7)
1d58f03b1SBram Moolenaar" Tests for Lua.
2d58f03b1SBram Moolenaar
3d58f03b1SBram Moolenaarif !has('lua')
4d58f03b1SBram Moolenaar  finish
5d58f03b1SBram Moolenaarendif
6d58f03b1SBram Moolenaar
74ff4814bSBram Moolenaar" Check that switching to another buffer does not trigger ml_get error.
84ff4814bSBram Moolenaarfunc Test_command_new_no_ml_get_error()
9d58f03b1SBram Moolenaar  new
10d58f03b1SBram Moolenaar  let wincount = winnr('$')
11d58f03b1SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
12d58f03b1SBram Moolenaar  luado vim.command("new")
13d58f03b1SBram Moolenaar  call assert_equal(wincount + 1, winnr('$'))
144ff4814bSBram Moolenaar  %bwipe!
154ff4814bSBram Moolenaarendfunc
164ff4814bSBram Moolenaar
174ff4814bSBram Moolenaar" Test vim.command()
184ff4814bSBram Moolenaarfunc Test_command()
194ff4814bSBram Moolenaar  new
204ff4814bSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
214ff4814bSBram Moolenaar  luado vim.command("1,2d_")
224ff4814bSBram Moolenaar  call assert_equal(['three'], getline(1, '$'))
23d58f03b1SBram Moolenaar  bwipe!
244ff4814bSBram Moolenaarendfunc
254ff4814bSBram Moolenaar
264ff4814bSBram Moolenaar" Test vim.eval()
274ff4814bSBram Moolenaarfunc Test_eval()
284ff4814bSBram Moolenaar  " lua.eval with a number
294ff4814bSBram Moolenaar  lua v = vim.eval('123')
304ff4814bSBram Moolenaar  call assert_equal('number', luaeval('vim.type(v)'))
314ff4814bSBram Moolenaar  call assert_equal(123.0, luaeval('v'))
324ff4814bSBram Moolenaar
334ff4814bSBram Moolenaar  " lua.eval with a string
344ff4814bSBram Moolenaar  lua v = vim.eval('"abc"')
354ff4814bSBram Moolenaar  call assert_equal('string', luaeval('vim.type(v)'))
364ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('v'))
374ff4814bSBram Moolenaar
384ff4814bSBram Moolenaar  " lua.eval with a list
394ff4814bSBram Moolenaar  lua v = vim.eval("['a']")
404ff4814bSBram Moolenaar  call assert_equal('list', luaeval('vim.type(v)'))
414ff4814bSBram Moolenaar  call assert_equal(['a'], luaeval('v'))
424ff4814bSBram Moolenaar
434ff4814bSBram Moolenaar  " lua.eval with a dict
444ff4814bSBram Moolenaar  lua v = vim.eval("{'a':'b'}")
454ff4814bSBram Moolenaar  call assert_equal('dict', luaeval('vim.type(v)'))
464ff4814bSBram Moolenaar  call assert_equal({'a':'b'}, luaeval('v'))
474ff4814bSBram Moolenaar
484ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(nil)',
494ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got nil)")
504ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(true)',
514ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got boolean)")
524ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval({})',
534ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got table)")
544ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(print)',
554ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got function)")
564ff4814bSBram Moolenaar  call assert_fails('lua v = vim.eval(vim.buffer())',
574ff4814bSBram Moolenaar        \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got userdata)")
584ff4814bSBram Moolenaar
594ff4814bSBram Moolenaar  lua v = nil
604ff4814bSBram Moolenaarendfunc
614ff4814bSBram Moolenaar
624ff4814bSBram Moolenaar" Test vim.window()
634ff4814bSBram Moolenaarfunc Test_window()
644ff4814bSBram Moolenaar  e Xfoo2
654ff4814bSBram Moolenaar  new Xfoo1
664ff4814bSBram Moolenaar
674ff4814bSBram Moolenaar  " Window 1 (top window) contains Xfoo1
684ff4814bSBram Moolenaar  " Window 2 (bottom window) contains Xfoo2
694ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.window(1):buffer().name'))
704ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.window(2):buffer().name'))
714ff4814bSBram Moolenaar
724ff4814bSBram Moolenaar  " Window 3 does not exist so vim.window(3) should return nil
734ff4814bSBram Moolenaar  call assert_equal('nil', luaeval('tostring(vim.window(3))'))
744ff4814bSBram Moolenaar
754ff4814bSBram Moolenaar  %bwipe!
764ff4814bSBram Moolenaarendfunc
774ff4814bSBram Moolenaar
784ff4814bSBram Moolenaar" Test vim.window().height
794ff4814bSBram Moolenaarfunc Test_window_height()
804ff4814bSBram Moolenaar  new
814ff4814bSBram Moolenaar  lua vim.window().height = 2
824ff4814bSBram Moolenaar  call assert_equal(2, winheight(0))
834ff4814bSBram Moolenaar  lua vim.window().height = vim.window().height + 1
844ff4814bSBram Moolenaar  call assert_equal(3, winheight(0))
854ff4814bSBram Moolenaar  bwipe!
864ff4814bSBram Moolenaarendfunc
874ff4814bSBram Moolenaar
884ff4814bSBram Moolenaar" Test vim.window().width
894ff4814bSBram Moolenaarfunc Test_window_width()
904ff4814bSBram Moolenaar  vert new
914ff4814bSBram Moolenaar  lua vim.window().width = 2
924ff4814bSBram Moolenaar  call assert_equal(2, winwidth(0))
934ff4814bSBram Moolenaar  lua vim.window().width = vim.window().width + 1
944ff4814bSBram Moolenaar  call assert_equal(3, winwidth(0))
954ff4814bSBram Moolenaar  bwipe!
964ff4814bSBram Moolenaarendfunc
974ff4814bSBram Moolenaar
984ff4814bSBram Moolenaar" Test vim.window().line and vim.window.col
994ff4814bSBram Moolenaarfunc Test_window_line_col()
1004ff4814bSBram Moolenaar  new
1014ff4814bSBram Moolenaar  call setline(1, ['line1', 'line2', 'line3'])
1024ff4814bSBram Moolenaar  lua vim.window().line = 2
1034ff4814bSBram Moolenaar  lua vim.window().col = 4
1044ff4814bSBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos('.'))
1054ff4814bSBram Moolenaar  lua vim.window().line = vim.window().line + 1
1064ff4814bSBram Moolenaar  lua vim.window().col = vim.window().col - 1
1074ff4814bSBram Moolenaar  call assert_equal([0, 3, 3, 0], getpos('.'))
1084ff4814bSBram Moolenaar
1094ff4814bSBram Moolenaar  call assert_fails('lua vim.window().line = 10',
1104ff4814bSBram Moolenaar        \           '[string "vim chunk"]:1: line out of range')
1114ff4814bSBram Moolenaar  bwipe!
1124ff4814bSBram Moolenaarendfunc
1134ff4814bSBram Moolenaar
1144ff4814bSBram Moolenaar" Test setting the current window
1154ff4814bSBram Moolenaarfunc Test_window_set_current()
1164ff4814bSBram Moolenaar  new Xfoo1
1174ff4814bSBram Moolenaar  lua w1 = vim.window()
1184ff4814bSBram Moolenaar  new Xfoo2
1194ff4814bSBram Moolenaar  lua w2 = vim.window()
1204ff4814bSBram Moolenaar
1214ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
1224ff4814bSBram Moolenaar  lua w1()
1234ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
1244ff4814bSBram Moolenaar  lua w2()
1254ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
1264ff4814bSBram Moolenaar
127*2f362bf7SBram Moolenaar  lua w1, w2 = nil
1284ff4814bSBram Moolenaar  %bwipe!
1294ff4814bSBram Moolenaarendfunc
1304ff4814bSBram Moolenaar
1314ff4814bSBram Moolenaar" Test vim.window().buffer
1324ff4814bSBram Moolenaarfunc Test_window_buffer()
1334ff4814bSBram Moolenaar  new Xfoo1
1344ff4814bSBram Moolenaar  lua w1 = vim.window()
1354ff4814bSBram Moolenaar  lua b1 = w1.buffer()
1364ff4814bSBram Moolenaar  new Xfoo2
1374ff4814bSBram Moolenaar  lua w2 = vim.window()
1384ff4814bSBram Moolenaar  lua b2 = w2.buffer()
1394ff4814bSBram Moolenaar
1404ff4814bSBram Moolenaar  lua b1()
1414ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
1424ff4814bSBram Moolenaar  lua b2()
1434ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
1444ff4814bSBram Moolenaar
145*2f362bf7SBram Moolenaar  lua b1, b2, w1, w2 = nil
1464ff4814bSBram Moolenaar  %bwipe!
1474ff4814bSBram Moolenaarendfunc
1484ff4814bSBram Moolenaar
1494ff4814bSBram Moolenaar" Test vim.window():previous() and vim.window():next()
1504ff4814bSBram Moolenaarfunc Test_window_next_previous()
1514ff4814bSBram Moolenaar  new Xfoo1
1524ff4814bSBram Moolenaar  new Xfoo2
1534ff4814bSBram Moolenaar  new Xfoo3
1544ff4814bSBram Moolenaar  wincmd j
1554ff4814bSBram Moolenaar
1564ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.window().buffer().name'))
1574ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.window():next():buffer().name'))
1584ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('vim.window():previous():buffer().name'))
1594ff4814bSBram Moolenaar
1604ff4814bSBram Moolenaar  %bwipe!
1614ff4814bSBram Moolenaarendfunc
1624ff4814bSBram Moolenaar
1634ff4814bSBram Moolenaar" Test vim.window():isvalid()
1644ff4814bSBram Moolenaarfunc Test_window_isvalid()
1654ff4814bSBram Moolenaar  new Xfoo
1664ff4814bSBram Moolenaar  lua w = vim.window()
1674ff4814bSBram Moolenaar  call assert_true(luaeval('w:isvalid()'))
1684ff4814bSBram Moolenaar
1694ff4814bSBram Moolenaar  " FIXME: how to test the case when isvalid() returns v:false?
1704ff4814bSBram Moolenaar  " isvalid() gives errors when the window is deleted. Is it a bug?
1714ff4814bSBram Moolenaar
1724ff4814bSBram Moolenaar  lua w = nil
1734ff4814bSBram Moolenaar  bwipe!
1744ff4814bSBram Moolenaarendfunc
1754ff4814bSBram Moolenaar
1764ff4814bSBram Moolenaar" Test vim.buffer() with and without argument
1774ff4814bSBram Moolenaarfunc Test_buffer()
1784ff4814bSBram Moolenaar  new Xfoo1
1794ff4814bSBram Moolenaar  let bn1 = bufnr('%')
1804ff4814bSBram Moolenaar  new Xfoo2
1814ff4814bSBram Moolenaar  let bn2 = bufnr('%')
1824ff4814bSBram Moolenaar
1834ff4814bSBram Moolenaar  " Test vim.buffer() without argument.
1844ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer().name"))
1854ff4814bSBram Moolenaar
1864ff4814bSBram Moolenaar  " Test vim.buffer() with string argument.
1874ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval("vim.buffer('Xfoo1').name"))
1884ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer('Xfoo2').name"))
1894ff4814bSBram Moolenaar
1904ff4814bSBram Moolenaar  " Test vim.buffer() with integer argument.
1914ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
1924ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
1934ff4814bSBram Moolenaar
194*2f362bf7SBram Moolenaar  lua bn1, bn2 = nil
1954ff4814bSBram Moolenaar  %bwipe!
1964ff4814bSBram Moolenaarendfunc
1974ff4814bSBram Moolenaar
1984ff4814bSBram Moolenaar" Test vim.buffer().name and vim.buffer().fname
1994ff4814bSBram Moolenaarfunc Test_buffer_name()
2004ff4814bSBram Moolenaar  new
2014ff4814bSBram Moolenaar  " FIXME: for an unnamed buffer, I would expect
2024ff4814bSBram Moolenaar  " vim.buffer().name to give an empty string, but
2034ff4814bSBram Moolenaar  " it returns 0. Is it a bug?
2044ff4814bSBram Moolenaar  " so this assert_equal is commented out.
2054ff4814bSBram Moolenaar  " call assert_equal('', luaeval('vim.buffer().name'))
2064ff4814bSBram Moolenaar  bwipe!
2074ff4814bSBram Moolenaar
2084ff4814bSBram Moolenaar  new Xfoo
2094ff4814bSBram Moolenaar  call assert_equal('Xfoo', luaeval('vim.buffer().name'))
2104ff4814bSBram Moolenaar  call assert_equal(expand('%:p'), luaeval('vim.buffer().fname'))
2114ff4814bSBram Moolenaar  bwipe!
2124ff4814bSBram Moolenaarendfunc
2134ff4814bSBram Moolenaar
2144ff4814bSBram Moolenaar" Test vim.buffer().number
2154ff4814bSBram Moolenaarfunc Test_buffer_number()
2164ff4814bSBram Moolenaar  " All numbers in Lua are floating points number (no integers).
2174ff4814bSBram Moolenaar  call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number')))
2184ff4814bSBram Moolenaarendfunc
2194ff4814bSBram Moolenaar
2204ff4814bSBram Moolenaar" Test inserting lines in buffer.
2214ff4814bSBram Moolenaarfunc Test_buffer_insert()
2224ff4814bSBram Moolenaar  new
2234ff4814bSBram Moolenaar  lua vim.buffer()[1] = '3'
2244ff4814bSBram Moolenaar  lua vim.buffer():insert('1', 0)
2254ff4814bSBram Moolenaar  lua vim.buffer():insert('2', 1)
2264ff4814bSBram Moolenaar  lua vim.buffer():insert('4', 10)
2274ff4814bSBram Moolenaar
2284ff4814bSBram Moolenaar  call assert_equal(['1', '2', '3', '4'], getline(1, '$'))
2294ff4814bSBram Moolenaar  bwipe!
2304ff4814bSBram Moolenaarendfunc
2314ff4814bSBram Moolenaar
2324ff4814bSBram Moolenaar" Test deleting line in buffer
2334ff4814bSBram Moolenaarfunc Test_buffer_delete()
2344ff4814bSBram Moolenaar  new
2354ff4814bSBram Moolenaar  call setline(1, ['1', '2', '3'])
2364ff4814bSBram Moolenaar  lua vim.buffer()[2] = nil
2374ff4814bSBram Moolenaar  call assert_equal(['1', '3'], getline(1, '$'))
2384ff4814bSBram Moolenaar
2394ff4814bSBram Moolenaar  call assert_fails('lua vim.buffer()[3] = nil',
2404ff4814bSBram Moolenaar        \           '[string "vim chunk"]:1: invalid line number')
2414ff4814bSBram Moolenaar  bwipe!
2424ff4814bSBram Moolenaarendfunc
2434ff4814bSBram Moolenaar
2444ff4814bSBram Moolenaar" Test #vim.buffer() i.e. number of lines in buffer
2454ff4814bSBram Moolenaarfunc Test_buffer_number_lines()
2464ff4814bSBram Moolenaar  new
2474ff4814bSBram Moolenaar  call setline(1, ['a', 'b', 'c'])
2484ff4814bSBram Moolenaar  call assert_equal(3.0, luaeval('#vim.buffer()'))
2494ff4814bSBram Moolenaar  bwipe!
2504ff4814bSBram Moolenaarendfunc
2514ff4814bSBram Moolenaar
2524ff4814bSBram Moolenaar" Test vim.buffer():next() and vim.buffer():previous()
2534ff4814bSBram Moolenaar" Note that these functions get the next or previous buffers
2544ff4814bSBram Moolenaar" but do not switch buffer.
2554ff4814bSBram Moolenaarfunc Test_buffer_next_previous()
2564ff4814bSBram Moolenaar  new Xfoo1
2574ff4814bSBram Moolenaar  new Xfoo2
2584ff4814bSBram Moolenaar  new Xfoo3
2594ff4814bSBram Moolenaar  b Xfoo2
2604ff4814bSBram Moolenaar
2614ff4814bSBram Moolenaar  lua bn = vim.buffer():next()
2624ff4814bSBram Moolenaar  lua bp = vim.buffer():previous()
2634ff4814bSBram Moolenaar
2644ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.buffer().name'))
2654ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('bp.name'))
2664ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('bn.name'))
2674ff4814bSBram Moolenaar
2684ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
2694ff4814bSBram Moolenaar
2704ff4814bSBram Moolenaar  lua bn()
2714ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('vim.buffer().name'))
2724ff4814bSBram Moolenaar  call assert_equal('Xfoo3', bufname('%'))
2734ff4814bSBram Moolenaar
2744ff4814bSBram Moolenaar  lua bp()
2754ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
2764ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
2774ff4814bSBram Moolenaar
278*2f362bf7SBram Moolenaar  lua bn, bp = nil
2794ff4814bSBram Moolenaar  %bwipe!
2804ff4814bSBram Moolenaarendfunc
2814ff4814bSBram Moolenaar
2824ff4814bSBram Moolenaar" Test vim.buffer():isvalid()
2834ff4814bSBram Moolenaarfunc Test_buffer_isvalid()
2844ff4814bSBram Moolenaar  new Xfoo
2854ff4814bSBram Moolenaar  lua b = vim.buffer()
2864ff4814bSBram Moolenaar  call assert_true(luaeval('b:isvalid()'))
2874ff4814bSBram Moolenaar
2884ff4814bSBram Moolenaar  " FIXME: how to test the case when isvalid() returns v:false?
2894ff4814bSBram Moolenaar  " isvalid() gives errors when the buffer is wiped. Is it a bug?
2904ff4814bSBram Moolenaar
2914ff4814bSBram Moolenaar  lua b = nil
2924ff4814bSBram Moolenaar  bwipe!
2934ff4814bSBram Moolenaarendfunc
2944ff4814bSBram Moolenaar
2954ff4814bSBram Moolenaarfunc Test_list()
2964ff4814bSBram Moolenaar  call assert_equal([], luaeval('vim.list()'))
2974ff4814bSBram Moolenaar
2984ff4814bSBram Moolenaar  let l = []
2994ff4814bSBram Moolenaar  lua l = vim.eval('l')
3004ff4814bSBram Moolenaar  lua l:add(123)
3014ff4814bSBram Moolenaar  lua l:add('abc')
3024ff4814bSBram Moolenaar  lua l:add(true)
3034ff4814bSBram Moolenaar  lua l:add(false)
3044ff4814bSBram Moolenaar  lua l:add(vim.eval("[1, 2, 3]"))
3054ff4814bSBram Moolenaar  lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
3064ff4814bSBram Moolenaar  call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
3074ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#l'))
3084ff4814bSBram Moolenaar  call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
3094ff4814bSBram Moolenaar
3104ff4814bSBram Moolenaar  lua l[0] = 124
3114ff4814bSBram Moolenaar  lua l[4] = nil
3124ff4814bSBram Moolenaar  lua l:insert('first')
3134ff4814bSBram Moolenaar  lua l:insert('xx', 3)
3144ff4814bSBram Moolenaar  call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l)
3154ff4814bSBram Moolenaar
316*2f362bf7SBram Moolenaar  lockvar 1 l
317*2f362bf7SBram Moolenaar  call assert_fails('lua l:add("x")', '[string "vim chunk"]:1: list is locked')
318*2f362bf7SBram Moolenaar
3194ff4814bSBram Moolenaar  lua l = nil
3204ff4814bSBram Moolenaarendfunc
3214ff4814bSBram Moolenaar
322*2f362bf7SBram Moolenaarfunc Test_list_table()
323*2f362bf7SBram Moolenaar  " See :help lua-vim
324*2f362bf7SBram Moolenaar  " Non-numeric keys should not be used to initialize the list
325*2f362bf7SBram Moolenaar  " so say = 'hi' should be ignored.
326*2f362bf7SBram Moolenaar  lua t = {3.14, 'hello', false, true, say = 'hi'}
327*2f362bf7SBram Moolenaar  call assert_equal([3.14, 'hello', v:false, v:true], luaeval('vim.list(t)'))
328*2f362bf7SBram Moolenaar  lua t = nil
329*2f362bf7SBram Moolenaar
330*2f362bf7SBram Moolenaar  call assert_fails('lua vim.list(1)', '[string "vim chunk"]:1: table expected, got number')
331*2f362bf7SBram Moolenaar  call assert_fails('lua vim.list("x")', '[string "vim chunk"]:1: table expected, got string')
332*2f362bf7SBram Moolenaar  call assert_fails('lua vim.list(print)', '[string "vim chunk"]:1: table expected, got function')
333*2f362bf7SBram Moolenaar  call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
334*2f362bf7SBram Moolenaarendfunc
335*2f362bf7SBram Moolenaar
3364ff4814bSBram Moolenaar" Test l() i.e. iterator on list
3374ff4814bSBram Moolenaarfunc Test_list_iter()
3384ff4814bSBram Moolenaar  lua l = vim.list():add('foo'):add('bar')
3394ff4814bSBram Moolenaar  lua str = ''
3404ff4814bSBram Moolenaar  lua for v in l() do str = str .. v end
3414ff4814bSBram Moolenaar  call assert_equal('foobar', luaeval('str'))
3424ff4814bSBram Moolenaar
343*2f362bf7SBram Moolenaar  lua str, l = nil
3444ff4814bSBram Moolenaarendfunc
3454ff4814bSBram Moolenaar
3464ff4814bSBram Moolenaarfunc Test_recursive_list()
3474ff4814bSBram Moolenaar  lua l = vim.list():add(1):add(2)
3484ff4814bSBram Moolenaar  lua l = l:add(l)
3494ff4814bSBram Moolenaar
3504ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[0]'))
3514ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[1]'))
3524ff4814bSBram Moolenaar
3534ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][0]'))
3544ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][1]'))
3554ff4814bSBram Moolenaar
3564ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][2][0]'))
3574ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][2][1]'))
3584ff4814bSBram Moolenaar
3594ff4814bSBram Moolenaar  call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
3604ff4814bSBram Moolenaar
3614ff4814bSBram Moolenaar  call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
3624ff4814bSBram Moolenaar  call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
3634ff4814bSBram Moolenaar
3644ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2]'))
3654ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2][2]'))
3664ff4814bSBram Moolenaar
3674ff4814bSBram Moolenaar  lua l = nil
3684ff4814bSBram Moolenaarendfunc
3694ff4814bSBram Moolenaar
3704ff4814bSBram Moolenaarfunc Test_dict()
3714ff4814bSBram Moolenaar  call assert_equal({}, luaeval('vim.dict()'))
3724ff4814bSBram Moolenaar
3734ff4814bSBram Moolenaar  let d = {}
3744ff4814bSBram Moolenaar  lua d = vim.eval('d')
3754ff4814bSBram Moolenaar  lua d[0] = 123
3764ff4814bSBram Moolenaar  lua d[1] = "abc"
3774ff4814bSBram Moolenaar  lua d[2] = true
3784ff4814bSBram Moolenaar  lua d[3] = false
3794ff4814bSBram Moolenaar  lua d[4] = vim.eval("[1, 2, 3]")
3804ff4814bSBram Moolenaar  lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
3814ff4814bSBram Moolenaar  call assert_equal({'0':123.0, '1':'abc', '2':v:true, '3':v:false, '4': [1, 2, 3], '5': {'a':1, 'b':2, 'c':3}}, d)
3824ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#d'))
3834ff4814bSBram Moolenaar  call assert_match('^dict: 0x\x\+$', luaeval('tostring(d)'))
3844ff4814bSBram Moolenaar
3854ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('d[1]'))
3864ff4814bSBram Moolenaar
3874ff4814bSBram Moolenaar  lua d[0] = 124
3884ff4814bSBram Moolenaar  lua d[4] = nil
3894ff4814bSBram Moolenaar  call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
3904ff4814bSBram Moolenaar
391*2f362bf7SBram Moolenaar  lockvar 1 d
392*2f362bf7SBram Moolenaar  call assert_fails('lua d[6] = 1', '[string "vim chunk"]:1: dict is locked')
393*2f362bf7SBram Moolenaar
3944ff4814bSBram Moolenaar  lua d = nil
3954ff4814bSBram Moolenaarendfunc
3964ff4814bSBram Moolenaar
397*2f362bf7SBram Moolenaarfunc Test_dict_table()
398*2f362bf7SBram Moolenaar  lua t = {key1 = 'x', key2 = 3.14, key3 = true, key4 = false}
399*2f362bf7SBram Moolenaar  call assert_equal({'key1': 'x', 'key2': 3.14, 'key3': v:true, 'key4': v:false},
400*2f362bf7SBram Moolenaar        \           luaeval('vim.dict(t)'))
401*2f362bf7SBram Moolenaar
402*2f362bf7SBram Moolenaar  " Same example as in :help lua-vim.
403*2f362bf7SBram Moolenaar  lua t = {math.pi, false, say = 'hi'}
404*2f362bf7SBram Moolenaar  " FIXME: commented out as it currently does not work as documented:
405*2f362bf7SBram Moolenaar  " Expected {'say': 'hi'}
406*2f362bf7SBram Moolenaar  " but got {'1': 3.141593, '2': v:false, 'say': 'hi'}
407*2f362bf7SBram Moolenaar  " Is the documentation or the code wrong?
408*2f362bf7SBram Moolenaar  "call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
409*2f362bf7SBram Moolenaar  lua t = nil
410*2f362bf7SBram Moolenaar
411*2f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(1)', '[string "vim chunk"]:1: table expected, got number')
412*2f362bf7SBram Moolenaar  call assert_fails('lua vim.dict("x")', '[string "vim chunk"]:1: table expected, got string')
413*2f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(print)', '[string "vim chunk"]:1: table expected, got function')
414*2f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(true)', '[string "vim chunk"]:1: table expected, got boolean')
415*2f362bf7SBram Moolenaarendfunc
416*2f362bf7SBram Moolenaar
4174ff4814bSBram Moolenaar" Test d() i.e. iterator on dictionary
4184ff4814bSBram Moolenaarfunc Test_dict_iter()
4194ff4814bSBram Moolenaar  let d = {'a': 1, 'b':2}
4204ff4814bSBram Moolenaar  lua d = vim.eval('d')
4214ff4814bSBram Moolenaar  lua str = ''
4224ff4814bSBram Moolenaar  lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
4234ff4814bSBram Moolenaar  call assert_equal('a:1,b:2,', luaeval('str'))
4244ff4814bSBram Moolenaar
425*2f362bf7SBram Moolenaar  lua str, d = nil
4264ff4814bSBram Moolenaarendfunc
4274ff4814bSBram Moolenaar
428ca06da92SBram Moolenaarfunc Test_funcref()
429ca06da92SBram Moolenaar  function I(x)
430ca06da92SBram Moolenaar    return a:x
431ca06da92SBram Moolenaar  endfunction
432ca06da92SBram Moolenaar  let R = function('I')
433ca06da92SBram Moolenaar  lua i1 = vim.funcref"I"
434ca06da92SBram Moolenaar  lua i2 = vim.eval"R"
435ca06da92SBram Moolenaar  lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
436ca06da92SBram Moolenaar  lua msg = vim.funcref"tr"(msg, "|", " ")
437ca06da92SBram Moolenaar  call assert_equal("funcref test OK", luaeval('msg'))
438ca06da92SBram Moolenaar
439ca06da92SBram Moolenaar  " dict funcref
440ca06da92SBram Moolenaar  function Mylen() dict
441ca06da92SBram Moolenaar    return len(self.data)
442ca06da92SBram Moolenaar  endfunction
443ca06da92SBram Moolenaar  let l = [0, 1, 2, 3]
444ca06da92SBram Moolenaar  let mydict = {'data': l}
445ca06da92SBram Moolenaar  lua d = vim.eval"mydict"
446ca06da92SBram Moolenaar  lua d.len = vim.funcref"Mylen" -- assign d as 'self'
447ca06da92SBram Moolenaar  lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
448ca06da92SBram Moolenaar  call assert_equal("OK", luaeval('res'))
449*2f362bf7SBram Moolenaar
450*2f362bf7SBram Moolenaar  lua i1, i2, msg, d, res = nil
451ca06da92SBram Moolenaarendfunc
452ca06da92SBram Moolenaar
4534ff4814bSBram Moolenaar" Test vim.type()
4544ff4814bSBram Moolenaarfunc Test_type()
4554ff4814bSBram Moolenaar  " The following values are identical to Lua's type function.
4564ff4814bSBram Moolenaar  call assert_equal('string',   luaeval('vim.type("foo")'))
4574ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1)'))
4584ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1.2)'))
4594ff4814bSBram Moolenaar  call assert_equal('function', luaeval('vim.type(print)'))
4604ff4814bSBram Moolenaar  call assert_equal('table',    luaeval('vim.type({})'))
4614ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(true)'))
4624ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(false)'))
4634ff4814bSBram Moolenaar  call assert_equal('nil',      luaeval('vim.type(nil)'))
4644ff4814bSBram Moolenaar
4654ff4814bSBram Moolenaar  " The following values are specific to Vim.
4664ff4814bSBram Moolenaar  call assert_equal('window',   luaeval('vim.type(vim.window())'))
4674ff4814bSBram Moolenaar  call assert_equal('buffer',   luaeval('vim.type(vim.buffer())'))
4684ff4814bSBram Moolenaar  call assert_equal('list',     luaeval('vim.type(vim.list())'))
4694ff4814bSBram Moolenaar  call assert_equal('dict',     luaeval('vim.type(vim.dict())'))
470ca06da92SBram Moolenaar  call assert_equal('funcref',  luaeval('vim.type(vim.funcref("Test_type"))'))
4714ff4814bSBram Moolenaarendfunc
4724ff4814bSBram Moolenaar
4734ff4814bSBram Moolenaar" Test vim.open()
4744ff4814bSBram Moolenaarfunc Test_open()
4754ff4814bSBram Moolenaar  call assert_notmatch('XOpen', execute('ls'))
4764ff4814bSBram Moolenaar
4774ff4814bSBram Moolenaar  " Open a buffer XOpen1, but do not jump to it.
4784ff4814bSBram Moolenaar  lua b = vim.open('XOpen1')
4794ff4814bSBram Moolenaar  call assert_equal('XOpen1', luaeval('b.name'))
4804ff4814bSBram Moolenaar  call assert_equal('', bufname('%'))
4814ff4814bSBram Moolenaar
4824ff4814bSBram Moolenaar  call assert_match('XOpen1', execute('ls'))
4834ff4814bSBram Moolenaar  call assert_notequal('XOpen2', bufname('%'))
4844ff4814bSBram Moolenaar
4854ff4814bSBram Moolenaar  " Open a buffer XOpen2 and jump to it.
4864ff4814bSBram Moolenaar  lua b = vim.open('XOpen2')()
4874ff4814bSBram Moolenaar  call assert_equal('XOpen2', luaeval('b.name'))
4884ff4814bSBram Moolenaar  call assert_equal('XOpen2', bufname('%'))
4894ff4814bSBram Moolenaar
4904ff4814bSBram Moolenaar  lua b = nil
4914ff4814bSBram Moolenaar  %bwipe!
4924ff4814bSBram Moolenaarendfunc
4934ff4814bSBram Moolenaar
4944ff4814bSBram Moolenaar" Test vim.line()
4954ff4814bSBram Moolenaarfunc Test_line()
4964ff4814bSBram Moolenaar  new
4974ff4814bSBram Moolenaar  call setline(1, ['first line', 'second line'])
4984ff4814bSBram Moolenaar  1
4994ff4814bSBram Moolenaar  call assert_equal('first line', luaeval('vim.line()'))
5004ff4814bSBram Moolenaar  2
5014ff4814bSBram Moolenaar  call assert_equal('second line', luaeval('vim.line()'))
5024ff4814bSBram Moolenaar  bwipe!
5034ff4814bSBram Moolenaarendfunc
5044ff4814bSBram Moolenaar
5054ff4814bSBram Moolenaar" Test vim.beep()
5064ff4814bSBram Moolenaarfunc Test_beep()
5074ff4814bSBram Moolenaar  call assert_beeps('lua vim.beep()')
5084ff4814bSBram Moolenaarendfunc
5094ff4814bSBram Moolenaar
5104ff4814bSBram Moolenaar" Test errors in luaeval()
5114ff4814bSBram Moolenaarfunc Test_luaeval_error()
5124ff4814bSBram Moolenaar  " Compile error
5134ff4814bSBram Moolenaar  call assert_fails("call luaeval('-nil')",
5144ff4814bSBram Moolenaar  \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
5154ff4814bSBram Moolenaar  call assert_fails("call luaeval(']')",
5164ff4814bSBram Moolenaar  \ "[string \"luaeval\"]:1: unexpected symbol near ']'")
5174ff4814bSBram Moolenaarendfunc
5184ff4814bSBram Moolenaar
5194ff4814bSBram Moolenaar" Test :luafile foo.lua
5204ff4814bSBram Moolenaarfunc Test_luafile()
5214ff4814bSBram Moolenaar  call delete('Xlua_file')
5224ff4814bSBram Moolenaar  call writefile(["str = 'hello'", "num = 123.0" ], 'Xlua_file')
5234ff4814bSBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
5244ff4814bSBram Moolenaar
5254ff4814bSBram Moolenaar  luafile Xlua_file
5264ff4814bSBram Moolenaar  call assert_equal('hello', luaeval('str'))
5274ff4814bSBram Moolenaar  call assert_equal(123.0, luaeval('num'))
5284ff4814bSBram Moolenaar
529*2f362bf7SBram Moolenaar  lua str, num = nil
5304ff4814bSBram Moolenaar  call delete('Xlua_file')
5314ff4814bSBram Moolenaarendfunc
5324ff4814bSBram Moolenaar
5334ff4814bSBram Moolenaar" Test :luafile %
5344ff4814bSBram Moolenaarfunc Test_luafile_percent()
5354ff4814bSBram Moolenaar  new Xlua_file
5364ff4814bSBram Moolenaar  append
5374ff4814bSBram Moolenaar    str, num = 'foo', 321.0
5384ff4814bSBram Moolenaar    print(string.format('str=%s, num=%d', str, num))
5394ff4814bSBram Moolenaar.
5404ff4814bSBram Moolenaar  w!
5414ff4814bSBram Moolenaar  luafile %
5424ff4814bSBram Moolenaar  let msg = split(execute('message'), "\n")[-1]
5434ff4814bSBram Moolenaar  call assert_equal('str=foo, num=321', msg)
5444ff4814bSBram Moolenaar
545*2f362bf7SBram Moolenaar  lua str, num = nil
546*2f362bf7SBram Moolenaar  call delete('Xlua_file')
547*2f362bf7SBram Moolenaar  bwipe!
548*2f362bf7SBram Moolenaarendfunc
549*2f362bf7SBram Moolenaar
550*2f362bf7SBram Moolenaar" Test :luafile with syntax error
551*2f362bf7SBram Moolenaarfunc Test_luafile_error()
552*2f362bf7SBram Moolenaar  new Xlua_file
553*2f362bf7SBram Moolenaar  call writefile(['nil = 0' ], 'Xlua_file')
554*2f362bf7SBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
555*2f362bf7SBram Moolenaar
556*2f362bf7SBram Moolenaar  call assert_fails('luafile Xlua_file', "Xlua_file:1: unexpected symbol near 'nil'")
557*2f362bf7SBram Moolenaar
5584ff4814bSBram Moolenaar  call delete('Xlua_file')
559d58f03b1SBram Moolenaar  bwipe!
560d58f03b1SBram Moolenaarendfunc
561