2 local multitable
= require
"util.multitable";
4 describe("util.multitable", function()
5 describe("#new()", function()
6 it("should create a multitable", function()
7 local mt
= multitable
.new();
8 assert.is_table(mt
, "Multitable is a table");
9 assert.is_function(mt
.add
, "Multitable has method add");
10 assert.is_function(mt
.get
, "Multitable has method get");
11 assert.is_function(mt
.remove, "Multitable has method remove");
15 describe("#get()", function()
16 it("should allow getting correctly", function()
17 local function has_items(list
, ...)
18 local should_have
= {};
19 if select('#', ...) > 0 then
20 assert.is_table(list
, "has_items: list is table", 3);
22 assert.is
.falsy(list
and #list
> 0, "No items, and no list");
23 return true, "has-all";
25 for n
=1,select('#', ...) do should_have
[select(n
, ...)] = true; end
26 for _
, item
in ipairs(list
) do
27 if not should_have
[item
] then return false, "too-many"; end
28 should_have
[item
] = nil;
30 if next(should_have
) then
31 return false, "not-enough";
33 return true, "has-all";
35 local function assert_has_all(message
, list
, ...)
36 return assert.are
.equal(select(2, has_items(list
, ...)), "has-all", message
or "List has all expected items, and no more", 2);
39 local mt
= multitable
.new();
41 local trigger1
, trigger2
, trigger3
= {}, {}, {};
42 local item1
, item2
, item3
= {}, {}, {};
44 assert_has_all("Has no items with trigger1", mt
:get(trigger1
));
47 mt
:add(1, 2, 3, item1
);
49 assert_has_all("Has item1 for 1, 2, 3", mt
:get(1, 2, 3), item1
);
53 -- Doesn't support nil
54 --[[ mt:add(nil, item1);
58 assert_has_all("Has all items with (nil)", mt:get(nil), item1, item2, item3);