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) end)