local addon = {L = {}}
SlashCmdList = {}
loadfile("Clique.lua")("Clique", addon)
loadfile("Utils.lua")("Clique", addon)
local tests = {}
local function printf(fmt, ...)
print(fmt:format(...))
end
local prelude = {
cset = [===[
local inCombat = control:GetAttribute('inCombat')
local setupbutton = self:GetFrameRef('cliquesetup_button')
local button = setupbutton or self
local name = button:GetName()
if blacklist[name] then return end]===],
crem = [===[
local inCombat = control:GetAttribute('inCombat')
local setupbutton = self:GetFrameRef('cliquesetup_button')
local button = setupbutton or self
local name = button:GetName()
if blacklist[name] then return end]===],
bset = [===[
local button = self
local name = button:GetName()
if danglingButton then control:RunFor(danglingButton, control:GetAttribute('setup_onleave')) end
if blacklist[name] then return end
danglingButton = button]===],
brem = [===[
local button = self
local name = button:GetName()
if blacklist[name] then return end
danglingButton = nil]===],
gcset = [[
local inCombat = control:GetAttribute('inCombat')
local setupbutton = self:GetFrameRef('cliquesetup_button')
local button = setupbutton or self]],
gcrem = [[
local inCombat = control:GetAttribute('inCombat')
local setupbutton = self:GetFrameRef('cliquesetup_button')
local button = setupbutton or self]],
gbset = [[]],
gbrem = [[]],
}
-- Check a test
function check(result, test, atype)
local pass = true
local pre, rest = result:sub(1, #prelude[atype]), result:sub(#prelude[atype]+1, -1)
local expected = tostring(test[atype])
-- Trim 'rest' to get rid of any spaces at start
rest = rest:match("^%s*(.-)$")
-- Check to see if the prelude matches
if pre ~= prelude[atype] then
printf("[%s] prelude[%s] mismatch. Expected:\n%s\nGot:\n%s", tostring(test.name), tostring(atype), tostring(prelude[atype]), tostring(pre))
print(#pre, #prelude[atype], pre == prelude[atype])
pass = false
end
if expected ~= rest then
printf("[%s] %s mismatch. Expected:\n%s\nGot:\n%s", tostring(test.name), tostring(atype), tostring(test[atype]), tostring(rest))
print(#expected, #rest, expected ~= rest)
pass = false
end
if not pass then
error(string.format("Test [%s] failed", test.name))
end
end
local test_mt = {__index = function(t,k)
return ""
end}
function addtest(test)
setmetatable(test, test_mt)
tests[#tests+1] = test
end
-- Test with no bindings other than target/menu, just for sanity
addtest{
name = "No bindings",
bindings = {
{ key = "BUTTON1", type = "target", unit = "mouseover", sets = { default = true } },
{ key = "BUTTON2", type = "menu", sets = { default = true } },
},
cset = [[
button:SetAttribute("type1", "target")
button:SetAttribute("type2", "menu")]],
crem = [[
button:SetAttribute("type1", nil)
button:SetAttribute("type2", nil)]],
}
-- Add a binding of each input type, click, key, etc.
addtest{
name = "Input types",
bindings = {
-- Mouse button
{ key = "BUTTON1", type = "macro", macrotext="button", sets = { default = true } },
-- Key binding
{ key = "F", type = "macro", macrotext="key", sets = { default = true } },
-- Special escaped keys
{ key = "DASH", type = "macro", macrotext="dash", sets = { default = true } },
{ key = "BACKSLASH", type = "macro", macrotext="backslash", sets = { default = true } },
{ key = "DOUBLEQUOTE", type = "macro", macrotext="doublequote", sets = { default = true } },
},
cset = [[
button:SetAttribute("type1", "macro")
button:SetAttribute("macrotext1", "button")
button:SetAttribute("type-cliquebuttonBACKSLASH", "macro")
button:SetAttribute("macrotext-cliquebuttonBACKSLASH", "backslash")
button:SetAttribute("type-cliquebuttonDASH", "macro")
button:SetAttribute("macrotext-cliquebuttonDASH", "dash")
button:SetAttribute("type-cliquebuttonF", "macro")
button:SetAttribute("macrotext-cliquebuttonF", "key")
button:SetAttribute("type-cliquebuttonDOUBLEQUOTE", "macro")
button:SetAttribute("macrotext-cliquebuttonDOUBLEQUOTE", "doublequote")]],
crem = [[
button:SetAttribute("type1", nil)
button:SetAttribute("macrotext1", nil)
button:SetAttribute("type-cliquebuttonBACKSLASH", nil)
button:SetAttribute("macrotext-cliquebuttonBACKSLASH", nil)
button:SetAttribute("type-cliquebuttonDASH", nil)
button:SetAttribute("macrotext-cliquebuttonDASH", nil)
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("macrotext-cliquebuttonF", nil)
button:SetAttribute("type-cliquebuttonDOUBLEQUOTE", nil)
button:SetAttribute("macrotext-cliquebuttonDOUBLEQUOTE", nil)]],
bset = [[
self:SetBindingClick(true, "\\", self, "cliquebuttonBACKSLASH");
self:SetBindingClick(true, "-", self, "cliquebuttonDASH");
self:SetBindingClick(true, "F", self, "cliquebuttonF");
self:SetBindingClick(true, "\"", self, "cliquebuttonDOUBLEQUOTE");]],
brem = [[
self:ClearBinding("\\");
self:ClearBinding("-");
self:ClearBinding("F");
self:ClearBinding("\"");]],
}
-- Test global bindings, button and key
addtest{
name = "Global bindings",
bindings = {
-- Mouse button
{ key = "BUTTON5", type = "macro", macrotext="button", sets = { global = true } },
-- Key binding
{ key = "F", type = "macro", macrotext="key", sets = { global = true } },
},
gcset = [[
button:SetAttribute("type-cliquemouse5", "macro")
button:SetAttribute("macrotext-cliquemouse5", "button")
button:SetAttribute("type-cliquebuttonF", "macro")
button:SetAttribute("macrotext-cliquebuttonF", "key")]],
gcrem = [[
button:SetAttribute("type-cliquemouse5", nil)
button:SetAttribute("macrotext-cliquemouse5", nil)
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("macrotext-cliquebuttonF", nil)]],
gbset = [[
self:SetBindingClick(true, "BUTTON5", self, "cliquemouse5");
self:SetBindingClick(true, "F", self, "cliquebuttonF");]],
gbrem = [[
self:ClearBinding("BUTTON5");
self:ClearBinding("F");]],
}
-- Test hovercast bindings, button and key
-- Test global bindings, button and key
addtest{
name = "Hovercast bindings",
bindings = {
-- Mouse button
{ key = "BUTTON5", type = "macro", macrotext="button", sets = { hovercast = true } },
-- Key binding
{ key = "F", type = "macro", macrotext="key", sets = { hovercast = true } },
},
gcset = [[
button:SetAttribute("unit-cliquemouse5", "mouseover")
button:SetAttribute("type-cliquemouse5", "macro")
button:SetAttribute("macrotext-cliquemouse5", "button")
button:SetAttribute("unit-cliquebuttonF", "mouseover")
button:SetAttribute("type-cliquebuttonF", "macro")
button:SetAttribute("macrotext-cliquebuttonF", "key")]],
gcrem = [[
button:SetAttribute("unit-cliquemouse5", nil)
button:SetAttribute("type-cliquemouse5", nil)
button:SetAttribute("macrotext-cliquemouse5", nil)
button:SetAttribute("unit-cliquebuttonF", nil)
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("macrotext-cliquebuttonF", nil)]],
gbset = [[
self:SetBindingClick(true, "BUTTON5", self, "cliquemouse5");
self:SetBindingClick(true, "F", self, "cliquebuttonF");]],
gbrem = [[
self:ClearBinding("BUTTON5");
self:ClearBinding("F");]],
}
-- Test modified bindings, button and key
addtest{
name = "Mofidied bindings",
bindings = {
-- Mouse button
{ key = "BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "ALT-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "ALT-SHIFT-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "ALT-CTRL-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "ALT-CTRL-SHIFT-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "CTRL-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "CTRL-SHIFT-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
{ key = "SHIFT-BUTTON5", type = "macro", macrotext="button", sets = { default = true } },
-- Key binding
{ key = "F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "ALT-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "ALT-SHIFT-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "ALT-CTRL-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "ALT-CTRL-SHIFT-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "CTRL-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "CTRL-SHIFT-F", type = "macro", macrotext="key", sets = { default = true } },
{ key = "SHIFT-F", type = "macro", macrotext="key", sets = { default = true } },
},
cset = [[
button:SetAttribute("type5", "macro")
button:SetAttribute("macrotext5", "button")
button:SetAttribute("type-cliquebuttonaltshiftF", "macro")
button:SetAttribute("macrotext-cliquebuttonaltshiftF", "key")
button:SetAttribute("type-cliquebuttonaltF", "macro")
button:SetAttribute("macrotext-cliquebuttonaltF", "key")
button:SetAttribute("type-cliquebuttonF", "macro")
button:SetAttribute("macrotext-cliquebuttonF", "key")
button:SetAttribute("type-cliquebuttonaltctrlF", "macro")
button:SetAttribute("macrotext-cliquebuttonaltctrlF", "key")
button:SetAttribute("type-cliquebuttonctrlF", "macro")
button:SetAttribute("macrotext-cliquebuttonctrlF", "key")
button:SetAttribute("type-cliquebuttonaltctrlshiftF", "macro")
button:SetAttribute("macrotext-cliquebuttonaltctrlshiftF", "key")
button:SetAttribute("type-cliquebuttonctrlshiftF", "macro")
button:SetAttribute("macrotext-cliquebuttonctrlshiftF", "key")
button:SetAttribute("shift-type5", "macro")
button:SetAttribute("shift-macrotext5", "button")
button:SetAttribute("ctrl-type5", "macro")
button:SetAttribute("ctrl-macrotext5", "button")
button:SetAttribute("alt-type5", "macro")
button:SetAttribute("alt-macrotext5", "button")
button:SetAttribute("ctrl-shift-type5", "macro")
button:SetAttribute("ctrl-shift-macrotext5", "button")
button:SetAttribute("alt-shift-type5", "macro")
button:SetAttribute("alt-shift-macrotext5", "button")
button:SetAttribute("alt-ctrl-shift-type5", "macro")
button:SetAttribute("alt-ctrl-shift-macrotext5", "button")
button:SetAttribute("alt-ctrl-type5", "macro")
button:SetAttribute("alt-ctrl-macrotext5", "button")
button:SetAttribute("type-cliquebuttonshiftF", "macro")
button:SetAttribute("macrotext-cliquebuttonshiftF", "key")]],
crem = [[
button:SetAttribute("type5", nil)
button:SetAttribute("macrotext5", nil)
button:SetAttribute("type-cliquebuttonaltshiftF", nil)
button:SetAttribute("macrotext-cliquebuttonaltshiftF", nil)
button:SetAttribute("type-cliquebuttonaltF", nil)
button:SetAttribute("macrotext-cliquebuttonaltF", nil)
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("macrotext-cliquebuttonF", nil)
button:SetAttribute("type-cliquebuttonaltctrlF", nil)
button:SetAttribute("macrotext-cliquebuttonaltctrlF", nil)
button:SetAttribute("type-cliquebuttonctrlF", nil)
button:SetAttribute("macrotext-cliquebuttonctrlF", nil)
button:SetAttribute("type-cliquebuttonaltctrlshiftF", nil)
button:SetAttribute("macrotext-cliquebuttonaltctrlshiftF", nil)
button:SetAttribute("type-cliquebuttonctrlshiftF", nil)
button:SetAttribute("macrotext-cliquebuttonctrlshiftF", nil)
button:SetAttribute("shift-type5", nil)
button:SetAttribute("shift-macrotext5", nil)
button:SetAttribute("ctrl-type5", nil)
button:SetAttribute("ctrl-macrotext5", nil)
button:SetAttribute("alt-type5", nil)
button:SetAttribute("alt-macrotext5", nil)
button:SetAttribute("ctrl-shift-type5", nil)
button:SetAttribute("ctrl-shift-macrotext5", nil)
button:SetAttribute("alt-shift-type5", nil)
button:SetAttribute("alt-shift-macrotext5", nil)
button:SetAttribute("alt-ctrl-shift-type5", nil)
button:SetAttribute("alt-ctrl-shift-macrotext5", nil)
button:SetAttribute("alt-ctrl-type5", nil)
button:SetAttribute("alt-ctrl-macrotext5", nil)
button:SetAttribute("type-cliquebuttonshiftF", nil)
button:SetAttribute("macrotext-cliquebuttonshiftF", nil)]],
bset = [[
self:SetBindingClick(true, "ALT-SHIFT-F", self, "cliquebuttonaltshiftF");
self:SetBindingClick(true, "ALT-F", self, "cliquebuttonaltF");
self:SetBindingClick(true, "F", self, "cliquebuttonF");
self:SetBindingClick(true, "ALT-CTRL-F", self, "cliquebuttonaltctrlF");
self:SetBindingClick(true, "CTRL-F", self, "cliquebuttonctrlF");
self:SetBindingClick(true, "ALT-CTRL-SHIFT-F", self, "cliquebuttonaltctrlshiftF");
self:SetBindingClick(true, "CTRL-SHIFT-F", self, "cliquebuttonctrlshiftF");
self:SetBindingClick(true, "SHIFT-F", self, "cliquebuttonshiftF");]],
brem = [[
self:ClearBinding("ALT-SHIFT-F");
self:ClearBinding("ALT-F");
self:ClearBinding("F");
self:ClearBinding("ALT-CTRL-F");
self:ClearBinding("CTRL-F");
self:ClearBinding("ALT-CTRL-SHIFT-F");
self:ClearBinding("CTRL-SHIFT-F");
self:ClearBinding("SHIFT-F");]],
}
-- Test ooc bindings
addtest{
name = "OOC bindings",
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "menu", sets = { ooc = true } },
{ key = "BUTTON2", type = "spell", spell = "Wild Growth", sets = { default = true } },
-- An unmasked keybinding
{ key = "F", type = "spell", spell = "Swiftmend", sets = { ooc = true } },
},
cset = [[
if not inCombat then -- ooc binding
button:SetAttribute("type2", "menu")
else -- clear ooc binding
button:SetAttribute("type2", nil)
end
if not inCombat then -- ooc binding
button:SetAttribute("type-cliquebuttonF", "spell")
button:SetAttribute("spell-cliquebuttonF", "Swiftmend")
else -- clear ooc binding
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("spell-cliquebuttonF", nil)
end
if inCombat then -- non-ooc that is masking
button:SetAttribute("type2", "spell")
button:SetAttribute("spell2", "Wild Growth")
end]],
crem = [[
button:SetAttribute("type2", nil)
button:SetAttribute("type-cliquebuttonF", nil)
button:SetAttribute("spell-cliquebuttonF", nil)
button:SetAttribute("type2", nil)
button:SetAttribute("spell2", nil)]],
bset = [[
self:SetBindingClick(true, "F", self, "cliquebuttonF");]],
brem = [[
self:ClearBinding("F");]],
}
-- Test ooc bindings being masked by friend bindings
addtest{
name = "OOC/friend mask",
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "menu", sets = { ooc = true } },
{ key = "BUTTON2", type = "spell", spell = "Wild Growth", sets = { friend = true } },
},
cset = [[
if not inCombat then -- ooc binding
button:SetAttribute("type2", "menu")
else -- clear ooc binding
button:SetAttribute("type2", nil)
end
if inCombat then -- non-ooc that is masking
button:SetAttribute("helpbutton2", "friend2")
button:SetAttribute("type-friend2", "spell")
button:SetAttribute("spell-friend2", "Wild Growth")
end]],
crem = [[
button:SetAttribute("type2", nil)
button:SetAttribute("helpbutton2", nil)
button:SetAttribute("type-friend2", nil)
button:SetAttribute("spell-friend2", nil)]],
}
-- Test friend/enemy bindings
addtest{
name = "Friend/enemy",
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "spell", spell = "Healing Touch", sets = { friend = true } },
{ key = "BUTTON2", type = "spell", spell = "Cyclone", sets = { enemy = true } },
},
cset = [[
button:SetAttribute("helpbutton2", "friend2")
button:SetAttribute("type-friend2", "spell")
button:SetAttribute("spell-friend2", "Healing Touch")
button:SetAttribute("harmbutton2", "enemy2")
button:SetAttribute("type-enemy2", "spell")
button:SetAttribute("spell-enemy2", "Cyclone")]],
crem = [[
button:SetAttribute("helpbutton2", nil)
button:SetAttribute("type-friend2", nil)
button:SetAttribute("spell-friend2", nil)
button:SetAttribute("harmbutton2", nil)
button:SetAttribute("type-enemy2", nil)
button:SetAttribute("spell-enemy2", nil)]],
}
-- Test friend/ooc/default ooc
addtest{
name = "Friend/default ooc",
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "spell", spell = "Healing Touch", sets = { ooc = true, default = true } },
{ key = "BUTTON2", type = "spell", spell = "Cyclone", sets = { ooc = true, enemy = true } },
},
cset = [[
if not inCombat then -- ooc binding
button:SetAttribute("type2", "spell")
button:SetAttribute("spell2", "Healing Touch")
else -- clear ooc binding
button:SetAttribute("type2", nil)
button:SetAttribute("spell2", nil)
end
if not inCombat then -- ooc binding
button:SetAttribute("harmbutton2", "enemy2")
button:SetAttribute("type-enemy2", "spell")
button:SetAttribute("spell-enemy2", "Cyclone")
else -- clear ooc binding
button:SetAttribute("harmbutton2", nil)
button:SetAttribute("type-enemy2", nil)
button:SetAttribute("spell-enemy2", nil)
end]],
crem = [[
button:SetAttribute("type2", nil)
button:SetAttribute("spell2", nil)
button:SetAttribute("harmbutton2", nil)
button:SetAttribute("type-enemy2", nil)
button:SetAttribute("spell-enemy2", nil)]],
}
-- pritalant
addtest{
name = "Primary talents",
talentGroup = 1,
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "spell", spell = "Healing Touch", sets = { pritalent = true } },
{ key = "BUTTON2", type = "spell", spell = "Cyclone", sets = { sectalent = true } },
},
cset = [[
button:SetAttribute("type2", "spell")
button:SetAttribute("spell2", "Healing Touch")]],
crem = [[
button:SetAttribute("type2", nil)
button:SetAttribute("spell2", nil)]],
}
-- pritalant
addtest{
name = "Secondary talents",
talentGroup = 2,
bindings = {
-- A masked binding
{ key = "BUTTON2", type = "spell", spell = "Healing Touch", sets = { pritalent = true } },
{ key = "BUTTON2", type = "spell", spell = "Cyclone", sets = { sectalent = true } },
},
cset = [[
button:SetAttribute("type2", "spell")
button:SetAttribute("spell2", "Cyclone")]],
crem = [[
button:SetAttribute("type2", nil)
button:SetAttribute("spell2", nil)]],
}
for idx, test in ipairs(tests) do
io.stdout:write("[" .. test.name .. "]")
addon.bindings = test.bindings
function GetActiveSpecGroup()
return test.talentGroup and test.talentGroup or 1
end
addon.talentGroup = test.talentGroup
local cset, crem = addon:GetClickAttributes()
local bset, brem = addon:GetBindingAttributes()
local gcset, gcrem = addon:GetClickAttributes(true)
local gbset, gbrem = addon:GetBindingAttributes(true)
check(cset, test, "cset")
check(crem, test, "crem")
check(bset, test, "bset")
check(brem, test, "brem")
check(gcset, test, "gcset")
check(gcrem, test, "gcrem")
check(gbset, test, "gbset")
check(gbrem, test, "gbrem")
print("\t - PASS")
end
print("Passed " .. #tests .. " tests")