xref: /vim-8.2.3635/src/testdir/test_lua.vim (revision fe08df45)
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
1272f362bf7SBram 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
1452f362bf7SBram 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
1942f362bf7SBram 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
201*fe08df45SBram Moolenaar  call assert_equal('', luaeval('vim.buffer().name'))
202*fe08df45SBram Moolenaar  call assert_equal('', luaeval('vim.buffer().fname'))
2034ff4814bSBram Moolenaar  bwipe!
2044ff4814bSBram Moolenaar
2054ff4814bSBram Moolenaar  new Xfoo
2064ff4814bSBram Moolenaar  call assert_equal('Xfoo', luaeval('vim.buffer().name'))
2074ff4814bSBram Moolenaar  call assert_equal(expand('%:p'), luaeval('vim.buffer().fname'))
2084ff4814bSBram Moolenaar  bwipe!
2094ff4814bSBram Moolenaarendfunc
2104ff4814bSBram Moolenaar
2114ff4814bSBram Moolenaar" Test vim.buffer().number
2124ff4814bSBram Moolenaarfunc Test_buffer_number()
2134ff4814bSBram Moolenaar  " All numbers in Lua are floating points number (no integers).
2144ff4814bSBram Moolenaar  call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number')))
2154ff4814bSBram Moolenaarendfunc
2164ff4814bSBram Moolenaar
2174ff4814bSBram Moolenaar" Test inserting lines in buffer.
2184ff4814bSBram Moolenaarfunc Test_buffer_insert()
2194ff4814bSBram Moolenaar  new
2204ff4814bSBram Moolenaar  lua vim.buffer()[1] = '3'
2214ff4814bSBram Moolenaar  lua vim.buffer():insert('1', 0)
2224ff4814bSBram Moolenaar  lua vim.buffer():insert('2', 1)
2234ff4814bSBram Moolenaar  lua vim.buffer():insert('4', 10)
2244ff4814bSBram Moolenaar
2254ff4814bSBram Moolenaar  call assert_equal(['1', '2', '3', '4'], getline(1, '$'))
2264ff4814bSBram Moolenaar  bwipe!
2274ff4814bSBram Moolenaarendfunc
2284ff4814bSBram Moolenaar
2294ff4814bSBram Moolenaar" Test deleting line in buffer
2304ff4814bSBram Moolenaarfunc Test_buffer_delete()
2314ff4814bSBram Moolenaar  new
2324ff4814bSBram Moolenaar  call setline(1, ['1', '2', '3'])
2334ff4814bSBram Moolenaar  lua vim.buffer()[2] = nil
2344ff4814bSBram Moolenaar  call assert_equal(['1', '3'], getline(1, '$'))
2354ff4814bSBram Moolenaar
2364ff4814bSBram Moolenaar  call assert_fails('lua vim.buffer()[3] = nil',
2374ff4814bSBram Moolenaar        \           '[string "vim chunk"]:1: invalid line number')
2384ff4814bSBram Moolenaar  bwipe!
2394ff4814bSBram Moolenaarendfunc
2404ff4814bSBram Moolenaar
2414ff4814bSBram Moolenaar" Test #vim.buffer() i.e. number of lines in buffer
2424ff4814bSBram Moolenaarfunc Test_buffer_number_lines()
2434ff4814bSBram Moolenaar  new
2444ff4814bSBram Moolenaar  call setline(1, ['a', 'b', 'c'])
2454ff4814bSBram Moolenaar  call assert_equal(3.0, luaeval('#vim.buffer()'))
2464ff4814bSBram Moolenaar  bwipe!
2474ff4814bSBram Moolenaarendfunc
2484ff4814bSBram Moolenaar
2494ff4814bSBram Moolenaar" Test vim.buffer():next() and vim.buffer():previous()
2504ff4814bSBram Moolenaar" Note that these functions get the next or previous buffers
2514ff4814bSBram Moolenaar" but do not switch buffer.
2524ff4814bSBram Moolenaarfunc Test_buffer_next_previous()
2534ff4814bSBram Moolenaar  new Xfoo1
2544ff4814bSBram Moolenaar  new Xfoo2
2554ff4814bSBram Moolenaar  new Xfoo3
2564ff4814bSBram Moolenaar  b Xfoo2
2574ff4814bSBram Moolenaar
2584ff4814bSBram Moolenaar  lua bn = vim.buffer():next()
2594ff4814bSBram Moolenaar  lua bp = vim.buffer():previous()
2604ff4814bSBram Moolenaar
2614ff4814bSBram Moolenaar  call assert_equal('Xfoo2', luaeval('vim.buffer().name'))
2624ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('bp.name'))
2634ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('bn.name'))
2644ff4814bSBram Moolenaar
2654ff4814bSBram Moolenaar  call assert_equal('Xfoo2', bufname('%'))
2664ff4814bSBram Moolenaar
2674ff4814bSBram Moolenaar  lua bn()
2684ff4814bSBram Moolenaar  call assert_equal('Xfoo3', luaeval('vim.buffer().name'))
2694ff4814bSBram Moolenaar  call assert_equal('Xfoo3', bufname('%'))
2704ff4814bSBram Moolenaar
2714ff4814bSBram Moolenaar  lua bp()
2724ff4814bSBram Moolenaar  call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
2734ff4814bSBram Moolenaar  call assert_equal('Xfoo1', bufname('%'))
2744ff4814bSBram Moolenaar
2752f362bf7SBram Moolenaar  lua bn, bp = nil
2764ff4814bSBram Moolenaar  %bwipe!
2774ff4814bSBram Moolenaarendfunc
2784ff4814bSBram Moolenaar
2794ff4814bSBram Moolenaar" Test vim.buffer():isvalid()
2804ff4814bSBram Moolenaarfunc Test_buffer_isvalid()
2814ff4814bSBram Moolenaar  new Xfoo
2824ff4814bSBram Moolenaar  lua b = vim.buffer()
2834ff4814bSBram Moolenaar  call assert_true(luaeval('b:isvalid()'))
2844ff4814bSBram Moolenaar
2854ff4814bSBram Moolenaar  " FIXME: how to test the case when isvalid() returns v:false?
2864ff4814bSBram Moolenaar  " isvalid() gives errors when the buffer is wiped. Is it a bug?
2874ff4814bSBram Moolenaar
2884ff4814bSBram Moolenaar  lua b = nil
2894ff4814bSBram Moolenaar  bwipe!
2904ff4814bSBram Moolenaarendfunc
2914ff4814bSBram Moolenaar
2924ff4814bSBram Moolenaarfunc Test_list()
2934ff4814bSBram Moolenaar  call assert_equal([], luaeval('vim.list()'))
2944ff4814bSBram Moolenaar
2954ff4814bSBram Moolenaar  let l = []
2964ff4814bSBram Moolenaar  lua l = vim.eval('l')
2974ff4814bSBram Moolenaar  lua l:add(123)
2984ff4814bSBram Moolenaar  lua l:add('abc')
2994ff4814bSBram Moolenaar  lua l:add(true)
3004ff4814bSBram Moolenaar  lua l:add(false)
3014ff4814bSBram Moolenaar  lua l:add(vim.eval("[1, 2, 3]"))
3024ff4814bSBram Moolenaar  lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
3034ff4814bSBram Moolenaar  call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
3044ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#l'))
305a8a60d0cSBram Moolenaar  call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
3064ff4814bSBram Moolenaar
3074ff4814bSBram Moolenaar  lua l[0] = 124
3084ff4814bSBram Moolenaar  lua l[4] = nil
3094ff4814bSBram Moolenaar  lua l:insert('first')
3104ff4814bSBram Moolenaar  lua l:insert('xx', 3)
3114ff4814bSBram Moolenaar  call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l)
3124ff4814bSBram Moolenaar
3132f362bf7SBram Moolenaar  lockvar 1 l
3142f362bf7SBram Moolenaar  call assert_fails('lua l:add("x")', '[string "vim chunk"]:1: list is locked')
3152f362bf7SBram Moolenaar
3164ff4814bSBram Moolenaar  lua l = nil
3174ff4814bSBram Moolenaarendfunc
3184ff4814bSBram Moolenaar
3192f362bf7SBram Moolenaarfunc Test_list_table()
3202f362bf7SBram Moolenaar  " See :help lua-vim
3212f362bf7SBram Moolenaar  " Non-numeric keys should not be used to initialize the list
3222f362bf7SBram Moolenaar  " so say = 'hi' should be ignored.
3232f362bf7SBram Moolenaar  lua t = {3.14, 'hello', false, true, say = 'hi'}
3242f362bf7SBram Moolenaar  call assert_equal([3.14, 'hello', v:false, v:true], luaeval('vim.list(t)'))
3252f362bf7SBram Moolenaar  lua t = nil
3262f362bf7SBram Moolenaar
3272f362bf7SBram Moolenaar  call assert_fails('lua vim.list(1)', '[string "vim chunk"]:1: table expected, got number')
3282f362bf7SBram Moolenaar  call assert_fails('lua vim.list("x")', '[string "vim chunk"]:1: table expected, got string')
3292f362bf7SBram Moolenaar  call assert_fails('lua vim.list(print)', '[string "vim chunk"]:1: table expected, got function')
3302f362bf7SBram Moolenaar  call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
3312f362bf7SBram Moolenaarendfunc
3322f362bf7SBram Moolenaar
3334ff4814bSBram Moolenaar" Test l() i.e. iterator on list
3344ff4814bSBram Moolenaarfunc Test_list_iter()
3354ff4814bSBram Moolenaar  lua l = vim.list():add('foo'):add('bar')
3364ff4814bSBram Moolenaar  lua str = ''
3374ff4814bSBram Moolenaar  lua for v in l() do str = str .. v end
3384ff4814bSBram Moolenaar  call assert_equal('foobar', luaeval('str'))
3394ff4814bSBram Moolenaar
3402f362bf7SBram Moolenaar  lua str, l = nil
3414ff4814bSBram Moolenaarendfunc
3424ff4814bSBram Moolenaar
3434ff4814bSBram Moolenaarfunc Test_recursive_list()
3444ff4814bSBram Moolenaar  lua l = vim.list():add(1):add(2)
3454ff4814bSBram Moolenaar  lua l = l:add(l)
3464ff4814bSBram Moolenaar
3474ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[0]'))
3484ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[1]'))
3494ff4814bSBram Moolenaar
3504ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][0]'))
3514ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][1]'))
3524ff4814bSBram Moolenaar
3534ff4814bSBram Moolenaar  call assert_equal(1.0, luaeval('l[2][2][0]'))
3544ff4814bSBram Moolenaar  call assert_equal(2.0, luaeval('l[2][2][1]'))
3554ff4814bSBram Moolenaar
3564ff4814bSBram Moolenaar  call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
3574ff4814bSBram Moolenaar
358a8a60d0cSBram Moolenaar  call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
3594ff4814bSBram Moolenaar  call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
3604ff4814bSBram Moolenaar
3614ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2]'))
3624ff4814bSBram Moolenaar  call assert_equal(luaeval('l'), luaeval('l[2][2]'))
3634ff4814bSBram Moolenaar
3644ff4814bSBram Moolenaar  lua l = nil
3654ff4814bSBram Moolenaarendfunc
3664ff4814bSBram Moolenaar
3674ff4814bSBram Moolenaarfunc Test_dict()
3684ff4814bSBram Moolenaar  call assert_equal({}, luaeval('vim.dict()'))
3694ff4814bSBram Moolenaar
3704ff4814bSBram Moolenaar  let d = {}
3714ff4814bSBram Moolenaar  lua d = vim.eval('d')
3724ff4814bSBram Moolenaar  lua d[0] = 123
3734ff4814bSBram Moolenaar  lua d[1] = "abc"
3744ff4814bSBram Moolenaar  lua d[2] = true
3754ff4814bSBram Moolenaar  lua d[3] = false
3764ff4814bSBram Moolenaar  lua d[4] = vim.eval("[1, 2, 3]")
3774ff4814bSBram Moolenaar  lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
3784ff4814bSBram 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)
3794ff4814bSBram Moolenaar  call assert_equal(6.0, luaeval('#d'))
380a8a60d0cSBram Moolenaar  call assert_match('^dict: \%(0x\)\?\x\+$', luaeval('tostring(d)'))
3814ff4814bSBram Moolenaar
3824ff4814bSBram Moolenaar  call assert_equal('abc', luaeval('d[1]'))
3834ff4814bSBram Moolenaar
3844ff4814bSBram Moolenaar  lua d[0] = 124
3854ff4814bSBram Moolenaar  lua d[4] = nil
3864ff4814bSBram Moolenaar  call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
3874ff4814bSBram Moolenaar
3882f362bf7SBram Moolenaar  lockvar 1 d
3892f362bf7SBram Moolenaar  call assert_fails('lua d[6] = 1', '[string "vim chunk"]:1: dict is locked')
3902f362bf7SBram Moolenaar
3914ff4814bSBram Moolenaar  lua d = nil
3924ff4814bSBram Moolenaarendfunc
3934ff4814bSBram Moolenaar
3942f362bf7SBram Moolenaarfunc Test_dict_table()
3952f362bf7SBram Moolenaar  lua t = {key1 = 'x', key2 = 3.14, key3 = true, key4 = false}
3962f362bf7SBram Moolenaar  call assert_equal({'key1': 'x', 'key2': 3.14, 'key3': v:true, 'key4': v:false},
3972f362bf7SBram Moolenaar        \           luaeval('vim.dict(t)'))
3982f362bf7SBram Moolenaar
3992f362bf7SBram Moolenaar  " Same example as in :help lua-vim.
4002f362bf7SBram Moolenaar  lua t = {math.pi, false, say = 'hi'}
4012f362bf7SBram Moolenaar  " FIXME: commented out as it currently does not work as documented:
4022f362bf7SBram Moolenaar  " Expected {'say': 'hi'}
4032f362bf7SBram Moolenaar  " but got {'1': 3.141593, '2': v:false, 'say': 'hi'}
4042f362bf7SBram Moolenaar  " Is the documentation or the code wrong?
4052f362bf7SBram Moolenaar  "call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
4062f362bf7SBram Moolenaar  lua t = nil
4072f362bf7SBram Moolenaar
4082f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(1)', '[string "vim chunk"]:1: table expected, got number')
4092f362bf7SBram Moolenaar  call assert_fails('lua vim.dict("x")', '[string "vim chunk"]:1: table expected, got string')
4102f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(print)', '[string "vim chunk"]:1: table expected, got function')
4112f362bf7SBram Moolenaar  call assert_fails('lua vim.dict(true)', '[string "vim chunk"]:1: table expected, got boolean')
4122f362bf7SBram Moolenaarendfunc
4132f362bf7SBram Moolenaar
4144ff4814bSBram Moolenaar" Test d() i.e. iterator on dictionary
4154ff4814bSBram Moolenaarfunc Test_dict_iter()
4164ff4814bSBram Moolenaar  let d = {'a': 1, 'b':2}
4174ff4814bSBram Moolenaar  lua d = vim.eval('d')
4184ff4814bSBram Moolenaar  lua str = ''
4194ff4814bSBram Moolenaar  lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
4204ff4814bSBram Moolenaar  call assert_equal('a:1,b:2,', luaeval('str'))
4214ff4814bSBram Moolenaar
4222f362bf7SBram Moolenaar  lua str, d = nil
4234ff4814bSBram Moolenaarendfunc
4244ff4814bSBram Moolenaar
425ca06da92SBram Moolenaarfunc Test_funcref()
426ca06da92SBram Moolenaar  function I(x)
427ca06da92SBram Moolenaar    return a:x
428ca06da92SBram Moolenaar  endfunction
429ca06da92SBram Moolenaar  let R = function('I')
430ca06da92SBram Moolenaar  lua i1 = vim.funcref"I"
431ca06da92SBram Moolenaar  lua i2 = vim.eval"R"
432ca06da92SBram Moolenaar  lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
433ca06da92SBram Moolenaar  lua msg = vim.funcref"tr"(msg, "|", " ")
434ca06da92SBram Moolenaar  call assert_equal("funcref test OK", luaeval('msg'))
435ca06da92SBram Moolenaar
436ca06da92SBram Moolenaar  " dict funcref
437ca06da92SBram Moolenaar  function Mylen() dict
438ca06da92SBram Moolenaar    return len(self.data)
439ca06da92SBram Moolenaar  endfunction
440ca06da92SBram Moolenaar  let l = [0, 1, 2, 3]
441ca06da92SBram Moolenaar  let mydict = {'data': l}
442ca06da92SBram Moolenaar  lua d = vim.eval"mydict"
443ca06da92SBram Moolenaar  lua d.len = vim.funcref"Mylen" -- assign d as 'self'
444ca06da92SBram Moolenaar  lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
445ca06da92SBram Moolenaar  call assert_equal("OK", luaeval('res'))
4462f362bf7SBram Moolenaar
4472f362bf7SBram Moolenaar  lua i1, i2, msg, d, res = nil
448ca06da92SBram Moolenaarendfunc
449ca06da92SBram Moolenaar
4504ff4814bSBram Moolenaar" Test vim.type()
4514ff4814bSBram Moolenaarfunc Test_type()
4524ff4814bSBram Moolenaar  " The following values are identical to Lua's type function.
4534ff4814bSBram Moolenaar  call assert_equal('string',   luaeval('vim.type("foo")'))
4544ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1)'))
4554ff4814bSBram Moolenaar  call assert_equal('number',   luaeval('vim.type(1.2)'))
4564ff4814bSBram Moolenaar  call assert_equal('function', luaeval('vim.type(print)'))
4574ff4814bSBram Moolenaar  call assert_equal('table',    luaeval('vim.type({})'))
4584ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(true)'))
4594ff4814bSBram Moolenaar  call assert_equal('boolean',  luaeval('vim.type(false)'))
4604ff4814bSBram Moolenaar  call assert_equal('nil',      luaeval('vim.type(nil)'))
4614ff4814bSBram Moolenaar
4624ff4814bSBram Moolenaar  " The following values are specific to Vim.
4634ff4814bSBram Moolenaar  call assert_equal('window',   luaeval('vim.type(vim.window())'))
4644ff4814bSBram Moolenaar  call assert_equal('buffer',   luaeval('vim.type(vim.buffer())'))
4654ff4814bSBram Moolenaar  call assert_equal('list',     luaeval('vim.type(vim.list())'))
4664ff4814bSBram Moolenaar  call assert_equal('dict',     luaeval('vim.type(vim.dict())'))
467ca06da92SBram Moolenaar  call assert_equal('funcref',  luaeval('vim.type(vim.funcref("Test_type"))'))
4684ff4814bSBram Moolenaarendfunc
4694ff4814bSBram Moolenaar
4704ff4814bSBram Moolenaar" Test vim.open()
4714ff4814bSBram Moolenaarfunc Test_open()
4724ff4814bSBram Moolenaar  call assert_notmatch('XOpen', execute('ls'))
4734ff4814bSBram Moolenaar
4744ff4814bSBram Moolenaar  " Open a buffer XOpen1, but do not jump to it.
4754ff4814bSBram Moolenaar  lua b = vim.open('XOpen1')
4764ff4814bSBram Moolenaar  call assert_equal('XOpen1', luaeval('b.name'))
4774ff4814bSBram Moolenaar  call assert_equal('', bufname('%'))
4784ff4814bSBram Moolenaar
4794ff4814bSBram Moolenaar  call assert_match('XOpen1', execute('ls'))
4804ff4814bSBram Moolenaar  call assert_notequal('XOpen2', bufname('%'))
4814ff4814bSBram Moolenaar
4824ff4814bSBram Moolenaar  " Open a buffer XOpen2 and jump to it.
4834ff4814bSBram Moolenaar  lua b = vim.open('XOpen2')()
4844ff4814bSBram Moolenaar  call assert_equal('XOpen2', luaeval('b.name'))
4854ff4814bSBram Moolenaar  call assert_equal('XOpen2', bufname('%'))
4864ff4814bSBram Moolenaar
4874ff4814bSBram Moolenaar  lua b = nil
4884ff4814bSBram Moolenaar  %bwipe!
4894ff4814bSBram Moolenaarendfunc
4904ff4814bSBram Moolenaar
4914ff4814bSBram Moolenaar" Test vim.line()
4924ff4814bSBram Moolenaarfunc Test_line()
4934ff4814bSBram Moolenaar  new
4944ff4814bSBram Moolenaar  call setline(1, ['first line', 'second line'])
4954ff4814bSBram Moolenaar  1
4964ff4814bSBram Moolenaar  call assert_equal('first line', luaeval('vim.line()'))
4974ff4814bSBram Moolenaar  2
4984ff4814bSBram Moolenaar  call assert_equal('second line', luaeval('vim.line()'))
4994ff4814bSBram Moolenaar  bwipe!
5004ff4814bSBram Moolenaarendfunc
5014ff4814bSBram Moolenaar
5024ff4814bSBram Moolenaar" Test vim.beep()
5034ff4814bSBram Moolenaarfunc Test_beep()
5044ff4814bSBram Moolenaar  call assert_beeps('lua vim.beep()')
5054ff4814bSBram Moolenaarendfunc
5064ff4814bSBram Moolenaar
5074ff4814bSBram Moolenaar" Test errors in luaeval()
5084ff4814bSBram Moolenaarfunc Test_luaeval_error()
5094ff4814bSBram Moolenaar  " Compile error
5104ff4814bSBram Moolenaar  call assert_fails("call luaeval('-nil')",
5114ff4814bSBram Moolenaar  \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
5124ff4814bSBram Moolenaar  call assert_fails("call luaeval(']')",
5134ff4814bSBram Moolenaar  \ "[string \"luaeval\"]:1: unexpected symbol near ']'")
5144ff4814bSBram Moolenaarendfunc
5154ff4814bSBram Moolenaar
5164ff4814bSBram Moolenaar" Test :luafile foo.lua
5174ff4814bSBram Moolenaarfunc Test_luafile()
5184ff4814bSBram Moolenaar  call delete('Xlua_file')
5194ff4814bSBram Moolenaar  call writefile(["str = 'hello'", "num = 123.0" ], 'Xlua_file')
5204ff4814bSBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
5214ff4814bSBram Moolenaar
5224ff4814bSBram Moolenaar  luafile Xlua_file
5234ff4814bSBram Moolenaar  call assert_equal('hello', luaeval('str'))
5244ff4814bSBram Moolenaar  call assert_equal(123.0, luaeval('num'))
5254ff4814bSBram Moolenaar
5262f362bf7SBram Moolenaar  lua str, num = nil
5274ff4814bSBram Moolenaar  call delete('Xlua_file')
5284ff4814bSBram Moolenaarendfunc
5294ff4814bSBram Moolenaar
5304ff4814bSBram Moolenaar" Test :luafile %
5314ff4814bSBram Moolenaarfunc Test_luafile_percent()
5324ff4814bSBram Moolenaar  new Xlua_file
5334ff4814bSBram Moolenaar  append
5344ff4814bSBram Moolenaar    str, num = 'foo', 321.0
5354ff4814bSBram Moolenaar    print(string.format('str=%s, num=%d', str, num))
5364ff4814bSBram Moolenaar.
5374ff4814bSBram Moolenaar  w!
5384ff4814bSBram Moolenaar  luafile %
5394ff4814bSBram Moolenaar  let msg = split(execute('message'), "\n")[-1]
5404ff4814bSBram Moolenaar  call assert_equal('str=foo, num=321', msg)
5414ff4814bSBram Moolenaar
5422f362bf7SBram Moolenaar  lua str, num = nil
5432f362bf7SBram Moolenaar  call delete('Xlua_file')
5442f362bf7SBram Moolenaar  bwipe!
5452f362bf7SBram Moolenaarendfunc
5462f362bf7SBram Moolenaar
5472f362bf7SBram Moolenaar" Test :luafile with syntax error
5482f362bf7SBram Moolenaarfunc Test_luafile_error()
5492f362bf7SBram Moolenaar  new Xlua_file
5502f362bf7SBram Moolenaar  call writefile(['nil = 0' ], 'Xlua_file')
5512f362bf7SBram Moolenaar  call setfperm('Xlua_file', 'r-xr-xr-x')
5522f362bf7SBram Moolenaar
5532f362bf7SBram Moolenaar  call assert_fails('luafile Xlua_file', "Xlua_file:1: unexpected symbol near 'nil'")
5542f362bf7SBram Moolenaar
5554ff4814bSBram Moolenaar  call delete('Xlua_file')
556d58f03b1SBram Moolenaar  bwipe!
557d58f03b1SBram Moolenaarendfunc
558