Files
FlexLove/testing/__tests__/31_immediate_mode_basic_tests.lua
2025-11-04 16:13:18 -05:00

274 lines
6.6 KiB
Lua

-- Test: Immediate Mode Basic Functionality
package.path = package.path .. ";./?.lua;./game/?.lua;./game/utils/?.lua;./game/components/?.lua;./game/systems/?.lua"
local luaunit = require("testing.luaunit")
require("testing.loveStub") -- Required to mock LOVE functions
local FlexLove = require("FlexLove")
local Gui = FlexLove.Gui
TestImmediateModeBasic = {}
function TestImmediateModeBasic:setUp()
-- Reset GUI state
if Gui.destroy then
Gui.destroy()
end
-- Initialize with immediate mode enabled
Gui.init({
baseScale = { width = 1920, height = 1080 },
immediateMode = true,
})
end
function TestImmediateModeBasic:tearDown()
-- Clear all states
if Gui.clearAllStates then
Gui.clearAllStates()
end
-- Reset immediate mode state
if Gui._immediateModeState then
Gui._immediateModeState.reset()
end
if Gui.destroy then
Gui.destroy()
end
-- Reset immediate mode flag
Gui._immediateMode = false
Gui._frameNumber = 0
end
function TestImmediateModeBasic:test_immediate_mode_enabled()
luaunit.assertTrue(Gui._immediateMode, "Immediate mode should be enabled")
luaunit.assertNotNil(Gui._immediateModeState, "Immediate mode state should be initialized")
end
function TestImmediateModeBasic:test_frame_lifecycle()
-- Begin frame
Gui.beginFrame()
luaunit.assertEquals(Gui._frameNumber, 1, "Frame number should increment to 1")
luaunit.assertEquals(#Gui.topElements, 0, "Top elements should be empty at frame start")
-- Create an element
local button = Gui.new({
id = "test_button",
width = 100,
height = 50,
text = "Click me",
})
luaunit.assertNotNil(button, "Button should be created")
luaunit.assertEquals(button.id, "test_button", "Button should have correct ID")
-- End frame
Gui.endFrame()
-- State should persist
luaunit.assertEquals(Gui.getStateCount(), 1, "Should have 1 state entry")
end
function TestImmediateModeBasic:test_auto_id_generation()
Gui.beginFrame()
-- Create element without explicit ID
local element1 = Gui.new({
width = 100,
height = 50,
})
luaunit.assertNotNil(element1.id, "Element should have auto-generated ID")
luaunit.assertNotEquals(element1.id, "", "Auto-generated ID should not be empty")
Gui.endFrame()
end
function TestImmediateModeBasic:test_state_persistence()
-- Frame 1: Create button and simulate click
Gui.beginFrame()
local button = Gui.new({
id = "persistent_button",
width = 100,
height = 50,
text = "Click me",
})
-- Simulate some state
button._clickCount = 5
button._lastClickTime = 123.45
Gui.endFrame()
-- Frame 2: Recreate button - state should persist
Gui.beginFrame()
local button2 = Gui.new({
id = "persistent_button",
width = 100,
height = 50,
text = "Click me",
})
luaunit.assertEquals(button2._clickCount, 5, "Click count should persist")
luaunit.assertEquals(button2._lastClickTime, 123.45, "Last click time should persist")
Gui.endFrame()
end
function TestImmediateModeBasic:test_helper_functions()
Gui.beginFrame()
-- Test button helper
local button = Gui.button({
id = "helper_button",
width = 100,
height = 50,
text = "Button",
})
luaunit.assertNotNil(button, "Button helper should create element")
luaunit.assertEquals(button.themeComponent, "button", "Button should have theme component")
-- Test panel helper
local panel = Gui.panel({
id = "helper_panel",
width = 200,
height = 200,
})
luaunit.assertNotNil(panel, "Panel helper should create element")
-- Test text helper
local text = Gui.text({
id = "helper_text",
text = "Hello",
})
luaunit.assertNotNil(text, "Text helper should create element")
-- Test input helper
local input = Gui.input({
id = "helper_input",
width = 150,
height = 30,
})
luaunit.assertNotNil(input, "Input helper should create element")
luaunit.assertTrue(input.editable, "Input should be editable")
Gui.endFrame()
end
function TestImmediateModeBasic:test_state_cleanup()
Gui.init({
immediateMode = true,
stateRetentionFrames = 2, -- Very short retention for testing
})
-- Frame 1: Create temporary element
Gui.beginFrame()
Gui.new({
id = "temp_element",
width = 100,
height = 50,
})
Gui.endFrame()
luaunit.assertEquals(Gui.getStateCount(), 1, "Should have 1 state after frame 1")
-- Frame 2: Don't create the element
Gui.beginFrame()
Gui.endFrame()
luaunit.assertEquals(Gui.getStateCount(), 1, "Should still have 1 state after frame 2")
-- Frame 3: Still don't create it
Gui.beginFrame()
Gui.endFrame()
luaunit.assertEquals(Gui.getStateCount(), 1, "Should still have 1 state after frame 3")
-- Frame 4: Should be cleaned up now (retention = 2 frames)
Gui.beginFrame()
Gui.endFrame()
luaunit.assertEquals(Gui.getStateCount(), 0, "State should be cleaned up after retention period")
end
function TestImmediateModeBasic:test_manual_state_management()
Gui.beginFrame()
Gui.new({
id = "element1",
width = 100,
height = 50,
})
Gui.new({
id = "element2",
width = 100,
height = 50,
})
Gui.endFrame()
luaunit.assertEquals(Gui.getStateCount(), 2, "Should have 2 states")
-- Clear specific state
Gui.clearState("element1")
luaunit.assertEquals(Gui.getStateCount(), 1, "Should have 1 state after clearing element1")
-- Clear all states
Gui.clearAllStates()
luaunit.assertEquals(Gui.getStateCount(), 0, "Should have 0 states after clearing all")
end
function TestImmediateModeBasic:test_retained_mode_still_works()
-- Reinitialize without immediate mode
Gui.destroy()
Gui.init({
baseScale = { width = 1920, height = 1080 },
immediateMode = false, -- Explicitly disable
})
luaunit.assertFalse(Gui._immediateMode, "Immediate mode should be disabled")
-- Create element in retained mode
local element = Gui.new({
width = 100,
height = 50,
text = "Retained",
})
luaunit.assertNotNil(element, "Element should be created in retained mode")
luaunit.assertEquals(#Gui.topElements, 1, "Should have 1 top element")
-- Element should persist without beginFrame/endFrame
luaunit.assertEquals(#Gui.topElements, 1, "Element should still exist")
end
function TestImmediateModeBasic:test_state_stats()
Gui.beginFrame()
Gui.new({
id = "stats_test",
width = 100,
height = 50,
})
Gui.endFrame()
local stats = Gui.getStateStats()
luaunit.assertNotNil(stats, "Stats should be returned")
luaunit.assertEquals(stats.stateCount, 1, "Stats should show 1 state")
luaunit.assertNotNil(stats.frameNumber, "Stats should include frame number")
end
luaunit.LuaUnit.run()