1d58f03b1SBram Moolenaar" Tests for Lua. 2d58f03b1SBram Moolenaar 3d58f03b1SBram Moolenaarif !has('lua') 4d58f03b1SBram Moolenaar finish 5d58f03b1SBram Moolenaarendif 6d58f03b1SBram Moolenaar 7*4ff4814bSBram Moolenaar" Check that switching to another buffer does not trigger ml_get error. 8*4ff4814bSBram 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('$')) 14*4ff4814bSBram Moolenaar %bwipe! 15*4ff4814bSBram Moolenaarendfunc 16*4ff4814bSBram Moolenaar 17*4ff4814bSBram Moolenaar" Test vim.command() 18*4ff4814bSBram Moolenaarfunc Test_command() 19*4ff4814bSBram Moolenaar new 20*4ff4814bSBram Moolenaar call setline(1, ['one', 'two', 'three']) 21*4ff4814bSBram Moolenaar luado vim.command("1,2d_") 22*4ff4814bSBram Moolenaar call assert_equal(['three'], getline(1, '$')) 23d58f03b1SBram Moolenaar bwipe! 24*4ff4814bSBram Moolenaarendfunc 25*4ff4814bSBram Moolenaar 26*4ff4814bSBram Moolenaar" Test vim.eval() 27*4ff4814bSBram Moolenaarfunc Test_eval() 28*4ff4814bSBram Moolenaar " lua.eval with a number 29*4ff4814bSBram Moolenaar lua v = vim.eval('123') 30*4ff4814bSBram Moolenaar call assert_equal('number', luaeval('vim.type(v)')) 31*4ff4814bSBram Moolenaar call assert_equal(123.0, luaeval('v')) 32*4ff4814bSBram Moolenaar 33*4ff4814bSBram Moolenaar " lua.eval with a string 34*4ff4814bSBram Moolenaar lua v = vim.eval('"abc"') 35*4ff4814bSBram Moolenaar call assert_equal('string', luaeval('vim.type(v)')) 36*4ff4814bSBram Moolenaar call assert_equal('abc', luaeval('v')) 37*4ff4814bSBram Moolenaar 38*4ff4814bSBram Moolenaar " lua.eval with a list 39*4ff4814bSBram Moolenaar lua v = vim.eval("['a']") 40*4ff4814bSBram Moolenaar call assert_equal('list', luaeval('vim.type(v)')) 41*4ff4814bSBram Moolenaar call assert_equal(['a'], luaeval('v')) 42*4ff4814bSBram Moolenaar 43*4ff4814bSBram Moolenaar " lua.eval with a dict 44*4ff4814bSBram Moolenaar lua v = vim.eval("{'a':'b'}") 45*4ff4814bSBram Moolenaar call assert_equal('dict', luaeval('vim.type(v)')) 46*4ff4814bSBram Moolenaar call assert_equal({'a':'b'}, luaeval('v')) 47*4ff4814bSBram Moolenaar 48*4ff4814bSBram Moolenaar call assert_fails('lua v = vim.eval(nil)', 49*4ff4814bSBram Moolenaar \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got nil)") 50*4ff4814bSBram Moolenaar call assert_fails('lua v = vim.eval(true)', 51*4ff4814bSBram Moolenaar \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got boolean)") 52*4ff4814bSBram Moolenaar call assert_fails('lua v = vim.eval({})', 53*4ff4814bSBram Moolenaar \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got table)") 54*4ff4814bSBram Moolenaar call assert_fails('lua v = vim.eval(print)', 55*4ff4814bSBram Moolenaar \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got function)") 56*4ff4814bSBram Moolenaar call assert_fails('lua v = vim.eval(vim.buffer())', 57*4ff4814bSBram Moolenaar \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got userdata)") 58*4ff4814bSBram Moolenaar 59*4ff4814bSBram Moolenaar lua v = nil 60*4ff4814bSBram Moolenaarendfunc 61*4ff4814bSBram Moolenaar 62*4ff4814bSBram Moolenaar" Test vim.window() 63*4ff4814bSBram Moolenaarfunc Test_window() 64*4ff4814bSBram Moolenaar e Xfoo2 65*4ff4814bSBram Moolenaar new Xfoo1 66*4ff4814bSBram Moolenaar 67*4ff4814bSBram Moolenaar " Window 1 (top window) contains Xfoo1 68*4ff4814bSBram Moolenaar " Window 2 (bottom window) contains Xfoo2 69*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval('vim.window(1):buffer().name')) 70*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval('vim.window(2):buffer().name')) 71*4ff4814bSBram Moolenaar 72*4ff4814bSBram Moolenaar " Window 3 does not exist so vim.window(3) should return nil 73*4ff4814bSBram Moolenaar call assert_equal('nil', luaeval('tostring(vim.window(3))')) 74*4ff4814bSBram Moolenaar 75*4ff4814bSBram Moolenaar %bwipe! 76*4ff4814bSBram Moolenaarendfunc 77*4ff4814bSBram Moolenaar 78*4ff4814bSBram Moolenaar" Test vim.window().height 79*4ff4814bSBram Moolenaarfunc Test_window_height() 80*4ff4814bSBram Moolenaar new 81*4ff4814bSBram Moolenaar lua vim.window().height = 2 82*4ff4814bSBram Moolenaar call assert_equal(2, winheight(0)) 83*4ff4814bSBram Moolenaar lua vim.window().height = vim.window().height + 1 84*4ff4814bSBram Moolenaar call assert_equal(3, winheight(0)) 85*4ff4814bSBram Moolenaar bwipe! 86*4ff4814bSBram Moolenaarendfunc 87*4ff4814bSBram Moolenaar 88*4ff4814bSBram Moolenaar" Test vim.window().width 89*4ff4814bSBram Moolenaarfunc Test_window_width() 90*4ff4814bSBram Moolenaar vert new 91*4ff4814bSBram Moolenaar lua vim.window().width = 2 92*4ff4814bSBram Moolenaar call assert_equal(2, winwidth(0)) 93*4ff4814bSBram Moolenaar lua vim.window().width = vim.window().width + 1 94*4ff4814bSBram Moolenaar call assert_equal(3, winwidth(0)) 95*4ff4814bSBram Moolenaar bwipe! 96*4ff4814bSBram Moolenaarendfunc 97*4ff4814bSBram Moolenaar 98*4ff4814bSBram Moolenaar" Test vim.window().line and vim.window.col 99*4ff4814bSBram Moolenaarfunc Test_window_line_col() 100*4ff4814bSBram Moolenaar new 101*4ff4814bSBram Moolenaar call setline(1, ['line1', 'line2', 'line3']) 102*4ff4814bSBram Moolenaar lua vim.window().line = 2 103*4ff4814bSBram Moolenaar lua vim.window().col = 4 104*4ff4814bSBram Moolenaar call assert_equal([0, 2, 4, 0], getpos('.')) 105*4ff4814bSBram Moolenaar lua vim.window().line = vim.window().line + 1 106*4ff4814bSBram Moolenaar lua vim.window().col = vim.window().col - 1 107*4ff4814bSBram Moolenaar call assert_equal([0, 3, 3, 0], getpos('.')) 108*4ff4814bSBram Moolenaar 109*4ff4814bSBram Moolenaar call assert_fails('lua vim.window().line = 10', 110*4ff4814bSBram Moolenaar \ '[string "vim chunk"]:1: line out of range') 111*4ff4814bSBram Moolenaar bwipe! 112*4ff4814bSBram Moolenaarendfunc 113*4ff4814bSBram Moolenaar 114*4ff4814bSBram Moolenaar" Test setting the current window 115*4ff4814bSBram Moolenaarfunc Test_window_set_current() 116*4ff4814bSBram Moolenaar new Xfoo1 117*4ff4814bSBram Moolenaar lua w1 = vim.window() 118*4ff4814bSBram Moolenaar new Xfoo2 119*4ff4814bSBram Moolenaar lua w2 = vim.window() 120*4ff4814bSBram Moolenaar 121*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', bufname('%')) 122*4ff4814bSBram Moolenaar lua w1() 123*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', bufname('%')) 124*4ff4814bSBram Moolenaar lua w2() 125*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', bufname('%')) 126*4ff4814bSBram Moolenaar 127*4ff4814bSBram Moolenaar lua w1, w2 = nil, nil 128*4ff4814bSBram Moolenaar %bwipe! 129*4ff4814bSBram Moolenaarendfunc 130*4ff4814bSBram Moolenaar 131*4ff4814bSBram Moolenaar" Test vim.window().buffer 132*4ff4814bSBram Moolenaarfunc Test_window_buffer() 133*4ff4814bSBram Moolenaar new Xfoo1 134*4ff4814bSBram Moolenaar lua w1 = vim.window() 135*4ff4814bSBram Moolenaar lua b1 = w1.buffer() 136*4ff4814bSBram Moolenaar new Xfoo2 137*4ff4814bSBram Moolenaar lua w2 = vim.window() 138*4ff4814bSBram Moolenaar lua b2 = w2.buffer() 139*4ff4814bSBram Moolenaar 140*4ff4814bSBram Moolenaar lua b1() 141*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', bufname('%')) 142*4ff4814bSBram Moolenaar lua b2() 143*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', bufname('%')) 144*4ff4814bSBram Moolenaar 145*4ff4814bSBram Moolenaar lua b1, b2 = nil, nil 146*4ff4814bSBram Moolenaar %bwipe! 147*4ff4814bSBram Moolenaarendfunc 148*4ff4814bSBram Moolenaar 149*4ff4814bSBram Moolenaar" Test vim.window():previous() and vim.window():next() 150*4ff4814bSBram Moolenaarfunc Test_window_next_previous() 151*4ff4814bSBram Moolenaar new Xfoo1 152*4ff4814bSBram Moolenaar new Xfoo2 153*4ff4814bSBram Moolenaar new Xfoo3 154*4ff4814bSBram Moolenaar wincmd j 155*4ff4814bSBram Moolenaar 156*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval('vim.window().buffer().name')) 157*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval('vim.window():next():buffer().name')) 158*4ff4814bSBram Moolenaar call assert_equal('Xfoo3', luaeval('vim.window():previous():buffer().name')) 159*4ff4814bSBram Moolenaar 160*4ff4814bSBram Moolenaar %bwipe! 161*4ff4814bSBram Moolenaarendfunc 162*4ff4814bSBram Moolenaar 163*4ff4814bSBram Moolenaar" Test vim.window():isvalid() 164*4ff4814bSBram Moolenaarfunc Test_window_isvalid() 165*4ff4814bSBram Moolenaar new Xfoo 166*4ff4814bSBram Moolenaar lua w = vim.window() 167*4ff4814bSBram Moolenaar call assert_true(luaeval('w:isvalid()')) 168*4ff4814bSBram Moolenaar 169*4ff4814bSBram Moolenaar " FIXME: how to test the case when isvalid() returns v:false? 170*4ff4814bSBram Moolenaar " isvalid() gives errors when the window is deleted. Is it a bug? 171*4ff4814bSBram Moolenaar 172*4ff4814bSBram Moolenaar lua w = nil 173*4ff4814bSBram Moolenaar bwipe! 174*4ff4814bSBram Moolenaarendfunc 175*4ff4814bSBram Moolenaar 176*4ff4814bSBram Moolenaar" Test vim.buffer() with and without argument 177*4ff4814bSBram Moolenaarfunc Test_buffer() 178*4ff4814bSBram Moolenaar new Xfoo1 179*4ff4814bSBram Moolenaar let bn1 = bufnr('%') 180*4ff4814bSBram Moolenaar new Xfoo2 181*4ff4814bSBram Moolenaar let bn2 = bufnr('%') 182*4ff4814bSBram Moolenaar 183*4ff4814bSBram Moolenaar " Test vim.buffer() without argument. 184*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval("vim.buffer().name")) 185*4ff4814bSBram Moolenaar 186*4ff4814bSBram Moolenaar " Test vim.buffer() with string argument. 187*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval("vim.buffer('Xfoo1').name")) 188*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval("vim.buffer('Xfoo2').name")) 189*4ff4814bSBram Moolenaar 190*4ff4814bSBram Moolenaar " Test vim.buffer() with integer argument. 191*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name")) 192*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name")) 193*4ff4814bSBram Moolenaar 194*4ff4814bSBram Moolenaar lua bn1, bn2 = nil, nil 195*4ff4814bSBram Moolenaar %bwipe! 196*4ff4814bSBram Moolenaarendfunc 197*4ff4814bSBram Moolenaar 198*4ff4814bSBram Moolenaar" Test vim.buffer().name and vim.buffer().fname 199*4ff4814bSBram Moolenaarfunc Test_buffer_name() 200*4ff4814bSBram Moolenaar new 201*4ff4814bSBram Moolenaar " FIXME: for an unnamed buffer, I would expect 202*4ff4814bSBram Moolenaar " vim.buffer().name to give an empty string, but 203*4ff4814bSBram Moolenaar " it returns 0. Is it a bug? 204*4ff4814bSBram Moolenaar " so this assert_equal is commented out. 205*4ff4814bSBram Moolenaar " call assert_equal('', luaeval('vim.buffer().name')) 206*4ff4814bSBram Moolenaar bwipe! 207*4ff4814bSBram Moolenaar 208*4ff4814bSBram Moolenaar new Xfoo 209*4ff4814bSBram Moolenaar call assert_equal('Xfoo', luaeval('vim.buffer().name')) 210*4ff4814bSBram Moolenaar call assert_equal(expand('%:p'), luaeval('vim.buffer().fname')) 211*4ff4814bSBram Moolenaar bwipe! 212*4ff4814bSBram Moolenaarendfunc 213*4ff4814bSBram Moolenaar 214*4ff4814bSBram Moolenaar" Test vim.buffer().number 215*4ff4814bSBram Moolenaarfunc Test_buffer_number() 216*4ff4814bSBram Moolenaar " All numbers in Lua are floating points number (no integers). 217*4ff4814bSBram Moolenaar call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number'))) 218*4ff4814bSBram Moolenaarendfunc 219*4ff4814bSBram Moolenaar 220*4ff4814bSBram Moolenaar" Test inserting lines in buffer. 221*4ff4814bSBram Moolenaarfunc Test_buffer_insert() 222*4ff4814bSBram Moolenaar new 223*4ff4814bSBram Moolenaar lua vim.buffer()[1] = '3' 224*4ff4814bSBram Moolenaar lua vim.buffer():insert('1', 0) 225*4ff4814bSBram Moolenaar lua vim.buffer():insert('2', 1) 226*4ff4814bSBram Moolenaar lua vim.buffer():insert('4', 10) 227*4ff4814bSBram Moolenaar 228*4ff4814bSBram Moolenaar call assert_equal(['1', '2', '3', '4'], getline(1, '$')) 229*4ff4814bSBram Moolenaar bwipe! 230*4ff4814bSBram Moolenaarendfunc 231*4ff4814bSBram Moolenaar 232*4ff4814bSBram Moolenaar" Test deleting line in buffer 233*4ff4814bSBram Moolenaarfunc Test_buffer_delete() 234*4ff4814bSBram Moolenaar new 235*4ff4814bSBram Moolenaar call setline(1, ['1', '2', '3']) 236*4ff4814bSBram Moolenaar lua vim.buffer()[2] = nil 237*4ff4814bSBram Moolenaar call assert_equal(['1', '3'], getline(1, '$')) 238*4ff4814bSBram Moolenaar 239*4ff4814bSBram Moolenaar call assert_fails('lua vim.buffer()[3] = nil', 240*4ff4814bSBram Moolenaar \ '[string "vim chunk"]:1: invalid line number') 241*4ff4814bSBram Moolenaar bwipe! 242*4ff4814bSBram Moolenaarendfunc 243*4ff4814bSBram Moolenaar 244*4ff4814bSBram Moolenaar" Test #vim.buffer() i.e. number of lines in buffer 245*4ff4814bSBram Moolenaarfunc Test_buffer_number_lines() 246*4ff4814bSBram Moolenaar new 247*4ff4814bSBram Moolenaar call setline(1, ['a', 'b', 'c']) 248*4ff4814bSBram Moolenaar call assert_equal(3.0, luaeval('#vim.buffer()')) 249*4ff4814bSBram Moolenaar bwipe! 250*4ff4814bSBram Moolenaarendfunc 251*4ff4814bSBram Moolenaar 252*4ff4814bSBram Moolenaar" Test vim.buffer():next() and vim.buffer():previous() 253*4ff4814bSBram Moolenaar" Note that these functions get the next or previous buffers 254*4ff4814bSBram Moolenaar" but do not switch buffer. 255*4ff4814bSBram Moolenaarfunc Test_buffer_next_previous() 256*4ff4814bSBram Moolenaar new Xfoo1 257*4ff4814bSBram Moolenaar new Xfoo2 258*4ff4814bSBram Moolenaar new Xfoo3 259*4ff4814bSBram Moolenaar b Xfoo2 260*4ff4814bSBram Moolenaar 261*4ff4814bSBram Moolenaar lua bn = vim.buffer():next() 262*4ff4814bSBram Moolenaar lua bp = vim.buffer():previous() 263*4ff4814bSBram Moolenaar 264*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', luaeval('vim.buffer().name')) 265*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval('bp.name')) 266*4ff4814bSBram Moolenaar call assert_equal('Xfoo3', luaeval('bn.name')) 267*4ff4814bSBram Moolenaar 268*4ff4814bSBram Moolenaar call assert_equal('Xfoo2', bufname('%')) 269*4ff4814bSBram Moolenaar 270*4ff4814bSBram Moolenaar lua bn() 271*4ff4814bSBram Moolenaar call assert_equal('Xfoo3', luaeval('vim.buffer().name')) 272*4ff4814bSBram Moolenaar call assert_equal('Xfoo3', bufname('%')) 273*4ff4814bSBram Moolenaar 274*4ff4814bSBram Moolenaar lua bp() 275*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', luaeval('vim.buffer().name')) 276*4ff4814bSBram Moolenaar call assert_equal('Xfoo1', bufname('%')) 277*4ff4814bSBram Moolenaar 278*4ff4814bSBram Moolenaar lua bn, bp = nil, nil 279*4ff4814bSBram Moolenaar %bwipe! 280*4ff4814bSBram Moolenaarendfunc 281*4ff4814bSBram Moolenaar 282*4ff4814bSBram Moolenaar" Test vim.buffer():isvalid() 283*4ff4814bSBram Moolenaarfunc Test_buffer_isvalid() 284*4ff4814bSBram Moolenaar new Xfoo 285*4ff4814bSBram Moolenaar lua b = vim.buffer() 286*4ff4814bSBram Moolenaar call assert_true(luaeval('b:isvalid()')) 287*4ff4814bSBram Moolenaar 288*4ff4814bSBram Moolenaar " FIXME: how to test the case when isvalid() returns v:false? 289*4ff4814bSBram Moolenaar " isvalid() gives errors when the buffer is wiped. Is it a bug? 290*4ff4814bSBram Moolenaar 291*4ff4814bSBram Moolenaar lua b = nil 292*4ff4814bSBram Moolenaar bwipe! 293*4ff4814bSBram Moolenaarendfunc 294*4ff4814bSBram Moolenaar 295*4ff4814bSBram Moolenaarfunc Test_list() 296*4ff4814bSBram Moolenaar call assert_equal([], luaeval('vim.list()')) 297*4ff4814bSBram Moolenaar 298*4ff4814bSBram Moolenaar " Same example as in :help lua-vim. 299*4ff4814bSBram Moolenaar " FIXME: test is disabled because it does not work. 300*4ff4814bSBram Moolenaar " See https://github.com/vim/vim/issues/3086 301*4ff4814bSBram Moolenaar " lua t = {math.pi, false, say = 'hi'} 302*4ff4814bSBram Moolenaar " call assert_equal([3.141593, 0], luaeval('vim.list(t)')) 303*4ff4814bSBram Moolenaar 304*4ff4814bSBram Moolenaar let l = [] 305*4ff4814bSBram Moolenaar lua l = vim.eval('l') 306*4ff4814bSBram Moolenaar lua l:add(123) 307*4ff4814bSBram Moolenaar lua l:add('abc') 308*4ff4814bSBram Moolenaar lua l:add(true) 309*4ff4814bSBram Moolenaar lua l:add(false) 310*4ff4814bSBram Moolenaar lua l:add(vim.eval("[1, 2, 3]")) 311*4ff4814bSBram Moolenaar lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}")) 312*4ff4814bSBram Moolenaar call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l) 313*4ff4814bSBram Moolenaar call assert_equal(6.0, luaeval('#l')) 314*4ff4814bSBram Moolenaar call assert_match('^list: 0x\x\+$', luaeval('tostring(l)')) 315*4ff4814bSBram Moolenaar 316*4ff4814bSBram Moolenaar lua l[0] = 124 317*4ff4814bSBram Moolenaar lua l[4] = nil 318*4ff4814bSBram Moolenaar lua l:insert('first') 319*4ff4814bSBram Moolenaar lua l:insert('xx', 3) 320*4ff4814bSBram Moolenaar call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l) 321*4ff4814bSBram Moolenaar 322*4ff4814bSBram Moolenaar lua l = nil 323*4ff4814bSBram Moolenaarendfunc 324*4ff4814bSBram Moolenaar 325*4ff4814bSBram Moolenaar" Test l() i.e. iterator on list 326*4ff4814bSBram Moolenaarfunc Test_list_iter() 327*4ff4814bSBram Moolenaar lua l = vim.list():add('foo'):add('bar') 328*4ff4814bSBram Moolenaar lua str = '' 329*4ff4814bSBram Moolenaar lua for v in l() do str = str .. v end 330*4ff4814bSBram Moolenaar call assert_equal('foobar', luaeval('str')) 331*4ff4814bSBram Moolenaar 332*4ff4814bSBram Moolenaar lua str, v, l = nil, nil, nil 333*4ff4814bSBram Moolenaarendfunc 334*4ff4814bSBram Moolenaar 335*4ff4814bSBram Moolenaarfunc Test_recursive_list() 336*4ff4814bSBram Moolenaar lua l = vim.list():add(1):add(2) 337*4ff4814bSBram Moolenaar lua l = l:add(l) 338*4ff4814bSBram Moolenaar 339*4ff4814bSBram Moolenaar call assert_equal(1.0, luaeval('l[0]')) 340*4ff4814bSBram Moolenaar call assert_equal(2.0, luaeval('l[1]')) 341*4ff4814bSBram Moolenaar 342*4ff4814bSBram Moolenaar call assert_equal(1.0, luaeval('l[2][0]')) 343*4ff4814bSBram Moolenaar call assert_equal(2.0, luaeval('l[2][1]')) 344*4ff4814bSBram Moolenaar 345*4ff4814bSBram Moolenaar call assert_equal(1.0, luaeval('l[2][2][0]')) 346*4ff4814bSBram Moolenaar call assert_equal(2.0, luaeval('l[2][2][1]')) 347*4ff4814bSBram Moolenaar 348*4ff4814bSBram Moolenaar call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l'))) 349*4ff4814bSBram Moolenaar 350*4ff4814bSBram Moolenaar call assert_match('^list: 0x\x\+$', luaeval('tostring(l)')) 351*4ff4814bSBram Moolenaar call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])')) 352*4ff4814bSBram Moolenaar 353*4ff4814bSBram Moolenaar call assert_equal(luaeval('l'), luaeval('l[2]')) 354*4ff4814bSBram Moolenaar call assert_equal(luaeval('l'), luaeval('l[2][2]')) 355*4ff4814bSBram Moolenaar 356*4ff4814bSBram Moolenaar lua l = nil 357*4ff4814bSBram Moolenaarendfunc 358*4ff4814bSBram Moolenaar 359*4ff4814bSBram Moolenaarfunc Test_dict() 360*4ff4814bSBram Moolenaar call assert_equal({}, luaeval('vim.dict()')) 361*4ff4814bSBram Moolenaar 362*4ff4814bSBram Moolenaar " Same example as in :help lua-vim. 363*4ff4814bSBram Moolenaar " FIXME: test is disabled because it does not work. 364*4ff4814bSBram Moolenaar " See https://github.com/vim/vim/issues/3086 365*4ff4814bSBram Moolenaar " lua t = {math.pi, false, say = 'hi'} 366*4ff4814bSBram Moolenaar " call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)')) 367*4ff4814bSBram Moolenaar 368*4ff4814bSBram Moolenaar let d = {} 369*4ff4814bSBram Moolenaar lua d = vim.eval('d') 370*4ff4814bSBram Moolenaar lua d[0] = 123 371*4ff4814bSBram Moolenaar lua d[1] = "abc" 372*4ff4814bSBram Moolenaar lua d[2] = true 373*4ff4814bSBram Moolenaar lua d[3] = false 374*4ff4814bSBram Moolenaar lua d[4] = vim.eval("[1, 2, 3]") 375*4ff4814bSBram Moolenaar lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}") 376*4ff4814bSBram 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) 377*4ff4814bSBram Moolenaar call assert_equal(6.0, luaeval('#d')) 378*4ff4814bSBram Moolenaar call assert_match('^dict: 0x\x\+$', luaeval('tostring(d)')) 379*4ff4814bSBram Moolenaar 380*4ff4814bSBram Moolenaar call assert_equal('abc', luaeval('d[1]')) 381*4ff4814bSBram Moolenaar 382*4ff4814bSBram Moolenaar lua d[0] = 124 383*4ff4814bSBram Moolenaar lua d[4] = nil 384*4ff4814bSBram Moolenaar call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d) 385*4ff4814bSBram Moolenaar 386*4ff4814bSBram Moolenaar lua d = nil 387*4ff4814bSBram Moolenaarendfunc 388*4ff4814bSBram Moolenaar 389*4ff4814bSBram Moolenaar" Test d() i.e. iterator on dictionary 390*4ff4814bSBram Moolenaarfunc Test_dict_iter() 391*4ff4814bSBram Moolenaar let d = {'a': 1, 'b':2} 392*4ff4814bSBram Moolenaar lua d = vim.eval('d') 393*4ff4814bSBram Moolenaar lua str = '' 394*4ff4814bSBram Moolenaar lua for k,v in d() do str = str .. k ..':' .. v .. ',' end 395*4ff4814bSBram Moolenaar call assert_equal('a:1,b:2,', luaeval('str')) 396*4ff4814bSBram Moolenaar 397*4ff4814bSBram Moolenaar lua str, k, v, d = nil, nil, nil, nil 398*4ff4814bSBram Moolenaarendfunc 399*4ff4814bSBram Moolenaar 400*4ff4814bSBram Moolenaar" Test vim.type() 401*4ff4814bSBram Moolenaarfunc Test_type() 402*4ff4814bSBram Moolenaar " The following values are identical to Lua's type function. 403*4ff4814bSBram Moolenaar call assert_equal('string', luaeval('vim.type("foo")')) 404*4ff4814bSBram Moolenaar call assert_equal('number', luaeval('vim.type(1)')) 405*4ff4814bSBram Moolenaar call assert_equal('number', luaeval('vim.type(1.2)')) 406*4ff4814bSBram Moolenaar call assert_equal('function', luaeval('vim.type(print)')) 407*4ff4814bSBram Moolenaar call assert_equal('table', luaeval('vim.type({})')) 408*4ff4814bSBram Moolenaar call assert_equal('boolean', luaeval('vim.type(true)')) 409*4ff4814bSBram Moolenaar call assert_equal('boolean', luaeval('vim.type(false)')) 410*4ff4814bSBram Moolenaar call assert_equal('nil', luaeval('vim.type(nil)')) 411*4ff4814bSBram Moolenaar 412*4ff4814bSBram Moolenaar " The following values are specific to Vim. 413*4ff4814bSBram Moolenaar call assert_equal('window', luaeval('vim.type(vim.window())')) 414*4ff4814bSBram Moolenaar call assert_equal('buffer', luaeval('vim.type(vim.buffer())')) 415*4ff4814bSBram Moolenaar call assert_equal('list', luaeval('vim.type(vim.list())')) 416*4ff4814bSBram Moolenaar call assert_equal('dict', luaeval('vim.type(vim.dict())')) 417*4ff4814bSBram Moolenaarendfunc 418*4ff4814bSBram Moolenaar 419*4ff4814bSBram Moolenaar" Test vim.open() 420*4ff4814bSBram Moolenaarfunc Test_open() 421*4ff4814bSBram Moolenaar call assert_notmatch('XOpen', execute('ls')) 422*4ff4814bSBram Moolenaar 423*4ff4814bSBram Moolenaar " Open a buffer XOpen1, but do not jump to it. 424*4ff4814bSBram Moolenaar lua b = vim.open('XOpen1') 425*4ff4814bSBram Moolenaar call assert_equal('XOpen1', luaeval('b.name')) 426*4ff4814bSBram Moolenaar call assert_equal('', bufname('%')) 427*4ff4814bSBram Moolenaar 428*4ff4814bSBram Moolenaar call assert_match('XOpen1', execute('ls')) 429*4ff4814bSBram Moolenaar call assert_notequal('XOpen2', bufname('%')) 430*4ff4814bSBram Moolenaar 431*4ff4814bSBram Moolenaar " Open a buffer XOpen2 and jump to it. 432*4ff4814bSBram Moolenaar lua b = vim.open('XOpen2')() 433*4ff4814bSBram Moolenaar call assert_equal('XOpen2', luaeval('b.name')) 434*4ff4814bSBram Moolenaar call assert_equal('XOpen2', bufname('%')) 435*4ff4814bSBram Moolenaar 436*4ff4814bSBram Moolenaar lua b = nil 437*4ff4814bSBram Moolenaar %bwipe! 438*4ff4814bSBram Moolenaarendfunc 439*4ff4814bSBram Moolenaar 440*4ff4814bSBram Moolenaar" Test vim.line() 441*4ff4814bSBram Moolenaarfunc Test_line() 442*4ff4814bSBram Moolenaar new 443*4ff4814bSBram Moolenaar call setline(1, ['first line', 'second line']) 444*4ff4814bSBram Moolenaar 1 445*4ff4814bSBram Moolenaar call assert_equal('first line', luaeval('vim.line()')) 446*4ff4814bSBram Moolenaar 2 447*4ff4814bSBram Moolenaar call assert_equal('second line', luaeval('vim.line()')) 448*4ff4814bSBram Moolenaar bwipe! 449*4ff4814bSBram Moolenaarendfunc 450*4ff4814bSBram Moolenaar 451*4ff4814bSBram Moolenaar" Test vim.beep() 452*4ff4814bSBram Moolenaarfunc Test_beep() 453*4ff4814bSBram Moolenaar call assert_beeps('lua vim.beep()') 454*4ff4814bSBram Moolenaarendfunc 455*4ff4814bSBram Moolenaar 456*4ff4814bSBram Moolenaar" Test errors in luaeval() 457*4ff4814bSBram Moolenaarfunc Test_luaeval_error() 458*4ff4814bSBram Moolenaar " Compile error 459*4ff4814bSBram Moolenaar call assert_fails("call luaeval('-nil')", 460*4ff4814bSBram Moolenaar \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value') 461*4ff4814bSBram Moolenaar call assert_fails("call luaeval(']')", 462*4ff4814bSBram Moolenaar \ "[string \"luaeval\"]:1: unexpected symbol near ']'") 463*4ff4814bSBram Moolenaarendfunc 464*4ff4814bSBram Moolenaar 465*4ff4814bSBram Moolenaar" Test :luafile foo.lua 466*4ff4814bSBram Moolenaarfunc Test_luafile() 467*4ff4814bSBram Moolenaar call delete('Xlua_file') 468*4ff4814bSBram Moolenaar call writefile(["str = 'hello'", "num = 123.0" ], 'Xlua_file') 469*4ff4814bSBram Moolenaar call setfperm('Xlua_file', 'r-xr-xr-x') 470*4ff4814bSBram Moolenaar 471*4ff4814bSBram Moolenaar luafile Xlua_file 472*4ff4814bSBram Moolenaar call assert_equal('hello', luaeval('str')) 473*4ff4814bSBram Moolenaar call assert_equal(123.0, luaeval('num')) 474*4ff4814bSBram Moolenaar 475*4ff4814bSBram Moolenaar lua str, num = nil, nil 476*4ff4814bSBram Moolenaar call delete('Xlua_file') 477*4ff4814bSBram Moolenaarendfunc 478*4ff4814bSBram Moolenaar 479*4ff4814bSBram Moolenaar" Test :luafile % 480*4ff4814bSBram Moolenaarfunc Test_luafile_percent() 481*4ff4814bSBram Moolenaar new Xlua_file 482*4ff4814bSBram Moolenaar append 483*4ff4814bSBram Moolenaar str, num = 'foo', 321.0 484*4ff4814bSBram Moolenaar print(string.format('str=%s, num=%d', str, num)) 485*4ff4814bSBram Moolenaar. 486*4ff4814bSBram Moolenaar w! 487*4ff4814bSBram Moolenaar luafile % 488*4ff4814bSBram Moolenaar let msg = split(execute('message'), "\n")[-1] 489*4ff4814bSBram Moolenaar call assert_equal('str=foo, num=321', msg) 490*4ff4814bSBram Moolenaar 491*4ff4814bSBram Moolenaar lua str, num = nil, nil 492*4ff4814bSBram Moolenaar call delete('Xlua_file') 493d58f03b1SBram Moolenaar bwipe! 494d58f03b1SBram Moolenaarendfunc 495