2023-03-04 23:52:27 -07:00
local helpers = require ( ' test.functional.helpers ' ) ( after_each )
local eq = helpers.eq
local exec_lua = helpers.exec_lua
local clear = helpers.clear
local is_os = helpers.is_os
2023-11-10 09:45:40 -07:00
local skip = helpers.skip
2023-03-04 23:52:27 -07:00
describe ( ' vim._watch ' , function ( )
before_each ( function ( )
clear ( )
end )
describe ( ' watch ' , function ( )
it ( ' detects file changes ' , function ( )
2023-11-10 09:45:40 -07:00
skip ( is_os ( ' bsd ' ) , " Stopped working on bsd after 3ca967387c49c754561c3b11a574797504d40f38 " )
2023-07-17 04:27:55 -07:00
local root_dir = vim.uv . fs_mkdtemp ( vim.fs . dirname ( helpers.tmpname ( ) ) .. ' /nvim_XXXXXXXXXX ' )
2023-03-04 23:52:27 -07:00
local result = exec_lua (
[ [
local root_dir = ...
local events = { }
local expected_events = 0
local function wait_for_events ( )
assert ( vim.wait ( 100 , function ( ) return # events == expected_events end ) , ' Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect ( events ) )
end
local stop = vim._watch . watch ( root_dir , { } , function ( path , change_type )
table.insert ( events , { path = path , change_type = change_type } )
end )
-- Only BSD seems to need some extra time for the watch to be ready to respond to events
if vim.fn . has ( ' bsd ' ) then
vim.wait ( 50 )
end
local watched_path = root_dir .. ' /file '
local watched , err = io.open ( watched_path , ' w ' )
assert ( not err , err )
expected_events = expected_events + 1
wait_for_events ( )
watched : close ( )
os.remove ( watched_path )
expected_events = expected_events + 1
wait_for_events ( )
stop ( )
-- No events should come through anymore
local watched_path = root_dir .. ' /file '
local watched , err = io.open ( watched_path , ' w ' )
assert ( not err , err )
vim.wait ( 50 )
watched : close ( )
os.remove ( watched_path )
vim.wait ( 50 )
return events
] ] ,
root_dir
)
local expected = {
{
change_type = exec_lua ( [[return vim._watch.FileChangeType.Created]] ) ,
path = root_dir .. ' /file ' ,
} ,
{
change_type = exec_lua ( [[return vim._watch.FileChangeType.Deleted]] ) ,
path = root_dir .. ' /file ' ,
} ,
}
-- kqueue only reports events on the watched path itself, so creating a file within a
-- watched directory results in a "rename" libuv event on the directory.
if is_os ( ' bsd ' ) then
expected = {
{
change_type = exec_lua ( [[return vim._watch.FileChangeType.Created]] ) ,
path = root_dir ,
} ,
{
change_type = exec_lua ( [[return vim._watch.FileChangeType.Created]] ) ,
path = root_dir ,
} ,
}
end
eq ( expected , result )
end )
end )
describe ( ' poll ' , function ( )
it ( ' detects file changes ' , function ( )
2023-11-19 10:37:49 -07:00
skip ( is_os ( ' bsd ' ) , " bsd only reports rename on folders if file inside change " )
2023-07-17 04:27:55 -07:00
local root_dir = vim.uv . fs_mkdtemp ( vim.fs . dirname ( helpers.tmpname ( ) ) .. ' /nvim_XXXXXXXXXX ' )
2023-03-04 23:52:27 -07:00
local result = exec_lua (
[ [
local root_dir = ...
2023-06-14 03:40:11 -07:00
local lpeg = vim.lpeg
2023-03-04 23:52:27 -07:00
local events = { }
2023-11-19 06:25:32 -07:00
local debounce = 100
local wait_ms = debounce + 200
2023-03-04 23:52:27 -07:00
local expected_events = 0
local function wait_for_events ( )
2023-11-19 06:25:32 -07:00
assert ( vim.wait ( wait_ms , function ( ) return # events == expected_events end ) , ' Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect ( events ) )
2023-03-04 23:52:27 -07:00
end
2023-06-14 03:40:11 -07:00
local incl = lpeg.P ( root_dir ) * lpeg.P ( " /file " ) ^- 1
local excl = lpeg.P ( root_dir .. ' /file.unwatched ' )
local stop = vim._watch . poll ( root_dir , {
2023-11-19 06:25:32 -07:00
debounce = debounce ,
2023-06-14 03:40:11 -07:00
include_pattern = incl ,
exclude_pattern = excl ,
} , function ( path , change_type )
2023-03-04 23:52:27 -07:00
table.insert ( events , { path = path , change_type = change_type } )
end )
local watched_path = root_dir .. ' /file '
local watched , err = io.open ( watched_path , ' w ' )
assert ( not err , err )
2023-06-14 03:40:11 -07:00
local unwatched_path = root_dir .. ' /file.unwatched '
local unwatched , err = io.open ( unwatched_path , ' w ' )
assert ( not err , err )
2023-03-04 23:52:27 -07:00
2023-11-19 06:25:32 -07:00
expected_events = expected_events + 1
2023-03-04 23:52:27 -07:00
wait_for_events ( )
watched : close ( )
os.remove ( watched_path )
2023-06-14 03:40:11 -07:00
unwatched : close ( )
os.remove ( unwatched_path )
2023-03-04 23:52:27 -07:00
2023-11-19 06:25:32 -07:00
expected_events = expected_events + 1
2023-03-04 23:52:27 -07:00
wait_for_events ( )
stop ( )
-- No events should come through anymore
local watched_path = root_dir .. ' /file '
local watched , err = io.open ( watched_path , ' w ' )
assert ( not err , err )
watched : close ( )
os.remove ( watched_path )
return events
] ] ,
root_dir
)
2023-11-19 06:25:32 -07:00
local created = exec_lua ( [[return vim._watch.FileChangeType.Created]] )
local deleted = exec_lua ( [[return vim._watch.FileChangeType.Deleted]] )
local expected = {
{
change_type = created ,
path = root_dir .. " /file " ,
} ,
{
change_type = deleted ,
path = root_dir .. " /file " ,
}
}
eq ( expected , result )
2023-03-04 23:52:27 -07:00
end )
end )
end )