aboutsummaryrefslogtreecommitdiff
path: root/test/functional/api
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-10-08 13:56:01 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-10-16 14:06:54 -0300
commit0c2ec77ae0c0bde70b168313f89fa3259682a056 (patch)
tree8ae4c703deff5a369cd35c7580351e320faa6d93 /test/functional/api
parent69561ea922ae6789703c06cbc245929d7c625db9 (diff)
downloadrneovim-0c2ec77ae0c0bde70b168313f89fa3259682a056.tar.gz
rneovim-0c2ec77ae0c0bde70b168313f89fa3259682a056.tar.bz2
rneovim-0c2ec77ae0c0bde70b168313f89fa3259682a056.zip
test: Use lua to perform sanity API checks
Sanity API checks made by the python-client in the api-python travis target were converted to lua and will now live in this repository. This will simplify performing breaking changes to the API as it won't be necessary to send parallel PRs the python-client.
Diffstat (limited to 'test/functional/api')
-rw-r--r--test/functional/api/buffer_spec.lua118
-rw-r--r--test/functional/api/server_notifications_spec.lua40
-rw-r--r--test/functional/api/server_requests_spec.lua68
-rw-r--r--test/functional/api/tabpage_spec.lua42
-rw-r--r--test/functional/api/vim_spec.lua108
-rw-r--r--test/functional/api/window_spec.lua124
6 files changed, 500 insertions, 0 deletions
diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua
new file mode 100644
index 0000000000..169d605b63
--- /dev/null
+++ b/test/functional/api/buffer_spec.lua
@@ -0,0 +1,118 @@
+-- Sanity checks for buffer_* API calls via msgpack-rpc
+local helpers = require('test.functional.helpers')
+local clear, nvim, buffer, curbuf, curwin, eq, ok =
+ helpers.clear, helpers.nvim, helpers.buffer, helpers.curbuf, helpers.curwin,
+ helpers.eq, helpers.ok
+
+describe('buffer_* functions', function()
+ before_each(clear)
+
+ describe('line_count, insert and del_line', function()
+ it('works', function()
+ eq(1, curbuf('line_count'))
+ curbuf('insert', -1, {'line'})
+ eq(2, curbuf('line_count'))
+ curbuf('insert', -1, {'line'})
+ eq(3, curbuf('line_count'))
+ curbuf('del_line', -1)
+ eq(2, curbuf('line_count'))
+ curbuf('del_line', -1)
+ curbuf('del_line', -1)
+ -- There's always at least one line
+ eq(1, curbuf('line_count'))
+ end)
+ end)
+
+
+ describe('{get,set,del}_line', function()
+ it('works', function()
+ eq('', curbuf('get_line', 0))
+ curbuf('set_line', 0, 'line1')
+ eq('line1', curbuf('get_line', 0))
+ curbuf('set_line', 0, 'line2')
+ eq('line2', curbuf('get_line', 0))
+ curbuf('del_line', 0)
+ eq('', curbuf('get_line', 0))
+ end)
+ end)
+
+
+ describe('{get,set}_line_slice', function()
+ it('works', function()
+ eq({''}, curbuf('get_line_slice', 0, -1, true, true))
+ -- Replace buffer
+ curbuf('set_line_slice', 0, -1, true, true, {'a', 'b', 'c'})
+ eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
+ eq({'b', 'c'}, curbuf('get_line_slice', 1, -1, true, true))
+ eq({'b'}, curbuf('get_line_slice', 1, 2, true, false))
+ eq({}, curbuf('get_line_slice', 1, 1, true, false))
+ eq({'a', 'b'}, curbuf('get_line_slice', 0, -1, true, false))
+ eq({'b'}, curbuf('get_line_slice', 1, -1, true, false))
+ eq({'b', 'c'}, curbuf('get_line_slice', -2, -1, true, true))
+ curbuf('set_line_slice', 1, 2, true, false, {'a', 'b', 'c'})
+ eq({'a', 'a', 'b', 'c', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
+ curbuf('set_line_slice', -1, -1, true, true, {'a', 'b', 'c'})
+ eq({'a', 'a', 'b', 'c', 'a', 'b', 'c'},
+ curbuf('get_line_slice', 0, -1, true, true))
+ curbuf('set_line_slice', 0, -3, true, false, {})
+ eq({'a', 'b', 'c'}, curbuf('get_line_slice', 0, -1, true, true))
+ curbuf('set_line_slice', 0, -1, true, true, {})
+ eq({''}, curbuf('get_line_slice', 0, -1, true, true))
+ end)
+ end)
+
+ describe('{get,set}_var', function()
+ it('works', function()
+ curbuf('set_var', 'lua', {1, 2, {['3'] = 1}})
+ eq({1, 2, {['3'] = 1}}, curbuf('get_var', 'lua'))
+ eq({1, 2, {['3'] = 1}}, nvim('eval', 'b:lua'))
+ end)
+ end)
+
+ describe('{get,set}_option', function()
+ it('works', function()
+ eq(8, curbuf('get_option', 'shiftwidth'))
+ curbuf('set_option', 'shiftwidth', 4)
+ eq(4, curbuf('get_option', 'shiftwidth'))
+ -- global-local option
+ curbuf('set_option', 'define', 'test')
+ eq('test', curbuf('get_option', 'define'))
+ -- Doesn't change the global value
+ eq([[^\s*#\s*define]], nvim('get_option', 'define'))
+ end)
+ end)
+
+ describe('{get,set}_name', function()
+ it('works', function()
+ nvim('command', 'new')
+ eq('', curbuf('get_name'))
+ local new_name = nvim('eval', 'resolve(tempname())')
+ curbuf('set_name', new_name)
+ eq(new_name, curbuf('get_name'))
+ nvim('command', 'w!')
+ local f = io.open(new_name)
+ ok(f ~= nil)
+ f:close()
+ os.remove(new_name)
+ end)
+ end)
+
+ describe('is_valid', function()
+ it('works', function()
+ nvim('command', 'new')
+ local b = nvim('get_current_buffer')
+ ok(buffer('is_valid', b))
+ nvim('command', 'bw!')
+ ok(not buffer('is_valid', b))
+ end)
+ end)
+
+ describe('get_mark', function()
+ it('works', function()
+ curbuf('insert', -1, {'a', 'bit of', 'text'})
+ curwin('set_cursor', {3, 4})
+ nvim('command', 'mark V')
+ eq({3, 0}, curbuf('get_mark', 'V'))
+ end)
+ end)
+end)
diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua
new file mode 100644
index 0000000000..6791fbb4ba
--- /dev/null
+++ b/test/functional/api/server_notifications_spec.lua
@@ -0,0 +1,40 @@
+-- Tests for nvim notifications
+local helpers = require('test.functional.helpers')
+local eq, clear, eval, execute, nvim, next_message =
+ helpers.eq, helpers.clear, helpers.eval, helpers.execute, helpers.nvim,
+ helpers.next_message
+
+describe('notify', function()
+ local channel
+
+ before_each(function()
+ clear()
+ channel = nvim('get_api_info')[1]
+ end)
+
+ describe('passing a valid channel id', function()
+ it('sends the notification/args to the corresponding channel', function()
+ eval('rpcnotify('..channel..', "test-event", 1, 2, 3)')
+ eq({'notification', 'test-event', {1, 2, 3}}, next_message())
+ execute('au FileType lua call rpcnotify('..channel..', "lua!")')
+ execute('set filetype=lua')
+ eq({'notification', 'lua!', {}}, next_message())
+ end)
+ end)
+
+ describe('passing 0 as the channel id', function()
+ it('sends the notification/args to all subscribed channels', function()
+ nvim('subscribe', 'event2')
+ eval('rpcnotify(0, "event1", 1, 2, 3)')
+ eval('rpcnotify(0, "event2", 4, 5, 6)')
+ eval('rpcnotify(0, "event2", 7, 8, 9)')
+ eq({'notification', 'event2', {4, 5, 6}}, next_message())
+ eq({'notification', 'event2', {7, 8, 9}}, next_message())
+ nvim('unsubscribe', 'event2')
+ nvim('subscribe', 'event1')
+ eval('rpcnotify(0, "event2", 10, 11, 12)')
+ eval('rpcnotify(0, "event1", 13, 14, 15)')
+ eq({'notification', 'event1', {13, 14, 15}}, next_message())
+ end)
+ end)
+end)
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
new file mode 100644
index 0000000000..b6f56a868c
--- /dev/null
+++ b/test/functional/api/server_requests_spec.lua
@@ -0,0 +1,68 @@
+-- Tests for some server->client RPC scenarios. Note that unlike with
+-- `rpcnotify`, to evaluate `rpcrequest` calls we need the client event loop to
+-- be running.
+local helpers = require('test.functional.helpers')
+local clear, nvim, eval, eq, run, stop = helpers.clear, helpers.nvim,
+ helpers.eval, helpers.eq, helpers.run, helpers.stop
+
+
+describe('server -> client', function()
+ local cid
+
+ before_each(function()
+ clear()
+ cid = nvim('get_api_info')[1]
+ end)
+
+ describe('simple call', function()
+ it('works', function()
+ local function on_setup()
+ eq({4, 5, 6}, eval('rpcrequest('..cid..', "scall", 1, 2, 3)'))
+ stop()
+ end
+
+ local function on_request(method, args)
+ eq('scall', method)
+ eq({1, 2, 3}, args)
+ nvim('command', 'let g:result = [4, 5, 6]')
+ return eval('g:result')
+ end
+ run(on_request, nil, on_setup)
+ end)
+ end)
+
+ describe('recursive call', function()
+ it('works', function()
+ local function on_setup()
+ nvim('set_var', 'result1', 0)
+ nvim('set_var', 'result2', 0)
+ nvim('set_var', 'result3', 0)
+ nvim('set_var', 'result4', 0)
+ nvim('command', 'let g:result1 = rpcrequest('..cid..', "rcall", 2)')
+ eq(4, nvim('get_var', 'result1'))
+ eq(8, nvim('get_var', 'result2'))
+ eq(16, nvim('get_var', 'result3'))
+ eq(32, nvim('get_var', 'result4'))
+ stop()
+ end
+
+ local function on_request(method, args)
+ eq('rcall', method)
+ local n = unpack(args) * 2
+ if n <= 16 then
+ local cmd
+ if n == 4 then
+ cmd = 'let g:result2 = rpcrequest('..cid..', "rcall", '..n..')'
+ elseif n == 8 then
+ cmd = 'let g:result3 = rpcrequest('..cid..', "rcall", '..n..')'
+ elseif n == 16 then
+ cmd = 'let g:result4 = rpcrequest('..cid..', "rcall", '..n..')'
+ end
+ nvim('command', cmd)
+ end
+ return n
+ end
+ run(on_request, nil, on_setup)
+ end)
+ end)
+end)
diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua
new file mode 100644
index 0000000000..9937e0c72e
--- /dev/null
+++ b/test/functional/api/tabpage_spec.lua
@@ -0,0 +1,42 @@
+-- Sanity checks for tabpage_* API calls via msgpack-rpc
+local helpers = require('test.functional.helpers')
+local clear, nvim, tabpage, curtab, eq, ok =
+ helpers.clear, helpers.nvim, helpers.tabpage, helpers.curtab, helpers.eq,
+ helpers.ok
+
+describe('tabpage_* functions', function()
+ before_each(clear)
+
+ describe('get_windows and get_window', function()
+ it('works', function()
+ nvim('command', 'tabnew')
+ nvim('command', 'vsplit')
+ local tab1, tab2 = unpack(nvim('get_tabpages'))
+ local win1, win2, win3 = unpack(nvim('get_windows'))
+ eq({win1}, tabpage('get_windows', tab1))
+ eq({win2, win3}, tabpage('get_windows', tab2))
+ eq(win2, tabpage('get_window', tab2))
+ nvim('set_current_window', win3)
+ eq(win3, tabpage('get_window', tab2))
+ end)
+ end)
+
+ describe('{get,set}_var', function()
+ it('works', function()
+ curtab('set_var', 'lua', {1, 2, {['3'] = 1}})
+ eq({1, 2, {['3'] = 1}}, curtab('get_var', 'lua'))
+ eq({1, 2, {['3'] = 1}}, nvim('eval', 't:lua'))
+ end)
+ end)
+
+ describe('is_valid', function()
+ it('works', function()
+ nvim('command', 'tabnew')
+ local tab = nvim('get_tabpages')[2]
+ nvim('set_current_tabpage', tab)
+ ok(tabpage('is_valid', tab))
+ nvim('command', 'tabclose')
+ ok(not tabpage('is_valid', tab))
+ end)
+ end)
+end)
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
new file mode 100644
index 0000000000..6a61607d2e
--- /dev/null
+++ b/test/functional/api/vim_spec.lua
@@ -0,0 +1,108 @@
+-- Sanity checks for vim_* API calls via msgpack-rpc
+local helpers = require('test.functional.helpers')
+local clear, nvim, eq, ok = helpers.clear, helpers.nvim, helpers.eq, helpers.ok
+
+
+describe('vim_* functions', function()
+ before_each(clear)
+
+ describe('command', function()
+ it('works', function()
+ local fname = os.tmpname()
+ nvim('command', 'new')
+ nvim('command', 'edit '..fname)
+ nvim('command', 'normal itesting\napi')
+ nvim('command', 'w')
+ local f = io.open(fname)
+ ok(f ~= nil)
+ eq('testing\napi\n', f:read('*a'))
+ f:close()
+ os.remove(fname)
+ end)
+ end)
+
+ describe('eval', function()
+ it('works', function()
+ nvim('command', 'let g:v1 = "a"')
+ nvim('command', 'let g:v2 = [1, 2, {"v3": 3}]')
+ eq({v1 = 'a', v2 = {1, 2, {v3 = 3}}}, nvim('eval', 'g:'))
+ end)
+ end)
+
+ describe('strwidth', function()
+ it('works', function()
+ eq(3, nvim('strwidth', 'abc'))
+ -- 6 + (neovim)
+ -- 19 * 2 (each japanese character occupies two cells)
+ eq(44, nvim('strwidth', 'neovimのデザインかなりまともなのになってる。'))
+ end)
+ end)
+
+ describe('{get,set}_current_line', function()
+ it('works', function()
+ eq('', nvim('get_current_line'))
+ nvim('set_current_line', 'abc')
+ eq('abc', nvim('get_current_line'))
+ end)
+ end)
+
+ describe('{get,set}_var', function()
+ it('works', function()
+ nvim('set_var', 'lua', {1, 2, {['3'] = 1}})
+ eq({1, 2, {['3'] = 1}}, nvim('get_var', 'lua'))
+ eq({1, 2, {['3'] = 1}}, nvim('eval', 'g:lua'))
+ end)
+ end)
+
+ describe('{get,set}_option', function()
+ it('works', function()
+ ok(nvim('get_option', 'equalalways'))
+ nvim('set_option', 'equalalways', false)
+ ok(not nvim('get_option', 'equalalways'))
+ end)
+ end)
+
+ describe('{get,set}_current_buffer and get_buffers', function()
+ it('works', function()
+ eq(1, #nvim('get_buffers'))
+ eq(nvim('get_buffers')[1], nvim('get_current_buffer'))
+ nvim('command', 'new')
+ eq(2, #nvim('get_buffers'))
+ eq(nvim('get_buffers')[2], nvim('get_current_buffer'))
+ nvim('set_current_buffer', nvim('get_buffers')[1])
+ eq(nvim('get_buffers')[1], nvim('get_current_buffer'))
+ end)
+ end)
+
+ describe('{get,set}_current_window and get_windows', function()
+ it('works', function()
+ eq(1, #nvim('get_windows'))
+ eq(nvim('get_windows')[1], nvim('get_current_window'))
+ nvim('command', 'vsplit')
+ nvim('command', 'split')
+ eq(3, #nvim('get_windows'))
+ eq(nvim('get_windows')[1], nvim('get_current_window'))
+ nvim('set_current_window', nvim('get_windows')[2])
+ eq(nvim('get_windows')[2], nvim('get_current_window'))
+ end)
+ end)
+
+ describe('{get,set}_current_tabpage and get_tabpages', function()
+ it('works', function()
+ eq(1, #nvim('get_tabpages'))
+ eq(nvim('get_tabpages')[1], nvim('get_current_tabpage'))
+ nvim('command', 'tabnew')
+ eq(2, #nvim('get_tabpages'))
+ eq(2, #nvim('get_windows'))
+ eq(nvim('get_windows')[2], nvim('get_current_window'))
+ eq(nvim('get_tabpages')[2], nvim('get_current_tabpage'))
+ nvim('set_current_window', nvim('get_windows')[1])
+ -- Switching window also switches tabpages if necessary
+ eq(nvim('get_tabpages')[1], nvim('get_current_tabpage'))
+ eq(nvim('get_windows')[1], nvim('get_current_window'))
+ nvim('set_current_tabpage', nvim('get_tabpages')[2])
+ eq(nvim('get_tabpages')[2], nvim('get_current_tabpage'))
+ eq(nvim('get_windows')[2], nvim('get_current_window'))
+ end)
+ end)
+end)
diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua
new file mode 100644
index 0000000000..a3814cce0f
--- /dev/null
+++ b/test/functional/api/window_spec.lua
@@ -0,0 +1,124 @@
+-- Sanity checks for window_* API calls via msgpack-rpc
+local helpers = require('test.functional.helpers')
+local clear, nvim, buffer, curbuf, curbuf_contents, window, curwin, eq, neq,
+ ok = helpers.clear, helpers.nvim, helpers.buffer, helpers.curbuf,
+ helpers.curbuf_contents, helpers.window, helpers.curwin, helpers.eq,
+ helpers.neq, helpers.ok
+
+describe('window_* functions', function()
+ before_each(clear)
+
+ describe('get_buffer', function()
+ it('works', function()
+ eq(curbuf(), window('get_buffer', nvim('get_windows')[1]))
+ nvim('command', 'new')
+ nvim('set_current_window', nvim('get_windows')[2])
+ eq(curbuf(), window('get_buffer', nvim('get_windows')[2]))
+ neq(window('get_buffer', nvim('get_windows')[1]),
+ window('get_buffer', nvim('get_windows')[2]))
+ end)
+ end)
+
+ describe('{get,set}_cursor', function()
+ it('works', function()
+ eq({1, 0}, curwin('get_cursor'))
+ nvim('command', 'normal ityping\027o some text')
+ eq('typing\n some text', curbuf_contents())
+ eq({2, 10}, curwin('get_cursor'))
+ curwin('set_cursor', {2, 6})
+ nvim('command', 'normal i dumb')
+ eq('typing\n some dumb text', curbuf_contents())
+ end)
+ end)
+
+ describe('{get,set}_height', function()
+ it('works', function()
+ nvim('command', 'vsplit')
+ eq(window('get_height', nvim('get_windows')[2]),
+ window('get_height', nvim('get_windows')[1]))
+ nvim('set_current_window', nvim('get_windows')[2])
+ nvim('command', 'split')
+ eq(window('get_height', nvim('get_windows')[2]),
+ window('get_height', nvim('get_windows')[1]) / 2)
+ window('set_height', nvim('get_windows')[2], 2)
+ eq(2, window('get_height', nvim('get_windows')[2]))
+ end)
+ end)
+
+ describe('{get,set}_width', function()
+ it('works', function()
+ nvim('command', 'split')
+ eq(window('get_width', nvim('get_windows')[2]),
+ window('get_width', nvim('get_windows')[1]))
+ nvim('set_current_window', nvim('get_windows')[2])
+ nvim('command', 'vsplit')
+ eq(window('get_width', nvim('get_windows')[2]),
+ window('get_width', nvim('get_windows')[1]) / 2)
+ window('set_width', nvim('get_windows')[2], 2)
+ eq(2, window('get_width', nvim('get_windows')[2]))
+ end)
+ end)
+
+ describe('{get,set}_var', function()
+ it('works', function()
+ curwin('set_var', 'lua', {1, 2, {['3'] = 1}})
+ eq({1, 2, {['3'] = 1}}, curwin('get_var', 'lua'))
+ eq({1, 2, {['3'] = 1}}, nvim('eval', 'w:lua'))
+ end)
+ end)
+
+ describe('{get,set}_option', function()
+ it('works', function()
+ curwin('set_option', 'colorcolumn', '4,3')
+ eq('4,3', curwin('get_option', 'colorcolumn'))
+ -- global-local option
+ curwin('set_option', 'statusline', 'window-status')
+ eq('window-status', curwin('get_option', 'statusline'))
+ eq('', nvim('get_option', 'statusline'))
+ end)
+ end)
+
+ describe('get_position', function()
+ it('works', function()
+ local height = window('get_height', nvim('get_windows')[1])
+ local width = window('get_width', nvim('get_windows')[1])
+ nvim('command', 'split')
+ nvim('command', 'vsplit')
+ eq({0, 0}, window('get_position', nvim('get_windows')[1]))
+ local vsplit_pos = math.floor(width / 2)
+ local split_pos = math.floor(height / 2)
+ local win2row, win2col =
+ unpack(window('get_position', nvim('get_windows')[2]))
+ local win3row, win3col =
+ unpack(window('get_position', nvim('get_windows')[3]))
+ eq(0, win2row)
+ eq(0, win3col)
+ ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1)
+ ok(split_pos - 1 <= win3row and win3row <= split_pos + 1)
+ end)
+ end)
+
+ describe('get_position', function()
+ it('works', function()
+ nvim('command', 'tabnew')
+ nvim('command', 'vsplit')
+ eq(window('get_tabpage',
+ nvim('get_windows')[1]), nvim('get_tabpages')[1])
+ eq(window('get_tabpage',
+ nvim('get_windows')[2]), nvim('get_tabpages')[2])
+ eq(window('get_tabpage',
+ nvim('get_windows')[3]), nvim('get_tabpages')[2])
+ end)
+ end)
+
+ describe('is_valid', function()
+ it('works', function()
+ nvim('command', 'split')
+ local win = nvim('get_windows')[2]
+ nvim('set_current_window', win)
+ ok(window('is_valid', win))
+ nvim('command', 'close')
+ ok(not window('is_valid', win))
+ end)
+ end)
+end)