xref: /vim-8.2.3635/src/testdir/test_lua.vim (revision 4ff4814b)
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