mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	Merge #9301 'runtime/lua'
This commit is contained in:
		
							
								
								
									
										73
									
								
								runtime/lua/vim/shared.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								runtime/lua/vim/shared.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | |||||||
|  | --- Shared functions | ||||||
|  | --    - Used by Nvim and tests | ||||||
|  | --    - Can run in vanilla Lua (do not require a running instance of Nvim) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | -- Checks if a list-like (vector) table contains `value`. | ||||||
|  | local function tbl_contains(t, value) | ||||||
|  |   if type(t) ~= 'table' then | ||||||
|  |     error('t must be a table') | ||||||
|  |   end | ||||||
|  |   for _,v in ipairs(t) do | ||||||
|  |     if v == value then | ||||||
|  |       return true | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   return false | ||||||
|  | end | ||||||
|  |  | ||||||
|  | --- Merges two or more map-like tables. | ||||||
|  | -- | ||||||
|  | --@see |extend()| | ||||||
|  | -- | ||||||
|  | -- behavior: Decides what to do if a key is found in more than one map: | ||||||
|  | --           "error": raise an error | ||||||
|  | --           "keep":  use value from the leftmost map | ||||||
|  | --           "force": use value from the rightmost map | ||||||
|  | local function tbl_extend(behavior, ...) | ||||||
|  |   if (behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force') then | ||||||
|  |     error('invalid "behavior": '..tostring(behavior)) | ||||||
|  |   end | ||||||
|  |   local ret = {} | ||||||
|  |   for i = 1, select('#', ...) do | ||||||
|  |     local tbl = select(i, ...) | ||||||
|  |     if tbl then | ||||||
|  |       for k, v in pairs(tbl) do | ||||||
|  |         if behavior ~= 'force' and ret[k] ~= nil then | ||||||
|  |           if behavior == 'error' then | ||||||
|  |             error('key found in more than one map: '..k) | ||||||
|  |           end  -- Else behavior is "keep". | ||||||
|  |         else | ||||||
|  |           ret[k] = v | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   return ret | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- Flattens a list-like table: unrolls and appends nested tables to table `t`. | ||||||
|  | local function tbl_flatten(t) | ||||||
|  |   -- From https://github.com/premake/premake-core/blob/master/src/base/table.lua | ||||||
|  |   local result = {} | ||||||
|  |   local function _tbl_flatten(_t) | ||||||
|  |     local n = #_t | ||||||
|  |     for i = 1, n do | ||||||
|  |       local v = _t[i] | ||||||
|  |       if type(v) == "table" then | ||||||
|  |         _tbl_flatten(v) | ||||||
|  |       elseif v then | ||||||
|  |         table.insert(result, v) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   _tbl_flatten(t) | ||||||
|  |   return result | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local module = { | ||||||
|  |   tbl_contains = tbl_contains, | ||||||
|  |   tbl_extend = tbl_extend, | ||||||
|  |   tbl_flatten = tbl_flatten, | ||||||
|  | } | ||||||
|  | return module | ||||||
| @@ -1,3 +1,39 @@ | |||||||
|  | -- Nvim-Lua stdlib: the `vim` module (:help lua-stdlib) | ||||||
|  | -- | ||||||
|  | -- Lua code lives in one of three places: | ||||||
|  | --    1. The runtime (`runtime/lua/vim/`). For "nice to have" features, e.g. | ||||||
|  | --       the `inspect` and `lpeg` modules. | ||||||
|  | --    2. The `vim.shared` module: code shared between Nvim and its test-suite. | ||||||
|  | --    3. Compiled-into Nvim itself (`src/nvim/lua/`). | ||||||
|  | -- | ||||||
|  | -- Guideline: "If in doubt, put it in the runtime". | ||||||
|  | -- | ||||||
|  | -- Most functions should live directly on `vim.`, not sub-modules. The only | ||||||
|  | -- "forbidden" names are those claimed by legacy `if_lua`: | ||||||
|  | --    $ vim | ||||||
|  | --    :lua for k,v in pairs(vim) do print(k) end | ||||||
|  | --    buffer | ||||||
|  | --    open | ||||||
|  | --    window | ||||||
|  | --    lastline | ||||||
|  | --    firstline | ||||||
|  | --    type | ||||||
|  | --    line | ||||||
|  | --    eval | ||||||
|  | --    dict | ||||||
|  | --    beep | ||||||
|  | --    list | ||||||
|  | --    command | ||||||
|  | -- | ||||||
|  | -- Reference (#6580): | ||||||
|  | --    - https://github.com/luafun/luafun | ||||||
|  | --    - https://github.com/rxi/lume | ||||||
|  | --    - http://leafo.net/lapis/reference/utilities.html | ||||||
|  | --    - https://github.com/torch/paths | ||||||
|  | --    - https://github.com/bakpakin/Fennel (pretty print, repl) | ||||||
|  | --    - https://github.com/howl-editor/howl/tree/master/lib/howl/util | ||||||
|  |  | ||||||
|  |  | ||||||
| -- Internal-only until comments in #8107 are addressed. | -- Internal-only until comments in #8107 are addressed. | ||||||
| -- Returns: | -- Returns: | ||||||
| --    {errcode}, {output} | --    {errcode}, {output} | ||||||
| @@ -187,10 +223,14 @@ deepcopy = function(orig) | |||||||
|   return deepcopy_funcs[type(orig)](orig) |   return deepcopy_funcs[type(orig)](orig) | ||||||
| end | end | ||||||
|  |  | ||||||
| local function __index(table, key) | local function __index(t, key) | ||||||
|   if key == "inspect" then |   if key == 'inspect' then | ||||||
|     table.inspect = require("vim.inspect") |     t.inspect = require('vim.inspect') | ||||||
|     return table.inspect |     return t.inspect | ||||||
|  |   elseif require('vim.shared')[key] ~= nil then | ||||||
|  |     -- Expose all `vim.shared` functions on the `vim` module. | ||||||
|  |     t[key] = require('vim.shared')[key] | ||||||
|  |     return t[key] | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | " Also used by: test/functional/helpers.lua | ||||||
|  |  | ||||||
| function! s:load_factor() abort | function! s:load_factor() abort | ||||||
|   let timeout = 200 |   let timeout = 200 | ||||||
|   let times = [] |   let times = [] | ||||||
| @@ -23,8 +25,8 @@ function! s:load_factor() abort | |||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| " Compute load factor only once. | " Compute load factor only once. | ||||||
| let s:load_factor = s:load_factor() | let g:test_load_factor = s:load_factor() | ||||||
|  |  | ||||||
| function! LoadAdjust(num) abort | function! LoadAdjust(num) abort | ||||||
|   return float2nr(ceil(a:num * s:load_factor)) |   return float2nr(ceil(a:num * g:test_load_factor)) | ||||||
| endfunction | endfunction | ||||||
|   | |||||||
| @@ -15,17 +15,13 @@ func MyHandlerWithLists(lists, timer) | |||||||
|   let x = string(a:lists) |   let x = string(a:lists) | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
| func s:assert_inrange(lower, upper, actual) |  | ||||||
|   return assert_inrange(a:lower, LoadAdjust(a:upper), a:actual) |  | ||||||
| endfunc |  | ||||||
|  |  | ||||||
| func Test_oneshot() | func Test_oneshot() | ||||||
|   let g:val = 0 |   let g:val = 0 | ||||||
|   let timer = timer_start(50, 'MyHandler') |   let timer = timer_start(50, 'MyHandler') | ||||||
|   let slept = WaitFor('g:val == 1') |   let slept = WaitFor('g:val == 1') | ||||||
|   call assert_equal(1, g:val) |   call assert_equal(1, g:val) | ||||||
|   if has('reltime') |   if has('reltime') | ||||||
|     call s:assert_inrange(40, 120, slept) |     call assert_inrange(40, LoadAdjust(120), slept) | ||||||
|   else |   else | ||||||
|     call assert_inrange(20, 120, slept) |     call assert_inrange(20, 120, slept) | ||||||
|   endif |   endif | ||||||
| @@ -37,7 +33,7 @@ func Test_repeat_three() | |||||||
|   let slept = WaitFor('g:val == 3') |   let slept = WaitFor('g:val == 3') | ||||||
|   call assert_equal(3, g:val) |   call assert_equal(3, g:val) | ||||||
|   if has('reltime') |   if has('reltime') | ||||||
|     call s:assert_inrange(120, 250, slept) |     call assert_inrange(120, LoadAdjust(250), slept) | ||||||
|   else |   else | ||||||
|     call assert_inrange(80, 200, slept) |     call assert_inrange(80, 200, slept) | ||||||
|   endif |   endif | ||||||
| @@ -52,7 +48,7 @@ func Test_repeat_many() | |||||||
|   endif |   endif | ||||||
|   sleep 200m |   sleep 200m | ||||||
|   call timer_stop(timer) |   call timer_stop(timer) | ||||||
|   call s:assert_inrange((has('mac') ? 1 : 2), 4, g:val) |   call assert_inrange((has('mac') ? 1 : 2), LoadAdjust(4), g:val) | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
| func Test_with_partial_callback() | func Test_with_partial_callback() | ||||||
| @@ -66,7 +62,7 @@ func Test_with_partial_callback() | |||||||
|   let slept = WaitFor('g:val == 1') |   let slept = WaitFor('g:val == 1') | ||||||
|   call assert_equal(1, g:val) |   call assert_equal(1, g:val) | ||||||
|   if has('reltime') |   if has('reltime') | ||||||
|     call s:assert_inrange(40, 130, slept) |     call assert_inrange(40, LoadAdjust(130), slept) | ||||||
|   else |   else | ||||||
|     call assert_inrange(20, 100, slept) |     call assert_inrange(20, 100, slept) | ||||||
|   endif |   endif | ||||||
| @@ -129,7 +125,7 @@ func Test_paused() | |||||||
|   let slept = WaitFor('g:val == 1') |   let slept = WaitFor('g:val == 1') | ||||||
|   call assert_equal(1, g:val) |   call assert_equal(1, g:val) | ||||||
|   if has('reltime') |   if has('reltime') | ||||||
|     call s:assert_inrange(0, 140, slept) |     call assert_inrange(0, LoadAdjust(140), slept) | ||||||
|   else |   else | ||||||
|     call assert_inrange(0, 10, slept) |     call assert_inrange(0, 10, slept) | ||||||
|   endif |   endif | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
|  |  | ||||||
| local bufmeths = helpers.bufmeths | local bufmeths = helpers.bufmeths | ||||||
| local clear = helpers.clear | local clear = helpers.clear | ||||||
| @@ -12,8 +11,8 @@ local funcs = helpers.funcs | |||||||
| local meths = helpers.meths | local meths = helpers.meths | ||||||
| local source = helpers.source | local source = helpers.source | ||||||
|  |  | ||||||
| local shallowcopy = global_helpers.shallowcopy | local shallowcopy = helpers.shallowcopy | ||||||
| local sleep = global_helpers.sleep | local sleep = helpers.sleep | ||||||
|  |  | ||||||
| describe('nvim_get_keymap', function() | describe('nvim_get_keymap', function() | ||||||
|   before_each(clear) |   before_each(clear) | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| -- Test server -> client RPC scenarios. Note: unlike `rpcnotify`, to evaluate | -- Test server -> client RPC scenarios. Note: unlike `rpcnotify`, to evaluate | ||||||
| -- `rpcrequest` calls we need the client event loop to be running. | -- `rpcrequest` calls we need the client event loop to be running. | ||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local Paths = require('test.config.paths') |  | ||||||
|  |  | ||||||
| local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval | local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval | ||||||
| local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop | local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop | ||||||
| @@ -243,8 +242,8 @@ describe('server -> client', function() | |||||||
|         \ 'rpc': v:true |         \ 'rpc': v:true | ||||||
|         \ } |         \ } | ||||||
|       ]]) |       ]]) | ||||||
|       local lua_prog = Paths.test_lua_prg |       meths.set_var("args", {helpers.test_lua_prg, | ||||||
|       meths.set_var("args", {lua_prog, 'test/functional/api/rpc_fixture.lua'}) |                              'test/functional/api/rpc_fixture.lua'}) | ||||||
|       jobid = eval("jobstart(g:args, g:job_opts)") |       jobid = eval("jobstart(g:args, g:job_opts)") | ||||||
|       neq(0, 'jobid') |       neq(0, 'jobid') | ||||||
|     end) |     end) | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local Screen = require('test.functional.ui.screen') | local Screen = require('test.functional.ui.screen') | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
|  |  | ||||||
| local NIL = helpers.NIL | local NIL = helpers.NIL | ||||||
| local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq | local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq | ||||||
| @@ -16,10 +15,10 @@ local request = helpers.request | |||||||
| local source = helpers.source | local source = helpers.source | ||||||
| local next_msg = helpers.next_msg | local next_msg = helpers.next_msg | ||||||
|  |  | ||||||
| local expect_err = global_helpers.expect_err | local expect_err = helpers.expect_err | ||||||
| local format_string = global_helpers.format_string | local format_string = helpers.format_string | ||||||
| local intchar2lua = global_helpers.intchar2lua | local intchar2lua = helpers.intchar2lua | ||||||
| local mergedicts_copy = global_helpers.mergedicts_copy | local mergedicts_copy = helpers.mergedicts_copy | ||||||
|  |  | ||||||
| describe('API', function() | describe('API', function() | ||||||
|   before_each(clear) |   before_each(clear) | ||||||
|   | |||||||
| @@ -1,7 +1,5 @@ | |||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local uname = global_helpers.uname |  | ||||||
|  |  | ||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
|  | local uname = helpers.uname | ||||||
| local clear, eq, eval, next_msg, ok, source = helpers.clear, helpers.eq, | local clear, eq, eval, next_msg, ok, source = helpers.clear, helpers.eq, | ||||||
|    helpers.eval, helpers.next_msg, helpers.ok, helpers.source |    helpers.eval, helpers.next_msg, helpers.ok, helpers.source | ||||||
| local command, funcs, meths = helpers.command, helpers.funcs, helpers.meths | local command, funcs, meths = helpers.command, helpers.funcs, helpers.meths | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ describe(':let', function() | |||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it("multibyte env var to child process #8398 #9267",  function() |   it("multibyte env var to child process #8398 #9267",  function() | ||||||
|     if (not helpers.iswin()) and require('test.helpers').isCI() then |     if (not helpers.iswin()) and helpers.isCI() then | ||||||
|       -- Fails on non-Windows CI. Buffering/timing issue? |       -- Fails on non-Windows CI. Buffering/timing issue? | ||||||
|       pending('fails on unix CI', function() end) |       pending('fails on unix CI', function() end) | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -8,23 +8,14 @@ local Session = require('nvim.session') | |||||||
| local TcpStream = require('nvim.tcp_stream') | local TcpStream = require('nvim.tcp_stream') | ||||||
| local SocketStream = require('nvim.socket_stream') | local SocketStream = require('nvim.socket_stream') | ||||||
| local ChildProcessStream = require('nvim.child_process_stream') | local ChildProcessStream = require('nvim.child_process_stream') | ||||||
| local Paths = require('test.config.paths') |  | ||||||
|  |  | ||||||
| local check_cores = global_helpers.check_cores | local check_cores = global_helpers.check_cores | ||||||
| local check_logs = global_helpers.check_logs | local check_logs = global_helpers.check_logs | ||||||
| local dedent = global_helpers.dedent | local dedent = global_helpers.dedent | ||||||
| local eq = global_helpers.eq | local eq = global_helpers.eq | ||||||
| local expect_err = global_helpers.expect_err |  | ||||||
| local filter = global_helpers.filter |  | ||||||
| local map = global_helpers.map |  | ||||||
| local matches = global_helpers.matches |  | ||||||
| local near = global_helpers.near |  | ||||||
| local neq = global_helpers.neq |  | ||||||
| local ok = global_helpers.ok | local ok = global_helpers.ok | ||||||
| local read_file = global_helpers.read_file |  | ||||||
| local sleep = global_helpers.sleep | local sleep = global_helpers.sleep | ||||||
| local table_contains = global_helpers.table_contains | local tbl_contains = global_helpers.tbl_contains | ||||||
| local table_flatten = global_helpers.table_flatten |  | ||||||
| local write_file = global_helpers.write_file | local write_file = global_helpers.write_file | ||||||
|  |  | ||||||
| local start_dir = lfs.currentdir() | local start_dir = lfs.currentdir() | ||||||
| @@ -32,7 +23,7 @@ local start_dir = lfs.currentdir() | |||||||
| local nvim_prog = ( | local nvim_prog = ( | ||||||
|   os.getenv('NVIM_PROG') |   os.getenv('NVIM_PROG') | ||||||
|   or os.getenv('NVIM_PRG') |   or os.getenv('NVIM_PRG') | ||||||
|   or Paths.test_build_dir .. '/bin/nvim' |   or global_helpers.test_build_dir .. '/bin/nvim' | ||||||
| ) | ) | ||||||
| -- Default settings for the test session. | -- Default settings for the test session. | ||||||
| local nvim_set  = 'set shortmess+=I background=light noswapfile noautoindent' | local nvim_set  = 'set shortmess+=I background=light noswapfile noautoindent' | ||||||
| @@ -174,7 +165,7 @@ local function expect_msg_seq(...) | |||||||
|         error(cat_err(final_error, |         error(cat_err(final_error, | ||||||
|                       string.format('got %d messages (ignored %d), expected %d', |                       string.format('got %d messages (ignored %d), expected %d', | ||||||
|                                     #actual_seq, nr_ignored, #expected_seq))) |                                     #actual_seq, nr_ignored, #expected_seq))) | ||||||
|       elseif table_contains(ignore, msg_type) then |       elseif tbl_contains(ignore, msg_type) then | ||||||
|         nr_ignored = nr_ignored + 1 |         nr_ignored = nr_ignored + 1 | ||||||
|       else |       else | ||||||
|         table.insert(actual_seq, msg) |         table.insert(actual_seq, msg) | ||||||
| @@ -348,9 +339,9 @@ local function remove_args(args, args_rm) | |||||||
|   end |   end | ||||||
|   local last = '' |   local last = '' | ||||||
|   for _, arg in ipairs(args) do |   for _, arg in ipairs(args) do | ||||||
|     if table_contains(skip_following, last) then |     if tbl_contains(skip_following, last) then | ||||||
|       last = '' |       last = '' | ||||||
|     elseif table_contains(args_rm, arg) then |     elseif tbl_contains(args_rm, arg) then | ||||||
|       last = arg |       last = arg | ||||||
|     else |     else | ||||||
|       table.insert(new_args, arg) |       table.insert(new_args, arg) | ||||||
| @@ -747,41 +738,14 @@ local function alter_slashes(obj) | |||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| local function compute_load_factor() |  | ||||||
|   local timeout = 200 |  | ||||||
|   local times = {} |  | ||||||
|  |  | ||||||
|   clear() |  | ||||||
|  |  | ||||||
|   for _ = 1, 5 do |  | ||||||
|     source([[ |  | ||||||
|       let g:val = 0 |  | ||||||
|       call timer_start(200, {-> nvim_set_var('val', 1)}) |  | ||||||
|       let start = reltime() |  | ||||||
|       while 1 |  | ||||||
|         sleep 10m |  | ||||||
|         if g:val == 1 |  | ||||||
|           let g:waited_in_ms = float2nr(reltimefloat(reltime(start)) * 1000) |  | ||||||
|           break |  | ||||||
|         endif |  | ||||||
|       endwhile |  | ||||||
|     ]]) |  | ||||||
|     table.insert(times, nvim_eval('g:waited_in_ms')) |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   session:close() |  | ||||||
|   session = nil |  | ||||||
|  |  | ||||||
|   local longest = math.max(unpack(times)) |  | ||||||
|   local factor = (longest + 50.0) / timeout |  | ||||||
|  |  | ||||||
|   return factor |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Compute load factor only once. |  | ||||||
| local load_factor = compute_load_factor() |  | ||||||
|  |  | ||||||
|  | local load_factor = nil | ||||||
| local function load_adjust(num) | local function load_adjust(num) | ||||||
|  |   if load_factor == nil then  -- Compute load factor only once. | ||||||
|  |     clear() | ||||||
|  |     request('nvim_command', 'source src/nvim/testdir/load.vim') | ||||||
|  |     load_factor = request('nvim_eval', 'g:test_load_factor') | ||||||
|  |   end | ||||||
|   return math.ceil(num * load_factor) |   return math.ceil(num * load_factor) | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -802,33 +766,25 @@ local module = { | |||||||
|   curtabmeths = curtabmeths, |   curtabmeths = curtabmeths, | ||||||
|   curwin = curwin, |   curwin = curwin, | ||||||
|   curwinmeths = curwinmeths, |   curwinmeths = curwinmeths, | ||||||
|   dedent = dedent, |  | ||||||
|   eq = eq, |  | ||||||
|   eval = nvim_eval, |   eval = nvim_eval, | ||||||
|   exc_exec = exc_exec, |   exc_exec = exc_exec, | ||||||
|   expect = expect, |   expect = expect, | ||||||
|   expect_any = expect_any, |   expect_any = expect_any, | ||||||
|   expect_err = expect_err, |  | ||||||
|   expect_msg_seq = expect_msg_seq, |   expect_msg_seq = expect_msg_seq, | ||||||
|   expect_twostreams = expect_twostreams, |   expect_twostreams = expect_twostreams, | ||||||
|   feed = feed, |   feed = feed, | ||||||
|   feed_command = feed_command, |   feed_command = feed_command, | ||||||
|   filter = filter, |  | ||||||
|   funcs = funcs, |   funcs = funcs, | ||||||
|   get_pathsep = get_pathsep, |   get_pathsep = get_pathsep, | ||||||
|   get_session = get_session, |   get_session = get_session, | ||||||
|   insert = insert, |   insert = insert, | ||||||
|   iswin = iswin, |   iswin = iswin, | ||||||
|   map = map, |  | ||||||
|   matches = matches, |  | ||||||
|   merge_args = merge_args, |   merge_args = merge_args, | ||||||
|   meth_pcall = meth_pcall, |   meth_pcall = meth_pcall, | ||||||
|   meths = meths, |   meths = meths, | ||||||
|   missing_provider = missing_provider, |   missing_provider = missing_provider, | ||||||
|   mkdir = lfs.mkdir, |   mkdir = lfs.mkdir, | ||||||
|   load_adjust = load_adjust, |   load_adjust = load_adjust, | ||||||
|   near = near, |  | ||||||
|   neq = neq, |  | ||||||
|   new_pipename = new_pipename, |   new_pipename = new_pipename, | ||||||
|   next_msg = next_msg, |   next_msg = next_msg, | ||||||
|   nvim = nvim, |   nvim = nvim, | ||||||
| @@ -838,13 +794,11 @@ local module = { | |||||||
|   nvim_prog = nvim_prog, |   nvim_prog = nvim_prog, | ||||||
|   nvim_prog_abs = nvim_prog_abs, |   nvim_prog_abs = nvim_prog_abs, | ||||||
|   nvim_set = nvim_set, |   nvim_set = nvim_set, | ||||||
|   ok = ok, |  | ||||||
|   os_name = os_name, |   os_name = os_name, | ||||||
|   pathroot = pathroot, |   pathroot = pathroot, | ||||||
|   pending_win32 = pending_win32, |   pending_win32 = pending_win32, | ||||||
|   prepend_argv = prepend_argv, |   prepend_argv = prepend_argv, | ||||||
|   rawfeed = rawfeed, |   rawfeed = rawfeed, | ||||||
|   read_file = read_file, |  | ||||||
|   redir_exec = redir_exec, |   redir_exec = redir_exec, | ||||||
|   request = request, |   request = request, | ||||||
|   retry = retry, |   retry = retry, | ||||||
| @@ -854,20 +808,17 @@ local module = { | |||||||
|   set_session = set_session, |   set_session = set_session, | ||||||
|   set_shell_powershell = set_shell_powershell, |   set_shell_powershell = set_shell_powershell, | ||||||
|   skip_fragile = skip_fragile, |   skip_fragile = skip_fragile, | ||||||
|   sleep = sleep, |  | ||||||
|   source = source, |   source = source, | ||||||
|   spawn = spawn, |   spawn = spawn, | ||||||
|   stop = stop, |   stop = stop, | ||||||
|   table_flatten = table_flatten, |  | ||||||
|   tabmeths = tabmeths, |   tabmeths = tabmeths, | ||||||
|   tabpage = tabpage, |   tabpage = tabpage, | ||||||
|   tmpname = tmpname, |  | ||||||
|   uimeths = uimeths, |   uimeths = uimeths, | ||||||
|   wait = wait, |   wait = wait, | ||||||
|   window = window, |   window = window, | ||||||
|   winmeths = winmeths, |   winmeths = winmeths, | ||||||
|   write_file = write_file, |  | ||||||
| } | } | ||||||
|  | module = global_helpers.tbl_extend('error', module, global_helpers) | ||||||
|  |  | ||||||
| return function(after_each) | return function(after_each) | ||||||
|   if after_each then |   if after_each then | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
|  |  | ||||||
| local Screen = require('test.functional.ui.screen') | local Screen = require('test.functional.ui.screen') | ||||||
|  |  | ||||||
| @@ -16,7 +15,7 @@ local neq = helpers.neq | |||||||
| local mkdir = helpers.mkdir | local mkdir = helpers.mkdir | ||||||
| local rmdir = helpers.rmdir | local rmdir = helpers.rmdir | ||||||
| local alter_slashes = helpers.alter_slashes | local alter_slashes = helpers.alter_slashes | ||||||
| local table_contains = global_helpers.table_contains | local tbl_contains = helpers.tbl_contains | ||||||
|  |  | ||||||
| describe('startup defaults', function() | describe('startup defaults', function() | ||||||
|   describe(':filetype', function() |   describe(':filetype', function() | ||||||
| @@ -262,7 +261,7 @@ describe('XDG-based defaults', function() | |||||||
|  |  | ||||||
|     for _,v in ipairs(rtp) do |     for _,v in ipairs(rtp) do | ||||||
|       local m = string.match(v, [=[[/\]nvim[^/\]*[/\]site.*$]=]) |       local m = string.match(v, [=[[/\]nvim[^/\]*[/\]site.*$]=]) | ||||||
|       if m and not table_contains(rv, m) then |       if m and not tbl_contains(rv, m) then | ||||||
|         table.insert(rv, m) |         table.insert(rv, m) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -1,8 +1,7 @@ | |||||||
| -- TUI acceptance tests. | -- TUI acceptance tests. | ||||||
| -- Uses :terminal as a way to send keys and assert screen state. | -- Uses :terminal as a way to send keys and assert screen state. | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local uname = global_helpers.uname |  | ||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
|  | local uname = helpers.uname | ||||||
| local thelpers = require('test.functional.terminal.helpers') | local thelpers = require('test.functional.terminal.helpers') | ||||||
| local Screen = require('test.functional.ui.screen') | local Screen = require('test.functional.ui.screen') | ||||||
| local eq = helpers.eq | local eq = helpers.eq | ||||||
|   | |||||||
| @@ -1,10 +1,9 @@ | |||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local Screen = require('test.functional.ui.screen') | local Screen = require('test.functional.ui.screen') | ||||||
| local clear = helpers.clear | local clear = helpers.clear | ||||||
| local command = helpers.command | local command = helpers.command | ||||||
| local eq = helpers.eq | local eq = helpers.eq | ||||||
| local shallowcopy = global_helpers.shallowcopy | local shallowcopy = helpers.shallowcopy | ||||||
|  |  | ||||||
| describe('ui receives option updates', function() | describe('ui receives option updates', function() | ||||||
|   local screen |   local screen | ||||||
|   | |||||||
| @@ -71,11 +71,10 @@ | |||||||
| -- To help write screen tests, see Screen:snapshot_util(). | -- To help write screen tests, see Screen:snapshot_util(). | ||||||
| -- To debug screen tests, see Screen:redraw_debug(). | -- To debug screen tests, see Screen:redraw_debug(). | ||||||
|  |  | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local deepcopy = global_helpers.deepcopy |  | ||||||
| local shallowcopy = global_helpers.shallowcopy |  | ||||||
| local concat_tables = global_helpers.concat_tables |  | ||||||
| local helpers = require('test.functional.helpers')(nil) | local helpers = require('test.functional.helpers')(nil) | ||||||
|  | local deepcopy = helpers.deepcopy | ||||||
|  | local shallowcopy = helpers.shallowcopy | ||||||
|  | local concat_tables = helpers.concat_tables | ||||||
| local request, run_session = helpers.request, helpers.run_session | local request, run_session = helpers.request, helpers.run_session | ||||||
| local eq = helpers.eq | local eq = helpers.eq | ||||||
| local dedent = helpers.dedent | local dedent = helpers.dedent | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local shallowcopy = global_helpers.shallowcopy |  | ||||||
| local helpers = require('test.functional.helpers')(after_each) | local helpers = require('test.functional.helpers')(after_each) | ||||||
| local Screen = require('test.functional.ui.screen') | local Screen = require('test.functional.ui.screen') | ||||||
|  | local shallowcopy = helpers.shallowcopy | ||||||
| local clear, feed, command = helpers.clear, helpers.feed, helpers.command | local clear, feed, command = helpers.clear, helpers.feed, helpers.command | ||||||
| local iswin = helpers.iswin | local iswin = helpers.iswin | ||||||
| local funcs = helpers.funcs | local funcs = helpers.funcs | ||||||
|   | |||||||
| @@ -1,8 +1,10 @@ | |||||||
| require('vim.compat') | require('vim.compat') | ||||||
|  | local shared = require('vim.shared') | ||||||
| local assert = require('luassert') | local assert = require('luassert') | ||||||
| local luv = require('luv') | local luv = require('luv') | ||||||
| local lfs = require('lfs') | local lfs = require('lfs') | ||||||
| local relpath = require('pl.path').relpath | local relpath = require('pl.path').relpath | ||||||
|  | local Paths = require('test.config.paths') | ||||||
|  |  | ||||||
| local quote_me = '[^.%w%+%-%@%_%/]' -- complement (needn't quote) | local quote_me = '[^.%w%+%-%@%_%/]' -- complement (needn't quote) | ||||||
| local function shell_quote(str) | local function shell_quote(str) | ||||||
| @@ -420,6 +422,7 @@ local function updated(d, d2) | |||||||
|   return d |   return d | ||||||
| end | end | ||||||
|  |  | ||||||
|  | -- Concat list-like tables. | ||||||
| local function concat_tables(...) | local function concat_tables(...) | ||||||
|   local ret = {} |   local ret = {} | ||||||
|   for i = 1, select('#', ...) do |   for i = 1, select('#', ...) do | ||||||
| @@ -609,37 +612,6 @@ local function fixtbl_rec(tbl) | |||||||
|   return fixtbl(tbl) |   return fixtbl(tbl) | ||||||
| end | end | ||||||
|  |  | ||||||
| -- From https://github.com/premake/premake-core/blob/master/src/base/table.lua |  | ||||||
| local function table_flatten(arr) |  | ||||||
|   local result = {} |  | ||||||
|   local function _table_flatten(_arr) |  | ||||||
|     local n = #_arr |  | ||||||
|     for i = 1, n do |  | ||||||
|       local v = _arr[i] |  | ||||||
|       if type(v) == "table" then |  | ||||||
|         _table_flatten(v) |  | ||||||
|       elseif v then |  | ||||||
|         table.insert(result, v) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|   _table_flatten(arr) |  | ||||||
|   return result |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Checks if a list-like (vector) table contains `value`. |  | ||||||
| local function table_contains(t, value) |  | ||||||
|   if type(t) ~= 'table' then |  | ||||||
|     error('t must be a table') |  | ||||||
|   end |  | ||||||
|   for _,v in ipairs(t) do |  | ||||||
|     if v == value then |  | ||||||
|       return true |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|   return false |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local function hexdump(str) | local function hexdump(str) | ||||||
|   local len = string.len(str) |   local len = string.len(str) | ||||||
|   local dump = "" |   local dump = "" | ||||||
| @@ -784,13 +756,12 @@ local module = { | |||||||
|   repeated_read_cmd = repeated_read_cmd, |   repeated_read_cmd = repeated_read_cmd, | ||||||
|   shallowcopy = shallowcopy, |   shallowcopy = shallowcopy, | ||||||
|   sleep = sleep, |   sleep = sleep, | ||||||
|   table_contains = table_contains, |  | ||||||
|   table_flatten = table_flatten, |  | ||||||
|   tmpname = tmpname, |   tmpname = tmpname, | ||||||
|   uname = uname, |   uname = uname, | ||||||
|   updated = updated, |   updated = updated, | ||||||
|   which = which, |   which = which, | ||||||
|   write_file = write_file, |   write_file = write_file, | ||||||
| } | } | ||||||
|  | module = shared.tbl_extend('error', module, Paths, shared) | ||||||
|  |  | ||||||
| return module | return module | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| local bit = require('bit') | local bit = require('bit') | ||||||
| local helpers = require('test.unit.helpers')(after_each) | local helpers = require('test.unit.helpers')(after_each) | ||||||
| local eval_helpers = require('test.unit.eval.helpers') | local eval_helpers = require('test.unit.eval.helpers') | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
|  |  | ||||||
| local itp = helpers.gen_itp(it) | local itp = helpers.gen_itp(it) | ||||||
|  |  | ||||||
| @@ -14,6 +13,8 @@ local NULL = helpers.NULL | |||||||
| local cimport = helpers.cimport | local cimport = helpers.cimport | ||||||
| local to_cstr = helpers.to_cstr | local to_cstr = helpers.to_cstr | ||||||
| local alloc_log_new = helpers.alloc_log_new | local alloc_log_new = helpers.alloc_log_new | ||||||
|  | local concat_tables = helpers.concat_tables | ||||||
|  | local map = helpers.map | ||||||
|  |  | ||||||
| local a = eval_helpers.alloc_logging_helpers | local a = eval_helpers.alloc_logging_helpers | ||||||
| local int = eval_helpers.int | local int = eval_helpers.int | ||||||
| @@ -40,9 +41,6 @@ local callback2tbl = eval_helpers.callback2tbl | |||||||
| local tbl2callback = eval_helpers.tbl2callback | local tbl2callback = eval_helpers.tbl2callback | ||||||
| local dict_watchers = eval_helpers.dict_watchers | local dict_watchers = eval_helpers.dict_watchers | ||||||
|  |  | ||||||
| local concat_tables = global_helpers.concat_tables |  | ||||||
| local map = global_helpers.map |  | ||||||
|  |  | ||||||
| local lib = cimport('./src/nvim/eval/typval.h', './src/nvim/memory.h', | local lib = cimport('./src/nvim/eval/typval.h', './src/nvim/memory.h', | ||||||
|                     './src/nvim/mbyte.h', './src/nvim/garray.h', |                     './src/nvim/mbyte.h', './src/nvim/garray.h', | ||||||
|                     './src/nvim/eval.h', './src/nvim/vim.h', |                     './src/nvim/eval.h', './src/nvim/vim.h', | ||||||
|   | |||||||
| @@ -15,7 +15,6 @@ local dedent = global_helpers.dedent | |||||||
| local neq = global_helpers.neq | local neq = global_helpers.neq | ||||||
| local map = global_helpers.map | local map = global_helpers.map | ||||||
| local eq = global_helpers.eq | local eq = global_helpers.eq | ||||||
| local ok = global_helpers.ok |  | ||||||
|  |  | ||||||
| -- C constants. | -- C constants. | ||||||
| local NULL = ffi.cast('void*', 0) | local NULL = ffi.cast('void*', 0) | ||||||
| @@ -842,9 +841,6 @@ local module = { | |||||||
|   cimport = cimport, |   cimport = cimport, | ||||||
|   cppimport = cppimport, |   cppimport = cppimport, | ||||||
|   internalize = internalize, |   internalize = internalize, | ||||||
|   ok = ok, |  | ||||||
|   eq = eq, |  | ||||||
|   neq = neq, |  | ||||||
|   ffi = ffi, |   ffi = ffi, | ||||||
|   lib = lib, |   lib = lib, | ||||||
|   cstr = cstr, |   cstr = cstr, | ||||||
| @@ -869,6 +865,7 @@ local module = { | |||||||
|   ptr2key = ptr2key, |   ptr2key = ptr2key, | ||||||
|   debug_log = debug_log, |   debug_log = debug_log, | ||||||
| } | } | ||||||
|  | module = global_helpers.tbl_extend('error', module, global_helpers) | ||||||
| return function() | return function() | ||||||
|   return module |   return module | ||||||
| end | end | ||||||
|   | |||||||
| @@ -2,9 +2,7 @@ local helpers = require('test.unit.helpers')(after_each) | |||||||
| local itp = helpers.gen_itp(it) | local itp = helpers.gen_itp(it) | ||||||
| local lfs = require('lfs') | local lfs = require('lfs') | ||||||
| local child_call_once = helpers.child_call_once | local child_call_once = helpers.child_call_once | ||||||
|  | local sleep = helpers.sleep | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local sleep = global_helpers.sleep |  | ||||||
|  |  | ||||||
| local ffi = helpers.ffi | local ffi = helpers.ffi | ||||||
| local cimport = helpers.cimport | local cimport = helpers.cimport | ||||||
| @@ -156,12 +154,12 @@ describe('u_write_undo', function() | |||||||
|     local file_contents = "testing permissions" |     local file_contents = "testing permissions" | ||||||
|     -- Write a text file where the undofile should go |     -- Write a text file where the undofile should go | ||||||
|     local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) |     local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) | ||||||
|     global_helpers.write_file(correct_name, file_contents, true, false) |     helpers.write_file(correct_name, file_contents, true, false) | ||||||
|  |  | ||||||
|     -- Call with `forceit`. |     -- Call with `forceit`. | ||||||
|     u_write_undo(correct_name, true, file_buffer, buffer_hash) |     u_write_undo(correct_name, true, file_buffer, buffer_hash) | ||||||
|  |  | ||||||
|     local undo_file_contents = global_helpers.read_file(correct_name) |     local undo_file_contents = helpers.read_file(correct_name) | ||||||
|  |  | ||||||
|     neq(file_contents, undo_file_contents) |     neq(file_contents, undo_file_contents) | ||||||
|     local success, deletion_err = os.remove(correct_name)  -- delete the file now that we're done with it. |     local success, deletion_err = os.remove(correct_name)  -- delete the file now that we're done with it. | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| local helpers = require('test.unit.helpers')(after_each) | local helpers = require('test.unit.helpers')(after_each) | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local itp = helpers.gen_itp(it) | local itp = helpers.gen_itp(it) | ||||||
| local viml_helpers = require('test.unit.viml.helpers') | local viml_helpers = require('test.unit.viml.helpers') | ||||||
|  |  | ||||||
| @@ -8,6 +7,8 @@ local conv_enum = helpers.conv_enum | |||||||
| local cimport = helpers.cimport | local cimport = helpers.cimport | ||||||
| local ffi = helpers.ffi | local ffi = helpers.ffi | ||||||
| local eq = helpers.eq | local eq = helpers.eq | ||||||
|  | local shallowcopy = helpers.shallowcopy | ||||||
|  | local intchar2lua = helpers.intchar2lua | ||||||
|  |  | ||||||
| local conv_ccs = viml_helpers.conv_ccs | local conv_ccs = viml_helpers.conv_ccs | ||||||
| local new_pstate = viml_helpers.new_pstate | local new_pstate = viml_helpers.new_pstate | ||||||
| @@ -15,9 +16,6 @@ local conv_cmp_type = viml_helpers.conv_cmp_type | |||||||
| local pstate_set_str = viml_helpers.pstate_set_str | local pstate_set_str = viml_helpers.pstate_set_str | ||||||
| local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type | local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type | ||||||
|  |  | ||||||
| local shallowcopy = global_helpers.shallowcopy |  | ||||||
| local intchar2lua = global_helpers.intchar2lua |  | ||||||
|  |  | ||||||
| local lib = cimport('./src/nvim/viml/parser/expressions.h') | local lib = cimport('./src/nvim/viml/parser/expressions.h') | ||||||
|  |  | ||||||
| local eltkn_type_tab, eltkn_mul_type_tab, eltkn_opt_scope_tab | local eltkn_type_tab, eltkn_mul_type_tab, eltkn_opt_scope_tab | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| local helpers = require('test.unit.helpers')(after_each) | local helpers = require('test.unit.helpers')(after_each) | ||||||
| local global_helpers = require('test.helpers') |  | ||||||
| local itp = helpers.gen_itp(it) | local itp = helpers.gen_itp(it) | ||||||
| local viml_helpers = require('test.unit.viml.helpers') | local viml_helpers = require('test.unit.viml.helpers') | ||||||
|  |  | ||||||
| @@ -14,6 +13,11 @@ local cimport = helpers.cimport | |||||||
| local ffi = helpers.ffi | local ffi = helpers.ffi | ||||||
| local neq = helpers.neq | local neq = helpers.neq | ||||||
| local eq = helpers.eq | local eq = helpers.eq | ||||||
|  | local mergedicts_copy = helpers.mergedicts_copy | ||||||
|  | local format_string = helpers.format_string | ||||||
|  | local format_luav = helpers.format_luav | ||||||
|  | local intchar2lua = helpers.intchar2lua | ||||||
|  | local dictdiff = helpers.dictdiff | ||||||
|  |  | ||||||
| local conv_ccs = viml_helpers.conv_ccs | local conv_ccs = viml_helpers.conv_ccs | ||||||
| local new_pstate = viml_helpers.new_pstate | local new_pstate = viml_helpers.new_pstate | ||||||
| @@ -21,12 +25,6 @@ local conv_cmp_type = viml_helpers.conv_cmp_type | |||||||
| local pstate_set_str = viml_helpers.pstate_set_str | local pstate_set_str = viml_helpers.pstate_set_str | ||||||
| local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type | local conv_expr_asgn_type = viml_helpers.conv_expr_asgn_type | ||||||
|  |  | ||||||
| local mergedicts_copy = global_helpers.mergedicts_copy |  | ||||||
| local format_string = global_helpers.format_string |  | ||||||
| local format_luav = global_helpers.format_luav |  | ||||||
| local intchar2lua = global_helpers.intchar2lua |  | ||||||
| local dictdiff = global_helpers.dictdiff |  | ||||||
|  |  | ||||||
| local lib = cimport('./src/nvim/viml/parser/expressions.h', | local lib = cimport('./src/nvim/viml/parser/expressions.h', | ||||||
|                     './src/nvim/syntax.h') |                     './src/nvim/syntax.h') | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes