Software / code / prosody
Comparison
spec/util_smqueue_spec.lua @ 12055:daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Meant to be used in mod_smacks for XEP-0198
Meant to have a larger virtual size than actual number of items stored,
on the theory that in most cases, the excess will be acked before needed
for a resumption event.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 14 Dec 2021 19:58:53 +0100 |
| child | 12058:4860da718e87 |
comparison
equal
deleted
inserted
replaced
| 12054:0116fa57f05c | 12055:daced16154fa |
|---|---|
| 1 describe("util.smqueue", function() | |
| 2 | |
| 3 local smqueue | |
| 4 setup(function() smqueue = require "util.smqueue"; end) | |
| 5 | |
| 6 describe("#new()", function() | |
| 7 it("should work", function() | |
| 8 local q = smqueue.new(10); | |
| 9 assert.truthy(q); | |
| 10 end) | |
| 11 end) | |
| 12 | |
| 13 describe("#push()", function() | |
| 14 it("should allow pushing many items", function() | |
| 15 local q = smqueue.new(10); | |
| 16 for i = 1, 20 do q:push(i); end | |
| 17 assert.equal(20, q:count_unacked()); | |
| 18 end) | |
| 19 end) | |
| 20 | |
| 21 describe("#resumable()", function() | |
| 22 it("returns true while the queue is small", function() | |
| 23 local q = smqueue.new(10); | |
| 24 for i = 1, 10 do q:push(i); end | |
| 25 assert.truthy(q:resumable()); | |
| 26 q:push(11); | |
| 27 assert.falsy(q:resumable()); | |
| 28 end) | |
| 29 end) | |
| 30 | |
| 31 describe("#ack", function() | |
| 32 it("allows removing items", function() | |
| 33 local q = smqueue.new(10); | |
| 34 for i = 1, 10 do q:push(i); end | |
| 35 assert.same({ 1; 2; 3 }, q:ack(3)); | |
| 36 assert.same({ 4; 5; 6 }, q:ack(6)); | |
| 37 assert.falsy(q:ack(3), "can't go backwards") | |
| 38 assert.falsy(q:ack(100), "can't ack too many") | |
| 39 for i = 11, 20 do q:push(i); end | |
| 40 assert.same({ 11; 12 }, q:ack(12), "items are dropped"); | |
| 41 end) | |
| 42 end) | |
| 43 | |
| 44 describe("#resume", function() | |
| 45 it("iterates over current items", function() | |
| 46 local q = smqueue.new(10); | |
| 47 for i = 1, 12 do q:push(i); end | |
| 48 assert.same({ 3; 4; 5; 6 }, q:ack(6)); | |
| 49 assert.truthy(q:resumable()); | |
| 50 local resume = {} | |
| 51 for _, i in q:resume() do resume[i] = true end | |
| 52 assert.same({ [7] = true; [8] = true; [9] = true; [10] = true; [11] = true; [12] = true }, resume); | |
| 53 end) | |
| 54 end) | |
| 55 end); |