feat: expose public Pokemon icon presentation

This commit is contained in:
MaxTomahawk
2026-08-11 11:16:58 +02:00
parent 79ed37699e
commit ccb5358aad
4 changed files with 117 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
-- Public read-only Pokemon icon presentation delegates to the same resolver
-- PartyMenu uses, so content registrations and pokemon.icon hooks compose.
package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.modkit")
local PartyMenu = require("src.ui.PartyMenu")
local FIXTURE = {
["mods/icon_probe/manifest.json"] = [[{
"id": "icon_probe",
"name": "Icon Probe",
"version": "1.0.0",
"entry": "main.lua",
"api": 2
}]],
["mods/icon_probe/main.lua"] = [[
local mod = ...
mod.exports.icon = mod.ui.PokemonIcon
]],
}
local run = T.sdk.loadMods({ "mods/icon_probe" }, { fs = T.sdk.memfs(FIXTURE) })
T.eq(#run.errors, 0, "fixture mod loads cleanly")
local icon = run.loader.exports.icon_probe.icon
T.eq(type(icon), "table", "mod.ui exposes the PokemonIcon helper")
T.eq(type(icon.draw), "function", "PokemonIcon exposes a draw operation")
local original = PartyMenu.drawIcon
local call
PartyMenu.drawIcon = function(game, mon, x, y, selected, counter)
call = { game = game, mon = mon, x = x, y = y,
selected = selected, counter = counter }
end
local game = { data = {} }
local drawn, code = icon.draw(game, {
species = "PIKACHU", hp = 4, maxHp = 10,
}, 8, 16, { selected = true, counter = 7 })
T.eq(drawn, true, "valid detached Pokemon summary is drawable")
T.eq(code, nil, "valid summary has no rejection code")
T.check(call and call.game == game, "helper delegates with the live game")
T.eq(call.mon.species, "PIKACHU", "species reaches the shared party resolver")
T.eq(call.mon.hp, 4, "captured current HP reaches icon animation semantics")
T.eq(call.mon.stats.hp, 10, "captured maximum HP reaches icon animation semantics")
T.eq(call.selected, true, "selection state is presentation-only")
T.eq(call.counter, 7, "animation counter is presentation-only")
call = nil
local bad, badCode = icon.draw(game, {
species = "PIKACHU", hp = 11, maxHp = 10,
}, 0, 0)
T.eq(bad, false, "invalid detached summary fails closed")
T.eq(badCode, "invalid_pokemon_preview", "invalid summary has a stable error")
T.eq(call, nil, "invalid summary never reaches renderer internals")
PartyMenu.drawIcon = original
run.release()
T.finish("pokemon_icon")