aboutsummaryrefslogtreecommitdiff
path: root/test/functional/provider/ruby_spec.lua
blob: 716ef296beec110f4c94c42349f5b110ecfd72ea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
local t = require('test.testutil')
local n = require('test.functional.testnvim')()

local assert_alive = n.assert_alive
local clear = n.clear
local command = n.command
local eq = t.eq
local exc_exec = n.exc_exec
local expect = n.expect
local feed = n.feed
local feed_command = n.feed_command
local fn = n.fn
local insert = n.insert
local api = n.api
local missing_provider = n.missing_provider
local matches = t.matches
local write_file = t.write_file
local pcall_err = t.pcall_err

do
  clear()
  local reason = missing_provider('ruby')
  if reason then
    it(':ruby reports E319 if provider is missing', function()
      local expected = [[Vim%(ruby.*%):E319: No "ruby" provider found.*]]
      matches(expected, pcall_err(command, 'ruby puts "foo"'))
      matches(expected, pcall_err(command, 'rubyfile foo'))
    end)
    pending(string.format('Missing neovim RubyGem (%s)', reason), function() end)
    return
  end
end

before_each(function()
  clear()
end)

describe('ruby feature test', function()
  it('works', function()
    eq(1, fn.has('ruby'))
  end)
end)

describe(':ruby command', function()
  it('evaluates ruby', function()
    command('ruby VIM.command("let g:set_by_ruby = [100, 0]")')
    eq({ 100, 0 }, api.nvim_get_var('set_by_ruby'))
  end)

  it('supports nesting', function()
    command([[ruby VIM.command('ruby VIM.command("let set_by_nested_ruby = 555")')]])
    eq(555, api.nvim_get_var('set_by_nested_ruby'))
  end)
end)

describe(':rubyfile command', function()
  it('evaluates a ruby file', function()
    local fname = 'rubyfile.rb'
    write_file(fname, 'VIM.command("let set_by_rubyfile = 123")')
    command('rubyfile rubyfile.rb')
    eq(123, api.nvim_get_var('set_by_rubyfile'))
    os.remove(fname)
  end)
end)

describe(':rubydo command', function()
  it('exposes the $_ variable for modifying lines', function()
    insert('abc\ndef\nghi\njkl')
    expect([[
      abc
      def
      ghi
      jkl]])

    feed('ggjvj:rubydo $_.upcase!<CR>')
    expect([[
      abc
      DEF
      GHI
      jkl]])
  end)

  it('operates on all lines when not given a range', function()
    insert('abc\ndef\nghi\njkl')
    expect([[
      abc
      def
      ghi
      jkl]])

    feed(':rubydo $_.upcase!<CR>')
    expect([[
      ABC
      DEF
      GHI
      JKL]])
  end)

  it('does not modify the buffer if no changes are made', function()
    command('normal :rubydo 42')
    eq(false, api.nvim_get_option_value('modified', {}))
  end)
end)

describe('ruby provider', function()
  it('RPC call to expand("<afile>") during BufDelete #5245 #5617', function()
    n.add_builddir_to_rtp()
    command([=[autocmd BufDelete * ruby VIM::evaluate('expand("<afile>")')]=])
    feed_command('help help')
    assert_alive()
  end)
end)

describe('rubyeval()', function()
  it('evaluates ruby objects', function()
    eq({ 1, 2, { ['key'] = 'val' } }, fn.rubyeval('[1, 2, {key: "val"}]'))
  end)

  it('returns nil for empty strings', function()
    eq(vim.NIL, fn.rubyeval(''))
  end)

  it('errors out when given non-string', function()
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(10)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(v:_null_dict)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(v:_null_list)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(0.0)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(function("tr"))'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(v:true)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(v:false)'))
    eq('Vim(call):E474: Invalid argument', exc_exec('call rubyeval(v:null)'))
  end)
end)