local addonName, addon = ...
local tests = {}
--[[-------------------------------------------------------------------
-- Bootstrap code to set up the buttons
-------------------------------------------------------------------]]--
local groupheader = CreateFrame("Button", addonName .. "TestHeader", UIParent, "SecureGroupHeaderTemplate")
SecureHandler_OnLoad(groupheader)
local button_m = CreateFrame("Button", addonName .. "TestButton_m", UIParent, "SecureActionButtonTemplate")
local button_h = CreateFrame("Button", addonName .. "TestButton_h", UIParent, "ClickCastUnitTemplate,SecureActionButtonTemplate")
--[[-------------------------------------------------------------------
-- Create the event handler
-------------------------------------------------------------------]]--
local eventFrame = CreateFrame("Frame")
eventFrame:RegisterEvent("PLAYER_LOGIN")
eventFrame:SetScript("OnEvent", function(self, event, ...)
print("====== " .. addonName .. "Test Suite ======")
print(" - Registering frames for click-casting")
ClickCastFrames[button_m] = true
groupheader:SetFrameRef("clickcast_header", addon.header)
groupheader:SetFrameRef("thebutton", button_h)
groupheader:Execute[[
local header = self:GetFrameRef("clickcast_header")
header:SetAttribute("clickcast_button", self:GetFrameRef("thebutton"))
header:RunAttribute("clickcast_register")
]]
local currentProfile = addon.db:GetCurrentProfile()
for name, testFunc in pairs(tests) do
print(" - Running " .. name)
testFunc()
end
addon.db:SetProfile(currentProfile)
end)
--[[-------------------------------------------------------------------
-- Utility functions
-------------------------------------------------------------------]]--
local function makeprofile(bindings)
addon:ClearAttributes()
local tempName = "Temp" .. GetTime()
local suiteName = addonName .. "TestSuite"
addon.db:SetProfile(tempName)
addon.db:DeleteProfile(suiteName, true)
addon.db:SetProfile(suiteName)
addon.db:DeleteProfile(tempName)
table.wipe(addon.bindings)
for k,v in pairs(bindings) do
table.insert(addon.bindings, v)
end
addon:FireMessage("BINDINGS_CHANGED")
end
local function makebind(key)
local entry = {}
entry.key = key
entry.type = "menu"
entry.menu = function()
CLIQUE_TEST_TRIGGERED = key
end
entry.sets = {default = true}
return entry
end
local function getbutton(bind)
local prefix, suffix = addon:GetBindingPrefixSuffix(bind)
if suffix == "1" then
suffix = "LeftButton"
elseif suffix == "2" then
suffix = "RightButton"
elseif suffix == "3" then
suffix = "MiddleButton"
elseif tonumber(suffix) then
suffix = "Button" .. suffix
end
return suffix
end
local passed = 0
local function pass(name)
passed = passed + 1
--print(" - |cff00ff00PASS|r - " .. name)
end
local failed = 0
local function fail(name)
failed = failed + 1
print(" - |cffff0000FAIL|r - " .. name)
end
local modbits = {
"IsAltKeyDown",
"IsLeftAltKeyDown",
"IsRightAltKeyDown",
"IsControlKeyDown",
"IsLeftControlKeyDown",
"IsRightControlKeyDown",
"IsShiftKeyDown",
"IsLeftShiftKeyDown",
"IsRightShiftKeyDown",
}
local origs = {}
for k,v in pairs(modbits) do
origs[v] = _G[v]
end
local function setmodifiers(bind)
local binary = addon:GetBinaryBindingKey()
for i = 1, #binary, 1 do
local enabled = binary:sub(i,i) == "1"
if enabled then
_G[modbits[i]] = function() return 1 end
end
end
end
local function clrmodifiers()
for idx, name in ipairs(modbits) do
_G[name] = origs[name]
end
end
local function randommodifiers()
local prefix = ""
if math.random(0, 1) then
-- Alt key down
local which = math.random(0, 10)
if which >= 2 then
prefix = prefix .. "ALT-"
elseif which == 0 then
prefix = prefix .. "LALT-"
elseif which == 1 then
prefix = prefix .. "RALT-"
end
end
if math.random(0, 1) then
-- Ctrl key down
local which = math.random(0, 10)
if which >= 2 then
prefix = prefix .. "CTRL-"
elseif which == 0 then
prefix = prefix .. "LCTRL-"
elseif which == 1 then
prefix = prefix .. "RCTRL-"
end
end
if math.random(0, 1) then
-- Shift key down
local which = math.random(0, 10)
if which >= 2 then
prefix = prefix .. "SHIFT-"
elseif which == 0 then
prefix = prefix .. "LSHIFT-"
elseif which == 1 then
prefix = prefix .. "RSHIFT-"
end
end
return prefix
end
--[[-------------------------------------------------------------------
-- Test code
-------------------------------------------------------------------]]--
local all_binding_types = {
lower = makebind("f"),
upper = makebind("F"),
num = makebind("1"),
foreign = makebind("รถ"),
fkey = makebind("F1"),
qkey = makebind("DOUBLEQUOTE"),
dash = makebind("DASH"),
bspace = makebind("BACKSPACE"),
leftbutton = makebind("BUTTON1"),
rightbutton = makebind("BUTTON2"),
middlebutton = makebind("BUTTON3"),
button4 = makebind("BUTTON4"),
button5 = makebind("BUTTON5"),
}
-- First test to ensure each type of binding works properly
function tests.SimpleTriggers()
makeprofile(all_binding_types)
for name, bind in pairs(all_binding_types) do
-- Test to see if the binding works on the manually registered button
local button = getbutton(bind)
button_m.menu = bind.menu
button_m:Click(button)
if CLIQUE_TEST_TRIGGERED then
pass(name .. " manual")
else
fail(name .. " manual")
end
button_h.menu = bind.menu
button_h:Click(button)
if CLIQUE_TEST_TRIGGERED then
pass(name .. " header")
else
fail(name .. " header")
end
end
print(" - " .. passed .. " passed, " .. failed .. " failed")
end
function tests.Modifiers()
-- Copy bindings table
local bindings = {}
for k,v in pairs(all_binding_types) do
bindings[k] = {}
for ka,va in pairs(v) do
bindings[k][ka] = va
end
end
-- Run this test five times
for i = 1, 10, 1 do
for name, bind in pairs(bindings) do
local obind = bind.key
bind.key = randommodifiers() .. bind.key
-- Register the bindings
makeprofile(bindings)
-- Manually registered button
local button = getbutton(bind)
button_m.menu = function()
CLIQUE_TEST_TRIGGERED = bind.key
end
button_m:Click(button)
if CLIQUE_TEST_TRIGGERED then
pass(name .. " manual")
else
fail(name .. " manual")
end
button_h.menu = function()
CLIQUE_TEST_TRIGGERED = bind.key
end
button_h:Click(button)
if CLIQUE_TEST_TRIGGERED then
pass(name .. "(" .. bind.key .. ") " .. "header")
else
fail(name .. " header")
end
bind.key = obind
end
end
print(" - " .. passed .. " passed, " .. failed .. " failed")
end