268 lines
6.8 KiB
Lua
268 lines
6.8 KiB
Lua
package.path = package.path .. ";./?.lua;./modules/?.lua"
|
|
local originalSearchers = package.searchers or package.loaders
|
|
table.insert(originalSearchers, 2, function(modname)
|
|
if modname:match("^FlexLove%.modules%.") then
|
|
local moduleName = modname:gsub("^FlexLove%.modules%.", "")
|
|
return function()
|
|
return require("modules." .. moduleName)
|
|
end
|
|
end
|
|
end)
|
|
require("testing.loveStub")
|
|
local luaunit = require("testing.luaunit")
|
|
|
|
-- Load FlexLove
|
|
local FlexLove = require("FlexLove")
|
|
|
|
TestAbsolutePositioning = {}
|
|
|
|
function TestAbsolutePositioning:setUp()
|
|
FlexLove.init()
|
|
end
|
|
|
|
function TestAbsolutePositioning:testAbsoluteBottomRightInFlexParent()
|
|
-- Create a flex parent
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
-- Create an absolutely positioned child with bottom and right offsets
|
|
local child = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
bottom = 0,
|
|
right = 0,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
-- Child should be positioned at bottom-right
|
|
luaunit.assertEquals(child.x, 300, "Child x should be 300 (400 - 100)")
|
|
luaunit.assertEquals(child.y, 300, "Child y should be 300 (400 - 100)")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testAbsoluteTopLeftInFlexParent()
|
|
-- Create a flex parent
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
-- Create an absolutely positioned child with top and left offsets
|
|
local child = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
top = 10,
|
|
left = 10,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
-- Child should be positioned at top-left with 10px offset
|
|
luaunit.assertEquals(child.x, 10, "Child x should be 10")
|
|
luaunit.assertEquals(child.y, 10, "Child y should be 10")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testAbsoluteWithPaddingParent()
|
|
-- Create a flex parent with padding
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
padding = 20,
|
|
})
|
|
|
|
-- Create an absolutely positioned child
|
|
local child = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
bottom = 0,
|
|
right = 0,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
-- Absolute positioning is relative to parent's padding box
|
|
-- Parent content box: 400 - 20 (left padding) - 20 (right padding) = 360
|
|
-- Child x: parent.x (0) + padding.left (20) + content.width (360) - right (0) - child.width (100) = 280
|
|
luaunit.assertEquals(child.x, 280, "Child x should account for parent padding")
|
|
luaunit.assertEquals(child.y, 280, "Child y should account for parent padding")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testAbsoluteDoesNotAffectFlexLayout()
|
|
-- Create a flex parent
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
flexDirection = "horizontal",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
-- Add flex children
|
|
local flexChild1 = FlexLove.new({
|
|
parent = parent,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
local flexChild2 = FlexLove.new({
|
|
parent = parent,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
-- Add absolutely positioned child
|
|
local absChild = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
top = 0,
|
|
left = 0,
|
|
width = 50,
|
|
height = 50,
|
|
})
|
|
|
|
-- Flex children should be positioned normally (absolute child doesn't affect layout)
|
|
luaunit.assertEquals(flexChild1.x, 0, "First flex child at x=0")
|
|
luaunit.assertEquals(flexChild2.x, 100, "Second flex child at x=100")
|
|
|
|
-- Absolute child should be at top-left
|
|
luaunit.assertEquals(absChild.x, 0, "Absolute child at x=0")
|
|
luaunit.assertEquals(absChild.y, 0, "Absolute child at y=0")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testMultipleAbsoluteChildren()
|
|
-- Create a flex parent
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
-- Create multiple absolutely positioned children
|
|
local topLeft = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
top = 0,
|
|
left = 0,
|
|
width = 50,
|
|
height = 50,
|
|
})
|
|
|
|
local topRight = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
top = 0,
|
|
right = 0,
|
|
width = 50,
|
|
height = 50,
|
|
})
|
|
|
|
local bottomLeft = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
bottom = 0,
|
|
left = 0,
|
|
width = 50,
|
|
height = 50,
|
|
})
|
|
|
|
local bottomRight = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
bottom = 0,
|
|
right = 0,
|
|
width = 50,
|
|
height = 50,
|
|
})
|
|
|
|
-- Verify positions
|
|
luaunit.assertEquals(topLeft.x, 0, "Top-left x")
|
|
luaunit.assertEquals(topLeft.y, 0, "Top-left y")
|
|
|
|
luaunit.assertEquals(topRight.x, 350, "Top-right x")
|
|
luaunit.assertEquals(topRight.y, 0, "Top-right y")
|
|
|
|
luaunit.assertEquals(bottomLeft.x, 0, "Bottom-left x")
|
|
luaunit.assertEquals(bottomLeft.y, 350, "Bottom-left y")
|
|
|
|
luaunit.assertEquals(bottomRight.x, 350, "Bottom-right x")
|
|
luaunit.assertEquals(bottomRight.y, 350, "Bottom-right y")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testAbsoluteInImmediateMode()
|
|
FlexLove.setMode("immediate")
|
|
|
|
local parent, child
|
|
|
|
local function createUI()
|
|
parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
child = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
bottom = 0,
|
|
right = 0,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
end
|
|
|
|
-- First frame
|
|
FlexLove.beginFrame()
|
|
createUI()
|
|
FlexLove.endFrame()
|
|
|
|
luaunit.assertEquals(child.x, 300, "Frame 1: Child x should be 300")
|
|
luaunit.assertEquals(child.y, 300, "Frame 1: Child y should be 300")
|
|
|
|
-- Second frame (recreate UI)
|
|
FlexLove.beginFrame()
|
|
createUI()
|
|
FlexLove.endFrame()
|
|
|
|
luaunit.assertEquals(child.x, 300, "Frame 2: Child x should be 300")
|
|
luaunit.assertEquals(child.y, 300, "Frame 2: Child y should be 300")
|
|
|
|
FlexLove.setMode("retained")
|
|
end
|
|
|
|
function TestAbsolutePositioning:testExplicitlyAbsoluteFlagIsSet()
|
|
local parent = FlexLove.new({
|
|
positioning = "flex",
|
|
width = 400,
|
|
height = 400,
|
|
})
|
|
|
|
-- Child with explicit absolute positioning
|
|
local absoluteChild = FlexLove.new({
|
|
parent = parent,
|
|
positioning = "absolute",
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
-- Child without explicit positioning (participates in flex)
|
|
local flexChild = FlexLove.new({
|
|
parent = parent,
|
|
width = 100,
|
|
height = 100,
|
|
})
|
|
|
|
luaunit.assertEquals(absoluteChild._explicitlyAbsolute, true, "Explicitly absolute child should have _explicitlyAbsolute = true")
|
|
luaunit.assertEquals(absoluteChild._originalPositioning, "absolute", "Absolute child should have _originalPositioning = 'absolute'")
|
|
|
|
luaunit.assertEquals(flexChild._explicitlyAbsolute, false, "Flex child should have _explicitlyAbsolute = false")
|
|
luaunit.assertEquals(flexChild._originalPositioning, nil, "Flex child should have _originalPositioning = nil")
|
|
end
|
|
|
|
if not _G.RUNNING_ALL_TESTS then
|
|
os.exit(luaunit.LuaUnit.run())
|
|
end
|