neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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