mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 19:00:06 +08:00
190 lines
5.0 KiB
Lua
190 lines
5.0 KiB
Lua
|
local EntryManager = require "telescope.entry_manager"
|
||
|
|
||
|
local eq = assert.are.same
|
||
|
|
||
|
describe("process_result", function()
|
||
|
it("works with one entry", function()
|
||
|
local manager = EntryManager:new(5, nil)
|
||
|
|
||
|
manager:add_entry(nil, 1, "hello", "")
|
||
|
|
||
|
eq(1, manager:get_score(1))
|
||
|
end)
|
||
|
|
||
|
it("works with two entries", function()
|
||
|
local manager = EntryManager:new(5, nil)
|
||
|
|
||
|
manager:add_entry(nil, 1, "hello", "")
|
||
|
manager:add_entry(nil, 2, "later", "")
|
||
|
|
||
|
eq(2, manager.linked_states.size)
|
||
|
|
||
|
eq("hello", manager:get_entry(1))
|
||
|
eq("later", manager:get_entry(2))
|
||
|
end)
|
||
|
|
||
|
it("calls functions when inserting", function()
|
||
|
local called_count = 0
|
||
|
local manager = EntryManager:new(5, function()
|
||
|
called_count = called_count + 1
|
||
|
end)
|
||
|
|
||
|
assert(called_count == 0)
|
||
|
manager:add_entry(nil, 1, "hello", "")
|
||
|
assert(called_count == 1)
|
||
|
end)
|
||
|
|
||
|
it("calls functions when inserting twice", function()
|
||
|
local called_count = 0
|
||
|
local manager = EntryManager:new(5, function()
|
||
|
called_count = called_count + 1
|
||
|
end)
|
||
|
|
||
|
assert(called_count == 0)
|
||
|
manager:add_entry(nil, 1, "hello", "")
|
||
|
manager:add_entry(nil, 2, "world", "")
|
||
|
assert(called_count == 2)
|
||
|
end)
|
||
|
|
||
|
it("correctly sorts lower scores", function()
|
||
|
local called_count = 0
|
||
|
local manager = EntryManager:new(5, function()
|
||
|
called_count = called_count + 1
|
||
|
end)
|
||
|
manager:add_entry(nil, 5, "worse result", "")
|
||
|
manager:add_entry(nil, 2, "better result", "")
|
||
|
|
||
|
eq("better result", manager:get_entry(1))
|
||
|
eq("worse result", manager:get_entry(2))
|
||
|
|
||
|
eq(2, called_count)
|
||
|
end)
|
||
|
|
||
|
it("respects max results", function()
|
||
|
local called_count = 0
|
||
|
local manager = EntryManager:new(1, function()
|
||
|
called_count = called_count + 1
|
||
|
end)
|
||
|
manager:add_entry(nil, 2, "better result", "")
|
||
|
manager:add_entry(nil, 5, "worse result", "")
|
||
|
|
||
|
eq("better result", manager:get_entry(1))
|
||
|
eq(1, called_count)
|
||
|
end)
|
||
|
|
||
|
it("should allow simple entries", function()
|
||
|
local manager = EntryManager:new(5)
|
||
|
|
||
|
local counts_executed = 0
|
||
|
manager:add_entry(
|
||
|
nil,
|
||
|
1,
|
||
|
setmetatable({}, {
|
||
|
__index = function(t, k)
|
||
|
local val = nil
|
||
|
if k == "ordinal" then
|
||
|
counts_executed = counts_executed + 1
|
||
|
|
||
|
-- This could be expensive, only call later
|
||
|
val = "wow"
|
||
|
end
|
||
|
|
||
|
rawset(t, k, val)
|
||
|
return val
|
||
|
end,
|
||
|
}),
|
||
|
""
|
||
|
)
|
||
|
|
||
|
eq("wow", manager:get_ordinal(1))
|
||
|
eq("wow", manager:get_ordinal(1))
|
||
|
eq("wow", manager:get_ordinal(1))
|
||
|
|
||
|
eq(1, counts_executed)
|
||
|
end)
|
||
|
|
||
|
it("should not loop a bunch", function()
|
||
|
local info = {}
|
||
|
local manager = EntryManager:new(5, nil, info)
|
||
|
manager:add_entry(nil, 4, "better result", "")
|
||
|
manager:add_entry(nil, 3, "better result", "")
|
||
|
manager:add_entry(nil, 2, "better result", "")
|
||
|
|
||
|
-- Loops once to find 3 < 4
|
||
|
-- Loops again to find 2 < 3
|
||
|
eq(2, info.looped)
|
||
|
end)
|
||
|
|
||
|
it("should not loop a bunch, part 2", function()
|
||
|
local info = {}
|
||
|
local manager = EntryManager:new(5, nil, info)
|
||
|
manager:add_entry(nil, 4, "better result", "")
|
||
|
manager:add_entry(nil, 2, "better result", "")
|
||
|
manager:add_entry(nil, 3, "better result", "")
|
||
|
|
||
|
-- Loops again to find 2 < 4
|
||
|
-- Loops once to find 3 > 2
|
||
|
-- but less than 4
|
||
|
eq(3, info.looped)
|
||
|
end)
|
||
|
|
||
|
it("should update worst score in all append case", function()
|
||
|
local manager = EntryManager:new(2, nil)
|
||
|
manager:add_entry(nil, 2, "result 2", "")
|
||
|
manager:add_entry(nil, 3, "result 3", "")
|
||
|
manager:add_entry(nil, 4, "result 4", "")
|
||
|
|
||
|
eq(3, manager.worst_acceptable_score)
|
||
|
end)
|
||
|
|
||
|
it("should update worst score in all prepend case", function()
|
||
|
local called_count = 0
|
||
|
local manager = EntryManager:new(2, function()
|
||
|
called_count = called_count + 1
|
||
|
end)
|
||
|
manager:add_entry(nil, 5, "worse result", "")
|
||
|
manager:add_entry(nil, 4, "less worse result", "")
|
||
|
manager:add_entry(nil, 2, "better result", "")
|
||
|
|
||
|
-- Once for insert 5
|
||
|
-- Once for prepend 4
|
||
|
-- Once for prepend 2
|
||
|
eq(3, called_count)
|
||
|
|
||
|
eq("better result", manager:get_entry(1))
|
||
|
eq(4, manager.worst_acceptable_score)
|
||
|
end)
|
||
|
|
||
|
it("should call tiebreaker if score is the same, sort length", function()
|
||
|
local manager = EntryManager:new(5, nil)
|
||
|
local picker = {
|
||
|
tiebreak = function(curr, prev, prompt)
|
||
|
eq("asdf", prompt)
|
||
|
return #curr < #prev
|
||
|
end,
|
||
|
}
|
||
|
|
||
|
manager:add_entry(picker, 0.5, "same same", "asdf")
|
||
|
manager:add_entry(picker, 0.5, "same", "asdf")
|
||
|
|
||
|
eq("same", manager:get_entry(1))
|
||
|
eq("same same", manager:get_entry(2))
|
||
|
end)
|
||
|
|
||
|
it("should call tiebreaker if score is the same, keep initial", function()
|
||
|
local manager = EntryManager:new(5, nil)
|
||
|
local picker = {
|
||
|
tiebreak = function(_, _, prompt)
|
||
|
eq("asdf", prompt)
|
||
|
return false
|
||
|
end,
|
||
|
}
|
||
|
|
||
|
manager:add_entry(picker, 0.5, "same same", "asdf")
|
||
|
manager:add_entry(picker, 0.5, "same", "asdf")
|
||
|
|
||
|
eq("same", manager:get_entry(2))
|
||
|
eq("same same", manager:get_entry(1))
|
||
|
end)
|
||
|
end)
|