aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2023-09-14 11:45:19 +0200
committerL Lllvvuu <git@llllvvuu.dev>2023-09-16 05:32:45 -0700
commit477458f7bf8dc70ff56d3d4af4ef44f83b95016a (patch)
treed9f50773ebabe07f7f330d0925da1f3f108fdaa3
parent34be915f6b9313d7554aa973a82277504de4e285 (diff)
downloadrneovim-477458f7bf8dc70ff56d3d4af4ef44f83b95016a.tar.gz
rneovim-477458f7bf8dc70ff56d3d4af4ef44f83b95016a.tar.bz2
rneovim-477458f7bf8dc70ff56d3d4af4ef44f83b95016a.zip
fix(test): more tests for marktree
Co-Authored-By: L Lllvvuu <git@llllvvuu.dev>
-rw-r--r--test/unit/marktree_spec.lua106
1 files changed, 106 insertions, 0 deletions
diff --git a/test/unit/marktree_spec.lua b/test/unit/marktree_spec.lua
index 32300c167c..97b97b47bb 100644
--- a/test/unit/marktree_spec.lua
+++ b/test/unit/marktree_spec.lua
@@ -366,6 +366,68 @@ describe('marktree', function()
eq(0, tree[0].n_keys)
end)
+ itp('works with intersections and marktree_splice', function()
+ local tree = ffi.new("MarkTree[1]") -- zero initialized by luajit
+
+ for i = 1,1000 do
+ put(tree, 1, i, false, 2, 1000-i, false)
+ if i % 10 == 1 then
+ check_intersections(tree)
+ end
+ end
+
+ check_intersections(tree)
+ eq(2000, tree[0].n_keys)
+ ok(tree[0].root.level >= 2)
+
+ for _ = 1,10 do
+ lib.marktree_splice(tree, 0, 0, 0, 100, 0, 0)
+ check_intersections(tree)
+ end
+ end)
+
+ itp('marktree_move should preserve key order', function()
+ local tree = ffi.new("MarkTree[1]") -- zero initialized by luajit
+ local iter = ffi.new("MarkTreeIter[1]")
+ local ids = {}
+
+ -- new index and old index look the same, but still have to move becase
+ -- pos will get updated
+ table.insert(ids, put(tree, 1, 1, false, 1, 3, false))
+ table.insert(ids, put(tree, 1, 3, false, 1, 3, false))
+ table.insert(ids, put(tree, 1, 3, false, 1, 3, false))
+ table.insert(ids, put(tree, 1, 3, false, 1, 3, false))
+
+ lib.marktree_lookup_ns(tree, ns, ids[3], false, iter)
+ lib.marktree_move(tree, iter, 1, 2)
+
+ check_intersections(tree)
+ end)
+
+ itp('works with intersections and marktree_move', function()
+ local tree = ffi.new("MarkTree[1]") -- zero initialized by luajit
+
+ local ids = {}
+
+ for i = 1,1000 do
+ table.insert(ids, put(tree, 1, i, false, 2, 1000-i, false))
+ if i % 10 == 1 then
+ check_intersections(tree)
+ end
+ end
+
+ local iter = ffi.new("MarkTreeIter[1]")
+ for i = 1,1000 do
+ local which = i%2
+ lib.marktree_lookup_ns(tree, ns, ids[i], which, iter)
+ lib.marktree_move(tree, iter, 1+which, 500+i)
+ if i % 10 == 1 then
+ check_intersections(tree)
+ end
+ end
+
+ end)
+
itp('works with intersections with a even bigger tree', function()
local tree = ffi.new("MarkTree[1]") -- zero initialized by luajit
@@ -435,4 +497,48 @@ describe('marktree', function()
eq(0, tree[0].n_keys)
end)
+
+ itp('works with intersections with a even bigger tree and splice', function()
+ local tree = ffi.new("MarkTree[1]") -- zero initialized by luajit
+
+ -- too much overhead on ASAN
+ local size_factor = helpers.is_asan() and 3 or 10
+
+ local at_row = {}
+ for i = 1, 10 do
+ at_row[i] = {}
+ end
+
+ local size = 1000*size_factor
+ local k = 1
+ while k <= size do
+ for row1 = 1,9 do
+ for row2 = row1,10 do -- note row2 can be == row1, leads to empty ranges being tested when k > size/2
+ if k > size then
+ break
+ end
+ local id = put(tree, row1, k, false, row2, size-k, false)
+ for i = row1+1, row2 do
+ table.insert(at_row[i], id)
+ end
+ --if tree[0].root.level == 4 then error("kk"..k) end
+ if k % 100*size_factor == 1 or (k < 2000 and k%100 == 1) then
+ check_intersections(tree)
+ end
+ k = k + 1
+ end
+ end
+ end
+
+ eq(2*size, tree[0].n_keys)
+ ok(tree[0].root.level >= 3)
+ check_intersections(tree)
+
+ for _ = 1,10 do
+ for j = 3, 8 do
+ lib.marktree_splice(tree, j, 0, 0, 200, 0, 0)
+ check_intersections(tree)
+ end
+ end
+ end)
end)