tests
This commit is contained in:
267
testing/__tests__/07_layout_validation.lua
Normal file
267
testing/__tests__/07_layout_validation.lua
Normal 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()
|
||||
Reference in New Issue
Block a user