mirror of
https://github.com/bjc/prosody.git
synced 2025-04-03 21:27:38 +03:00
There was an off-by-one in the modulo calculation. Switching to a plain old array-table makes the apparent size of the queue wrong, but since some of the queue may not be available this is likely for the best.
84 lines
2.2 KiB
Lua
84 lines
2.2 KiB
Lua
describe("util.smqueue", function()
|
|
|
|
local smqueue
|
|
setup(function() smqueue = require "util.smqueue"; end)
|
|
|
|
describe("#new()", function()
|
|
it("should work", function()
|
|
assert.has_error(function () smqueue.new(-1) end);
|
|
assert.has_error(function () smqueue.new(0) end);
|
|
assert.not_has_error(function () smqueue.new(1) end);
|
|
local q = smqueue.new(10);
|
|
assert.truthy(q);
|
|
end)
|
|
end)
|
|
|
|
describe("#push()", function()
|
|
it("should allow pushing many items", function()
|
|
local q = smqueue.new(10);
|
|
for i = 1, 20 do q:push(i); end
|
|
assert.equal(20, q:count_unacked());
|
|
end)
|
|
end)
|
|
|
|
describe("#resumable()", function()
|
|
it("returns true while the queue is small", function()
|
|
local q = smqueue.new(10);
|
|
for i = 1, 10 do q:push(i); end
|
|
assert.truthy(q:resumable());
|
|
q:push(11);
|
|
assert.falsy(q:resumable());
|
|
end)
|
|
end)
|
|
|
|
describe("#ack", function()
|
|
it("allows removing items", function()
|
|
local q = smqueue.new(10);
|
|
for i = 1, 10 do q:push(i); end
|
|
assert.same({ 1; 2; 3 }, q:ack(3));
|
|
assert.same({ 4; 5; 6 }, q:ack(6));
|
|
assert.falsy(q:ack(3), "can't go backwards")
|
|
assert.falsy(q:ack(100), "can't ack too many")
|
|
for i = 11, 20 do q:push(i); end
|
|
assert.same({ 11; 12 }, q:ack(12), "items are dropped");
|
|
end)
|
|
end)
|
|
|
|
describe("#resume", function()
|
|
it("iterates over current items", function()
|
|
local q = smqueue.new(10);
|
|
for i = 1, 12 do q:push(i); end
|
|
assert.same({ 3; 4; 5; 6 }, q:ack(6));
|
|
assert.truthy(q:resumable());
|
|
local resume = {}
|
|
for _, i in q:resume() do resume[i] = true end
|
|
assert.same({ [7] = true; [8] = true; [9] = true; [10] = true; [11] = true; [12] = true }, resume);
|
|
end)
|
|
end)
|
|
|
|
describe("#table", function ()
|
|
it("produces a compat layer", function ()
|
|
local q = smqueue.new(10);
|
|
for i = 1,10 do q:push(i); end
|
|
do
|
|
local t = q:table();
|
|
assert.same({ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 }, t);
|
|
end
|
|
do
|
|
for i = 11,20 do q:push(i); end
|
|
local t = q:table();
|
|
assert.same({ 11; 12; 13; 14; 15; 16; 17; 18; 19; 20 }, t);
|
|
end
|
|
do
|
|
q:ack(15);
|
|
local t = q:table();
|
|
assert.same({ 16; 17; 18; 19; 20 }, t);
|
|
end
|
|
do
|
|
q:ack(20);
|
|
local t = q:table();
|
|
assert.same({}, t);
|
|
end
|
|
end)
|
|
end)
|
|
end);
|