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