blob: dcfdc62448cae59128b97dd70684f88163d561ec [file] [log] [blame]
Bram Moolenaar85babd62016-06-21 22:59:28 +02001" Tests for ruby interface
2
3if !has('ruby')
Bram Moolenaarb0f94c12019-06-13 22:19:53 +02004 throw 'Skipped, ruby feature missing'
Bram Moolenaar85babd62016-06-21 22:59:28 +02005end
6
7func Test_ruby_change_buffer()
8 call setline(line('$'), ['1 line 1'])
9 ruby Vim.command("normal /^1\n")
10 ruby $curbuf.line = "1 changed line 1"
11 call assert_equal('1 changed line 1', getline('$'))
12endfunc
13
Bram Moolenaarc593fee2017-01-29 23:11:25 +010014func Test_rubydo()
15 " Check deleting lines does not trigger ml_get error.
16 new
17 call setline(1, ['one', 'two', 'three'])
18 rubydo Vim.command("%d_")
19 bwipe!
20
21 " Check switching to another buffer does not trigger ml_get error.
22 new
23 let wincount = winnr('$')
24 call setline(1, ['one', 'two', 'three'])
25 rubydo Vim.command("new")
26 call assert_equal(wincount + 1, winnr('$'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020027 %bwipe!
Bram Moolenaarc593fee2017-01-29 23:11:25 +010028endfunc
Bram Moolenaar37badc82018-01-31 20:15:30 +010029
30func Test_rubyfile()
31 " Check :rubyfile does not SEGV with Ruby level exception but just fails
32 let tempfile = tempname() . '.rb'
33 call writefile(['raise "vim!"'], tempfile)
34 call assert_fails('rubyfile ' . tempfile)
35 call delete(tempfile)
36endfunc
Bram Moolenaar53901442018-07-25 22:02:36 +020037
38func Test_set_cursor()
39 " Check that setting the cursor position works.
40 new
41 call setline(1, ['first line', 'second line'])
42 normal gg
43 rubydo $curwin.cursor = [1, 5]
44 call assert_equal([1, 6], [line('.'), col('.')])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010045 call assert_equal([1, 5], rubyeval('$curwin.cursor'))
Bram Moolenaar53901442018-07-25 22:02:36 +020046
47 " Check that movement after setting cursor position keeps current column.
48 normal j
49 call assert_equal([2, 6], [line('.'), col('.')])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010050 call assert_equal([2, 5], rubyeval('$curwin.cursor'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020051
52 call assert_fails('ruby $curwin.cursor = [1]',
53 \ 'ArgumentError: array length must be 2')
54 bwipe!
55endfunc
56
57" Test buffer.count and buffer.length (number of lines in buffer)
58func Test_buffer_count()
59 new
60 call setline(1, ['one', 'two', 'three'])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010061 call assert_equal(3, rubyeval('$curbuf.count'))
62 call assert_equal(3, rubyeval('$curbuf.length'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020063 bwipe!
64endfunc
65
66" Test buffer.name (buffer name)
67func Test_buffer_name()
68 new Xfoo
Bram Moolenaare99be0e2019-03-26 22:51:09 +010069 call assert_equal(expand('%:p'), rubyeval('$curbuf.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020070 bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +010071 call assert_equal(v:null, rubyeval('$curbuf.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020072endfunc
73
74" Test buffer.number (number of the buffer).
75func Test_buffer_number()
76 new
Bram Moolenaare99be0e2019-03-26 22:51:09 +010077 call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020078 new
Bram Moolenaare99be0e2019-03-26 22:51:09 +010079 call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020080
81 %bwipe
82endfunc
83
84" Test buffer.delete({n}) (delete line {n})
85func Test_buffer_delete()
86 new
87 call setline(1, ['one', 'two', 'three'])
88 ruby $curbuf.delete(2)
89 call assert_equal(['one', 'three'], getline(1, '$'))
90
91 call assert_fails('ruby $curbuf.delete(0)', 'IndexError: line number 0 out of range')
92 call assert_fails('ruby $curbuf.delete(3)', 'IndexError: line number 3 out of range')
93
94 bwipe!
95endfunc
96
97" Test buffer.append({str}, str) (append line {str} after line {n})
98func Test_buffer_append()
99 new
100 ruby $curbuf.append(0, 'one')
101 ruby $curbuf.append(1, 'three')
102 ruby $curbuf.append(1, 'two')
103 ruby $curbuf.append(4, 'four')
104
105 call assert_equal(['one', 'two', 'three', '', 'four'], getline(1, '$'))
106
107 call assert_fails('ruby $curbuf.append(-1, "x")',
108 \ 'IndexError: line number -1 out of range')
109 call assert_fails('ruby $curbuf.append(6, "x")',
110 \ 'IndexError: line number 6 out of range')
111
112 bwipe!
113endfunc
114
115" Test buffer.line (get or set the current line)
116func Test_buffer_line()
117 new
118 call setline(1, ['one', 'two', 'three'])
119 2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100120 call assert_equal('two', rubyeval('$curbuf.line'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200121
122 ruby $curbuf.line = 'TWO'
123 call assert_equal(['one', 'TWO', 'three'], getline(1, '$'))
124
125 bwipe!
126endfunc
127
128" Test buffer.line_number (get current line number)
129func Test_buffer_line_number()
130 new
131 call setline(1, ['one', 'two', 'three'])
132 2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100133 call assert_equal(2, rubyeval('$curbuf.line_number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200134
135 bwipe!
136endfunc
137
138func Test_buffer_get()
139 new
140 call setline(1, ['one', 'two'])
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100141 call assert_equal('one', rubyeval('$curbuf[1]'))
142 call assert_equal('two', rubyeval('$curbuf[2]'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200143
144 call assert_fails('ruby $curbuf[0]',
145 \ 'IndexError: line number 0 out of range')
146 call assert_fails('ruby $curbuf[3]',
147 \ 'IndexError: line number 3 out of range')
148
149 bwipe!
150endfunc
151
152func Test_buffer_set()
153 new
154 call setline(1, ['one', 'two'])
155 ruby $curbuf[2] = 'TWO'
156 ruby $curbuf[1] = 'ONE'
157
158 call assert_fails('ruby $curbuf[0] = "ZERO"',
159 \ 'IndexError: line number 0 out of range')
160 call assert_fails('ruby $curbuf[3] = "THREE"',
161 \ 'IndexError: line number 3 out of range')
162 bwipe!
163endfunc
164
165" Test window.width (get or set window height).
166func Test_window_height()
167 new
168
169 " Test setting window height
170 ruby $curwin.height = 2
171 call assert_equal(2, winheight(0))
172
173 " Test getting window height
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100174 call assert_equal(2, rubyeval('$curwin.height'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200175
176 bwipe
177endfunc
178
179" Test window.width (get or set window width).
180func Test_window_width()
181 vnew
182
183 " Test setting window width
184 ruby $curwin.width = 2
185 call assert_equal(2, winwidth(0))
186
187 " Test getting window width
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100188 call assert_equal(2, rubyeval('$curwin.width'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200189
190 bwipe
191endfunc
192
193" Test window.buffer (get buffer object of a window object).
194func Test_window_buffer()
195 new Xfoo1
196 new Xfoo2
197 ruby $b2 = $curwin.buffer
198 ruby $w2 = $curwin
199 wincmd j
200 ruby $b1 = $curwin.buffer
201 ruby $w1 = $curwin
202
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100203 call assert_equal(rubyeval('$b1'), rubyeval('$w1.buffer'))
204 call assert_equal(rubyeval('$b2'), rubyeval('$w2.buffer'))
205 call assert_equal(bufnr('Xfoo1'), rubyeval('$w1.buffer.number'))
206 call assert_equal(bufnr('Xfoo2'), rubyeval('$w2.buffer.number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200207
208 ruby $b1, $w1, $b2, $w2 = nil
209 %bwipe
210endfunc
211
212" Test Vim::Window.current (get current window object)
213func Test_Vim_window_current()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100214 let cw = rubyeval('$curwin')
215 call assert_equal(cw, rubyeval('Vim::Window.current'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200216 call assert_match('^#<Vim::Window:0x\x\+>$', cw)
217endfunc
218
219" Test Vim::Window.count (number of windows)
220func Test_Vim_window_count()
221 new Xfoo1
222 new Xfoo2
223 split
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100224 call assert_equal(4, rubyeval('Vim::Window.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200225 %bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100226 call assert_equal(1, rubyeval('Vim::Window.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200227endfunc
228
229" Test Vim::Window[n] (get window object of window n)
230func Test_Vim_window_get()
231 new Xfoo1
232 new Xfoo2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100233 call assert_match('Xfoo2$', rubyeval('Vim::Window[0].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200234 wincmd j
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100235 call assert_match('Xfoo1$', rubyeval('Vim::Window[1].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200236 wincmd j
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100237 call assert_equal(v:null, rubyeval('Vim::Window[2].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200238 %bwipe
239endfunc
240
241" Test Vim::Buffer.current (return the buffer object of current buffer)
242func Test_Vim_buffer_current()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100243 let cb = rubyeval('$curbuf')
244 call assert_equal(cb, rubyeval('Vim::Buffer.current'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200245 call assert_match('^#<Vim::Buffer:0x\x\+>$', cb)
246endfunc
247
248" Test Vim::Buffer:.count (return the number of buffers)
249func Test_Vim_buffer_count()
250 new Xfoo1
251 new Xfoo2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100252 call assert_equal(3, rubyeval('Vim::Buffer.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200253 %bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100254 call assert_equal(1, rubyeval('Vim::Buffer.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200255endfunc
256
257" Test Vim::buffer[n] (return the buffer object of buffer number n)
258func Test_Vim_buffer_get()
259 new Xfoo1
260 new Xfoo2
261
262 " Index of Vim::Buffer[n] goes from 0 to the number of buffers.
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100263 call assert_equal(v:null, rubyeval('Vim::Buffer[0].name'))
264 call assert_match('Xfoo1$', rubyeval('Vim::Buffer[1].name'))
265 call assert_match('Xfoo2$', rubyeval('Vim::Buffer[2].name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200266 call assert_fails('ruby print Vim::Buffer[3].name',
267 \ "NoMethodError: undefined method `name' for nil:NilClass")
268 %bwipe
269endfunc
270
271" Test Vim::command({cmd}) (execute a Ex command))
272" Test Vim::command({cmd})
273func Test_Vim_command()
274 new
275 call setline(1, ['one', 'two', 'three', 'four'])
276 ruby Vim::command('2,3d')
277 call assert_equal(['one', 'four'], getline(1, '$'))
278 bwipe!
279endfunc
280
281" Test Vim::set_option (set a vim option)
282func Test_Vim_set_option()
283 call assert_equal(0, &number)
284 ruby Vim::set_option('number')
285 call assert_equal(1, &number)
286 ruby Vim::set_option('nonumber')
287 call assert_equal(0, &number)
288endfunc
289
290func Test_Vim_evaluate()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100291 call assert_equal(123, rubyeval('Vim::evaluate("123")'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200292 " Vim::evaluate("123").class gives Integer or Fixnum depending
293 " on versions of Ruby.
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100294 call assert_match('^Integer\|Fixnum$', rubyeval('Vim::evaluate("123").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200295
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100296 call assert_equal(1.23, rubyeval('Vim::evaluate("1.23")'))
297 call assert_equal('Float', rubyeval('Vim::evaluate("1.23").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200298
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100299 call assert_equal('foo', rubyeval('Vim::evaluate("\"foo\"")'))
300 call assert_equal('String', rubyeval('Vim::evaluate("\"foo\"").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200301
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100302 call assert_equal(["\x01\xAB"], rubyeval('Vim::evaluate("0z01ab").unpack("M")'))
303 call assert_equal('String', rubyeval('Vim::evaluate("0z01ab").class'))
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100304
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100305 call assert_equal([1, 2], rubyeval('Vim::evaluate("[1, 2]")'))
306 call assert_equal('Array', rubyeval('Vim::evaluate("[1, 2]").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200307
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100308 call assert_equal({'1': 2}, rubyeval('Vim::evaluate("{1:2}")'))
309 call assert_equal('Hash', rubyeval('Vim::evaluate("{1:2}").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200310
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100311 call assert_equal(v:null, rubyeval('Vim::evaluate("v:null")'))
312 call assert_equal('NilClass', rubyeval('Vim::evaluate("v:null").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200313
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100314 call assert_equal(v:null, rubyeval('Vim::evaluate("v:none")'))
315 call assert_equal('NilClass', rubyeval('Vim::evaluate("v:none").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200316
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100317 call assert_equal(v:true, rubyeval('Vim::evaluate("v:true")'))
318 call assert_equal('TrueClass', rubyeval('Vim::evaluate("v:true").class'))
319 call assert_equal(v:false, rubyeval('Vim::evaluate("v:false")'))
320 call assert_equal('FalseClass',rubyeval('Vim::evaluate("v:false").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200321endfunc
322
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100323func Test_Vim_blob()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100324 call assert_equal('0z', rubyeval('Vim::blob("")'))
325 call assert_equal('0z31326162', rubyeval('Vim::blob("12ab")'))
326 call assert_equal('0z00010203', rubyeval('Vim::blob("\x00\x01\x02\x03")'))
327 call assert_equal('0z8081FEFF', rubyeval('Vim::blob("\x80\x81\xfe\xff")'))
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100328endfunc
329
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200330func Test_Vim_evaluate_list()
331 call setline(line('$'), ['2 line 2'])
332 ruby Vim.command("normal /^2\n")
333 let l = ["abc", "def"]
334 ruby << EOF
335 curline = $curbuf.line_number
336 l = Vim.evaluate("l");
337 $curbuf.append(curline, l.join("\n"))
338EOF
339 normal j
340 .rubydo $_ = $_.gsub(/\n/, '/')
341 call assert_equal('abc/def', getline('$'))
342endfunc
343
344func Test_Vim_evaluate_dict()
345 let d = {'a': 'foo', 'b': 123}
346 redir => l:out
347 ruby d = Vim.evaluate("d"); print d
348 redir END
349 call assert_equal(['{"a"=>"foo", "b"=>123}'], split(l:out, "\n"))
350endfunc
351
352" Test Vim::message({msg}) (display message {msg})
353func Test_Vim_message()
354 ruby Vim::message('A message')
355 let messages = split(execute('message'), "\n")
356 call assert_equal('A message', messages[-1])
357endfunc
358
359func Test_print()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100360 func RubyPrint(expr)
361 return trim(execute('ruby print ' . a:expr))
362 endfunc
363
364 call assert_equal('123', RubyPrint('123'))
365 call assert_equal('1.23', RubyPrint('1.23'))
366 call assert_equal('Hello World!', RubyPrint('"Hello World!"'))
367 call assert_equal('[1, 2]', RubyPrint('[1, 2]'))
368 call assert_equal('{"k1"=>"v1", "k2"=>"v2"}', RubyPrint('({"k1" => "v1", "k2" => "v2"})'))
369 call assert_equal('true', RubyPrint('true'))
370 call assert_equal('false', RubyPrint('false'))
371 call assert_equal('', RubyPrint('nil'))
372 call assert_match('Vim', RubyPrint('Vim'))
373 call assert_match('Module', RubyPrint('Vim.class'))
374
375 delfunc RubyPrint
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200376endfunc
377
378func Test_p()
379 ruby p 'Just a test'
380 let messages = split(execute('message'), "\n")
381 call assert_equal('"Just a test"', messages[-1])
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200382
383 " Check return values of p method
384
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100385 call assert_equal(123, rubyeval('p(123)'))
386 call assert_equal([1, 2, 3], rubyeval('p(1, 2, 3)'))
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200387
388 " Avoid the "message maintainer" line.
389 let $LANG = ''
390 messages clear
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100391 call assert_equal(v:true, rubyeval('p() == nil'))
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200392
393 let messages = split(execute('message'), "\n")
394 call assert_equal(0, len(messages))
Bram Moolenaar53901442018-07-25 22:02:36 +0200395endfunc