This commit is contained in:
Michael Freno
2025-09-18 18:27:57 -04:00
parent d869582b37
commit d5f85e82d1
14 changed files with 2511 additions and 17 deletions

View File

@@ -0,0 +1,267 @@
package.path = package.path .. ";?.lua"
local luaunit = require("testing/luaunit")
require("testing/loveStub") -- Required to mock LOVE functions
local FlexLove = require("FlexLove")
local FlexDirection = FlexLove.enums.FlexDirection
local Positioning = FlexLove.enums.Positioning
local JustifyContent = FlexLove.enums.JustifyContent
local AlignItems = FlexLove.enums.AlignItems
-- Create test cases
TestLayoutValidation = {}
function TestLayoutValidation:setUp()
self.GUI = FlexLove.GUI
end
function TestLayoutValidation:testNestedFlexContainers()
-- Test nested flex containers behave correctly
local outerContainer = self.GUI.new({
x = 0,
y = 0,
w = 300,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
})
local innerContainer1 = self.GUI.new({
parent = outerContainer,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.SPACE_BETWEEN,
})
local innerContainer2 = self.GUI.new({
parent = outerContainer,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.CENTER,
})
-- Add children to inner container 1
local child1 = self.GUI.new({
parent = innerContainer1,
w = 50,
h = 50,
positioning = Positioning.FLEX,
})
local child2 = self.GUI.new({
parent = innerContainer1,
w = 50,
h = 50,
positioning = Positioning.FLEX,
})
-- Add child to inner container 2
local child3 = self.GUI.new({
parent = innerContainer2,
w = 50,
h = 50,
positioning = Positioning.FLEX,
})
-- Verify outer container layout
luaunit.assertEquals(innerContainer1.y, 0)
luaunit.assertEquals(innerContainer2.y, 110) -- 100 + 10 gap
-- Verify inner container 1 layout (space-between)
luaunit.assertEquals(child1.x, 0)
luaunit.assertEquals(child2.x, 250)
-- Verify inner container 2 layout (center)
luaunit.assertEquals(child3.x, 125) -- (300 - 50) / 2
-- Test container references
luaunit.assertEquals(#innerContainer1.children, 2)
luaunit.assertEquals(#innerContainer2.children, 1)
luaunit.assertEquals(innerContainer1.children[1], child1)
luaunit.assertEquals(innerContainer1.children[2], child2)
luaunit.assertEquals(innerContainer2.children[1], child3)
end
function TestLayoutValidation:testMixedPositioning()
-- Test mixing absolute and flex positioning
local container = self.GUI.new({
x = 0,
y = 0,
w = 300,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
})
-- Add flex positioned child
local flexChild = self.GUI.new({
parent = container,
w = 100,
h = 50,
positioning = Positioning.FLEX,
})
-- Add absolute positioned child
local absoluteChild = self.GUI.new({
parent = container,
x = 150,
y = 150,
w = 100,
h = 50,
positioning = Positioning.ABSOLUTE,
})
-- Add another flex positioned child
local flexChild2 = self.GUI.new({
parent = container,
w = 100,
h = 50,
positioning = Positioning.FLEX,
})
-- Verify flex children positions
luaunit.assertEquals(flexChild.y, 0)
luaunit.assertEquals(flexChild2.y, 60) -- 50 + 10 gap
-- Verify absolute child position is maintained
luaunit.assertEquals(absoluteChild.x, 150)
luaunit.assertEquals(absoluteChild.y, 150)
end
function TestLayoutValidation:testDynamicSizing()
-- Test auto-sizing of flex containers
local container = self.GUI.new({
x = 0,
y = 0,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
})
-- Add children to determine container size
local child1 = self.GUI.new({
parent = container,
w = 50,
h = 100,
positioning = Positioning.FLEX,
})
local child2 = self.GUI.new({
parent = container,
w = 50,
h = 150,
positioning = Positioning.FLEX,
})
-- Container should size to fit children
luaunit.assertEquals(container.width, 110) -- 50 + 10 + 50
luaunit.assertEquals(container.height, 150) -- Max of child heights
end
function TestLayoutValidation:testDeepNesting()
-- Test deeply nested flex containers
local level1 = self.GUI.new({
x = 0,
y = 0,
w = 400,
h = 400,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
})
local level2 = self.GUI.new({
parent = level1,
w = 300,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
})
local level3 = self.GUI.new({
parent = level2,
w = 200,
h = 200,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
alignItems = AlignItems.CENTER,
})
local level4 = self.GUI.new({
parent = level3,
w = 100,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.CENTER,
})
-- Add a child to the deepest level
local deepChild = self.GUI.new({
parent = level4,
w = 50,
h = 50,
positioning = Positioning.FLEX,
})
-- Verify positioning through all levels
luaunit.assertEquals(level2.y, 0)
luaunit.assertEquals(level3.x, 0)
luaunit.assertEquals(level4.x, 50) -- (200 - 100) / 2
luaunit.assertEquals(deepChild.x, 25) -- (100 - 50) / 2
end
function TestLayoutValidation:testEdgeCases()
-- Test edge cases and potential layout issues
local container = self.GUI.new({
x = 0,
y = 0,
w = 100,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
})
-- Test zero-size child
local zeroSizeChild = self.GUI.new({
parent = container,
w = 0,
h = 0,
positioning = Positioning.FLEX,
})
-- Test negative size (should be clamped to 0)
local negativeSizeChild = self.GUI.new({
parent = container,
w = -50,
h = -50,
positioning = Positioning.FLEX,
})
-- Test oversized child
local oversizedChild = self.GUI.new({
parent = container,
w = 200,
h = 200,
positioning = Positioning.FLEX,
})
-- Verify layout handles edge cases gracefully
luaunit.assertTrue(zeroSizeChild.width >= 0)
luaunit.assertTrue(zeroSizeChild.height >= 0)
luaunit.assertTrue(negativeSizeChild.width >= 0)
luaunit.assertTrue(negativeSizeChild.height >= 0)
luaunit.assertEquals(oversizedChild.x, 0) -- Should still be positioned at start
-- Check that containers handle children properly
luaunit.assertEquals(zeroSizeChild.x, 0) -- First child should be at start
luaunit.assertEquals(negativeSizeChild.x, 0) -- Should be positioned after zero-size child
luaunit.assertEquals(oversizedChild.x, 0) -- Should be positioned after negative-size child
luaunit.assertNotNil(container.children[1]) -- Container should maintain child references
luaunit.assertEquals(#container.children, 3) -- All children should be tracked
end
luaunit.LuaUnit.run()