local LinkedList = require "telescope.algos.linked_list" describe("LinkedList", function() it("can create a list", function() local l = LinkedList:new() assert.are.same(0, l.size) end) it("can add a single entry to the list", function() local l = LinkedList:new() l:append "hello" assert.are.same(1, l.size) end) it("can iterate over one item", function() local l = LinkedList:new() l:append "hello" for val in l:iter() do assert.are.same("hello", val) end end) it("iterates in order", function() local l = LinkedList:new() l:append "hello" l:append "world" local x = {} for val in l:iter() do table.insert(x, val) end assert.are.same({ "hello", "world" }, x) end) it("iterates in order, for prepend", function() local l = LinkedList:new() l:prepend "world" l:prepend "hello" local x = {} for val in l:iter() do table.insert(x, val) end assert.are.same({ "hello", "world" }, x) end) it("iterates in order, for combo", function() local l = LinkedList:new() l:prepend "world" l:prepend "hello" l:append "last" l:prepend "first" local x = {} for val in l:iter() do table.insert(x, val) end assert.are.same({ "first", "hello", "world", "last" }, x) assert.are.same(#x, l.size) end) it("has ipairs", function() local l = LinkedList:new() l:prepend "world" l:prepend "hello" l:append "last" l:prepend "first" local x = {} for v in l:iter() do table.insert(x, v) end assert.are.same({ "first", "hello", "world", "last" }, x) local expected = {} for i, v in ipairs(x) do table.insert(expected, { i, v }) end local actual = {} for i, v in l:ipairs() do table.insert(actual, { i, v }) end assert.are.same(expected, actual) end) describe("track_at", function() it("should update tracked when only appending", function() local l = LinkedList:new { track_at = 2 } l:append "first" l:append "second" l:append "third" assert.are.same("second", l.tracked) end) it("should update tracked when first some prepend and then append", function() local l = LinkedList:new { track_at = 2 } l:prepend "first" l:append "second" l:append "third" assert.are.same("second", l.tracked) end) it("should update when only prepending", function() local l = LinkedList:new { track_at = 2 } l:prepend "third" l:prepend "second" l:prepend "first" assert.are.same("second", l.tracked) end) it("should update when lots of prepend and append", function() local l = LinkedList:new { track_at = 2 } l:prepend "third" l:prepend "second" l:prepend "first" l:append "fourth" l:prepend "zeroth" assert.are.same("first", l.tracked) end) end) end)