Files
neovim/test/functional/lua/list_spec.lua
2025-08-03 07:45:49 -07:00

66 lines
2.0 KiB
Lua

-- Test suite for vim.list
local t = require('test.testutil')
local eq = t.eq
describe('vim.list', function()
it('vim.list.unique()', function()
eq({ 1, 2, 3, 4, 5 }, vim.list.unique({ 1, 2, 2, 3, 4, 4, 5 }))
eq({ 1, 2, 3, 4, 5 }, vim.list.unique({ 1, 2, 3, 4, 4, 5, 1, 2, 3, 2, 1, 2, 3, 4, 5 }))
eq({ 1, 2, 3, 4, 5, field = 1 }, vim.list.unique({ 1, 2, 2, 3, 4, 4, 5, field = 1 }))
-- Not properly defined, but test anyway
-- luajit evaluates #t as 7, whereas Lua 5.1 evaluates it as 12
local r = vim.list.unique({ 1, 2, 2, 3, 4, 4, 5, nil, 6, 6, 7, 7 })
if jit then
eq({ 1, 2, 3, 4, 5, nil, nil, nil, 6, 6, 7, 7 }, r)
else
eq({ 1, 2, 3, 4, 5, nil, 6, 7 }, r)
end
eq(
{ { 1 }, { 2 }, { 3 } },
vim.list.unique({ { 1 }, { 1 }, { 2 }, { 2 }, { 3 }, { 3 } }, function(x)
return x[1]
end)
)
end)
--- Generate a list like { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...}.
---@param num integer
local function gen_list(num)
---@type integer[]
local list = {}
for i = 1, num do
for _ = 1, i do
list[#list + 1] = i
end
end
return list
end
--- Index of the last {num}.
--- Mathematically, a triangular number.
---@param num integer
local function index(num)
return math.floor((math.pow(num, 2) + num) / 2)
end
it("vim.list.bisect(..., { bound = 'lower' })", function()
local num = math.random(100)
local list = gen_list(num)
local target = math.random(num)
eq(vim.list.bisect(list, target, { bound = 'lower' }), index(target - 1) + 1)
eq(vim.list.bisect(list, num + 1, { bound = 'lower' }), index(num) + 1)
end)
it("vim.list.bisect(..., bound = { 'upper' })", function()
local num = math.random(100)
local list = gen_list(num)
local target = math.random(num)
eq(vim.list.bisect(list, target, { bound = 'upper' }), index(target) + 1)
eq(vim.list.bisect(list, num + 1, { bound = 'upper' }), index(num) + 1)
end)
end)