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