tests/test_util_multitable.lua

1
-- Prosody IM
2
-- Copyright (C) 2008-2010 Matthew Wild
3
-- Copyright (C) 2008-2010 Waqas Hussain
4
-- 
5
-- This project is MIT/X11 licensed. Please see the
6
-- COPYING file in the source package for more information.
7
--
8
 
9
 
10
function new(new, multitable)
11
	mt = new();
12
	assert_table(mt, "Multitable is a table");
13
	assert_function(mt.add, "Multitable has method add");
14
	assert_function(mt.get, "Multitable has method get");
15
	assert_function(mt.remove, "Multitable has method remove");
16
 
17
	get(mt.get, multitable);
18
end
19
 
20
function get(get, multitable)
21
	local function has_items(list, ...)
22
		local should_have = {};
23
		if select('#', ...) > 0 then
24
			assert_table(list, "has_items: list is table", 3);
25
		else
26
			assert_is_not(list and #list > 0, "No items, and no list");
27
			return true, "has-all";
28
		end
29
		for n=1,select('#', ...) do should_have[select(n, ...)] = true; end
30
		for n, item in ipairs(list) do
31
			if not should_have[item] then return false, "too-many"; end
32
			should_have[item] = nil;
33
		end
34
		if next(should_have) then
35
			return false, "not-enough";
36
		end
37
		return true, "has-all";
38
	end
39
	local function assert_has_all(message, list, ...)
40
		return assert_equal(select(2, has_items(list, ...)), "has-all", message or "List has all expected items, and no more", 2);
41
	end
42
 
43
	mt = multitable.new();
44
	
45
	local trigger1, trigger2, trigger3 = {}, {}, {};
46
	local item1, item2, item3 = {}, {}, {};
47
 
48
	assert_has_all("Has no items with trigger1", mt:get(trigger1));
49
 
50
 
51
	mt:add(1, 2, 3, item1);
52
 
53
	assert_has_all("Has item1 for 1, 2, 3", mt:get(1, 2, 3), item1);
54
	
55
-- Doesn't support nil
56
--[[	mt:add(nil, item1);
57
	mt:add(nil, item2);
58
	mt:add(nil, item3);
59
	
60
	assert_has_all("Has all items with (nil)", mt:get(nil), item1, item2, item3);
61
]]
62
end