mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	 a66d63f36e
			
		
	
	a66d63f36e
	
	
	
		
			
			fbd6a86 changes the behavior of :command-range and no longer allows arbitrary numbers. Adjust tests to reflect this behavior.
		
			
				
	
	
		
			388 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			388 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local helpers = require('test.functional.helpers')(after_each)
 | |
| local eval, command, nvim = helpers.eval, helpers.command, helpers.nvim
 | |
| local eq, run, stop = helpers.eq, helpers.run, helpers.stop
 | |
| local clear = helpers.clear
 | |
| 
 | |
| local function get_prefix(sync)
 | |
|   if sync then
 | |
|     return 'sync'
 | |
|   end
 | |
|   return 'async'
 | |
| end
 | |
| 
 | |
| local function call(fn, arguments)
 | |
|   command('call '..fn..'('..arguments..')')
 | |
| end
 | |
| 
 | |
| local function clear_and_init(init)
 | |
|   return function()
 | |
|     clear()
 | |
|     if init then
 | |
|       init()
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| local function runx(sync, handler, on_setup)
 | |
|   local function setup_cb(...)
 | |
|     on_setup(...)
 | |
|     -- need to stop on setup callback because there's two session:request
 | |
|     -- calls in `request/helpers.lua`. The second call will always return
 | |
|     -- after pending notification/request callbacks are processed
 | |
|     stop()
 | |
|   end
 | |
|   local function handler_cb(...)
 | |
|     return handler(...)
 | |
|   end
 | |
|   if sync then
 | |
|     run(handler_cb, nil, setup_cb)
 | |
|   else
 | |
|     run(nil, handler_cb, setup_cb)
 | |
|   end
 | |
| end
 | |
| 
 | |
| local function command_specs_for(fn, sync, first_arg_factory, init)
 | |
|   local prefix = get_prefix(sync)
 | |
| 
 | |
|   describe(prefix..' command created by', function()
 | |
|     before_each(clear_and_init(init))
 | |
| 
 | |
|     describe(fn, function()
 | |
|       local args
 | |
| 
 | |
|       before_each(function()
 | |
|         args = first_arg_factory()..', "test-handler", '
 | |
|         if sync then
 | |
|           args = args .. '1'
 | |
|         else
 | |
|           args = args .. '0'
 | |
|         end
 | |
|         args = args..', "RpcCommand"'
 | |
|       end)
 | |
| 
 | |
|       it('without options', function()
 | |
|         call(fn, args..', {}')
 | |
|         local function on_setup()
 | |
|           command('RpcCommand')
 | |
|         end
 | |
| 
 | |
|         local function handler(method)
 | |
|           eq('test-handler', method)
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs', function()
 | |
|         call(fn, args..', {"nargs": "*"}')
 | |
|         local function on_setup()
 | |
|           command('RpcCommand arg1 arg2 arg3')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg1', 'arg2', 'arg3'}, arguments[1])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/double-quote', function()
 | |
|         call(fn, args..', {"nargs": "*"}')
 | |
|         local function on_setup()
 | |
|           command('RpcCommand "arg1" "arg2" "arg3"')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'"arg1"', '"arg2"', '"arg3"'}, arguments[1])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with range', function()
 | |
|         call(fn,args..', {"range": ""}')
 | |
|         local function on_setup()
 | |
|           command('1,1RpcCommand')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({1, 1}, arguments[1])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/range', function()
 | |
|         call(fn, args..', {"nargs": "1", "range": ""}')
 | |
|         local function on_setup()
 | |
|           command('1,1RpcCommand arg')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg'}, arguments[1])
 | |
|           eq({1, 1}, arguments[2])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/count', function()
 | |
|         call(fn, args..', {"nargs": "1", "count": "5"}')
 | |
|         local function on_setup()
 | |
|           command('5RpcCommand arg')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg'}, arguments[1])
 | |
|           eq(5, arguments[2])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/count/bang', function()
 | |
|         call(fn, args..', {"nargs": "1", "count": "5", "bang": ""}')
 | |
|         local function on_setup()
 | |
|           command('5RpcCommand! arg')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg'}, arguments[1])
 | |
|           eq(5, arguments[2])
 | |
|           eq(1, arguments[3])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/count/bang/register', function()
 | |
|         call(fn, args..', {"nargs": "1", "count": "5", "bang": "",'..
 | |
|         ' "register": ""}')
 | |
|         local function on_setup()
 | |
|           command('5RpcCommand! b arg')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg'}, arguments[1])
 | |
|           eq(5, arguments[2])
 | |
|           eq(1, arguments[3])
 | |
|           eq('b', arguments[4])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with nargs/count/bang/register/eval', function()
 | |
|         call(fn, args..', {"nargs": "1", "count": "5", "bang": "",'..
 | |
|         ' "register": "", "eval": "@<reg>"}')
 | |
|         local function on_setup()
 | |
|           command('let @b = "regb"')
 | |
|           command('5RpcCommand! b arg')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({'arg'}, arguments[1])
 | |
|           eq(5, arguments[2])
 | |
|           eq(1, arguments[3])
 | |
|           eq('b', arguments[4])
 | |
|           eq('regb', arguments[5])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
|     end)
 | |
|   end)
 | |
| end
 | |
| 
 | |
| 
 | |
| local function autocmd_specs_for(fn, sync, first_arg_factory, init)
 | |
|   local prefix = get_prefix(sync)
 | |
| 
 | |
|   describe(prefix..' autocmd created by', function()
 | |
|     before_each(clear_and_init(init))
 | |
| 
 | |
|     describe(fn, function()
 | |
|       local args
 | |
| 
 | |
|       before_each(function()
 | |
|         args = first_arg_factory()..', "test-handler", '
 | |
|         if sync then
 | |
|           args = args .. '1'
 | |
|         else
 | |
|           args = args .. '0'
 | |
|         end
 | |
|         args = args..', "BufEnter"'
 | |
|       end)
 | |
| 
 | |
|       it('without options', function()
 | |
|         call(fn, args..', {}')
 | |
|         local function on_setup()
 | |
|           command('doautocmd BufEnter x.c')
 | |
|         end
 | |
| 
 | |
|         local function handler(method)
 | |
|           eq('test-handler', method)
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with eval', function()
 | |
|         call(fn, args..[[, {'eval': 'expand("<afile>")'}]])
 | |
|         local function on_setup()
 | |
|           command('doautocmd BufEnter x.c')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq('x.c', arguments[1])
 | |
|           return ''
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
|     end)
 | |
|   end)
 | |
| end
 | |
| 
 | |
| 
 | |
| local function function_specs_for(fn, sync, first_arg_factory, init)
 | |
|   local prefix = get_prefix(sync)
 | |
| 
 | |
|   describe(prefix..' function created by', function()
 | |
|     before_each(clear_and_init(init))
 | |
| 
 | |
|     describe(fn, function()
 | |
|       local args
 | |
| 
 | |
|       before_each(function()
 | |
|         args = first_arg_factory()..', "test-handler", '
 | |
|         if sync then
 | |
|           args = args .. '1'
 | |
|         else
 | |
|           args = args .. '0'
 | |
|         end
 | |
|         args = args..', "TestFunction"'
 | |
|       end)
 | |
| 
 | |
|       it('without options', function()
 | |
|         call(fn, args..', {}')
 | |
|         local function on_setup()
 | |
|           if sync then
 | |
|             eq('rv', eval('TestFunction(1, "a", ["b", "c"])'))
 | |
|           else
 | |
|             eq(1, eval('TestFunction(1, "a", ["b", "c"])'))
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({{1, 'a', {'b', 'c'}}}, arguments)
 | |
|           return 'rv'
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with eval', function()
 | |
|         call(fn, args..[[, {'eval': '2 + 2'}]])
 | |
|         local function on_setup()
 | |
|           if sync then
 | |
|             eq('rv', eval('TestFunction(1, "a", ["b", "c"])'))
 | |
|           else
 | |
|             eq(1, eval('TestFunction(1, "a", ["b", "c"])'))
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({{1, 'a', {'b', 'c'}}, 4}, arguments)
 | |
|           return 'rv'
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with range', function()
 | |
|         helpers.insert([[
 | |
|           foo
 | |
|           bar
 | |
|           baz
 | |
|           zub]])
 | |
|         call(fn, args..[[, {'range': ''}]])
 | |
|         local function on_setup()
 | |
|           command('2,3call TestFunction(1, "a", ["b", "c"])')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({{1, 'a', {'b', 'c'}}, {2, 3}}, arguments)
 | |
|           return 'rv'
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
| 
 | |
|       it('with eval/range', function()
 | |
|         call(fn, args..[[, {'eval': '4', 'range': ''}]])
 | |
|         local function on_setup()
 | |
|           command('%call TestFunction(1, "a", ["b", "c"])')
 | |
|         end
 | |
| 
 | |
|         local function handler(method, arguments)
 | |
|           eq('test-handler', method)
 | |
|           eq({{1, 'a', {'b', 'c'}}, {1, 1}, 4}, arguments)
 | |
|           return 'rv'
 | |
|         end
 | |
| 
 | |
|         runx(sync, handler, on_setup)
 | |
|       end)
 | |
|     end)
 | |
|   end)
 | |
| end
 | |
| 
 | |
| local function channel()
 | |
|   return nvim('get_api_info')[1]
 | |
| end
 | |
| 
 | |
| local function host()
 | |
|   return '"busted"'
 | |
| end
 | |
| 
 | |
| local function register()
 | |
|   eval('remote#host#Register("busted", "busted", '..channel()..')')
 | |
| end
 | |
| 
 | |
| command_specs_for('remote#define#CommandOnChannel', true, channel)
 | |
| command_specs_for('remote#define#CommandOnChannel', false, channel)
 | |
| command_specs_for('remote#define#CommandOnHost', true, host, register)
 | |
| command_specs_for('remote#define#CommandOnHost', false, host, register)
 | |
| 
 | |
| autocmd_specs_for('remote#define#AutocmdOnChannel', true, channel)
 | |
| autocmd_specs_for('remote#define#AutocmdOnChannel', false, channel)
 | |
| autocmd_specs_for('remote#define#AutocmdOnHost', true, host, register)
 | |
| autocmd_specs_for('remote#define#AutocmdOnHost', false, host, register)
 | |
| 
 | |
| function_specs_for('remote#define#FunctionOnChannel', true, channel)
 | |
| function_specs_for('remote#define#FunctionOnChannel', false, channel)
 | |
| function_specs_for('remote#define#FunctionOnHost', true, host, register)
 | |
| function_specs_for('remote#define#FunctionOnHost', false, host, register)
 |