350 lines
18 KiB
Lua

-------------------------------------------------------------------------------
---Class to build UnitTestPanel panel
---@class UnitTestPanel
UnitTestPanel = newclass(Form,function(base,classname)
Form.init(base,classname)
base.add_special_button = true
end)
local data = require "unit_test.Data"
local data_pyanodons = require "unit_test.DataPyanodons"
local data_bob_angel = require "unit_test.DataBobAngel"
local data_krastorio2 = require "unit_test.DataKrastorio2"
local data_space_ecploration = require "unit_test.DataSpaceExploration"
-------------------------------------------------------------------------------
---On initialization
function UnitTestPanel:onInit()
self.panelCaption = ({"helmod_result-panel.tab-button-unittest"})
self.help_button = false
end
-------------------------------------------------------------------------------
---Get Button Sprites
---@return boolean
function UnitTestPanel:getButtonSprites()
return defines.sprites.database_test.white,defines.sprites.database_test.black
end
-------------------------------------------------------------------------------
---Is visible
---@return boolean
function UnitTestPanel:isVisible()
return User.getModGlobalSetting("hidden_panels")
end
-------------------------------------------------------------------------------
---Is special
---@return boolean
function UnitTestPanel:isSpecial()
return true
end
-------------------------------------------------------------------------------
---Get or create tab panel
---@return LuaGuiElement
function UnitTestPanel:getTabPane()
local content_panel = self:getFrameDeepPanel("panel")
local panel_name = "tab_panel"
if content_panel[panel_name] ~= nil and content_panel[panel_name].valid then
return content_panel[panel_name]
end
local panel = GuiElement.add(content_panel, GuiTabPane(panel_name))
return panel
end
-------------------------------------------------------------------------------
---Get or create tab panel
---@return LuaGuiElement
function UnitTestPanel:getTab(panel_name, caption)
local content_panel = self:getTabPane()
local scroll_name = "scroll-" .. panel_name
if content_panel[panel_name] ~= nil and content_panel[panel_name].valid then
return content_panel[scroll_name]
end
local tab_panel = GuiElement.add(content_panel, GuiTab(panel_name):caption(caption))
local scroll_panel = GuiElement.add(content_panel, GuiScroll(scroll_name):style("helmod_scroll_pane"):policy(true))
content_panel.add_tab(tab_panel,scroll_panel)
scroll_panel.style.horizontally_stretchable = true
scroll_panel.style.vertically_stretchable = true
return scroll_panel
end
-------------------------------------------------------------------------------
---Get or create energy tab panel
---@return LuaGuiElement
function UnitTestPanel:getEnergyTab()
return self:getTab("energy-tab-panel", {"helmod_unittest.energy-title"})
end
-------------------------------------------------------------------------------
---Get or create sprite tab panel
---@return LuaGuiElement
function UnitTestPanel:getSpriteTab()
return self:getTab("sprite-tab-panel", {"helmod_unittest.sprite-title"})
end
-------------------------------------------------------------------------------
---On event
---@param event LuaEvent
function UnitTestPanel:onEvent(event)
if not(User.isAdmin()) then return end
if event.action == "reload-script" then
game.reload_script()
Controller:send("on_gui_update", event)
end
end
-------------------------------------------------------------------------------
---On update
---@param event LuaEvent
function UnitTestPanel:onUpdate(event)
if game.active_mods["boblibrary"] then
data = data_bob_angel
end
if game.active_mods["pyrawores"] then
data = data_pyanodons
end
if game.active_mods["Krastorio2"] then
data = data_krastorio2
end
if game.active_mods["space-exploration"] then
data = data_space_ecploration
end
self:updateMenu()
self:updateEnergy()
self:updateSprite()
end
-------------------------------------------------------------------------------
---Update menu
function UnitTestPanel:updateMenu()
local menu_panel = self:getMenuPanel()
---pin info
local group1 = GuiElement.add(menu_panel, GuiFlowH("group1"))
GuiElement.add(group1, GuiButton("HMUnitTestPanel", "reload-script"):sprite("menu", defines.sprites.refresh.black, defines.sprites.refresh.black):style("helmod_button_menu"):tooltip("Reload script"))
end
-------------------------------------------------------------------------------
---Update energy
function UnitTestPanel:updateSprite()
local tab_panel = self:getSpriteTab()
local table_panel = GuiElement.add(tab_panel, GuiTable("list-table"):column(2))
for sprite_name, sprites in pairs(defines.sprites) do
local col1 = GuiElement.add(table_panel, GuiFrameH("info", sprite_name):style(helmod_frame_style.hidden))
GuiElement.add(col1, GuiLabel("label"):caption(sprite_name))
local col2 = GuiElement.add(table_panel, GuiFrameH("buttons", sprite_name):style(helmod_frame_style.hidden))
for color_name, sprite in pairs(sprites) do
GuiElement.add(col2, GuiButton("do_noting", sprite_name, color_name):sprite("menu", sprite, sprite):style("helmod_button_menu"):tooltip(string.format("defines.sprites.%s.%s", sprite_name, color_name)))
end
end
end
-------------------------------------------------------------------------------
---Update energy
function UnitTestPanel:updateEnergy()
local tab_panel = self:getEnergyTab()
GuiElement.add(tab_panel, GuiLabel("label"):caption(data.mod):style("heading_1_label"))
local table_panel = GuiElement.add(tab_panel, GuiTable("list-table"):column(23))
table_panel.vertical_centering = false
table_panel.style.horizontal_spacing = 10
self:addEnergyListHeader(table_panel)
for entity, test_data in spairs(data.energy, function(t,a,b) return t[b]["energy_type_input"] < t[a]["energy_type_input"] end) do
self:addEnergyListRow(table_panel, entity, test_data)
end
end
-------------------------------------------------------------------------------
---Add cell header with tooltip
---@param itable LuaGuiElement
---@param name string
---@param caption string
---@param tooltip table
function UnitTestPanel:addCellHeaderTooltip(itable, name, caption, tooltip)
local cell = GuiElement.add(itable, GuiFrameH("header", name):style(helmod_frame_style.hidden))
GuiElement.add(cell, GuiLabel("label"):caption(caption):tooltip(tooltip))
end
-------------------------------------------------------------------------------
---Add energy List header
---@param itable LuaGuiElement
function UnitTestPanel:addEnergyListHeader(itable)
---col action
self:addCellHeaderTooltip(itable, "entity", "Entity")
---data
self:addCellHeaderTooltip(itable, "type", "Type")
self:addCellHeaderTooltip(itable, "name", "Name")
---**** Attributes ***
self:addCellHeaderTooltip(itable, "energy-type", "ET", "Energy Type")
self:addCellHeaderTooltip(itable, "energy-usage-min", "EUmin", "Min Energy Usage")
self:addCellHeaderTooltip(itable, "energy-usage-max", "EUmax", "Max Energy Usage")
self:addCellHeaderTooltip(itable, "energy-usage-priority", "EUP", "Energy Usage Priority")
self:addCellHeaderTooltip(itable, "fluid-usage", "FU", "Fluid Usage /s")
self:addCellHeaderTooltip(itable, "fluid-burns", "FB", "Fluid Burns")
self:addCellHeaderTooltip(itable, "effectivity", "E", "Effectivity")
self:addCellHeaderTooltip(itable, "target-temperature", "TT", "Target Temperature")
self:addCellHeaderTooltip(itable, "maximum-temperature", "MT", "Maximum Temperature")
---**** Computed ***
self:addCellHeaderTooltip(itable, "energy-type-input", "ETI", "Energy Type Input")
self:addCellHeaderTooltip(itable, "energy-consumption", "EC", "Energy Consumption")
self:addCellHeaderTooltip(itable, "fluid-consumption", "FC", "Fluid Consumption /s")
self:addCellHeaderTooltip(itable, "fluid-fuel", "FF", "Fluid Fuel")
self:addCellHeaderTooltip(itable, "fluid-capacity", "FJ", "Fluid Capacity J")
self:addCellHeaderTooltip(itable, "energy-type-output", "ETO", "Energy Type Output")
self:addCellHeaderTooltip(itable, "fluid-production", "FP", "Fluid Production /s")
self:addCellHeaderTooltip(itable, "fluid-production-prototype", "FPP", "Fluid Production Prototype")
self:addCellHeaderTooltip(itable, "energy-production", "EP", "Energy Production")
self:addCellHeaderTooltip(itable, "pollution", "P", "Pollution")
self:addCellHeaderTooltip(itable, "speed", "S", "Speed")
end
-------------------------------------------------------------------------------
---Add row energy List
---@param itable LuaGuiElement
---@param entity table
---@param test_data table
function UnitTestPanel:addEnergyListRow(itable, entity, test_data)
local prototype = EntityPrototype(entity)
local lua_prototype = prototype:native()
if lua_prototype ~= nil then
---col Entity
local button = GuiElement.add(itable, GuiButtonSelectSprite("entity", entity):choose("entity", lua_prototype.name))
button.locked = true
---col Type
GuiElement.add(itable, GuiLabel("type", entity):caption(lua_prototype.type))
---col Name
GuiElement.add(itable, GuiLabel("name", entity):caption(lua_prototype.name))
local energy_source = prototype:getEnergySource()
---**** Attributes ***
---col Energy Type
local energy_type = "none"
if energy_source ~= nil then
energy_type = energy_source:getType()
end
local tag_color, tooltip = self:valueEquals(energy_type, test_data.energy_type, true)
GuiElement.add(itable, GuiLabel("energy-type", entity):caption({"", helmod_tag.font.default_bold, tag_color, energy_type, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Usage Min
local energy_usage_min = math.floor(prototype:getMinEnergyUsage())
local tag_color, tooltip = self:valueEquals(energy_usage_min, test_data.energy_usage_min, true)
GuiElement.add(itable, GuiLabel("energy-usage-min", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumberKilo(energy_usage_min, "W"), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Usage Max
local energy_usage_max = math.floor(prototype:getMaxEnergyUsage())
local tag_color, tooltip = self:valueEquals(energy_usage_max, test_data.energy_usage_max, true)
GuiElement.add(itable, GuiLabel("energy-usage-max", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumberKilo(energy_usage_max, "W"), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Usage Priority
local energy_usage_priority = "none"
if energy_source ~= nil then
energy_usage_priority = energy_source:getUsagePriority()
end
local tag_color, tooltip = self:valueEquals(energy_usage_priority, test_data.energy_usage_priority, true)
GuiElement.add(itable, GuiLabel("energy-usage-priority", entity):caption({"", helmod_tag.font.default_bold, tag_color, energy_usage_priority, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Usage /s
local fluid_usage = math.floor(prototype:getFluidUsage())
local tag_color, tooltip = self:valueEquals(fluid_usage, test_data.fluid_usage, true)
GuiElement.add(itable, GuiLabel("fluid-usage", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_usage, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Burns
local fluid_burns = "none"
if energy_source ~= nil and prototype:getEnergyTypeInput() == "fluid" then
fluid_burns = prototype:getBurnsFluid()
end
local tag_color, tooltip = self:valueEquals(fluid_burns, test_data.fluid_burns, true)
GuiElement.add(itable, GuiLabel("fluid-burns", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_burns, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Effectivity
local effectivity = prototype:getEffectivity()
local tag_color, tooltip = self:valueEquals(effectivity, test_data.effectivity, true)
GuiElement.add(itable, GuiLabel("effectivity", entity):caption({"", helmod_tag.font.default_bold, tag_color, effectivity, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Target Temperature
local target_temperature = prototype:getTargetTemperature()
local tag_color, tooltip = self:valueEquals(target_temperature, test_data.target_temperature, true)
GuiElement.add(itable, GuiLabel("target-temperature", entity):caption({"", helmod_tag.font.default_bold, tag_color, target_temperature, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Maximum Temperature
local maximum_temperature = prototype:getMaximumTemperature()
local tag_color, tooltip = self:valueEquals(maximum_temperature, test_data.maximum_temperature, true)
GuiElement.add(itable, GuiLabel("maximum-temperature", entity):caption({"", helmod_tag.font.default_bold, tag_color, maximum_temperature, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---**** Computed ***
---col Energy Type
local energy_type_input = prototype:getEnergyTypeInput()
local tag_color, tooltip = self:valueEquals(energy_type_input, test_data.energy_type_input)
GuiElement.add(itable, GuiLabel("energy-type-input", entity):caption({"", helmod_tag.font.default_bold, tag_color, energy_type_input, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Consumption
local energy_consumption = math.floor(prototype:getEnergyConsumption() + prototype:getMinEnergyUsage())
local tag_color, tooltip = self:valueEquals(energy_consumption, test_data.energy_consumption)
GuiElement.add(itable, GuiLabel("energy-consumption", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumberKilo(energy_consumption, "W"), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Consumption /s
local fluid_consumption = Format.round(prototype:getFluidConsumption(),-2)
local tag_color, tooltip = self:valueEquals(fluid_consumption, test_data.fluid_consumption)
GuiElement.add(itable, GuiLabel("fluid-consumption", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_consumption, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Fuel
local fuel_prototype = prototype:getFluidFuelPrototype()
local fluid_fuel = {name="none", capacity=0}
if fuel_prototype ~= nil and fuel_prototype:native() ~= nil then
fluid_fuel = {name=fuel_prototype:native().name, capacity=fuel_prototype:getHeatCapacity()}
end
local tag_color, tooltip = self:valueEquals(fluid_fuel.name, test_data.fluid_fuel.name)
GuiElement.add(itable, GuiLabel("fluid-fuel", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_fuel.name, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Capacity
local tag_color, tooltip = self:valueEquals(fluid_fuel.capacity, test_data.fluid_fuel.capacity)
GuiElement.add(itable, GuiLabel("fluid-capacity", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_fuel.capacity, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Type Output
local energy_type_output = prototype:getEnergyTypeOutput()
local tag_color, tooltip = self:valueEquals(energy_type_output, test_data.energy_type_output)
GuiElement.add(itable, GuiLabel("energy-type-output", entity):caption({"", helmod_tag.font.default_bold, tag_color, energy_type_output, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Production /s
local fluid_production = {name="none", amount=math.floor(prototype:getFluidProduction())}
local fluid_production_filter = prototype:getFluidProductionFilter()
if fluid_production_filter ~= nil then fluid_production.name = fluid_production_filter.name end
local tag_color, tooltip = self:valueEquals(fluid_production.amount, test_data.fluid_production.amount)
GuiElement.add(itable, GuiLabel("fluid-production", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_production.amount, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Fluid Production Prototype
local tag_color, tooltip = self:valueEquals(fluid_production.name, test_data.fluid_production.name)
GuiElement.add(itable, GuiLabel("fluid-production-prototype", entity):caption({"", helmod_tag.font.default_bold, tag_color, fluid_production.name, helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Energy Production
local energy_production = math.floor(prototype:getEnergyProduction())
local tag_color, tooltip = self:valueEquals(energy_production, test_data.energy_production)
GuiElement.add(itable, GuiLabel("energy-production", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumberKilo(energy_production, "W"), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Pollution
local pollution = Format.round(prototype:getPollution() * 60, -2)
local tag_color, tooltip = self:valueEquals(pollution, test_data.pollution)
GuiElement.add(itable, GuiLabel("pollution", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumber(pollution), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
---col Speed
local speed = Format.round(prototype:speedFactory(test_data.recipe), -2)
local tag_color, tooltip = self:valueEquals(speed, test_data.speed)
GuiElement.add(itable, GuiLabel("speed", entity):caption({"", helmod_tag.font.default_bold, tag_color, Format.formatNumber(speed), helmod_tag.color.close, helmod_tag.font.close}):tooltip(tooltip))
end
end
function UnitTestPanel:valueEquals(current_value, target_value, attribute)
if current_value == target_value then
local tag_color = helmod_tag.color.green_light
if attribute then
tag_color = helmod_tag.color.blue_light
end
if current_value == "none" then
tag_color = helmod_tag.color.white
end
local tooltip = {"","Success"}
return tag_color, tooltip
else
local tag_color = helmod_tag.color.red_light
if attribute then
tag_color = helmod_tag.color.orange
end
local display_current = current_value
if type(current_value) == "number" then
display_current = Format.formatNumber(current_value)
end
local display_target = target_value
if type(target_value) == "number" then
display_target = Format.formatNumber(target_value)
end
local tooltip = {"",string.format("Failed, value %s must be %s", display_current, display_target)}
return tag_color, tooltip
end
end