| 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 |