Files
ShaguTweaks-ClassicAPI/tests/test_unitframe_style_routing.lua

107 lines
6.6 KiB
Lua

local root=(arg[1] or '.')..'/'
local env=setmetatable({},{__index=getfenv(0)});env._G=env
local modules,hooks,frames,power,queries={},{},{},{player=0,target=0,party1=0},{}
local function texture(path)
local t={path=path,shown=true,coords={0,0,0,1,1,0,1,1},writes=0,crops=0}
function t:GetTexture()return self.path end
function t:SetTexture(path)self.path=path;self.writes=self.writes+1 end
function t:GetTexCoord()return unpack(self.coords)end
function t:SetTexCoord(l,r,top,bottom)self.coords={l,top,l,bottom,r,top,r,bottom};self.crops=self.crops+1 end
function t:SetAllPoints()end
function t:IsShown()return self.shown end
function t:Show()self.shown=true end
function t:Hide()self.shown=false end
return t
end
local function bar(unit)
local f={unit=unit,fill=texture('original'),color={.2,.3,.4,1},writes=0}
function f:GetStatusBarTexture()return self.fill end
function f:SetStatusBarTexture(path)self.fill:SetTexture(path)end
function f:GetStatusBarColor()return unpack(self.color)end
function f:SetStatusBarColor(r,g,b,a)self.color={r,g,b,a};self.writes=self.writes+1 end
function f:CreateTexture()return texture()end
return f
end
env.PlayerFrameManaBar=bar('player');env.PlayerFrameAlternatePowerBar=bar('player')
env.TargetFrameManaBar=bar('target');env.PartyMemberFrame1ManaBar=bar('party1')
env.MAX_PARTY_MEMBERS=1
env.UnitExists=function(unit)queries[unit]=(queries[unit] or 0)+1;return true end
env.UnitPowerType=function(unit)return power[unit] or 0 end
env.UnitClass=function(unit)return 'Druid','DRUID' end
env.CreateFrame=function()
local f={scripts={}}
function f:SetScript(k,v)self.scripts[k]=v end
function f:RegisterEvent()end
function f:Hide()end
table.insert(frames,f);return f
end
env.ShaguTweaks={T=setmetatable({},{__index=function(_,k)return k end}),API={},GetGlobalEnv=function()return env end}
function env.ShaguTweaks:register(m)modules[m.title]=m;return m end
env.ShaguTweaks.hooksecurefunc=function(obj,name,callback)
if type(obj)=='string' then hooks[obj]=name;return end
local old=obj[name];obj[name]=function(self,r,g,b,a)old(self,r,g,b,a);callback(self,r,g,b,a)end
end
local function load(path)local f=assert(loadfile(root..path));setfenv(f,env);f()end
load('mods/unitframes-classcolor.lua');modules['Modern Class Colors']:enable()
local player,alt,target,party=env.PlayerFrameManaBar,env.PlayerFrameAlternatePowerBar,env.TargetFrameManaBar,env.PartyMemberFrame1ManaBar
local function reset()
queries={}
for _,f in ipairs({player,alt,target,party})do f.writes=0;f.fill.writes=0 end
end
reset();hooks.UnitFrame_UpdateManaType({unit='target',manabar=target})
assert(queries.target==1 and not queries.player and not queries.party1)
assert(target.fill.writes==0 and target.writes==0,'unchanged styles must not repeat texture/tint writes')
-- Native overwrites are corrected even though the cached style key is stable.
target.fill.path='native';target.color={0,0,1,1};hooks.UnitFrame_UpdateManaType({manabar=target})
assert(target.fill.writes==1 and target.writes==1 and target.color[1]==1)
reset();target:SetStatusBarColor(.5,.5,.5,1)
assert(target.writes==2 and not queries.player and not queries.party1)
reset();target.color={.999997,.999997,.999997,.999997};hooks.UnitFrame_UpdateManaType(target)
assert(target.writes==0,'packed native white should not trigger repeated corrective writes')
-- A player form change updates the primary and fixed-mana secondary bar only.
reset();power.player=3;hooks.UnitFrame_UpdateManaType({unit='player'})
assert(queries.player==2 and not queries.target and not queries.party1)
assert(string.find(player.fill.path,'ModernPowerEnergyClass',1,true))
assert(string.find(alt.fill.path,'ModernPowerManaClass',1,true))
reset();hooks.UnitFrame_UpdateManaType({unit='raid40'});assert(not next(queries))
env.this={manabar=party};hooks.UnitFrame_UpdateManaType('party1');env.this=nil
assert(queries.party1==1 and not queries.player)
power.target=7;reset();hooks.UnitFrame_UpdateManaType(target);assert(target.fill.path=='original')
hooks.UnitFrame_UpdateManaType(target);assert(target.fill.writes==1)
-- Keep the explicit full startup refresh after other modules initialize.
reset();env.this=frames[1];frames[1].scripts.OnUpdate();env.this=nil
assert(queries.player==2 and queries.target==1 and queries.party1==1)
local classQueries,players,selfTarget={}, {},false
env.GetAddOnInfo=function()return 'ShaguTweaks','ShaguTweaks' end
env.UnitClass=function(unit)classQueries[unit]=(classQueries[unit] or 0)+1;return 'Druid','DRUID' end
env.UnitIsPlayer=function(unit)return players[unit]~=false end
env.UnitIsUnit=function(a,b)return a==b or selfTarget and ((a=='player' and b=='target')or(a=='target' and b=='player'))end
env.TargetofTarget_OnUpdate=function()end
env.ShaguTweaks.API.UnitGUID=function(unit)return unit..'guid' end
env.PlayerFrame={unit='player',portrait=texture('portrait')}
env.TargetFrame={unit='target',portrait=texture('portrait')}
env.TargetofTargetFrame={unit='targettarget',portrait=texture('portrait')}
for i=1,4 do env['PartyMemberFrame'..i]={unit='party'..i,portrait=texture('portrait')}end
load('mods/unitframes-classportrait.lua');modules['Unit Frame Class Portraits']:enable()
local events=frames[table.getn(frames)]
local function emit(name,unit)
classQueries={};env.event,env.arg1=name,unit;events.scripts.OnEvent()
end
emit('PLAYER_ENTERING_WORLD')
assert(classQueries.player==1 and classQueries.target==1 and classQueries.party4==1)
emit('UNIT_PORTRAIT_UPDATE','party2');assert(classQueries.party2==1 and not classQueries.player and not classQueries.target)
local portrait=env.PartyMemberFrame2.portrait;local writes,crops=portrait.writes,portrait.crops
emit('UNIT_PORTRAIT_UPDATE','party2');assert(portrait.writes==writes and portrait.crops==crops)
emit('UNIT_PORTRAIT_UPDATE','raid40');assert(not next(classQueries))
selfTarget=true;emit('UNIT_PORTRAIT_UPDATE','player');assert(classQueries.player==1 and classQueries.target==1)
local tf=env.TargetFrame;tf.portrait.path='native';tf.portrait.coords={0,0,0,1,1,0,1,1}
hooks.UnitFrame_Update(tf);assert(string.find(tf.portrait.path,'UI-Classes-Circles',1,true))
tf.portrait.path='native';env.this=tf;hooks.UnitFrame_Update('target');env.this=nil
assert(string.find(tf.portrait.path,'UI-Classes-Circles',1,true))
players.target=false;tf.portrait.path='npc';hooks.UnitFrame_Update(tf)
assert(tf.portrait.path=='npc' and tf.portrait.coords[1]==0 and tf.portrait.coords[5]==1)
env.TargetofTarget_OnUpdate(.3)
assert(string.find(env.TargetofTargetFrame.portrait.path,'UI-Classes-Circles',1,true))
print('Unit-frame styling: affected power/portrait routing, startup refreshes, fixed druid mana, stable keys/live overwrite correction, packed-white tolerance, aliases and native hook contexts passed')