aboutsummaryrefslogtreecommitdiff
path: root/test/functional/lua/range_spec.lua
diff options
context:
space:
mode:
authorLuis Calle <53507599+TheLeoP@users.noreply.github.com>2026-05-08 04:17:00 -0500
committerGitHub <noreply@github.com>2026-05-08 05:17:00 -0400
commit416f3482e7f183b039dfe56e158ac42ea42abb3a (patch)
treee0ddf53935157889813e9571410d3259f76b2551 /test/functional/lua/range_spec.lua
parent832a68835b741bf874b936f933d662a5e1159e32 (diff)
downloadrneovim-416f3482e7f183b039dfe56e158ac42ea42abb3a.tar.gz
rneovim-416f3482e7f183b039dfe56e158ac42ea42abb3a.tar.bz2
rneovim-416f3482e7f183b039dfe56e158ac42ea42abb3a.zip
fix(vim.range): empty ranges semantics vs regular ranges #39474
Problem: - Empty ranges have different `<`, `<=`, `has` and `intersect` semantics compared to regular ranges. - `to_inclusive_pos` assumes that the end position of a range is exclusive, which is not true for empty ranges Solution: Special case empty ranges in these operations.
Diffstat (limited to 'test/functional/lua/range_spec.lua')
-rw-r--r--test/functional/lua/range_spec.lua86
1 files changed, 83 insertions, 3 deletions
diff --git a/test/functional/lua/range_spec.lua b/test/functional/lua/range_spec.lua
index c47dc25363..bb2235d6c6 100644
--- a/test/functional/lua/range_spec.lua
+++ b/test/functional/lua/range_spec.lua
@@ -90,12 +90,92 @@ describe('vim.range', function()
)
end)
- it('checks whether a range does not contain an empty range just outside it', function()
+ it('a range does not contain an empty range just outside it', function()
eq(
false,
exec_lua(function()
- local buf = vim.api.nvim_create_buf(false, true)
- return vim.range(buf, 0, 0, 0, 4):has(vim.range(buf, 0, 0, 0, 0))
+ return vim.range(0, 0, 0, 0, 4):has(vim.range(0, 0, 0, 0, 0))
+ end)
+ )
+
+ eq(
+ false,
+ exec_lua(function()
+ return vim.range(0, 0, 0, 0, 4):has(vim.range(0, 0, 4, 0, 4))
+ end)
+ )
+ end)
+
+ it('an empty range contains no other range', function()
+ eq(
+ false,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):has(vim.range(0, 1, 0, 1, 0))
+ end)
+ )
+ eq(
+ false,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):has(vim.range(0, 1, 0, 2, 0))
+ end)
+ )
+ eq(
+ false,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):has(vim.range(0, 0, 0, 1, 0))
+ end)
+ )
+ end)
+
+ it('an empty range intersercts with no other range', function()
+ eq(
+ nil,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):intersect(vim.range(0, 1, 0, 1, 0))
+ end)
+ )
+ eq(
+ nil,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):intersect(vim.range(0, 1, 0, 2, 0))
+ end)
+ )
+ eq(
+ nil,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0):intersect(vim.range(0, 0, 0, 1, 0))
+ end)
+ )
+ end)
+
+ it('empty range comparison semantics', function()
+ eq(
+ true,
+ exec_lua(function()
+ return vim.range(0, 0, 0, 0, 0) < vim.range(0, 0, 0, 0, 1)
+ end)
+ )
+
+ eq(
+ true,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 0) < vim.range(0, 1, 0, 1, 1)
+ end)
+ )
+
+ eq(
+ true,
+ exec_lua(function()
+ return vim.range(0, 1, 1, 1, 1) > vim.range(0, 1, 0, 1, 1)
+ end)
+ )
+ end)
+
+ it('1 byte wide range is not empty', function()
+ eq(
+ false,
+ exec_lua(function()
+ return vim.range(0, 1, 0, 1, 1):is_empty()
end)
)
end)