line based

This commit is contained in:
Michael Freno
2025-09-18 22:13:58 -04:00
parent e1e17973d2
commit 5704c4de95
27 changed files with 5801 additions and 2572 deletions

View File

@@ -0,0 +1,659 @@
-- 05. Justify Content Alignment Tests
-- Tests for FlexLove justify content functionality
-- Load test framework and dependencies
package.path = package.path .. ";?.lua"
local luaunit = require("testing/luaunit")
require("testing/loveStub") -- Required to mock LOVE functions
local FlexLove = require("FlexLove")
local Gui, enums = FlexLove.GUI, FlexLove.enums
-- Import required enums
local Positioning = enums.Positioning
local FlexDirection = enums.FlexDirection
local JustifyContent = enums.JustifyContent
-- Test class for justify content functionality
TestJustifyContent = {}
function TestJustifyContent:setUp()
-- Clear any previous state if needed
Gui.destroy()
end
function TestJustifyContent:tearDown()
-- Clean up after each test
Gui.destroy()
end
-- Test 1: Horizontal Flex with JustifyContent.FLEX_START
function TestJustifyContent:testHorizontalFlexJustifyContentFlexStart()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.FLEX_START,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
local child3 = Gui.new({
id = "child3",
w = 70,
h = 35,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
container:addChild(child3)
-- With FLEX_START, children should be positioned from the start (left)
luaunit.assertEquals(child1.x, 0)
luaunit.assertEquals(child2.x, 50)
luaunit.assertEquals(child3.x, 110)
-- Y positions should be 0 (aligned to top by default)
luaunit.assertEquals(child1.y, 0)
luaunit.assertEquals(child2.y, 0)
luaunit.assertEquals(child3.y, 0)
end
-- Test 2: Horizontal Flex with JustifyContent.CENTER
function TestJustifyContent:testHorizontalFlexJustifyContentCenter()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.CENTER,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child width: 50 + 60 = 110
-- Available space: 300 - 110 = 190
-- Center offset: 190 / 2 = 95
luaunit.assertEquals(child1.x, 95)
luaunit.assertEquals(child2.x, 145)
end
-- Test 3: Horizontal Flex with JustifyContent.FLEX_END
function TestJustifyContent:testHorizontalFlexJustifyContentFlexEnd()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.FLEX_END,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child width: 50 + 60 = 110
-- Available space: 300 - 110 = 190
-- Children should be positioned from the end
luaunit.assertEquals(child1.x, 190)
luaunit.assertEquals(child2.x, 240)
end
-- Test 4: Horizontal Flex with JustifyContent.SPACE_BETWEEN
function TestJustifyContent:testHorizontalFlexJustifyContentSpaceBetween()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.SPACE_BETWEEN,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
local child3 = Gui.new({
id = "child3",
w = 40,
h = 35,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
container:addChild(child3)
-- Total child width: 50 + 60 + 40 = 150
-- Available space: 300 - 150 = 150
-- Space between 3 children: 150 / 2 = 75
luaunit.assertEquals(child1.x, 0)
luaunit.assertEquals(child2.x, 125) -- 0 + 50 + 75
luaunit.assertEquals(child3.x, 260) -- 125 + 60 + 75
end
-- Test 5: Horizontal Flex with JustifyContent.SPACE_AROUND
function TestJustifyContent:testHorizontalFlexJustifyContentSpaceAround()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.SPACE_AROUND,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child width: 50 + 60 = 110
-- Available space: 300 - 110 = 190
-- Space around each: 190 / 2 = 95 (FlexLove divides by number of children)
-- Start position: 95 / 2 = 47.5
-- Item spacing: 0 + 95 = 95
luaunit.assertEquals(child1.x, 47.5)
luaunit.assertEquals(child2.x, 192.5) -- 47.5 + 50 + 95
end
-- Test 6: Horizontal Flex with JustifyContent.SPACE_EVENLY
function TestJustifyContent:testHorizontalFlexJustifyContentSpaceEvenly()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.SPACE_EVENLY,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child width: 50 + 60 = 110
-- Available space: 300 - 110 = 190
-- Space evenly: 190 / 3 = 63.33... (equal spaces at start, between, and end)
local expectedSpace = 190 / 3
luaunit.assertAlmostEquals(child1.x, expectedSpace, 0.01)
luaunit.assertAlmostEquals(child2.x, expectedSpace + 50 + expectedSpace, 0.01)
end
-- Test 7: Vertical Flex with JustifyContent.FLEX_START
function TestJustifyContent:testVerticalFlexJustifyContentFlexStart()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.FLEX_START,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
local child3 = Gui.new({
id = "child3",
w = 70,
h = 35,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
container:addChild(child3)
-- With FLEX_START, children should be positioned from the start (top)
luaunit.assertEquals(child1.y, 0)
luaunit.assertEquals(child2.y, 30)
luaunit.assertEquals(child3.y, 70)
-- X positions should be 0 (aligned to left by default)
luaunit.assertEquals(child1.x, 0)
luaunit.assertEquals(child2.x, 0)
luaunit.assertEquals(child3.x, 0)
end
-- Test 8: Vertical Flex with JustifyContent.CENTER
function TestJustifyContent:testVerticalFlexJustifyContentCenter()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.CENTER,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child height: 30 + 40 = 70
-- Available space: 300 - 70 = 230
-- Center offset: 230 / 2 = 115
luaunit.assertEquals(child1.y, 115)
luaunit.assertEquals(child2.y, 145)
end
-- Test 9: Vertical Flex with JustifyContent.FLEX_END
function TestJustifyContent:testVerticalFlexJustifyContentFlexEnd()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.FLEX_END,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child height: 30 + 40 = 70
-- Available space: 300 - 70 = 230
-- Children should be positioned from the end
luaunit.assertEquals(child1.y, 230)
luaunit.assertEquals(child2.y, 260)
end
-- Test 10: Vertical Flex with JustifyContent.SPACE_BETWEEN
function TestJustifyContent:testVerticalFlexJustifyContentSpaceBetween()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.SPACE_BETWEEN,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
local child3 = Gui.new({
id = "child3",
w = 40,
h = 35,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
container:addChild(child3)
-- Total child height: 30 + 40 + 35 = 105
-- Available space: 300 - 105 = 195
-- Space between 3 children: 195 / 2 = 97.5
luaunit.assertEquals(child1.y, 0)
luaunit.assertEquals(child2.y, 127.5) -- 0 + 30 + 97.5
luaunit.assertEquals(child3.y, 265) -- 127.5 + 40 + 97.5
end
-- Test 11: Vertical Flex with JustifyContent.SPACE_AROUND
function TestJustifyContent:testVerticalFlexJustifyContentSpaceAround()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.SPACE_AROUND,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child height: 30 + 40 = 70
-- Available space: 300 - 70 = 230
-- Space around each: 230 / 2 = 115 (FlexLove divides by number of children)
-- Start position: 115 / 2 = 57.5
-- Item spacing: 0 + 115 = 115
luaunit.assertEquals(child1.y, 57.5)
luaunit.assertEquals(child2.y, 202.5) -- 57.5 + 30 + 115
end
-- Test 12: Vertical Flex with JustifyContent.SPACE_EVENLY
function TestJustifyContent:testVerticalFlexJustifyContentSpaceEvenly()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 300,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.VERTICAL,
justifyContent = JustifyContent.SPACE_EVENLY,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Total child height: 30 + 40 = 70
-- Available space: 300 - 70 = 230
-- Space evenly: 230 / 3 = 76.67... (equal spaces at start, between, and end)
local expectedSpace = 230 / 3
luaunit.assertAlmostEquals(child1.y, expectedSpace, 0.01)
luaunit.assertAlmostEquals(child2.y, expectedSpace + 30 + expectedSpace, 0.01)
end
-- Test 13: JustifyContent with Single Child
function TestJustifyContent:testJustifyContentWithSingleChild()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.CENTER,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
container:addChild(child1)
-- With single child and CENTER, child should be centered
-- Available space: 300 - 50 = 250
-- Center offset: 250 / 2 = 125
luaunit.assertEquals(child1.x, 125)
end
-- Test 14: JustifyContent with No Available Space
function TestJustifyContent:testJustifyContentWithNoAvailableSpace()
local container = Gui.new({
id = "container",
x = 0,
y = 0,
w = 100,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.SPACE_BETWEEN,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 50,
h = 40,
positioning = Positioning.FLEX,
})
container:addChild(child1)
container:addChild(child2)
-- Children exactly fill container width (100)
-- Should fall back to FLEX_START behavior
luaunit.assertEquals(child1.x, 0)
luaunit.assertEquals(child2.x, 50)
end
-- Test 15: JustifyContent Preservation with Parent Coordinates
function TestJustifyContent:testJustifyContentWithParentCoordinates()
local parent = Gui.new({
id = "parent",
x = 50,
y = 30,
w = 400,
h = 200,
positioning = Positioning.ABSOLUTE,
})
local container = Gui.new({
id = "container",
x = 20,
y = 10,
w = 300,
h = 100,
positioning = Positioning.FLEX,
flexDirection = FlexDirection.HORIZONTAL,
justifyContent = JustifyContent.CENTER,
gap = 0,
})
local child1 = Gui.new({
id = "child1",
w = 50,
h = 30,
positioning = Positioning.FLEX,
})
local child2 = Gui.new({
id = "child2",
w = 60,
h = 40,
positioning = Positioning.FLEX,
})
parent:addChild(container)
container:addChild(child1)
container:addChild(child2)
-- Container should maintain its own coordinates since parent is ABSOLUTE
luaunit.assertEquals(container.x, 20) -- container keeps its own x
luaunit.assertEquals(container.y, 10) -- container keeps its own y
-- Children should be centered within container coordinate system
-- Total child width: 50 + 60 = 110
-- Available space: 300 - 110 = 190
-- Center offset: 190 / 2 = 95
-- Children are positioned in absolute coordinates: container.x + offset
luaunit.assertEquals(child1.x, 115) -- container.x(20) + center_offset(95)
luaunit.assertEquals(child2.x, 165) -- container.x(20) + center_offset(95) + child1.width(50)
end
-- Run the tests
if arg and arg[0]:match("05_justify_content_tests%.lua$") then
os.exit(luaunit.LuaUnit.run())
end
return TestJustifyContent