diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/functional/runtime/autoload/rpc/define_spec.lua | 365 | 
1 files changed, 365 insertions, 0 deletions
diff --git a/test/functional/runtime/autoload/rpc/define_spec.lua b/test/functional/runtime/autoload/rpc/define_spec.lua new file mode 100644 index 0000000000..a85ba4d37b --- /dev/null +++ b/test/functional/runtime/autoload/rpc/define_spec.lua @@ -0,0 +1,365 @@ +local helpers = require('test.functional.helpers') +local eval, command, nvim = helpers.eval, helpers.command, helpers.nvim +local eq, run, stop = helpers.eq, helpers.run, helpers.stop +local clear, feed = helpers.clear, helpers.feed + + +local function get_prefix(sync) +  if sync then +    return 'sync' +  end +  return 'async' +end + + +local function call(fn, args) +  command('call '..fn..'('..args..')') +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) + +      describe('without options', function() +        it('ok', 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) +      end) + +      describe('with nargs', function() +        it('ok', function() +          call(fn, args..', {"nargs": "*"}') +          local function on_setup() +            command('RpcCommand arg1 arg2 arg3') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg1', 'arg2', 'arg3'}, args[1]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with range', function() +        it('ok', function() +          call(fn,args..', {"range": ""}') +          local function on_setup() +            command('1,1RpcCommand') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({1, 1}, args[1]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with nargs/range', function() +        it('ok', function() +          call(fn, args..', {"nargs": "1", "range": ""}') +          local function on_setup() +            command('1,1RpcCommand arg') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg'}, args[1]) +            eq({1, 1}, args[2]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with nargs/count', function() +        it('ok', function() +          call(fn, args..', {"nargs": "1", "range": "5"}') +          local function on_setup() +            command('5RpcCommand arg') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg'}, args[1]) +            eq(5, args[2]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with nargs/count/bang', function() +        it('ok', function() +          call(fn, args..', {"nargs": "1", "range": "5", "bang": ""}') +          local function on_setup() +            command('5RpcCommand! arg') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg'}, args[1]) +            eq(5, args[2]) +            eq(1, args[3]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with nargs/count/bang/register', function() +        it('ok', function() +          call(fn, args..', {"nargs": "1", "range": "5", "bang": "",'.. +                     ' "register": ""}') +          local function on_setup() +            command('5RpcCommand! b arg') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg'}, args[1]) +            eq(5, args[2]) +            eq(1, args[3]) +            eq('b', args[4]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with nargs/count/bang/register/eval', function() +        it('ok', function() +          call(fn, args..', {"nargs": "1", "range": "5", "bang": "",'.. +                     ' "register": "", "eval": "@<reg>"}') +          local function on_setup() +            command('let @b = "regb"') +            command('5RpcCommand! b arg') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq({'arg'}, args[1]) +            eq(5, args[2]) +            eq(1, args[3]) +            eq('b', args[4]) +            eq('regb', args[5]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      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) + +      describe('without options', function() +        it('ok', function() +          call(fn, args..', {}') +          local function on_setup() +            command('doautocmd BufEnter x.c') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with eval', function() +        it('ok', function() +          call(fn, args..[[, {'eval': 'expand("<afile>")'}]]) +          local function on_setup() +            command('doautocmd BufEnter x.c') +          end + +          local function handler(method, args) +            eq('test-handler', method) +            eq('x.c', args[1]) +            return '' +          end + +          runx(sync, handler, on_setup) +        end) +      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) + +      describe('without options', function() +        it('ok', 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, args) +            eq('test-handler', method) +            eq({{1, 'a', {'b', 'c'}}}, args) +            return 'rv' +          end + +          runx(sync, handler, on_setup) +        end) +      end) + +      describe('with eval', function() +        it('ok', 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, args) +            eq('test-handler', method) +            eq({{1, 'a', {'b', 'c'}}, 4}, args) +            return 'rv' +          end + +          runx(sync, handler, on_setup) +        end) +      end) +    end) +  end) +end + +local function channel() +  return nvim('get_api_info')[1] +end + +local function host() +  return '"busted"' +end + +local function register() +  eval('rpc#host#Register("busted", '..channel()..')') +end + +command_specs_for('rpc#define#CommandOnChannel', true, channel) +command_specs_for('rpc#define#CommandOnChannel', false, channel) +command_specs_for('rpc#define#CommandOnHost', true, host, register) +command_specs_for('rpc#define#CommandOnHost', false, host, register) + +autocmd_specs_for('rpc#define#AutocmdOnChannel', true, channel) +autocmd_specs_for('rpc#define#AutocmdOnChannel', false, channel) +autocmd_specs_for('rpc#define#AutocmdOnHost', true, host, register) +autocmd_specs_for('rpc#define#AutocmdOnHost', false, host, register) + +function_specs_for('rpc#define#FunctionOnChannel', true, channel) +function_specs_for('rpc#define#FunctionOnChannel', false, channel) +function_specs_for('rpc#define#FunctionOnHost', true, host, register) +function_specs_for('rpc#define#FunctionOnHost', false, host, register)  | 
