blob: f679bbd5f4ae215e47ff7e964d5dd06c9e9bfb62 [file] [log] [blame]
Bram Moolenaar85babd62016-06-21 22:59:28 +02001" Tests for ruby interface
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
4CheckFeature ruby
Bram Moolenaar85babd62016-06-21 22:59:28 +02005
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
Bram Moolenaarc593fee2017-01-29 23:11:25 +010013func 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('$'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020026 %bwipe!
Bram Moolenaarc593fee2017-01-29 23:11:25 +010027endfunc
Bram Moolenaar37badc82018-01-31 20:15:30 +010028
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
Bram Moolenaar53901442018-07-25 22:02:36 +020036
37func Test_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('.')])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010044 call assert_equal([1, 5], rubyeval('$curwin.cursor'))
Bram Moolenaar53901442018-07-25 22:02:36 +020045
46 " Check that movement after setting cursor position keeps current column.
47 normal j
48 call assert_equal([2, 6], [line('.'), col('.')])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010049 call assert_equal([2, 5], rubyeval('$curwin.cursor'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020050
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_buffer_count()
58 new
59 call setline(1, ['one', 'two', 'three'])
Bram Moolenaare99be0e2019-03-26 22:51:09 +010060 call assert_equal(3, rubyeval('$curbuf.count'))
61 call assert_equal(3, rubyeval('$curbuf.length'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020062 bwipe!
63endfunc
64
65" Test buffer.name (buffer name)
66func Test_buffer_name()
67 new Xfoo
Bram Moolenaare99be0e2019-03-26 22:51:09 +010068 call assert_equal(expand('%:p'), rubyeval('$curbuf.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020069 bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +010070 call assert_equal(v:null, rubyeval('$curbuf.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020071endfunc
72
73" Test buffer.number (number of the buffer).
74func Test_buffer_number()
75 new
Bram Moolenaare99be0e2019-03-26 22:51:09 +010076 call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020077 new
Bram Moolenaare99be0e2019-03-26 22:51:09 +010078 call assert_equal(bufnr('%'), rubyeval('$curbuf.number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +020079
80 %bwipe
81endfunc
82
83" Test buffer.delete({n}) (delete line {n})
84func Test_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_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_buffer_line()
116 new
117 call setline(1, ['one', 'two', 'three'])
118 2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100119 call assert_equal('two', rubyeval('$curbuf.line'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200120
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_buffer_line_number()
129 new
130 call setline(1, ['one', 'two', 'three'])
131 2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100132 call assert_equal(2, rubyeval('$curbuf.line_number'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200133
134 bwipe!
135endfunc
136
137func Test_buffer_get()
138 new
139 call setline(1, ['one', 'two'])
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100140 call assert_equal('one', rubyeval('$curbuf[1]'))
141 call assert_equal('two', rubyeval('$curbuf[2]'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200142
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_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_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
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100173 call assert_equal(2, rubyeval('$curwin.height'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200174
175 bwipe
176endfunc
177
178" Test window.width (get or set window width).
179func Test_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
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100187 call assert_equal(2, rubyeval('$curwin.width'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200188
189 bwipe
190endfunc
191
192" Test window.buffer (get buffer object of a window object).
193func Test_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
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100202 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'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200206
207 ruby $b1, $w1, $b2, $w2 = nil
208 %bwipe
209endfunc
210
211" Test Vim::Window.current (get current window object)
212func Test_Vim_window_current()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100213 let cw = rubyeval('$curwin')
214 call assert_equal(cw, rubyeval('Vim::Window.current'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200215 call assert_match('^#<Vim::Window:0x\x\+>$', cw)
216endfunc
217
218" Test Vim::Window.count (number of windows)
219func Test_Vim_window_count()
220 new Xfoo1
221 new Xfoo2
222 split
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100223 call assert_equal(4, rubyeval('Vim::Window.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200224 %bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100225 call assert_equal(1, rubyeval('Vim::Window.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200226endfunc
227
228" Test Vim::Window[n] (get window object of window n)
229func Test_Vim_window_get()
230 new Xfoo1
231 new Xfoo2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100232 call assert_match('Xfoo2$', rubyeval('Vim::Window[0].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200233 wincmd j
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100234 call assert_match('Xfoo1$', rubyeval('Vim::Window[1].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200235 wincmd j
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100236 call assert_equal(v:null, rubyeval('Vim::Window[2].buffer.name'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200237 %bwipe
238endfunc
239
240" Test Vim::Buffer.current (return the buffer object of current buffer)
241func Test_Vim_buffer_current()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100242 let cb = rubyeval('$curbuf')
243 call assert_equal(cb, rubyeval('Vim::Buffer.current'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200244 call assert_match('^#<Vim::Buffer:0x\x\+>$', cb)
245endfunc
246
247" Test Vim::Buffer:.count (return the number of buffers)
248func Test_Vim_buffer_count()
249 new Xfoo1
250 new Xfoo2
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100251 call assert_equal(3, rubyeval('Vim::Buffer.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200252 %bwipe
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100253 call assert_equal(1, rubyeval('Vim::Buffer.count'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200254endfunc
255
256" Test Vim::buffer[n] (return the buffer object of buffer number n)
257func Test_Vim_buffer_get()
258 new Xfoo1
259 new Xfoo2
260
261 " Index of Vim::Buffer[n] goes from 0 to the number of buffers.
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100262 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'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200265 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_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_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_Vim_evaluate()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100290 call assert_equal(123, rubyeval('Vim::evaluate("123")'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200291 " Vim::evaluate("123").class gives Integer or Fixnum depending
292 " on versions of Ruby.
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100293 call assert_match('^Integer\|Fixnum$', rubyeval('Vim::evaluate("123").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200294
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100295 call assert_equal(1.23, rubyeval('Vim::evaluate("1.23")'))
296 call assert_equal('Float', rubyeval('Vim::evaluate("1.23").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200297
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100298 call assert_equal('foo', rubyeval('Vim::evaluate("\"foo\"")'))
299 call assert_equal('String', rubyeval('Vim::evaluate("\"foo\"").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200300
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100301 call assert_equal(["\x01\xAB"], rubyeval('Vim::evaluate("0z01ab").unpack("M")'))
302 call assert_equal('String', rubyeval('Vim::evaluate("0z01ab").class'))
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100303
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100304 call assert_equal([1, 2], rubyeval('Vim::evaluate("[1, 2]")'))
305 call assert_equal('Array', rubyeval('Vim::evaluate("[1, 2]").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200306
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100307 call assert_equal({'1': 2}, rubyeval('Vim::evaluate("{1:2}")'))
308 call assert_equal('Hash', rubyeval('Vim::evaluate("{1:2}").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200309
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100310 call assert_equal(v:null, rubyeval('Vim::evaluate("v:null")'))
311 call assert_equal('NilClass', rubyeval('Vim::evaluate("v:null").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200312
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100313 call assert_equal(v:null, rubyeval('Vim::evaluate("v:none")'))
314 call assert_equal('NilClass', rubyeval('Vim::evaluate("v:none").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200315
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100316 call assert_equal(v:true, rubyeval('Vim::evaluate("v:true")'))
317 call assert_equal('TrueClass', rubyeval('Vim::evaluate("v:true").class'))
318 call assert_equal(v:false, rubyeval('Vim::evaluate("v:false")'))
319 call assert_equal('FalseClass',rubyeval('Vim::evaluate("v:false").class'))
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200320endfunc
321
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100322func Test_Vim_blob()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100323 call assert_equal('0z', rubyeval('Vim::blob("")'))
324 call assert_equal('0z31326162', rubyeval('Vim::blob("12ab")'))
325 call assert_equal('0z00010203', rubyeval('Vim::blob("\x00\x01\x02\x03")'))
326 call assert_equal('0z8081FEFF', rubyeval('Vim::blob("\x80\x81\xfe\xff")'))
Bram Moolenaar0d13cce2019-02-23 14:23:03 +0100327endfunc
328
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200329func Test_Vim_evaluate_list()
330 call setline(line('$'), ['2 line 2'])
331 ruby Vim.command("normal /^2\n")
332 let l = ["abc", "def"]
333 ruby << EOF
334 curline = $curbuf.line_number
335 l = Vim.evaluate("l");
336 $curbuf.append(curline, l.join("\n"))
337EOF
338 normal j
339 .rubydo $_ = $_.gsub(/\n/, '/')
340 call assert_equal('abc/def', getline('$'))
341endfunc
342
343func Test_Vim_evaluate_dict()
344 let d = {'a': 'foo', 'b': 123}
345 redir => l:out
346 ruby d = Vim.evaluate("d"); print d
347 redir END
348 call assert_equal(['{"a"=>"foo", "b"=>123}'], split(l:out, "\n"))
349endfunc
350
351" Test Vim::message({msg}) (display message {msg})
352func Test_Vim_message()
353 ruby Vim::message('A message')
354 let messages = split(execute('message'), "\n")
355 call assert_equal('A message', messages[-1])
356endfunc
357
358func Test_print()
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100359 func RubyPrint(expr)
360 return trim(execute('ruby print ' . a:expr))
361 endfunc
362
363 call assert_equal('123', RubyPrint('123'))
364 call assert_equal('1.23', RubyPrint('1.23'))
365 call assert_equal('Hello World!', RubyPrint('"Hello World!"'))
366 call assert_equal('[1, 2]', RubyPrint('[1, 2]'))
367 call assert_equal('{"k1"=>"v1", "k2"=>"v2"}', RubyPrint('({"k1" => "v1", "k2" => "v2"})'))
368 call assert_equal('true', RubyPrint('true'))
369 call assert_equal('false', RubyPrint('false'))
370 call assert_equal('', RubyPrint('nil'))
371 call assert_match('Vim', RubyPrint('Vim'))
372 call assert_match('Module', RubyPrint('Vim.class'))
373
374 delfunc RubyPrint
Bram Moolenaaredd6aac2018-07-28 17:29:19 +0200375endfunc
376
377func Test_p()
378 ruby p 'Just a test'
379 let messages = split(execute('message'), "\n")
380 call assert_equal('"Just a test"', messages[-1])
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200381
382 " Check return values of p method
383
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100384 call assert_equal(123, rubyeval('p(123)'))
385 call assert_equal([1, 2, 3], rubyeval('p(1, 2, 3)'))
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200386
387 " Avoid the "message maintainer" line.
388 let $LANG = ''
389 messages clear
Bram Moolenaare99be0e2019-03-26 22:51:09 +0100390 call assert_equal(v:true, rubyeval('p() == nil'))
Bram Moolenaar51e9fbf2018-08-11 14:24:11 +0200391
392 let messages = split(execute('message'), "\n")
393 call assert_equal(0, len(messages))
Bram Moolenaar53901442018-07-25 22:02:36 +0200394endfunc