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