mirror of
https://github.com/neovim/neovim.git
synced 2025-12-16 11:25:33 +00:00
Merge #9292 from mhinz/xcode10
This commit is contained in:
@@ -70,10 +70,10 @@ jobs:
|
|||||||
env: BUILD_32BIT=ON
|
env: BUILD_32BIT=ON
|
||||||
- os: osx
|
- os: osx
|
||||||
compiler: clang
|
compiler: clang
|
||||||
osx_image: xcode9.4 # macOS 10.13
|
osx_image: xcode10.1 # macOS 10.13
|
||||||
- os: osx
|
- os: osx
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
osx_image: xcode9.4 # macOS 10.13
|
osx_image: xcode10.1 # macOS 10.13
|
||||||
- if: branch = master
|
- if: branch = master
|
||||||
os: linux
|
os: linux
|
||||||
env: CI_TARGET=lint
|
env: CI_TARGET=lint
|
||||||
|
|||||||
30
src/nvim/testdir/load.vim
Normal file
30
src/nvim/testdir/load.vim
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
function! s:load_factor() abort
|
||||||
|
let timeout = 200
|
||||||
|
let times = []
|
||||||
|
|
||||||
|
for _ in range(5)
|
||||||
|
let g:val = 0
|
||||||
|
call timer_start(timeout, {-> 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
|
||||||
|
call insert(times, g:waited_in_ms, 0)
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let longest = max(times)
|
||||||
|
let factor = (longest + 50.0) / timeout
|
||||||
|
|
||||||
|
return factor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Compute load factor only once.
|
||||||
|
let s:load_factor = s:load_factor()
|
||||||
|
|
||||||
|
function! LoadAdjust(num) abort
|
||||||
|
return float2nr(ceil(a:num * s:load_factor))
|
||||||
|
endfunction
|
||||||
@@ -18,6 +18,8 @@ func Test_vim_did_enter()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
if has('timers')
|
if has('timers')
|
||||||
|
source load.vim
|
||||||
|
|
||||||
func ExitInsertMode(id)
|
func ExitInsertMode(id)
|
||||||
call feedkeys("\<Esc>")
|
call feedkeys("\<Esc>")
|
||||||
endfunc
|
endfunc
|
||||||
@@ -29,7 +31,7 @@ if has('timers')
|
|||||||
let g:triggered = 0
|
let g:triggered = 0
|
||||||
au CursorHoldI * let g:triggered += 1
|
au CursorHoldI * let g:triggered += 1
|
||||||
set updatetime=20
|
set updatetime=20
|
||||||
call timer_start(100, 'ExitInsertMode')
|
call timer_start(LoadAdjust(100), 'ExitInsertMode')
|
||||||
call feedkeys('a', 'x!')
|
call feedkeys('a', 'x!')
|
||||||
call assert_equal(1, g:triggered)
|
call assert_equal(1, g:triggered)
|
||||||
au! CursorHoldI
|
au! CursorHoldI
|
||||||
@@ -40,7 +42,7 @@ if has('timers')
|
|||||||
let g:triggered = 0
|
let g:triggered = 0
|
||||||
au CursorHoldI * let g:triggered += 1
|
au CursorHoldI * let g:triggered += 1
|
||||||
set updatetime=20
|
set updatetime=20
|
||||||
call timer_start(100, 'ExitInsertMode')
|
call timer_start(LoadAdjust(100), 'ExitInsertMode')
|
||||||
" CursorHoldI does not trigger after CTRL-X
|
" CursorHoldI does not trigger after CTRL-X
|
||||||
call feedkeys("a\<C-X>", 'x!')
|
call feedkeys("a\<C-X>", 'x!')
|
||||||
call assert_equal(0, g:triggered)
|
call assert_equal(0, g:triggered)
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ func Test_help_tagjump()
|
|||||||
call assert_true(getline('.') =~ '\*quotestar\*')
|
call assert_true(getline('.') =~ '\*quotestar\*')
|
||||||
helpclose
|
helpclose
|
||||||
|
|
||||||
help sp?it
|
help ch?ckhealth
|
||||||
call assert_equal("help", &filetype)
|
call assert_equal("help", &filetype)
|
||||||
call assert_true(getline('.') =~ '\*'.(has('win32') ? 'split()' : ':split').'\*')
|
call assert_true(getline('.') =~ '\*:checkhealth\*')
|
||||||
helpclose
|
helpclose
|
||||||
|
|
||||||
help :?
|
help :?
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ function! Test_lambda_with_timer()
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
source load.vim
|
||||||
|
|
||||||
let s:n = 0
|
let s:n = 0
|
||||||
let s:timer_id = 0
|
let s:timer_id = 0
|
||||||
function! s:Foo()
|
function! s:Foo()
|
||||||
@@ -31,15 +33,19 @@ function! Test_lambda_with_timer()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
call s:Foo()
|
call s:Foo()
|
||||||
sleep 210ms
|
sleep 210m
|
||||||
" do not collect lambda
|
" do not collect lambda
|
||||||
call test_garbagecollect_now()
|
call test_garbagecollect_now()
|
||||||
let m = s:n
|
let m = LoadAdjust(s:n)
|
||||||
sleep 230ms
|
sleep 230m
|
||||||
call timer_stop(s:timer_id)
|
call timer_stop(s:timer_id)
|
||||||
|
|
||||||
|
let n = LoadAdjust(s:n)
|
||||||
|
let nine = LoadAdjust(9)
|
||||||
|
|
||||||
call assert_true(m > 1)
|
call assert_true(m > 1)
|
||||||
call assert_true(s:n > m + 1)
|
call assert_true(n > m + 1)
|
||||||
call assert_true(s:n < 9)
|
call assert_true(n < nine)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! Test_lambda_with_partial()
|
function! Test_lambda_with_partial()
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ if !has('timers')
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
|
source load.vim
|
||||||
|
|
||||||
func MyHandler(timer)
|
func MyHandler(timer)
|
||||||
let g:val += 1
|
let g:val += 1
|
||||||
@@ -14,13 +15,17 @@ 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 assert_inrange(40, 120, slept)
|
call s:assert_inrange(40, 120, slept)
|
||||||
else
|
else
|
||||||
call assert_inrange(20, 120, slept)
|
call assert_inrange(20, 120, slept)
|
||||||
endif
|
endif
|
||||||
@@ -32,7 +37,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 assert_inrange(120, 250, slept)
|
call s:assert_inrange(120, 250, slept)
|
||||||
else
|
else
|
||||||
call assert_inrange(80, 200, slept)
|
call assert_inrange(80, 200, slept)
|
||||||
endif
|
endif
|
||||||
@@ -58,7 +63,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 assert_inrange(40, 130, slept)
|
call s:assert_inrange(40, 130, slept)
|
||||||
else
|
else
|
||||||
call assert_inrange(20, 100, slept)
|
call assert_inrange(20, 100, slept)
|
||||||
endif
|
endif
|
||||||
@@ -121,7 +126,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 assert_inrange(0, 140, slept)
|
call s:assert_inrange(0, 140, slept)
|
||||||
else
|
else
|
||||||
call assert_inrange(0, 10, slept)
|
call assert_inrange(0, 10, slept)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ local feed, eq, eval = helpers.feed, helpers.eq, helpers.eval
|
|||||||
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
|
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
|
||||||
local clear, command, funcs = helpers.clear, helpers.command, helpers.funcs
|
local clear, command, funcs = helpers.clear, helpers.command, helpers.funcs
|
||||||
local curbufmeths = helpers.curbufmeths
|
local curbufmeths = helpers.curbufmeths
|
||||||
|
local load_adjust = helpers.load_adjust
|
||||||
|
|
||||||
describe('timers', function()
|
describe('timers', function()
|
||||||
before_each(function()
|
before_each(function()
|
||||||
@@ -19,14 +20,14 @@ describe('timers', function()
|
|||||||
it('works one-shot', function()
|
it('works one-shot', function()
|
||||||
command("call timer_start(50, 'MyHandler')")
|
command("call timer_start(50, 'MyHandler')")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 200)
|
run(nil, nil, nil, load_adjust(200))
|
||||||
eq(1,eval("g:val"))
|
eq(1,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('works one-shot when repeat=0', function()
|
it('works one-shot when repeat=0', function()
|
||||||
command("call timer_start(50, 'MyHandler', {'repeat': 0})")
|
command("call timer_start(50, 'MyHandler', {'repeat': 0})")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 200)
|
run(nil, nil, nil, load_adjust(200))
|
||||||
eq(1,eval("g:val"))
|
eq(1,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -34,7 +35,7 @@ describe('timers', function()
|
|||||||
it('works with repeat two', function()
|
it('works with repeat two', function()
|
||||||
command("call timer_start(50, 'MyHandler', {'repeat': 2})")
|
command("call timer_start(50, 'MyHandler', {'repeat': 2})")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(2,eval("g:val"))
|
eq(2,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -42,14 +43,14 @@ describe('timers', function()
|
|||||||
command("call timer_start(50, 'MyHandler', {'repeat': 2})")
|
command("call timer_start(50, 'MyHandler', {'repeat': 2})")
|
||||||
nvim_async("command", "sleep 10")
|
nvim_async("command", "sleep 10")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(2,eval("g:val"))
|
eq(2,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('works with zero timeout', function()
|
it('works with zero timeout', function()
|
||||||
-- timer_start does still not invoke the callback immediately
|
-- timer_start does still not invoke the callback immediately
|
||||||
eq(0,eval("[timer_start(0, 'MyHandler', {'repeat': 1000}), g:val][1]"))
|
eq(0,eval("[timer_start(0, 'MyHandler', {'repeat': 1000}), g:val][1]"))
|
||||||
run(nil, nil, nil, 400)
|
run(nil, nil, nil, load_adjust(400))
|
||||||
eq(1000,eval("g:val"))
|
eq(1000,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -58,18 +59,18 @@ describe('timers', function()
|
|||||||
-- this also tests that remote requests works during sleep
|
-- this also tests that remote requests works during sleep
|
||||||
eval("timer_start(50, 'MyHandler', {'repeat': 2})")
|
eval("timer_start(50, 'MyHandler', {'repeat': 2})")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(2,eval("g:val"))
|
eq(2,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('are paused when event processing is disabled', function()
|
it('are paused when event processing is disabled', function()
|
||||||
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
||||||
run(nil, nil, nil, 100)
|
run(nil, nil, nil, load_adjust(100))
|
||||||
local count = eval("g:val")
|
local count = eval("g:val")
|
||||||
-- shows two line error message and thus invokes the return prompt.
|
-- shows two line error message and thus invokes the return prompt.
|
||||||
-- if we start to allow event processing here, we need to change this test.
|
-- if we start to allow event processing here, we need to change this test.
|
||||||
feed(':throw "fatal error"<CR>')
|
feed(':throw "fatal error"<CR>')
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
feed("<cr>")
|
feed("<cr>")
|
||||||
local diff = eval("g:val") - count
|
local diff = eval("g:val") - count
|
||||||
assert(0 <= diff and diff <= 4,
|
assert(0 <= diff and diff <= 4,
|
||||||
@@ -79,7 +80,7 @@ describe('timers', function()
|
|||||||
it('are triggered in blocking getchar() call', function()
|
it('are triggered in blocking getchar() call', function()
|
||||||
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
||||||
nvim_async("command", "let g:c = getchar()")
|
nvim_async("command", "let g:c = getchar()")
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
feed("c")
|
feed("c")
|
||||||
local count = eval("g:val")
|
local count = eval("g:val")
|
||||||
assert(count >= 3, 'expected count >= 3, got: '..tostring(count))
|
assert(count >= 3, 'expected count >= 3, got: '..tostring(count))
|
||||||
@@ -137,10 +138,10 @@ describe('timers', function()
|
|||||||
it('can be stopped', function()
|
it('can be stopped', function()
|
||||||
local t = eval("timer_start(50, 'MyHandler', {'repeat': -1})")
|
local t = eval("timer_start(50, 'MyHandler', {'repeat': -1})")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
funcs.timer_stop(t)
|
funcs.timer_stop(t)
|
||||||
local count = eval("g:val")
|
local count = eval("g:val")
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
local count2 = eval("g:val")
|
local count2 = eval("g:val")
|
||||||
-- when count is eval:ed after timer_stop this should be non-racy
|
-- when count is eval:ed after timer_stop this should be non-racy
|
||||||
eq(count, count2)
|
eq(count, count2)
|
||||||
@@ -161,7 +162,7 @@ describe('timers', function()
|
|||||||
]])
|
]])
|
||||||
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
command("call timer_start(50, 'MyHandler', {'repeat': -1})")
|
||||||
eq(0,eval("g:val"))
|
eq(0,eval("g:val"))
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(3,eval("g:val"))
|
eq(3,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -174,7 +175,7 @@ describe('timers', function()
|
|||||||
]])
|
]])
|
||||||
command("call timer_start(20, 'MyHandler', {'repeat': 3})")
|
command("call timer_start(20, 'MyHandler', {'repeat': 3})")
|
||||||
command("call timer_start(40, 'MyHandler2', {'repeat': 2})")
|
command("call timer_start(40, 'MyHandler2', {'repeat': 2})")
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(3,eval("g:val"))
|
eq(3,eval("g:val"))
|
||||||
eq(2,eval("g:val2"))
|
eq(2,eval("g:val2"))
|
||||||
end)
|
end)
|
||||||
@@ -189,7 +190,7 @@ describe('timers', function()
|
|||||||
endfunc
|
endfunc
|
||||||
]])
|
]])
|
||||||
command("call timer_start(5, 'MyHandler', {'repeat': 1})")
|
command("call timer_start(5, 'MyHandler', {'repeat': 1})")
|
||||||
run(nil, nil, nil, 300)
|
run(nil, nil, nil, load_adjust(300))
|
||||||
eq(1,eval("g:val"))
|
eq(1,eval("g:val"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|||||||
@@ -678,6 +678,44 @@ 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 function load_adjust(num)
|
||||||
|
return math.ceil(num * load_factor)
|
||||||
|
end
|
||||||
|
|
||||||
local module = {
|
local module = {
|
||||||
NIL = mpack.NIL,
|
NIL = mpack.NIL,
|
||||||
alter_slashes = alter_slashes,
|
alter_slashes = alter_slashes,
|
||||||
@@ -719,6 +757,7 @@ local module = {
|
|||||||
meths = meths,
|
meths = meths,
|
||||||
missing_provider = missing_provider,
|
missing_provider = missing_provider,
|
||||||
mkdir = lfs.mkdir,
|
mkdir = lfs.mkdir,
|
||||||
|
load_adjust = load_adjust,
|
||||||
near = near,
|
near = near,
|
||||||
neq = neq,
|
neq = neq,
|
||||||
new_pipename = new_pipename,
|
new_pipename = new_pipename,
|
||||||
|
|||||||
Reference in New Issue
Block a user