xref: /vim-8.2.3635/src/testdir/test_lua.vim (revision ca06da92)
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
1274ff4814bSBram Moolenaar  lua w1, w2 = nil, 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
1454ff4814bSBram Moolenaar  lua b1, b2 = nil, 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
1944ff4814bSBram Moolenaar  lua bn1, bn2 = nil, 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
2784ff4814bSBram Moolenaar  lua bn, bp = nil, 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  " Same example as in :help lua-vim.
2994ff4814bSBram Moolenaar  " FIXME: test is disabled because it does not work.
3004ff4814bSBram Moolenaar  " See https://github.com/vim/vim/issues/3086
3014ff4814bSBram Moolenaar  " lua t = {math.pi, false, say = 'hi'}
3024ff4814bSBram Moolenaar  " call assert_equal([3.141593, 0], luaeval('vim.list(t)'))
3034ff4814bSBram Moolenaar
3044ff4814bSBram Moolenaar  let l = []
3054ff4814bSBram Moolenaar  lua l = vim.eval('l')
3064ff4814bSBram Moolenaar  lua l:add(123)
3074ff4814bSBram Moolenaar  lua l:add('abc')
3084ff4814bSBram Moolenaar  lua l:add(true)
3094ff4814bSBram Moolenaar  lua l:add(false)
3104ff4814bSBram Moolenaar  lua l:add(vim.eval("[1, 2, 3]"))
3114ff4814bSBram Moolenaar  lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
3124ff4814bSBram Moolenaar  call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
3134ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#l'))
3144ff4814bSBram Moolenaar  call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
3154ff4814bSBram Moolenaar
3164ff4814bSBram Moolenaar  lua l[0] = 124
3174ff4814bSBram Moolenaar  lua l[4] = nil
3184ff4814bSBram Moolenaar  lua l:insert('first')
3194ff4814bSBram Moolenaar  lua l:insert('xx', 3)
3204ff4814bSBram Moolenaar  call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l)
3214ff4814bSBram Moolenaar
3224ff4814bSBram Moolenaar  lua l = nil
3234ff4814bSBram Moolenaarendfunc
3244ff4814bSBram Moolenaar
3254ff4814bSBram Moolenaar" Test l() i.e. iterator on list
3264ff4814bSBram Moolenaarfunc Test_list_iter()
3274ff4814bSBram Moolenaar  lua l = vim.list():add('foo'):add('bar')
3284ff4814bSBram Moolenaar  lua str = ''
3294ff4814bSBram Moolenaar  lua for v in l() do str = str .. v end
3304ff4814bSBram Moolenaar  call assert_equal('foobar', luaeval('str'))
3314ff4814bSBram Moolenaar
3324ff4814bSBram Moolenaar  lua str, v, l = nil, nil, nil
3334ff4814bSBram Moolenaarendfunc
3344ff4814bSBram Moolenaar
3354ff4814bSBram Moolenaarfunc Test_recursive_list()
3364ff4814bSBram Moolenaar  lua l = vim.list():add(1):add(2)
3374ff4814bSBram Moolenaar  lua l = l:add(l)
3384ff4814bSBram Moolenaar
3394ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[0]'))
3404ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[1]'))
3414ff4814bSBram Moolenaar
3424ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][0]'))
3434ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][1]'))
3444ff4814bSBram Moolenaar
3454ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][2][0]'))
3464ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][2][1]'))
3474ff4814bSBram Moolenaar
3484ff4814bSBram Moolenaar  call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
3494ff4814bSBram Moolenaar
3504ff4814bSBram Moolenaar  call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
3514ff4814bSBram Moolenaar  call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
3524ff4814bSBram Moolenaar
3534ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2]'))
3544ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2][2]'))
3554ff4814bSBram Moolenaar
3564ff4814bSBram Moolenaar  lua l = nil
3574ff4814bSBram Moolenaarendfunc
3584ff4814bSBram Moolenaar
3594ff4814bSBram Moolenaarfunc Test_dict()
3604ff4814bSBram Moolenaar  call assert_equal({}, luaeval('vim.dict()'))
3614ff4814bSBram Moolenaar
3624ff4814bSBram Moolenaar  " Same example as in :help lua-vim.
3634ff4814bSBram Moolenaar  " FIXME: test is disabled because it does not work.
3644ff4814bSBram Moolenaar  " See https://github.com/vim/vim/issues/3086
3654ff4814bSBram Moolenaar  " lua t = {math.pi, false, say = 'hi'}
3664ff4814bSBram Moolenaar  " call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
3674ff4814bSBram Moolenaar
3684ff4814bSBram Moolenaar  let d = {}
3694ff4814bSBram Moolenaar  lua d = vim.eval('d')
3704ff4814bSBram Moolenaar  lua d[0] = 123
3714ff4814bSBram Moolenaar  lua d[1] = "abc"
3724ff4814bSBram Moolenaar  lua d[2] = true
3734ff4814bSBram Moolenaar  lua d[3] = false
3744ff4814bSBram Moolenaar  lua d[4] = vim.eval("[1, 2, 3]")
3754ff4814bSBram Moolenaar  lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
3764ff4814bSBram 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)
3774ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#d'))
3784ff4814bSBram Moolenaar  call assert_match('^dict: 0x\x\+$', luaeval('tostring(d)'))
3794ff4814bSBram Moolenaar
3804ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('d[1]'))
3814ff4814bSBram Moolenaar
3824ff4814bSBram Moolenaar  lua d[0] = 124
3834ff4814bSBram Moolenaar  lua d[4] = nil
3844ff4814bSBram Moolenaar  call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
3854ff4814bSBram Moolenaar
3864ff4814bSBram Moolenaar  lua d = nil
3874ff4814bSBram Moolenaarendfunc
3884ff4814bSBram Moolenaar
3894ff4814bSBram Moolenaar" Test d() i.e. iterator on dictionary
3904ff4814bSBram Moolenaarfunc Test_dict_iter()
3914ff4814bSBram Moolenaar  let d = {'a': 1, 'b':2}
3924ff4814bSBram Moolenaar  lua d = vim.eval('d')
3934ff4814bSBram Moolenaar  lua str = ''
3944ff4814bSBram Moolenaar  lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
3954ff4814bSBram Moolenaar  call assert_equal('a:1,b:2,', luaeval('str'))
3964ff4814bSBram Moolenaar
3974ff4814bSBram Moolenaar  lua str, k, v, d = nil, nil, nil, nil
3984ff4814bSBram Moolenaarendfunc
3994ff4814bSBram Moolenaar
400*ca06da92SBram Moolenaarfunc Test_funcref()
401*ca06da92SBram Moolenaar  function I(x)
402*ca06da92SBram Moolenaar    return a:x
403*ca06da92SBram Moolenaar  endfunction
404*ca06da92SBram Moolenaar  let R = function('I')
405*ca06da92SBram Moolenaar  lua i1 = vim.funcref"I"
406*ca06da92SBram Moolenaar  lua i2 = vim.eval"R"
407*ca06da92SBram Moolenaar  lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
408*ca06da92SBram Moolenaar  lua msg = vim.funcref"tr"(msg, "|", " ")
409*ca06da92SBram Moolenaar  call assert_equal("funcref test OK", luaeval('msg'))
410*ca06da92SBram Moolenaar
411*ca06da92SBram Moolenaar  " dict funcref
412*ca06da92SBram Moolenaar  function Mylen() dict
413*ca06da92SBram Moolenaar    return len(self.data)
414*ca06da92SBram Moolenaar  endfunction
415*ca06da92SBram Moolenaar  let l = [0, 1, 2, 3]
416*ca06da92SBram Moolenaar  let mydict = {'data': l}
417*ca06da92SBram Moolenaar  lua d = vim.eval"mydict"
418*ca06da92SBram Moolenaar  lua d.len = vim.funcref"Mylen" -- assign d as 'self'
419*ca06da92SBram Moolenaar  lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
420*ca06da92SBram Moolenaar  call assert_equal("OK", luaeval('res'))
421*ca06da92SBram Moolenaarendfunc
422*ca06da92SBram Moolenaar
4234ff4814bSBram Moolenaar" Test vim.type()
4244ff4814bSBram Moolenaarfunc Test_type()
4254ff4814bSBram Moolenaar  " The following values are identical to Lua's type function.
4264ff4814bSBram Moolenaar  call assert_equal('string',   luaeval('vim.type("foo")'))
4274ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1)'))
4284ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1.2)'))
4294ff4814bSBram Moolenaar  call assert_equal('function', luaeval('vim.type(print)'))
4304ff4814bSBram Moolenaar  call assert_equal('table',    luaeval('vim.type({})'))
4314ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(true)'))
4324ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(false)'))
4334ff4814bSBram Moolenaar  call assert_equal('nil',      luaeval('vim.type(nil)'))
4344ff4814bSBram Moolenaar
4354ff4814bSBram Moolenaar  " The following values are specific to Vim.
4364ff4814bSBram Moolenaar  call assert_equal('window',   luaeval('vim.type(vim.window())'))
4374ff4814bSBram Moolenaar  call assert_equal('buffer',   luaeval('vim.type(vim.buffer())'))
4384ff4814bSBram Moolenaar  call assert_equal('list',     luaeval('vim.type(vim.list())'))
4394ff4814bSBram Moolenaar  call assert_equal('dict',     luaeval('vim.type(vim.dict())'))
440*ca06da92SBram Moolenaar  call assert_equal('funcref',  luaeval('vim.type(vim.funcref("Test_type"))'))
4414ff4814bSBram Moolenaarendfunc
4424ff4814bSBram Moolenaar
4434ff4814bSBram Moolenaar" Test vim.open()
4444ff4814bSBram Moolenaarfunc Test_open()
4454ff4814bSBram Moolenaar  call assert_notmatch('XOpen', execute('ls'))
4464ff4814bSBram Moolenaar
4474ff4814bSBram Moolenaar  " Open a buffer XOpen1, but do not jump to it.
4484ff4814bSBram Moolenaar  lua b = vim.open('XOpen1')
4494ff4814bSBram Moolenaar  call assert_equal('XOpen1', luaeval('b.name'))
4504ff4814bSBram Moolenaar  call assert_equal('', bufname('%'))
4514ff4814bSBram Moolenaar
4524ff4814bSBram Moolenaar  call assert_match('XOpen1', execute('ls'))
4534ff4814bSBram Moolenaar  call assert_notequal('XOpen2', bufname('%'))
4544ff4814bSBram Moolenaar
4554ff4814bSBram Moolenaar  " Open a buffer XOpen2 and jump to it.
4564ff4814bSBram Moolenaar  lua b = vim.open('XOpen2')()
4574ff4814bSBram Moolenaar  call assert_equal('XOpen2', luaeval('b.name'))
4584ff4814bSBram Moolenaar  call assert_equal('XOpen2', bufname('%'))
4594ff4814bSBram Moolenaar
4604ff4814bSBram Moolenaar  lua b = nil
4614ff4814bSBram Moolenaar  %bwipe!
4624ff4814bSBram Moolenaarendfunc
4634ff4814bSBram Moolenaar
4644ff4814bSBram Moolenaar" Test vim.line()
4654ff4814bSBram Moolenaarfunc Test_line()
4664ff4814bSBram Moolenaar  new
4674ff4814bSBram Moolenaar  call setline(1, ['first line', 'second line'])
4684ff4814bSBram Moolenaar  1
4694ff4814bSBram Moolenaar  call assert_equal('first line', luaeval('vim.line()'))
4704ff4814bSBram Moolenaar  2
4714ff4814bSBram Moolenaar  call assert_equal('second line', luaeval('vim.line()'))
4724ff4814bSBram Moolenaar  bwipe!
4734ff4814bSBram Moolenaarendfunc
4744ff4814bSBram Moolenaar
4754ff4814bSBram Moolenaar" Test vim.beep()
4764ff4814bSBram Moolenaarfunc Test_beep()
4774ff4814bSBram Moolenaar  call assert_beeps('lua vim.beep()')
4784ff4814bSBram Moolenaarendfunc
4794ff4814bSBram Moolenaar
4804ff4814bSBram Moolenaar" Test errors in luaeval()
4814ff4814bSBram Moolenaarfunc Test_luaeval_error()
4824ff4814bSBram Moolenaar  " Compile error
4834ff4814bSBram Moolenaar  call assert_fails("call luaeval('-nil')",
4844ff4814bSBram Moolenaar  \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
4854ff4814bSBram Moolenaar  call assert_fails("call luaeval(']')",
4864ff4814bSBram Moolenaar  \ "[string \"luaeval\"]:1: unexpected symbol near ']'")
4874ff4814bSBram Moolenaarendfunc
4884ff4814bSBram Moolenaar
4894ff4814bSBram Moolenaar" Test :luafile foo.lua
4904ff4814bSBram Moolenaarfunc Test_luafile()
4914ff4814bSBram Moolenaar  call delete('Xlua_file')
4924ff4814bSBram Moolenaar  call writefile(["str = 'hello'", "num = 123.0" ], 'Xlua_file')
4934ff4814bSBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
4944ff4814bSBram Moolenaar
4954ff4814bSBram Moolenaar  luafile Xlua_file
4964ff4814bSBram Moolenaar  call assert_equal('hello', luaeval('str'))
4974ff4814bSBram Moolenaar  call assert_equal(123.0, luaeval('num'))
4984ff4814bSBram Moolenaar
4994ff4814bSBram Moolenaar  lua str, num = nil, nil
5004ff4814bSBram Moolenaar  call delete('Xlua_file')
5014ff4814bSBram Moolenaarendfunc
5024ff4814bSBram Moolenaar
5034ff4814bSBram Moolenaar" Test :luafile %
5044ff4814bSBram Moolenaarfunc Test_luafile_percent()
5054ff4814bSBram Moolenaar  new Xlua_file
5064ff4814bSBram Moolenaar  append
5074ff4814bSBram Moolenaar    str, num = 'foo', 321.0
5084ff4814bSBram Moolenaar    print(string.format('str=%s, num=%d', str, num))
5094ff4814bSBram Moolenaar.
5104ff4814bSBram Moolenaar  w!
5114ff4814bSBram Moolenaar  luafile %
5124ff4814bSBram Moolenaar  let msg = split(execute('message'), "\n")[-1]
5134ff4814bSBram Moolenaar  call assert_equal('str=foo, num=321', msg)
5144ff4814bSBram Moolenaar
5154ff4814bSBram Moolenaar  lua str, num = nil, nil
5164ff4814bSBram Moolenaar  call delete('Xlua_file')
517d58f03b1SBram Moolenaar  bwipe!
518d58f03b1SBram Moolenaarendfunc
519