aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-04-29 14:12:39 +0200
committerbfredl <bjorn.linse@gmail.com>2024-04-29 16:20:46 +0200
commit0df681a91d6b86395609e6fc40efb4d8623d72c9 (patch)
tree782be8ed4e68780c14edd9912692e1bba192545b /test
parentca432069eb6f5453acab896acdb8e0363c232629 (diff)
downloadrneovim-0df681a91d6b86395609e6fc40efb4d8623d72c9.tar.gz
rneovim-0df681a91d6b86395609e6fc40efb4d8623d72c9.tar.bz2
rneovim-0df681a91d6b86395609e6fc40efb4d8623d72c9.zip
fix(treesitter): make tests for memoize more robust
Instead of painfully messing with timing to determine if queries were reparsed, we can simply keep a counter next to the call to ts_query_new Also memoization had a hidden dependency on the garbage collection of the the key, a hash value which never is kept around in memory. this was done intentionally as the hash does not capture all relevant state for the query (external included files) even if actual query objects still would be reachable in memory. To make the test fully deterministic in CI, we explicitly control GC.
Diffstat (limited to 'test')
-rw-r--r--test/functional/treesitter/query_spec.lua20
1 files changed, 8 insertions, 12 deletions
diff --git a/test/functional/treesitter/query_spec.lua b/test/functional/treesitter/query_spec.lua
index 3dad61d79e..96665ee2e7 100644
--- a/test/functional/treesitter/query_spec.lua
+++ b/test/functional/treesitter/query_spec.lua
@@ -7,7 +7,6 @@ local eq = t.eq
local insert = n.insert
local exec_lua = n.exec_lua
local pcall_err = t.pcall_err
-local is_os = t.is_os
local api = n.api
local fn = n.fn
@@ -72,11 +71,14 @@ void ui_refresh(void)
return exec_lua(
[[
local query, n = ...
- local before = vim.uv.hrtime()
+ local before = vim.api.nvim__stats().ts_query_parse_count
+ collectgarbage("stop")
for i=1, n, 1 do
cquery = vim.treesitter.query.parse("c", ...)
end
- local after = vim.uv.hrtime()
+ collectgarbage("restart")
+ collectgarbage("collect")
+ local after = vim.api.nvim__stats().ts_query_parse_count
return after - before
]],
long_query,
@@ -84,15 +86,9 @@ void ui_refresh(void)
)
end
- local firstrun = q(1)
- local manyruns = q(100)
-
- -- First run should be at least 200x slower than an 100 subsequent runs.
- local factor = is_os('win') and 100 or 200
- assert(
- factor * manyruns < firstrun,
- ('firstrun: %f ms, manyruns: %f ms'):format(firstrun / 1e6, manyruns / 1e6)
- )
+ eq(1, q(1))
+ -- cache is cleared by garbage collection even if valid "cquery" reference is kept around
+ eq(1, q(100))
end)
it('supports query and iter by capture (iter_captures)', function()