diff options
| author | Luis Calle <53507599+TheLeoP@users.noreply.github.com> | 2026-05-08 04:17:00 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-08 05:17:00 -0400 |
| commit | 416f3482e7f183b039dfe56e158ac42ea42abb3a (patch) | |
| tree | e0ddf53935157889813e9571410d3259f76b2551 /test/functional/lua/range_spec.lua | |
| parent | 832a68835b741bf874b936f933d662a5e1159e32 (diff) | |
| download | rneovim-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.lua | 86 |
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) |