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