aboutsummaryrefslogtreecommitdiff
path: root/test/functional/lua/watch_spec.lua
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2023-11-30 20:35:25 +0000
committerJosh Rahm <joshuarahm@gmail.com>2023-11-30 20:35:25 +0000
commit1b7b916b7631ddf73c38e3a0070d64e4636cb2f3 (patch)
treecd08258054db80bb9a11b1061bb091c70b76926a /test/functional/lua/watch_spec.lua
parenteaa89c11d0f8aefbb512de769c6c82f61a8baca3 (diff)
parent4a8bf24ac690004aedf5540fa440e788459e5e34 (diff)
downloadrneovim-aucmd_textputpost.tar.gz
rneovim-aucmd_textputpost.tar.bz2
rneovim-aucmd_textputpost.zip
Merge remote-tracking branch 'upstream/master' into aucmd_textputpostaucmd_textputpost
Diffstat (limited to 'test/functional/lua/watch_spec.lua')
-rw-r--r--test/functional/lua/watch_spec.lua178
1 files changed, 178 insertions, 0 deletions
diff --git a/test/functional/lua/watch_spec.lua b/test/functional/lua/watch_spec.lua
new file mode 100644
index 0000000000..cdcef08a1a
--- /dev/null
+++ b/test/functional/lua/watch_spec.lua
@@ -0,0 +1,178 @@
+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
+local skip = helpers.skip
+
+describe('vim._watch', function()
+ before_each(function()
+ clear()
+ end)
+
+ describe('watch', function()
+ it('detects file changes', function()
+ skip(is_os('bsd'), "Stopped working on bsd after 3ca967387c49c754561c3b11a574797504d40f38")
+ local root_dir = vim.uv.fs_mkdtemp(vim.fs.dirname(helpers.tmpname()) .. '/nvim_XXXXXXXXXX')
+
+ 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()
+ skip(is_os('bsd'), "bsd only reports rename on folders if file inside change")
+ local root_dir = vim.uv.fs_mkdtemp(vim.fs.dirname(helpers.tmpname()) .. '/nvim_XXXXXXXXXX')
+
+ local result = exec_lua(
+ [[
+ local root_dir = ...
+ local lpeg = vim.lpeg
+
+ local events = {}
+
+ local debounce = 100
+ local wait_ms = debounce + 200
+
+ local expected_events = 0
+ local function wait_for_events()
+ 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))
+ end
+
+ 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, {
+ debounce = debounce,
+ include_pattern = incl,
+ exclude_pattern = excl,
+ }, function(path, change_type)
+ 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)
+ local unwatched_path = root_dir .. '/file.unwatched'
+ local unwatched, err = io.open(unwatched_path, 'w')
+ assert(not err, err)
+
+ expected_events = expected_events + 1
+ wait_for_events()
+
+ watched:close()
+ os.remove(watched_path)
+ unwatched:close()
+ os.remove(unwatched_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)
+
+ watched:close()
+ os.remove(watched_path)
+
+ return events
+ ]],
+ root_dir
+ )
+
+ 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)
+ end)
+ end)
+end)