xref: /vim-8.2.3635/src/testdir/test_ruby.vim (revision 2c5c1638)
1" Tests for ruby interface
2
3source check.vim
4CheckFeature ruby
5
6func Test_ruby_change_buffer()
7  call setline(line('$'), ['1 line 1'])
8  ruby Vim.command("normal /^1\n")
9  ruby $curbuf.line = "1 changed line 1"
10  call assert_equal('1 changed line 1', getline('$'))
11endfunc
12
13func Test_rubydo()
14  " Check deleting lines does not trigger ml_get error.
15  new
16  call setline(1, ['one', 'two', 'three'])
17  rubydo Vim.command("%d_")
18  bwipe!
19
20  " Check switching to another buffer does not trigger ml_get error.
21  new
22  let wincount = winnr('$')
23  call setline(1, ['one', 'two', 'three'])
24  rubydo Vim.command("new")
25  call assert_equal(wincount + 1, winnr('$'))
26  %bwipe!
27endfunc
28
29func Test_rubyfile()
30  " Check :rubyfile does not SEGV with Ruby level exception but just fails
31  let tempfile = tempname() . '.rb'
32  call writefile(['raise "vim!"'], tempfile)
33  call assert_fails('rubyfile ' . tempfile)
34  call delete(tempfile)
35endfunc
36
37func Test_ruby_set_cursor()
38  " Check that setting the cursor position works.
39  new
40  call setline(1, ['first line', 'second line'])
41  normal gg
42  rubydo $curwin.cursor = [1, 5]
43  call assert_equal([1, 6], [line('.'), col('.')])
44  call assert_equal([1, 5], rubyeval('$curwin.cursor'))
45
46  " Check that movement after setting cursor position keeps current column.
47  normal j
48  call assert_equal([2, 6], [line('.'), col('.')])
49  call assert_equal([2, 5], '$curwin.cursor'->rubyeval())
50
51  call assert_fails('ruby $curwin.cursor = [1]',
52        \           'ArgumentError: array length must be 2')
53  bwipe!
54endfunc
55
56" Test buffer.count and buffer.length (number of lines in buffer)
57func Test_ruby_buffer_count()
58  new
59  call setline(1, ['one', 'two', 'three'])
60  call assert_equal(3, rubyeval('$curbuf.count'))
61  call assert_equal(3, rubyeval('$curbuf.length'))
62  bwipe!
63endfunc
64
65" Test buffer.name (buffer name)
66func Test_ruby_buffer_name()
67  new Xfoo
68  call assert_equal(expand('%:p'), rubyeval('$curbuf.name'))
69  bwipe
70  call assert_equal(v:null, rubyeval('$curbuf.name'))
71endfunc
72
73" Test buffer.number (number of the buffer).
74func Test_ruby_buffer_number()
75  new
76  call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
77  new
78  call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
79
80  %bwipe
81endfunc
82
83" Test buffer.delete({n}) (delete line {n})
84func Test_ruby_buffer_delete()
85  new
86  call setline(1, ['one', 'two', 'three'])
87  ruby $curbuf.delete(2)
88  call assert_equal(['one', 'three'], getline(1, '$'))
89
90  call assert_fails('ruby $curbuf.delete(0)', 'IndexError: line number 0 out of range')
91  call assert_fails('ruby $curbuf.delete(3)', 'IndexError: line number 3 out of range')
92
93  bwipe!
94endfunc
95
96" Test buffer.append({str}, str) (append line {str} after line {n})
97func Test_ruby_buffer_append()
98  new
99  ruby $curbuf.append(0, 'one')
100  ruby $curbuf.append(1, 'three')
101  ruby $curbuf.append(1, 'two')
102  ruby $curbuf.append(4, 'four')
103
104  call assert_equal(['one', 'two', 'three', '', 'four'], getline(1, '$'))
105
106  call assert_fails('ruby $curbuf.append(-1, "x")',
107        \           'IndexError: line number -1 out of range')
108  call assert_fails('ruby $curbuf.append(6, "x")',
109        \           'IndexError: line number 6 out of range')
110
111  bwipe!
112endfunc
113
114" Test buffer.line (get or set the current line)
115func Test_ruby_buffer_line()
116  new
117  call setline(1, ['one', 'two', 'three'])
118  2
119  call assert_equal('two', rubyeval('$curbuf.line'))
120
121  ruby $curbuf.line = 'TWO'
122  call assert_equal(['one', 'TWO', 'three'], getline(1, '$'))
123
124  bwipe!
125endfunc
126
127" Test buffer.line_number (get current line number)
128func Test_ruby_buffer_line_number()
129  new
130  call setline(1, ['one', 'two', 'three'])
131  2
132  call assert_equal(2, rubyeval('$curbuf.line_number'))
133
134  bwipe!
135endfunc
136
137func Test_ruby_buffer_get()
138  new
139  call setline(1, ['one', 'two'])
140  call assert_equal('one', rubyeval('$curbuf[1]'))
141  call assert_equal('two', rubyeval('$curbuf[2]'))
142
143  call assert_fails('ruby $curbuf[0]',
144        \           'IndexError: line number 0 out of range')
145  call assert_fails('ruby $curbuf[3]',
146        \           'IndexError: line number 3 out of range')
147
148  bwipe!
149endfunc
150
151func Test_ruby_buffer_set()
152  new
153  call setline(1, ['one', 'two'])
154  ruby $curbuf[2] = 'TWO'
155  ruby $curbuf[1] = 'ONE'
156
157  call assert_fails('ruby $curbuf[0] = "ZERO"',
158        \           'IndexError: line number 0 out of range')
159  call assert_fails('ruby $curbuf[3] = "THREE"',
160        \           'IndexError: line number 3 out of range')
161  bwipe!
162endfunc
163
164" Test window.width (get or set window height).
165func Test_ruby_window_height()
166  new
167
168  " Test setting window height
169  ruby $curwin.height = 2
170  call assert_equal(2, winheight(0))
171
172  " Test getting window height
173  call assert_equal(2, rubyeval('$curwin.height'))
174
175  bwipe
176endfunc
177
178" Test window.width (get or set window width).
179func Test_ruby_window_width()
180  vnew
181
182  " Test setting window width
183  ruby $curwin.width = 2
184  call assert_equal(2, winwidth(0))
185
186  " Test getting window width
187  call assert_equal(2, rubyeval('$curwin.width'))
188
189  bwipe
190endfunc
191
192" Test window.buffer (get buffer object of a window object).
193func Test_ruby_window_buffer()
194  new Xfoo1
195  new Xfoo2
196  ruby $b2 = $curwin.buffer
197  ruby $w2 = $curwin
198  wincmd j
199  ruby $b1 = $curwin.buffer
200  ruby $w1 = $curwin
201
202  call assert_equal(rubyeval('$b1'), rubyeval('$w1.buffer'))
203  call assert_equal(rubyeval('$b2'), rubyeval('$w2.buffer'))
204  call assert_equal(bufnr('Xfoo1'), rubyeval('$w1.buffer.number'))
205  call assert_equal(bufnr('Xfoo2'), rubyeval('$w2.buffer.number'))
206
207  ruby $b1, $w1, $b2, $w2 = nil
208  %bwipe
209endfunc
210
211" Test Vim::Window.current (get current window object)
212func Test_ruby_Vim_window_current()
213  let cw = rubyeval('$curwin')
214  call assert_equal(cw, rubyeval('Vim::Window.current'))
215  call assert_match('^#<Vim::Window:0x\x\+>$', cw)
216endfunc
217
218" Test Vim::Window.count (number of windows)
219func Test_ruby_Vim_window_count()
220  new Xfoo1
221  new Xfoo2
222  split
223  call assert_equal(4, rubyeval('Vim::Window.count'))
224  %bwipe
225  call assert_equal(1, rubyeval('Vim::Window.count'))
226endfunc
227
228" Test Vim::Window[n] (get window object of window n)
229func Test_ruby_Vim_window_get()
230  new Xfoo1
231  new Xfoo2
232  call assert_match('Xfoo2$', rubyeval('Vim::Window[0].buffer.name'))
233  wincmd j
234  call assert_match('Xfoo1$', rubyeval('Vim::Window[1].buffer.name'))
235  wincmd j
236  call assert_equal(v:null,   rubyeval('Vim::Window[2].buffer.name'))
237  %bwipe
238endfunc
239
240" Test Vim::Buffer.current (return the buffer object of current buffer)
241func Test_ruby_Vim_buffer_current()
242  let cb = rubyeval('$curbuf')
243  call assert_equal(cb, rubyeval('Vim::Buffer.current'))
244  call assert_match('^#<Vim::Buffer:0x\x\+>$', cb)
245endfunc
246
247" Test Vim::Buffer:.count (return the number of buffers)
248func Test_ruby_Vim_buffer_count()
249  new Xfoo1
250  new Xfoo2
251  call assert_equal(3, rubyeval('Vim::Buffer.count'))
252  %bwipe
253  call assert_equal(1, rubyeval('Vim::Buffer.count'))
254endfunc
255
256" Test Vim::buffer[n] (return the buffer object of buffer number n)
257func Test_ruby_Vim_buffer_get()
258  new Xfoo1
259  new Xfoo2
260
261  " Index of Vim::Buffer[n] goes from 0 to the number of buffers.
262  call assert_equal(v:null,   rubyeval('Vim::Buffer[0].name'))
263  call assert_match('Xfoo1$', rubyeval('Vim::Buffer[1].name'))
264  call assert_match('Xfoo2$', rubyeval('Vim::Buffer[2].name'))
265  call assert_fails('ruby print Vim::Buffer[3].name',
266        \           "NoMethodError: undefined method `name' for nil:NilClass")
267  %bwipe
268endfunc
269
270" Test Vim::command({cmd}) (execute a Ex command))
271" Test Vim::command({cmd})
272func Test_ruby_Vim_command()
273  new
274  call setline(1, ['one', 'two', 'three', 'four'])
275  ruby Vim::command('2,3d')
276  call assert_equal(['one', 'four'], getline(1, '$'))
277  bwipe!
278endfunc
279
280" Test Vim::set_option (set a vim option)
281func Test_ruby_Vim_set_option()
282  call assert_equal(0, &number)
283  ruby Vim::set_option('number')
284  call assert_equal(1, &number)
285  ruby Vim::set_option('nonumber')
286  call assert_equal(0, &number)
287endfunc
288
289func Test_ruby_Vim_evaluate()
290  call assert_equal(123,        rubyeval('Vim::evaluate("123")'))
291  " Vim::evaluate("123").class gives Integer or Fixnum depending
292  " on versions of Ruby.
293  call assert_match('^Integer\|Fixnum$', rubyeval('Vim::evaluate("123").class'))
294
295  if has('float')
296    call assert_equal(1.23,       rubyeval('Vim::evaluate("1.23")'))
297    call assert_equal('Float',    rubyeval('Vim::evaluate("1.23").class'))
298  endif
299
300  call assert_equal('foo',      rubyeval('Vim::evaluate("\"foo\"")'))
301  call assert_equal('String',   rubyeval('Vim::evaluate("\"foo\"").class'))
302
303  call assert_equal(["\x01\xAB"],   rubyeval('Vim::evaluate("0z01ab").unpack("M")'))
304  call assert_equal('String',       rubyeval('Vim::evaluate("0z01ab").class'))
305
306  call assert_equal([1, 2],     rubyeval('Vim::evaluate("[1, 2]")'))
307  call assert_equal('Array',    rubyeval('Vim::evaluate("[1, 2]").class'))
308
309  call assert_equal({'1': 2},   rubyeval('Vim::evaluate("{1:2}")'))
310  call assert_equal('Hash',     rubyeval('Vim::evaluate("{1:2}").class'))
311
312  call assert_equal(v:null,     rubyeval('Vim::evaluate("v:null")'))
313  call assert_equal('NilClass', rubyeval('Vim::evaluate("v:null").class'))
314
315  call assert_equal(v:null,     rubyeval('Vim::evaluate("v:none")'))
316  call assert_equal('NilClass', rubyeval('Vim::evaluate("v:none").class'))
317
318  call assert_equal(v:true,      rubyeval('Vim::evaluate("v:true")'))
319  call assert_equal('TrueClass', rubyeval('Vim::evaluate("v:true").class'))
320  call assert_equal(v:false,     rubyeval('Vim::evaluate("v:false")'))
321  call assert_equal('FalseClass',rubyeval('Vim::evaluate("v:false").class'))
322endfunc
323
324func Test_ruby_Vim_blob()
325  call assert_equal('0z',         rubyeval('Vim::blob("")'))
326  call assert_equal('0z31326162', rubyeval('Vim::blob("12ab")'))
327  call assert_equal('0z00010203', rubyeval('Vim::blob("\x00\x01\x02\x03")'))
328  call assert_equal('0z8081FEFF', rubyeval('Vim::blob("\x80\x81\xfe\xff")'))
329endfunc
330
331func Test_ruby_Vim_evaluate_list()
332  call setline(line('$'), ['2 line 2'])
333  ruby Vim.command("normal /^2\n")
334  let l = ["abc", "def"]
335  ruby << trim EOF
336    curline = $curbuf.line_number
337    l = Vim.evaluate("l");
338    $curbuf.append(curline, l.join("\n"))
339  EOF
340  normal j
341  .rubydo $_ = $_.gsub(/\n/, '/')
342  call assert_equal('abc/def', getline('$'))
343endfunc
344
345func Test_ruby_Vim_evaluate_dict()
346  let d = {'a': 'foo', 'b': 123}
347  redir => l:out
348  ruby d = Vim.evaluate("d"); print d
349  redir END
350  call assert_equal(['{"a"=>"foo", "b"=>123}'], split(l:out, "\n"))
351endfunc
352
353" Test Vim::message({msg}) (display message {msg})
354func Test_ruby_Vim_message()
355  ruby Vim::message('A message')
356  let messages = split(execute('message'), "\n")
357  call assert_equal('A message', messages[-1])
358endfunc
359
360func Test_ruby_print()
361  func RubyPrint(expr)
362    return trim(execute('ruby print ' . a:expr))
363  endfunc
364
365  call assert_equal('123', RubyPrint('123'))
366  call assert_equal('1.23', RubyPrint('1.23'))
367  call assert_equal('Hello World!', RubyPrint('"Hello World!"'))
368  call assert_equal('[1, 2]', RubyPrint('[1, 2]'))
369  call assert_equal('{"k1"=>"v1", "k2"=>"v2"}', RubyPrint('({"k1" => "v1", "k2" => "v2"})'))
370  call assert_equal('true', RubyPrint('true'))
371  call assert_equal('false', RubyPrint('false'))
372  call assert_equal('', RubyPrint('nil'))
373  call assert_match('Vim', RubyPrint('Vim'))
374  call assert_match('Module', RubyPrint('Vim.class'))
375
376  delfunc RubyPrint
377endfunc
378
379func Test_ruby_p()
380  ruby p 'Just a test'
381  let messages = GetMessages()
382  call assert_equal('"Just a test"', messages[-1])
383
384  " Check return values of p method
385
386  call assert_equal(123, rubyeval('p(123)'))
387  call assert_equal([1, 2, 3], rubyeval('p(1, 2, 3)'))
388
389  " Avoid the "message maintainer" line.
390  let $LANG = ''
391  messages clear
392  call assert_equal(v:true, rubyeval('p() == nil'))
393
394  let messages = GetMessages()
395  call assert_equal(0, len(messages))
396endfunc
397
398" Test for various heredoc syntax
399func Test_ruby_heredoc()
400  ruby << END
401Vim.command('let s = "A"')
402END
403  ruby <<
404Vim.command('let s ..= "B"')
405.
406  ruby << trim END
407    Vim.command('let s ..= "C"')
408  END
409  ruby << trim
410    Vim.command('let s ..= "D"')
411  .
412  call assert_equal('ABCD', s)
413endfunc
414
415" vim: shiftwidth=2 sts=2 expandtab
416