prop alignment
This commit is contained in:
82
FlexLove.lua
82
FlexLove.lua
@@ -83,17 +83,6 @@ local enums = {
|
|||||||
FlexWrap = { NOWRAP = "nowrap", WRAP = "wrap", WRAP_REVERSE = "wrap-reverse" },
|
FlexWrap = { NOWRAP = "nowrap", WRAP = "wrap", WRAP_REVERSE = "wrap-reverse" },
|
||||||
}
|
}
|
||||||
|
|
||||||
local Positioning, FlexDirection, JustifyContent, AlignContent, AlignItems, TextAlign, AlignSelf, JustifySelf, FlexWrap =
|
|
||||||
enums.Positioning,
|
|
||||||
enums.FlexDirection,
|
|
||||||
enums.JustifyContent,
|
|
||||||
enums.AlignContent,
|
|
||||||
enums.AlignItems,
|
|
||||||
enums.TextAlign,
|
|
||||||
enums.AlignSelf,
|
|
||||||
enums.JustifySelf,
|
|
||||||
enums.FlexWrap
|
|
||||||
|
|
||||||
local Positioning, FlexDirection, JustifyContent, AlignContent, AlignItems, TextAlign, AlignSelf, JustifySelf, FlexWrap =
|
local Positioning, FlexDirection, JustifyContent, AlignContent, AlignItems, TextAlign, AlignSelf, JustifySelf, FlexWrap =
|
||||||
enums.Positioning,
|
enums.Positioning,
|
||||||
enums.FlexDirection,
|
enums.FlexDirection,
|
||||||
@@ -143,10 +132,8 @@ function Units.parse(value)
|
|||||||
unit = "px"
|
unit = "px"
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Validate unit type (removed vmin/vmax as requested)
|
|
||||||
local validUnits = { px = true, ["%"] = true, vw = true, vh = true }
|
local validUnits = { px = true, ["%"] = true, vw = true, vh = true }
|
||||||
if not validUnits[unit] then
|
if not validUnits[unit] then
|
||||||
-- Fallback to pixels for unsupported units, keeping the numeric value
|
|
||||||
return num, "px"
|
return num, "px"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -177,14 +164,14 @@ function Units.resolve(value, unit, viewportWidth, viewportHeight, parentSize)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Get current viewport dimensions
|
|
||||||
---@return number, number -- width, height
|
---@return number, number -- width, height
|
||||||
function Units.getViewport()
|
function Units.getViewport()
|
||||||
-- Try both functions to be compatible with different love versions and test environments
|
-- Try both functions to be compatible with different love versions and test environments
|
||||||
if love.graphics and love.graphics.getDimensions then
|
if love.graphics and love.graphics.getDimensions then
|
||||||
return love.graphics.getDimensions()
|
return love.graphics.getDimensions()
|
||||||
else
|
else
|
||||||
return love.window.getMode()
|
local w, h = love.window.getMode()
|
||||||
|
return w, h
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -488,8 +475,8 @@ Element.__index = Element
|
|||||||
---@field x number|string? -- X coordinate of the element (default: 0)
|
---@field x number|string? -- X coordinate of the element (default: 0)
|
||||||
---@field y number|string? -- Y coordinate of the element (default: 0)
|
---@field y number|string? -- Y coordinate of the element (default: 0)
|
||||||
---@field z number? -- Z-index for layering (default: 0)
|
---@field z number? -- Z-index for layering (default: 0)
|
||||||
---@field w number|string? -- Width of the element (default: calculated automatically)
|
---@field width number|string? -- Width of the element (default: calculated automatically)
|
||||||
---@field h number|string? -- Height of the element (default: calculated automatically)
|
---@field height number|string? -- Height of the element (default: calculated automatically)
|
||||||
---@field top number|string? -- Offset from top edge (CSS-style positioning)
|
---@field top number|string? -- Offset from top edge (CSS-style positioning)
|
||||||
---@field right number|string? -- Offset from right edge (CSS-style positioning)
|
---@field right number|string? -- Offset from right edge (CSS-style positioning)
|
||||||
---@field bottom number|string? -- Offset from bottom edge (CSS-style positioning)
|
---@field bottom number|string? -- Offset from bottom edge (CSS-style positioning)
|
||||||
@@ -550,7 +537,6 @@ function Element.new(props)
|
|||||||
self.opacity = props.opacity or 1
|
self.opacity = props.opacity or 1
|
||||||
|
|
||||||
self.text = props.text
|
self.text = props.text
|
||||||
self.textSize = props.textSize or 12
|
|
||||||
self.textAlign = props.textAlign or TextAlign.START
|
self.textAlign = props.textAlign or TextAlign.START
|
||||||
|
|
||||||
--- self positioning ---
|
--- self positioning ---
|
||||||
@@ -584,7 +570,7 @@ function Element.new(props)
|
|||||||
}
|
}
|
||||||
|
|
||||||
-- Handle width (both w and width properties, prefer w if both exist)
|
-- Handle width (both w and width properties, prefer w if both exist)
|
||||||
local widthProp = props.w or props.width
|
local widthProp = props.width
|
||||||
if widthProp then
|
if widthProp then
|
||||||
if type(widthProp) == "string" then
|
if type(widthProp) == "string" then
|
||||||
local value, unit = Units.parse(widthProp)
|
local value, unit = Units.parse(widthProp)
|
||||||
@@ -602,7 +588,7 @@ function Element.new(props)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Handle height (both h and height properties, prefer h if both exist)
|
-- Handle height (both h and height properties, prefer h if both exist)
|
||||||
local heightProp = props.h or props.height
|
local heightProp = props.height
|
||||||
if heightProp then
|
if heightProp then
|
||||||
if type(heightProp) == "string" then
|
if type(heightProp) == "string" then
|
||||||
local value, unit = Units.parse(heightProp)
|
local value, unit = Units.parse(heightProp)
|
||||||
@@ -652,8 +638,7 @@ function Element.new(props)
|
|||||||
self.units.textSize = { value = props.textSize, unit = "px" }
|
self.units.textSize = { value = props.textSize, unit = "px" }
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Initialize with default/nil value
|
self.units.textSize = { value = 12, unit = "px" }
|
||||||
self.units.textSize = { value = nil, unit = "px" }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Store original spacing values for proper resize handling
|
-- Store original spacing values for proper resize handling
|
||||||
@@ -731,7 +716,7 @@ function Element.new(props)
|
|||||||
self._originalPositioning = props.positioning
|
self._originalPositioning = props.positioning
|
||||||
self._explicitlyAbsolute = (props.positioning == Positioning.ABSOLUTE)
|
self._explicitlyAbsolute = (props.positioning == Positioning.ABSOLUTE)
|
||||||
else
|
else
|
||||||
self.positioning = Positioning.RELATIVE
|
self.positioning = Positioning.ABSOLUTE
|
||||||
self._originalPositioning = nil -- No explicit positioning
|
self._originalPositioning = nil -- No explicit positioning
|
||||||
self._explicitlyAbsolute = false
|
self._explicitlyAbsolute = false
|
||||||
end
|
end
|
||||||
@@ -746,13 +731,13 @@ function Element.new(props)
|
|||||||
self._explicitlyAbsolute = false
|
self._explicitlyAbsolute = false
|
||||||
else
|
else
|
||||||
-- Default: children in flex containers participate in flex layout
|
-- Default: children in flex containers participate in flex layout
|
||||||
-- children in other containers default to relative
|
-- children in absolute containers default to absolute
|
||||||
if self.parent.positioning == Positioning.FLEX then
|
if self.parent.positioning == Positioning.FLEX then
|
||||||
self.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
self.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
||||||
self._explicitlyAbsolute = false -- Participate in parent's flex layout
|
self._explicitlyAbsolute = false -- Participate in parent's flex layout
|
||||||
else
|
else
|
||||||
self.positioning = Positioning.RELATIVE
|
self.positioning = Positioning.ABSOLUTE
|
||||||
self._explicitlyAbsolute = false -- Default for other containers
|
self._explicitlyAbsolute = false -- Default for absolute containers
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -791,44 +776,6 @@ function Element.new(props)
|
|||||||
end
|
end
|
||||||
|
|
||||||
self.z = props.z or 0
|
self.z = props.z or 0
|
||||||
elseif self.positioning == Positioning.RELATIVE then
|
|
||||||
-- Relative positioning: position relative to parent's position
|
|
||||||
local baseX = self.parent.x
|
|
||||||
local baseY = self.parent.y
|
|
||||||
|
|
||||||
if props.x then
|
|
||||||
if type(props.x) == "string" then
|
|
||||||
local value, unit = Units.parse(props.x)
|
|
||||||
self.units.x = { value = value, unit = unit }
|
|
||||||
local parentWidth = self.parent.width
|
|
||||||
local offsetX = Units.resolve(value, unit, viewportWidth, viewportHeight, parentWidth)
|
|
||||||
self.x = baseX + offsetX
|
|
||||||
else
|
|
||||||
self.x = baseX + props.x
|
|
||||||
self.units.x = { value = props.x, unit = "px" }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
self.x = baseX
|
|
||||||
self.units.x = { value = 0, unit = "px" }
|
|
||||||
end
|
|
||||||
|
|
||||||
if props.y then
|
|
||||||
if type(props.y) == "string" then
|
|
||||||
local value, unit = Units.parse(props.y)
|
|
||||||
self.units.y = { value = value, unit = unit }
|
|
||||||
local parentHeight = self.parent.height
|
|
||||||
local offsetY = Units.resolve(value, unit, viewportWidth, viewportHeight, parentHeight)
|
|
||||||
self.y = baseY + offsetY
|
|
||||||
else
|
|
||||||
self.y = baseY + props.y
|
|
||||||
self.units.y = { value = props.y, unit = "px" }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
self.y = baseY
|
|
||||||
self.units.y = { value = 0, unit = "px" }
|
|
||||||
end
|
|
||||||
|
|
||||||
self.z = props.z or self.parent.z or 0
|
|
||||||
else
|
else
|
||||||
-- Children in flex containers start at parent position but will be repositioned by layoutChildren
|
-- Children in flex containers start at parent position but will be repositioned by layoutChildren
|
||||||
local baseX = self.parent.x
|
local baseX = self.parent.x
|
||||||
@@ -972,8 +919,8 @@ function Element:addChild(child)
|
|||||||
child.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
child.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
||||||
child._explicitlyAbsolute = false -- Participate in parent's flex layout
|
child._explicitlyAbsolute = false -- Participate in parent's flex layout
|
||||||
else
|
else
|
||||||
child.positioning = Positioning.RELATIVE
|
child.positioning = Positioning.ABSOLUTE
|
||||||
child._explicitlyAbsolute = false -- Default for other containers
|
child._explicitlyAbsolute = false -- Default for absolute containers
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- If child._originalPositioning is set, it means explicit positioning was provided
|
-- If child._originalPositioning is set, it means explicit positioning was provided
|
||||||
@@ -1046,10 +993,7 @@ function Element:layoutChildren()
|
|||||||
-- Get flex children (children that participate in flex layout)
|
-- Get flex children (children that participate in flex layout)
|
||||||
local flexChildren = {}
|
local flexChildren = {}
|
||||||
for _, child in ipairs(self.children) do
|
for _, child in ipairs(self.children) do
|
||||||
-- Only flex positioned children or non-explicitly absolute children participate in flex layout
|
|
||||||
-- Relative positioned children maintain their own positioning
|
|
||||||
local isFlexChild = not (child.positioning == Positioning.ABSOLUTE and child._explicitlyAbsolute)
|
local isFlexChild = not (child.positioning == Positioning.ABSOLUTE and child._explicitlyAbsolute)
|
||||||
and child.positioning ~= Positioning.RELATIVE
|
|
||||||
if isFlexChild then
|
if isFlexChild then
|
||||||
table.insert(flexChildren, child)
|
table.insert(flexChildren, child)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package.path = package.path .. ";?.lua"
|
package.patheight = package.path .. ";?.lua"
|
||||||
|
|
||||||
local luaunit = require("testing/luaunit")
|
local luaunit = require("testing/luaunit")
|
||||||
require("testing/loveStub") -- Required to mock LOVE functions
|
require("testing/loveStub") -- Required to mock LOVE functions
|
||||||
@@ -25,8 +25,8 @@ function TestAbsolutePositioningBasic:testCreateElementWithAbsolutePositioning()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -47,8 +47,8 @@ function TestAbsolutePositioningBasic:testDefaultAbsolutePositioning()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 75,
|
y = 75,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Default should be relative positioning
|
-- Default should be relative positioning
|
||||||
@@ -62,8 +62,8 @@ function TestAbsolutePositioningBasic:testZIndexHandling()
|
|||||||
local elem1 = Gui.new({
|
local elem1 = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
z = 1,
|
z = 1,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
@@ -71,8 +71,8 @@ function TestAbsolutePositioningBasic:testZIndexHandling()
|
|||||||
local elem2 = Gui.new({
|
local elem2 = Gui.new({
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
z = 5,
|
z = 5,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
@@ -80,8 +80,8 @@ function TestAbsolutePositioningBasic:testZIndexHandling()
|
|||||||
local elem3 = Gui.new({
|
local elem3 = Gui.new({
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 25,
|
y = 25,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
z = 3,
|
z = 3,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
@@ -99,8 +99,8 @@ function TestAbsolutePositioningBasic:testDefaultZIndex()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -112,16 +112,16 @@ function TestAbsolutePositioningBasic:testCoordinateIndependence()
|
|||||||
local elem1 = Gui.new({
|
local elem1 = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
local elem2 = Gui.new({
|
local elem2 = Gui.new({
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -142,8 +142,8 @@ function TestAbsolutePositioningBasic:testAbsoluteWithParentIndependentCoordinat
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -151,8 +151,8 @@ function TestAbsolutePositioningBasic:testAbsoluteWithParentIndependentCoordinat
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 25,
|
y = 25,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -174,8 +174,8 @@ function TestAbsolutePositioningBasic:testMultipleAbsoluteElementsNonInterferenc
|
|||||||
elements[i] = Gui.new({
|
elements[i] = Gui.new({
|
||||||
x = i * 10,
|
x = i * 10,
|
||||||
y = i * 20,
|
y = i * 20,
|
||||||
w = 30,
|
width = 30,
|
||||||
h = 40,
|
height = 40,
|
||||||
z = i,
|
z = i,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
@@ -198,8 +198,8 @@ function TestAbsolutePositioningBasic:testNegativeCoordinates()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = -50,
|
x = -50,
|
||||||
y = -100,
|
y = -100,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -212,8 +212,8 @@ function TestAbsolutePositioningBasic:testZeroCoordinates()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -224,8 +224,8 @@ end
|
|||||||
-- Test 10: Default coordinates when not specified
|
-- Test 10: Default coordinates when not specified
|
||||||
function TestAbsolutePositioningBasic:testDefaultCoordinates()
|
function TestAbsolutePositioningBasic:testDefaultCoordinates()
|
||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -239,8 +239,8 @@ function TestAbsolutePositioningBasic:testElementBounds()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -256,8 +256,8 @@ function TestAbsolutePositioningBasic:testParentChildRelationshipAbsolute()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 300,
|
height = 300,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -265,8 +265,8 @@ function TestAbsolutePositioningBasic:testParentChildRelationshipAbsolute()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 75,
|
y = 75,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -288,15 +288,15 @@ function TestAbsolutePositioningBasic:testAbsoluteChildNoParentAutoSizeAffect()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
local originalParentWidth = parent.width
|
local originalParentWidtheight = parent.width
|
||||||
local originalParentHeight = parent.height
|
local originalParentHeight = parent.height
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
x = 1000, -- Far outside parent
|
x = 1000, -- Far outside parent
|
||||||
y = 1000,
|
y = 1000,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 500,
|
height = 500,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -311,16 +311,16 @@ function TestAbsolutePositioningBasic:testAbsoluteNoFlexParticipation()
|
|||||||
local flexParent = Gui.new({
|
local flexParent = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild = Gui.new({
|
local flexChild = Gui.new({
|
||||||
parent = flexParent,
|
parent = flexParent,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -328,8 +328,8 @@ function TestAbsolutePositioningBasic:testAbsoluteNoFlexParticipation()
|
|||||||
parent = flexParent,
|
parent = flexParent,
|
||||||
x = 300,
|
x = 300,
|
||||||
y = 150,
|
y = 150,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -347,8 +347,8 @@ function TestAbsolutePositioningBasic:testLargeCoordinateValues()
|
|||||||
local elem = Gui.new({
|
local elem = Gui.new({
|
||||||
x = 9999,
|
x = 9999,
|
||||||
y = 8888,
|
y = 8888,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
z = 1000,
|
z = 1000,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
@@ -372,8 +372,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "root",
|
id = "root",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -384,8 +384,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "child1",
|
id = "child1",
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -395,8 +395,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "grandchild1",
|
id = "grandchild1",
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 25,
|
y = 25,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -406,8 +406,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "greatGrandchild1",
|
id = "greatGrandchild1",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 75,
|
height = 75,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 4,
|
z = 4,
|
||||||
})
|
})
|
||||||
@@ -418,8 +418,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "child2",
|
id = "child2",
|
||||||
x = 450,
|
x = 450,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -429,8 +429,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "grandchild2",
|
id = "grandchild2",
|
||||||
x = 125,
|
x = 125,
|
||||||
y = 175,
|
y = 175,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -440,8 +440,8 @@ function TestAbsolutePositioningBasic:testComplexNestedAbsoluteTree()
|
|||||||
id = "greatGrandchild2",
|
id = "greatGrandchild2",
|
||||||
x = 90,
|
x = 90,
|
||||||
y = 160,
|
y = 160,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 75,
|
height = 75,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 4,
|
z = 4,
|
||||||
})
|
})
|
||||||
@@ -487,8 +487,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "root",
|
id = "root",
|
||||||
x = 400,
|
x = 400,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -499,8 +499,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "left",
|
id = "left",
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -510,8 +510,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "right",
|
id = "right",
|
||||||
x = 600,
|
x = 600,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -522,8 +522,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "leftLeft",
|
id = "leftLeft",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -533,8 +533,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "leftRight",
|
id = "leftRight",
|
||||||
x = 300,
|
x = 300,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -545,8 +545,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "rightLeft",
|
id = "rightLeft",
|
||||||
x = 500,
|
x = 500,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -556,8 +556,8 @@ function TestAbsolutePositioningBasic:testBinaryTreeAbsoluteStructure()
|
|||||||
id = "rightRight",
|
id = "rightRight",
|
||||||
x = 700,
|
x = 700,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -588,8 +588,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "container",
|
id = "container",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 1000,
|
height = 1000,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
@@ -600,8 +600,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "background",
|
id = "background",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 800,
|
height = 800,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -612,8 +612,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "middleParent",
|
id = "middleParent",
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 600,
|
width = 600,
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 5,
|
z = 5,
|
||||||
})
|
})
|
||||||
@@ -623,8 +623,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "middleChild1",
|
id = "middleChild1",
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1, -- relative to middleParent
|
z = 1, -- relative to middleParent
|
||||||
})
|
})
|
||||||
@@ -634,8 +634,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "middleChild2",
|
id = "middleChild2",
|
||||||
x = 350,
|
x = 350,
|
||||||
y = 350,
|
y = 350,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2, -- relative to middleParent, above middleChild1
|
z = 2, -- relative to middleParent, above middleChild1
|
||||||
})
|
})
|
||||||
@@ -646,8 +646,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "foreground",
|
id = "foreground",
|
||||||
x = 300,
|
x = 300,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 10,
|
z = 10,
|
||||||
})
|
})
|
||||||
@@ -657,8 +657,8 @@ function TestAbsolutePositioningBasic:testMultiBranchZIndexStacking()
|
|||||||
id = "foregroundChild",
|
id = "foregroundChild",
|
||||||
x = 150,
|
x = 150,
|
||||||
y = 150,
|
y = 150,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -688,8 +688,8 @@ function TestAbsolutePositioningBasic:testWideShallowAbsoluteTree()
|
|||||||
id = "container",
|
id = "container",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 2000,
|
width = 2000,
|
||||||
h = 500,
|
height = 500,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
@@ -702,8 +702,8 @@ function TestAbsolutePositioningBasic:testWideShallowAbsoluteTree()
|
|||||||
id = "sibling" .. i,
|
id = "sibling" .. i,
|
||||||
x = i * 180,
|
x = i * 180,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 300,
|
height = 300,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = i, -- Each has different z-index
|
z = i, -- Each has different z-index
|
||||||
})
|
})
|
||||||
@@ -715,8 +715,8 @@ function TestAbsolutePositioningBasic:testWideShallowAbsoluteTree()
|
|||||||
id = "child" .. i .. "_" .. j,
|
id = "child" .. i .. "_" .. j,
|
||||||
x = 25,
|
x = 25,
|
||||||
y = j * 80,
|
y = j * 80,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = j,
|
z = j,
|
||||||
})
|
})
|
||||||
@@ -740,20 +740,20 @@ function TestAbsolutePositioningBasic:testAsymmetricAbsoluteTree()
|
|||||||
id = "root",
|
id = "root",
|
||||||
x = 500,
|
x = 500,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Left branch: deep nesting
|
-- Left branch: deep nesting
|
||||||
local leftBranch = Gui.new({
|
local leftBrancheight = Gui.new({
|
||||||
parent = root,
|
parent = root,
|
||||||
id = "leftBranch",
|
id = "leftBranch",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 250,
|
y = 250,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -763,8 +763,8 @@ function TestAbsolutePositioningBasic:testAsymmetricAbsoluteTree()
|
|||||||
id = "leftDeep1",
|
id = "leftDeep1",
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 80,
|
height = 80,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -774,8 +774,8 @@ function TestAbsolutePositioningBasic:testAsymmetricAbsoluteTree()
|
|||||||
id = "leftDeep2",
|
id = "leftDeep2",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 4,
|
z = 4,
|
||||||
})
|
})
|
||||||
@@ -785,20 +785,20 @@ function TestAbsolutePositioningBasic:testAsymmetricAbsoluteTree()
|
|||||||
id = "leftDeep3",
|
id = "leftDeep3",
|
||||||
x = 5,
|
x = 5,
|
||||||
y = 5,
|
y = 5,
|
||||||
w = 70,
|
width = 70,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 5,
|
z = 5,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Right branch: wide shallow
|
-- Right branch: wide shallow
|
||||||
local rightBranch = Gui.new({
|
local rightBrancheight = Gui.new({
|
||||||
parent = root,
|
parent = root,
|
||||||
id = "rightBranch",
|
id = "rightBranch",
|
||||||
x = 800,
|
x = 800,
|
||||||
y = 250,
|
y = 250,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -810,8 +810,8 @@ function TestAbsolutePositioningBasic:testAsymmetricAbsoluteTree()
|
|||||||
id = "rightChild" .. i,
|
id = "rightChild" .. i,
|
||||||
x = i * 70,
|
x = i * 70,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
@@ -839,8 +839,8 @@ function TestAbsolutePositioningBasic:testOverlappingNegativeCoordinates()
|
|||||||
id = "viewport",
|
id = "viewport",
|
||||||
x = 500,
|
x = 500,
|
||||||
y = 500,
|
y = 500,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
@@ -851,8 +851,8 @@ function TestAbsolutePositioningBasic:testOverlappingNegativeCoordinates()
|
|||||||
id = "topLeft",
|
id = "topLeft",
|
||||||
x = -100,
|
x = -100,
|
||||||
y = -100,
|
y = -100,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -862,8 +862,8 @@ function TestAbsolutePositioningBasic:testOverlappingNegativeCoordinates()
|
|||||||
id = "topRight",
|
id = "topRight",
|
||||||
x = 300,
|
x = 300,
|
||||||
y = -50,
|
y = -50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
@@ -873,8 +873,8 @@ function TestAbsolutePositioningBasic:testOverlappingNegativeCoordinates()
|
|||||||
id = "bottomLeft",
|
id = "bottomLeft",
|
||||||
x = -50,
|
x = -50,
|
||||||
y = 350,
|
y = 350,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 3,
|
z = 3,
|
||||||
})
|
})
|
||||||
@@ -884,8 +884,8 @@ function TestAbsolutePositioningBasic:testOverlappingNegativeCoordinates()
|
|||||||
id = "center",
|
id = "center",
|
||||||
x = 150,
|
x = 150,
|
||||||
y = 150,
|
y = 150,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 10, -- Highest z-index
|
z = 10, -- Highest z-index
|
||||||
})
|
})
|
||||||
@@ -912,8 +912,8 @@ function TestAbsolutePositioningBasic:testCircularPositioningPattern()
|
|||||||
id = "center",
|
id = "center",
|
||||||
x = 400,
|
x = 400,
|
||||||
y = 400,
|
y = 400,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -932,8 +932,8 @@ function TestAbsolutePositioningBasic:testCircularPositioningPattern()
|
|||||||
id = "orbiter" .. i,
|
id = "orbiter" .. i,
|
||||||
x = math.floor(x),
|
x = math.floor(x),
|
||||||
y = math.floor(y),
|
y = math.floor(y),
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
@@ -944,8 +944,8 @@ function TestAbsolutePositioningBasic:testCircularPositioningPattern()
|
|||||||
id = "orbiterChild" .. i,
|
id = "orbiterChild" .. i,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 30,
|
width = 30,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -966,8 +966,8 @@ function TestAbsolutePositioningBasic:testDeepSingleBranchChain()
|
|||||||
id = "root",
|
id = "root",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 500,
|
height = 500,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -979,8 +979,8 @@ function TestAbsolutePositioningBasic:testDeepSingleBranchChain()
|
|||||||
id = "depth" .. i,
|
id = "depth" .. i,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = math.max(50, 500 - (i * 25)), -- Decreasing width
|
width = math.max(50, 500 - (i * 25)), -- Decreasing width
|
||||||
h = math.max(50, 500 - (i * 25)), -- Decreasing height
|
height = math.max(50, 500 - (i * 25)), -- Decreasing height
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
@@ -1011,8 +1011,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = "desktop",
|
id = "desktop",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
@@ -1023,8 +1023,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = "taskbar",
|
id = "taskbar",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 1040,
|
y = 1040,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 100, -- Always on top
|
z = 100, -- Always on top
|
||||||
})
|
})
|
||||||
@@ -1035,8 +1035,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = "window1",
|
id = "window1",
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 600,
|
width = 600,
|
||||||
h = 400,
|
height = 400,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 10,
|
z = 10,
|
||||||
})
|
})
|
||||||
@@ -1046,8 +1046,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = "window2",
|
id = "window2",
|
||||||
x = 300,
|
x = 300,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 350,
|
height = 350,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 15, -- Above window1
|
z = 15, -- Above window1
|
||||||
})
|
})
|
||||||
@@ -1057,8 +1057,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = "window3",
|
id = "window3",
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 150,
|
y = 150,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 5, -- Behind window1 and window2
|
z = 5, -- Behind window1 and window2
|
||||||
})
|
})
|
||||||
@@ -1070,8 +1070,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = window.id .. "_titlebar",
|
id = window.id .. "_titlebar",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = window.width,
|
width = window.width,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -1081,8 +1081,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = window.id .. "_content",
|
id = window.id .. "_content",
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = window.width,
|
width = window.width,
|
||||||
h = window.height - 30,
|
height = window.height - 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
@@ -1094,8 +1094,8 @@ function TestAbsolutePositioningBasic:testComplexBranchingWithOverlaps()
|
|||||||
id = window.id .. "_item" .. j,
|
id = window.id .. "_item" .. j,
|
||||||
x = j * 50,
|
x = j * 50,
|
||||||
y = j * 40,
|
y = j * 40,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
z = j,
|
z = j,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -34,16 +34,16 @@ function TestAbsolutePositioningChildLayout:testAddChildToAbsoluteParent()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child)
|
parent:addChild(child)
|
||||||
@@ -61,24 +61,24 @@ function TestAbsolutePositioningChildLayout:testChildrenMaintainCoordinates()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child1 = Gui.new({
|
local child1 = Gui.new({
|
||||||
id = "child1",
|
id = "child1",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
id = "child2",
|
id = "child2",
|
||||||
x = 75,
|
x = 75,
|
||||||
y = 85,
|
y = 85,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child1)
|
parent:addChild(child1)
|
||||||
@@ -98,8 +98,8 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentSkipsLayoutChildre
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -107,16 +107,16 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentSkipsLayoutChildre
|
|||||||
id = "child1",
|
id = "child1",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
id = "child2",
|
id = "child2",
|
||||||
x = 200, -- Way beyond parent w - this would be repositioned in flex layout
|
x = 200, -- Way beyond parent w - this would be repositioned in flex layout
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child1)
|
parent:addChild(child1)
|
||||||
@@ -137,8 +137,8 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentFlexPropertiesUnch
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
alignItems = AlignItems.FLEX_END,
|
alignItems = AlignItems.FLEX_END,
|
||||||
@@ -148,8 +148,8 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentFlexPropertiesUnch
|
|||||||
id = "child",
|
id = "child",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Store original values
|
-- Store original values
|
||||||
@@ -176,8 +176,8 @@ function TestAbsolutePositioningChildLayout:testMultipleChildrenIndependentPosit
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 300,
|
height = 300,
|
||||||
})
|
})
|
||||||
|
|
||||||
local children = {}
|
local children = {}
|
||||||
@@ -186,8 +186,8 @@ function TestAbsolutePositioningChildLayout:testMultipleChildrenIndependentPosit
|
|||||||
id = "child" .. i,
|
id = "child" .. i,
|
||||||
x = i * 25,
|
x = i * 25,
|
||||||
y = i * 30,
|
y = i * 30,
|
||||||
w = 20,
|
width = 20,
|
||||||
h = 15,
|
height = 15,
|
||||||
})
|
})
|
||||||
parent:addChild(children[i])
|
parent:addChild(children[i])
|
||||||
end
|
end
|
||||||
@@ -209,16 +209,16 @@ function TestAbsolutePositioningChildLayout:testAbsoluteChildrenIgnoreFlexLayout
|
|||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 100,
|
height = 100,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild = Gui.new({
|
local flexChild = Gui.new({
|
||||||
id = "flex_child",
|
id = "flex_child",
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local absoluteChild = Gui.new({
|
local absoluteChild = Gui.new({
|
||||||
@@ -226,8 +226,8 @@ function TestAbsolutePositioningChildLayout:testAbsoluteChildrenIgnoreFlexLayout
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 40,
|
y = 40,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(flexChild)
|
parent:addChild(flexChild)
|
||||||
@@ -249,16 +249,16 @@ function TestAbsolutePositioningChildLayout:testChildCoordinatesIndependentOfPar
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child)
|
parent:addChild(child)
|
||||||
@@ -279,8 +279,8 @@ function TestAbsolutePositioningChildLayout:testNestedAbsolutePositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 25,
|
y = 25,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
})
|
})
|
||||||
|
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
@@ -288,16 +288,16 @@ function TestAbsolutePositioningChildLayout:testNestedAbsolutePositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 75,
|
x = 75,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
grandparent:addChild(parent)
|
grandparent:addChild(parent)
|
||||||
@@ -320,15 +320,15 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentWithFlexChildren()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild = Gui.new({
|
local flexChild = Gui.new({
|
||||||
id = "flex_child",
|
id = "flex_child",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(flexChild)
|
parent:addChild(flexChild)
|
||||||
@@ -352,8 +352,8 @@ function TestAbsolutePositioningChildLayout:testAutoSizingWithAbsoluteParentAndC
|
|||||||
id = "child",
|
id = "child",
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child)
|
parent:addChild(child)
|
||||||
@@ -371,8 +371,8 @@ function TestAbsolutePositioningChildLayout:testChildrenPreservePositioningType(
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local absoluteChild = Gui.new({
|
local absoluteChild = Gui.new({
|
||||||
@@ -380,15 +380,15 @@ function TestAbsolutePositioningChildLayout:testChildrenPreservePositioningType(
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild = Gui.new({
|
local flexChild = Gui.new({
|
||||||
id = "flex_child",
|
id = "flex_child",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 35,
|
height = 35,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(absoluteChild)
|
parent:addChild(absoluteChild)
|
||||||
@@ -406,16 +406,16 @@ function TestAbsolutePositioningChildLayout:testParentChildCoordinateRelationshi
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child)
|
parent:addChild(child)
|
||||||
@@ -434,8 +434,8 @@ function TestAbsolutePositioningChildLayout:testAddChildNoParentRepositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 150,
|
x = 150,
|
||||||
y = 75,
|
y = 75,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local originalX = parent.x
|
local originalX = parent.x
|
||||||
@@ -445,8 +445,8 @@ function TestAbsolutePositioningChildLayout:testAddChildNoParentRepositioning()
|
|||||||
id = "child",
|
id = "child",
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(child)
|
parent:addChild(child)
|
||||||
@@ -463,13 +463,13 @@ function TestAbsolutePositioningChildLayout:testChildrenTableMaintained()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child1 = Gui.new({ id = "child1", x = 10, y = 20, w = 50, h = 30 })
|
local child1 = Gui.new({ id = "child1", x = 10, y = 20, width = 50, height = 30 })
|
||||||
local child2 = Gui.new({ id = "child2", x = 70, y = 80, w = 40, h = 25 })
|
local child2 = Gui.new({ id = "child2", x = 70, y = 80, width = 40, height = 25 })
|
||||||
local child3 = Gui.new({ id = "child3", x = 120, y = 90, w = 30, h = 35 })
|
local child3 = Gui.new({ id = "child3", x = 120, y = 90, width = 30, height = 35 })
|
||||||
|
|
||||||
parent:addChild(child1)
|
parent:addChild(child1)
|
||||||
luaunit.assertEquals(#parent.children, 1)
|
luaunit.assertEquals(#parent.children, 1)
|
||||||
@@ -496,8 +496,8 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentMixedChildTypes()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 200,
|
height = 200,
|
||||||
})
|
})
|
||||||
|
|
||||||
local absoluteChild = Gui.new({
|
local absoluteChild = Gui.new({
|
||||||
@@ -505,15 +505,15 @@ function TestAbsolutePositioningChildLayout:testAbsoluteParentMixedChildTypes()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild = Gui.new({
|
local flexChild = Gui.new({
|
||||||
id = "flex_child",
|
id = "flex_child",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 35,
|
height = 35,
|
||||||
})
|
})
|
||||||
|
|
||||||
parent:addChild(absoluteChild)
|
parent:addChild(absoluteChild)
|
||||||
@@ -548,8 +548,8 @@ function TestAbsolutePositioningChildLayout:testDeepHierarchyMixedPositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 600,
|
height = 600,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexLevel1 = Gui.new({
|
local flexLevel1 = Gui.new({
|
||||||
@@ -559,8 +559,8 @@ function TestAbsolutePositioningChildLayout:testDeepHierarchyMixedPositioning()
|
|||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
x = 50, -- Should be ignored due to flex positioning
|
x = 50, -- Should be ignored due to flex positioning
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 700,
|
width = 700,
|
||||||
h = 500,
|
height = 500,
|
||||||
gap = 20,
|
gap = 20,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -571,24 +571,24 @@ function TestAbsolutePositioningChildLayout:testDeepHierarchyMixedPositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 600, -- Absolute position within flex parent
|
x = 600, -- Absolute position within flex parent
|
||||||
y = 400,
|
y = 400,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 100,
|
height = 100,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild1 = Gui.new({
|
local flexChild1 = Gui.new({
|
||||||
parent = flexLevel1,
|
parent = flexLevel1,
|
||||||
id = "flexChild1",
|
id = "flexChild1",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexChild2 = Gui.new({
|
local flexChild2 = Gui.new({
|
||||||
parent = flexLevel1,
|
parent = flexLevel1,
|
||||||
id = "flexChild2",
|
id = "flexChild2",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Add grandchildren to flex children
|
-- Add grandchildren to flex children
|
||||||
@@ -598,16 +598,16 @@ function TestAbsolutePositioningChildLayout:testDeepHierarchyMixedPositioning()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 75,
|
x = 75,
|
||||||
y = 75,
|
y = 75,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flexGrandchild = Gui.new({
|
local flexGrandchild = Gui.new({
|
||||||
parent = flexChild2,
|
parent = flexChild2,
|
||||||
id = "flexGrandchild",
|
id = "flexGrandchild",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 75,
|
height = 75,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Verify hierarchy structure
|
-- Verify hierarchy structure
|
||||||
@@ -641,8 +641,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 800,
|
height = 800,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Left branch: Absolute parent with flex children
|
-- Left branch: Absolute parent with flex children
|
||||||
@@ -652,8 +652,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 700,
|
height = 700,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Flex container within absolute parent
|
-- Flex container within absolute parent
|
||||||
@@ -662,8 +662,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
id = "leftFlexContainer",
|
id = "leftFlexContainer",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 600,
|
height = 600,
|
||||||
gap = 15,
|
gap = 15,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -673,8 +673,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
parent = leftFlexContainer,
|
parent = leftFlexContainer,
|
||||||
id = "leftFlexChild" .. i,
|
id = "leftFlexChild" .. i,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 350,
|
width = 350,
|
||||||
h = 120,
|
height = 120,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Each flex child has absolute grandchildren
|
-- Each flex child has absolute grandchildren
|
||||||
@@ -685,8 +685,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = j * 100,
|
x = j * 100,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 80,
|
height = 80,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -699,8 +699,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 450,
|
x = 450,
|
||||||
y = i * 200,
|
y = i * 200,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -711,8 +711,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 650,
|
x = 650,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 700,
|
height = 700,
|
||||||
})
|
})
|
||||||
|
|
||||||
local rightFlexContainer = Gui.new({
|
local rightFlexContainer = Gui.new({
|
||||||
@@ -720,8 +720,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
id = "rightFlexContainer",
|
id = "rightFlexContainer",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
w = 450,
|
width = 450,
|
||||||
h = 200,
|
height = 200,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -731,8 +731,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
parent = rightFlexContainer,
|
parent = rightFlexContainer,
|
||||||
id = "rightFlexChild" .. i,
|
id = "rightFlexChild" .. i,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 130,
|
width = 130,
|
||||||
h = 180,
|
height = 180,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Nested flex container
|
-- Nested flex container
|
||||||
@@ -741,8 +741,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
id = "rightNestedFlex" .. i,
|
id = "rightNestedFlex" .. i,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
w = 120,
|
width = 120,
|
||||||
h = 170,
|
height = 170,
|
||||||
gap = 5,
|
gap = 5,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -752,8 +752,8 @@ function TestAbsolutePositioningChildLayout:testMultiBranchAbsoluteWithMixedChil
|
|||||||
parent = nestedFlex,
|
parent = nestedFlex,
|
||||||
id = "rightNestedChild" .. i .. "_" .. j,
|
id = "rightNestedChild" .. i .. "_" .. j,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
w = 110,
|
width = 110,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -781,8 +781,8 @@ function TestAbsolutePositioningChildLayout:testCascadeAbsoluteWithZIndexConflic
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 1000,
|
height = 1000,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -795,8 +795,8 @@ function TestAbsolutePositioningChildLayout:testCascadeAbsoluteWithZIndexConflic
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = i * 50,
|
x = i * 50,
|
||||||
y = i * 50,
|
y = i * 50,
|
||||||
w = 600,
|
width = 600,
|
||||||
h = 600,
|
height = 600,
|
||||||
z = 6 - i, -- Reverse z-index (layer1=5, layer2=4, etc.)
|
z = 6 - i, -- Reverse z-index (layer1=5, layer2=4, etc.)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -808,8 +808,8 @@ function TestAbsolutePositioningChildLayout:testCascadeAbsoluteWithZIndexConflic
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = j * 100,
|
x = j * 100,
|
||||||
y = j * 100,
|
y = j * 100,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
z = j, -- Same z-index pattern across all layers
|
z = j, -- Same z-index pattern across all layers
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -821,8 +821,8 @@ function TestAbsolutePositioningChildLayout:testCascadeAbsoluteWithZIndexConflic
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = k * 30,
|
x = k * 30,
|
||||||
y = k * 30,
|
y = k * 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 50,
|
height = 50,
|
||||||
z = k,
|
z = k,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -858,8 +858,8 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 600,
|
height = 600,
|
||||||
})
|
})
|
||||||
|
|
||||||
local rows, cols = 4, 5
|
local rows, cols = 4, 5
|
||||||
@@ -868,7 +868,7 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
|
|
||||||
-- Create grid cells
|
-- Create grid cells
|
||||||
local cells = {}
|
local cells = {}
|
||||||
for row = 1, rows do
|
for rowidth = 1, rows do
|
||||||
cells[row] = {}
|
cells[row] = {}
|
||||||
for col = 1, cols do
|
for col = 1, cols do
|
||||||
local x = (col - 1) * (cellWidth + gap)
|
local x = (col - 1) * (cellWidth + gap)
|
||||||
@@ -880,8 +880,8 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = x,
|
x = x,
|
||||||
y = y,
|
y = y,
|
||||||
w = cellWidth,
|
width = cellWidth,
|
||||||
h = cellHeight,
|
height = cellHeight,
|
||||||
z = row * cols + col, -- Unique z-index for each cell
|
z = row * cols + col, -- Unique z-index for each cell
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -892,8 +892,8 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = cellWidth,
|
width = cellWidth,
|
||||||
h = 30,
|
height = 30,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -903,8 +903,8 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 5,
|
x = 5,
|
||||||
y = 35,
|
y = 35,
|
||||||
w = cellWidth - 10,
|
width = cellWidth - 10,
|
||||||
h = cellHeight - 40,
|
height = cellHeight - 40,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -916,8 +916,8 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = i * 25,
|
y = i * 25,
|
||||||
w = cellWidth - 30,
|
width = cellWidth - 30,
|
||||||
h = 20,
|
height = 20,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -927,7 +927,7 @@ function TestAbsolutePositioningChildLayout:testGridStructureAbsolutePositioning
|
|||||||
-- Verify grid structure
|
-- Verify grid structure
|
||||||
luaunit.assertEquals(#grid.children, rows * cols)
|
luaunit.assertEquals(#grid.children, rows * cols)
|
||||||
|
|
||||||
for row = 1, rows do
|
for rowidth = 1, rows do
|
||||||
for col = 1, cols do
|
for col = 1, cols do
|
||||||
local cell = cells[row][col]
|
local cell = cells[row][col]
|
||||||
local expectedX = (col - 1) * (cellWidth + gap)
|
local expectedX = (col - 1) * (cellWidth + gap)
|
||||||
@@ -950,8 +950,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -962,8 +962,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -974,8 +974,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
z = 1000, -- High z-index for overlay
|
z = 1000, -- High z-index for overlay
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -986,8 +986,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 460, -- Centered: (1920 - 1000) / 2
|
x = 460, -- Centered: (1920 - 1000) / 2
|
||||||
y = 290, -- Centered: (1080 - 500) / 2
|
y = 290, -- Centered: (1080 - 500) / 2
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 500,
|
height = 500,
|
||||||
z = 1001,
|
z = 1001,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -998,8 +998,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 50,
|
height = 50,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1010,8 +1010,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 400,
|
height = 400,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1022,8 +1022,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 40,
|
height = 40,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1035,8 +1035,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = (i - 1) * 250,
|
x = (i - 1) * 250,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 250,
|
width = 250,
|
||||||
h = 40,
|
height = 40,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -1048,8 +1048,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 980,
|
width = 980,
|
||||||
h = 340,
|
height = 340,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1060,8 +1060,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 710, -- Offset from primary modal
|
x = 710, -- Offset from primary modal
|
||||||
y = 340,
|
y = 340,
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 400,
|
height = 400,
|
||||||
z = 1002, -- Above primary modal
|
z = 1002, -- Above primary modal
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1072,8 +1072,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
z = 2000, -- Highest z-index
|
z = 2000, -- Highest z-index
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1083,8 +1083,8 @@ function TestAbsolutePositioningChildLayout:testComplexModalDialogSystem()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 800,
|
x = 800,
|
||||||
y = 600,
|
y = 600,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 50,
|
height = 50,
|
||||||
z = 2001,
|
z = 2001,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1113,8 +1113,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 2000,
|
height = 2000,
|
||||||
z = 0,
|
z = 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1125,8 +1125,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 100,
|
height = 100,
|
||||||
z = 10,
|
z = 10,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1137,8 +1137,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 60,
|
height = 60,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1150,8 +1150,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = (i - 1) * 200,
|
x = (i - 1) * 200,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 60,
|
height = 60,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1163,8 +1163,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 60,
|
y = 60,
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 200,
|
height = 200,
|
||||||
z = 100, -- High z-index for dropdown
|
z = 100, -- High z-index for dropdown
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1176,8 +1176,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = (j - 1) * 50,
|
y = (j - 1) * 50,
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 50,
|
height = 50,
|
||||||
z = j,
|
z = j,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -1191,8 +1191,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 1700,
|
height = 1700,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1203,8 +1203,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 1700,
|
height = 1700,
|
||||||
z = 2,
|
z = 2,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1216,8 +1216,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = (i - 1) * 280 + 10,
|
y = (i - 1) * 280 + 10,
|
||||||
w = 280,
|
width = 280,
|
||||||
h = 260,
|
height = 260,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1228,8 +1228,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 280,
|
width = 280,
|
||||||
h = 40,
|
height = 40,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1240,8 +1240,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 5,
|
x = 5,
|
||||||
y = 45,
|
y = 45,
|
||||||
w = 270,
|
width = 270,
|
||||||
h = 210,
|
height = 210,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1253,8 +1253,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 5,
|
x = 5,
|
||||||
y = (j - 1) * 50,
|
y = (j - 1) * 50,
|
||||||
w = 260,
|
width = 260,
|
||||||
h = 45,
|
height = 45,
|
||||||
z = j,
|
z = j,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -1267,8 +1267,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 320,
|
x = 320,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 880,
|
width = 880,
|
||||||
h = 1700,
|
height = 1700,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1280,8 +1280,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 20,
|
x = 20,
|
||||||
y = (i - 1) * 550 + 20,
|
y = (i - 1) * 550 + 20,
|
||||||
w = 840,
|
width = 840,
|
||||||
h = 500,
|
height = 500,
|
||||||
z = i,
|
z = i,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1292,8 +1292,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 840,
|
width = 840,
|
||||||
h = 80,
|
height = 80,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1303,8 +1303,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 80,
|
y = 80,
|
||||||
w = 840,
|
width = 840,
|
||||||
h = 350,
|
height = 350,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1314,8 +1314,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 430,
|
y = 430,
|
||||||
w = 840,
|
width = 840,
|
||||||
h = 70,
|
height = 70,
|
||||||
z = 1,
|
z = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1327,8 +1327,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 20,
|
x = 20,
|
||||||
y = 50 + (j - 1) * 100,
|
y = 50 + (j - 1) * 100,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 80,
|
height = 80,
|
||||||
z = j,
|
z = j,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -1341,8 +1341,8 @@ function TestAbsolutePositioningChildLayout:testDynamicBranchingDOMStructure()
|
|||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 1800,
|
y = 1800,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 200,
|
height = 200,
|
||||||
z = 10,
|
z = 10,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1381,4 +1381,3 @@ end
|
|||||||
|
|
||||||
-- Run the tests
|
-- Run the tests
|
||||||
luaunit.LuaUnit.run()
|
luaunit.LuaUnit.run()
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -36,8 +36,8 @@ local function createTestContainer(props)
|
|||||||
local defaults = {
|
local defaults = {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -91,8 +91,8 @@ function TestLayoutValidation:testInvalidEnumValuesGracefulDegradation()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
-- flexDirection = "invalid_direction", -- Skip invalid enum to avoid type error
|
-- flexDirection = "invalid_direction", -- Skip invalid enum to avoid type error
|
||||||
})
|
})
|
||||||
@@ -105,8 +105,8 @@ function TestLayoutValidation:testInvalidEnumValuesGracefulDegradation()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
-- justifyContent = "invalid_justify", -- Skip invalid enum to avoid type error
|
-- justifyContent = "invalid_justify", -- Skip invalid enum to avoid type error
|
||||||
})
|
})
|
||||||
@@ -147,8 +147,8 @@ function TestLayoutValidation:testInvalidPropertyCombinations()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
flexDirection = FlexDirection.VERTICAL, -- Should be ignored
|
flexDirection = FlexDirection.VERTICAL, -- Should be ignored
|
||||||
justifyContent = JustifyContent.CENTER, -- Should be ignored
|
justifyContent = JustifyContent.CENTER, -- Should be ignored
|
||||||
@@ -163,8 +163,8 @@ function TestLayoutValidation:testInvalidPropertyCombinations()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = 10, -- Should work with flex
|
x = 10, -- Should work with flex
|
||||||
y = 10, -- Should work with flex
|
y = 10, -- Should work with flex
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -181,8 +181,8 @@ function TestLayoutValidation:testNegativeDimensionsAndPositions()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = -10,
|
x = -10,
|
||||||
y = -20,
|
y = -20,
|
||||||
w = -50,
|
width = -50,
|
||||||
h = -30,
|
height = -30,
|
||||||
})
|
})
|
||||||
end)
|
end)
|
||||||
luaunit.assertTrue(success) -- Should not crash
|
luaunit.assertTrue(success) -- Should not crash
|
||||||
@@ -198,8 +198,8 @@ function TestLayoutValidation:testExtremelyLargeValues()
|
|||||||
return Gui.new({
|
return Gui.new({
|
||||||
x = 999999,
|
x = 999999,
|
||||||
y = 999999,
|
y = 999999,
|
||||||
w = 999999,
|
width = 999999,
|
||||||
h = 999999,
|
height = 999999,
|
||||||
})
|
})
|
||||||
end)
|
end)
|
||||||
luaunit.assertTrue(success) -- Should not crash
|
luaunit.assertTrue(success) -- Should not crash
|
||||||
@@ -218,8 +218,8 @@ function TestLayoutValidation:testInvalidChildParentRelationships()
|
|||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.FLEX, -- Child tries to be flex container
|
positioning = Positioning.FLEX, -- Child tries to be flex container
|
||||||
})
|
})
|
||||||
child.parent = parent
|
child.parent = parent
|
||||||
@@ -237,15 +237,15 @@ function TestLayoutValidation:testLayoutAfterPropertyChanges()
|
|||||||
local container = createTestContainer()
|
local container = createTestContainer()
|
||||||
|
|
||||||
local child1 = Gui.new({
|
local child1 = Gui.new({
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
child1.parent = container
|
child1.parent = container
|
||||||
table.insert(container.children, child1)
|
table.insert(container.children, child1)
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 35,
|
height = 35,
|
||||||
})
|
})
|
||||||
child2.parent = container
|
child2.parent = container
|
||||||
table.insert(container.children, child2)
|
table.insert(container.children, child2)
|
||||||
@@ -288,14 +288,14 @@ function TestLayoutValidation:testComplexNestedValidation()
|
|||||||
local root = Gui.new({
|
local root = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
})
|
})
|
||||||
|
|
||||||
local flex_child = Gui.new({
|
local flex_child = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 75,
|
height = 75,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -305,16 +305,16 @@ function TestLayoutValidation:testComplexNestedValidation()
|
|||||||
local absolute_grandchild = Gui.new({
|
local absolute_grandchild = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 30,
|
width = 30,
|
||||||
h = 20,
|
height = 20,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
})
|
})
|
||||||
absolute_grandchild.parent = flex_child
|
absolute_grandchild.parent = flex_child
|
||||||
table.insert(flex_child.children, absolute_grandchild)
|
table.insert(flex_child.children, absolute_grandchild)
|
||||||
|
|
||||||
local flex_grandchild = Gui.new({
|
local flex_grandchild = Gui.new({
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
-- No positioning - should inherit behavior
|
-- No positioning - should inherit behavior
|
||||||
})
|
})
|
||||||
flex_grandchild.parent = flex_child
|
flex_grandchild.parent = flex_child
|
||||||
@@ -350,8 +350,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
local app = Gui.new({
|
local app = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 800,
|
height = 800,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -361,7 +361,7 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Header with complex validation scenarios
|
-- Header with complex validation scenarios
|
||||||
local header = Gui.new({
|
local header = Gui.new({
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -374,8 +374,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Header navigation with potential edge cases
|
-- Header navigation with potential edge cases
|
||||||
local nav = Gui.new({
|
local nav = Gui.new({
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -388,8 +388,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Create nav items with extreme values
|
-- Create nav items with extreme values
|
||||||
for i = 1, 5 do
|
for i = 1, 5 do
|
||||||
local navItem = Gui.new({
|
local navItem = Gui.new({
|
||||||
w = i == 3 and 0 or 80, -- One item with zero width
|
width = i == 3 and 0 or 80, -- One item with zero width
|
||||||
h = i == 4 and -10 or 24, -- One item with negative height
|
height = i == 4 and -10 or 24, -- One item with negative height
|
||||||
positioning = i == 5 and Positioning.ABSOLUTE or nil, -- Mixed positioning
|
positioning = i == 5 and Positioning.ABSOLUTE or nil, -- Mixed positioning
|
||||||
})
|
})
|
||||||
navItem.parent = nav
|
navItem.parent = nav
|
||||||
@@ -398,8 +398,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Header actions with validation edge cases
|
-- Header actions with validation edge cases
|
||||||
local actions = Gui.new({
|
local actions = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_END,
|
justifyContent = JustifyContent.FLEX_END,
|
||||||
@@ -412,8 +412,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Actions with extreme dimensions
|
-- Actions with extreme dimensions
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
local action = Gui.new({
|
local action = Gui.new({
|
||||||
w = i == 1 and 999999 or 32, -- Extremely large width
|
width = i == 1 and 999999 or 32, -- Extremely large width
|
||||||
h = i == 2 and 0.1 or 32, -- Fractional height
|
height = i == 2 and 0.1 or 32, -- Fractional height
|
||||||
x = i == 3 and -1000 or nil, -- Extreme negative position
|
x = i == 3 and -1000 or nil, -- Extreme negative position
|
||||||
y = i == 3 and -1000 or nil,
|
y = i == 3 and -1000 or nil,
|
||||||
})
|
})
|
||||||
@@ -423,7 +423,7 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Main content with nested validation challenges
|
-- Main content with nested validation challenges
|
||||||
local main = Gui.new({
|
local main = Gui.new({
|
||||||
h = 740,
|
height = 740,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -435,8 +435,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Sidebar with deep nesting and edge cases
|
-- Sidebar with deep nesting and edge cases
|
||||||
local sidebar = Gui.new({
|
local sidebar = Gui.new({
|
||||||
w = 250,
|
width = 250,
|
||||||
h = 740,
|
height = 740,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -450,7 +450,7 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Sidebar sections with validation challenges
|
-- Sidebar sections with validation challenges
|
||||||
for section = 1, 3 do
|
for section = 1, 3 do
|
||||||
local sideSection = Gui.new({
|
local sideSection = Gui.new({
|
||||||
h = section == 2 and -100 or 200, -- Negative height test
|
height = section == 2 and -100 or 200, -- Negative height test
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -463,8 +463,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Section items with extreme properties
|
-- Section items with extreme properties
|
||||||
for item = 1, 4 do
|
for item = 1, 4 do
|
||||||
local sectionItem = Gui.new({
|
local sectionItem = Gui.new({
|
||||||
h = 24,
|
height = 24,
|
||||||
w = item == 2 and 0 or nil, -- Zero width test
|
width = item == 2 and 0 or nil, -- Zero width test
|
||||||
positioning = item == 4 and Positioning.ABSOLUTE or nil,
|
positioning = item == 4 and Positioning.ABSOLUTE or nil,
|
||||||
x = item == 4 and 50 or nil,
|
x = item == 4 and 50 or nil,
|
||||||
y = item == 4 and 50 or nil,
|
y = item == 4 and 50 or nil,
|
||||||
@@ -477,8 +477,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
if item <= 2 then
|
if item <= 2 then
|
||||||
for nested = 1, 2 do
|
for nested = 1, 2 do
|
||||||
local nestedItem = Gui.new({
|
local nestedItem = Gui.new({
|
||||||
w = nested == 1 and 999999 or 20, -- Extreme width
|
width = nested == 1 and 999999 or 20, -- Extreme width
|
||||||
h = 12,
|
height = 12,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -493,8 +493,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Content area with complex validation scenarios
|
-- Content area with complex validation scenarios
|
||||||
local content = Gui.new({
|
local content = Gui.new({
|
||||||
w = 950,
|
width = 950,
|
||||||
h = 740,
|
height = 740,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -506,7 +506,7 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Content grid with wrapping and validation challenges
|
-- Content grid with wrapping and validation challenges
|
||||||
local contentGrid = Gui.new({
|
local contentGrid = Gui.new({
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -521,8 +521,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Grid items with validation edge cases
|
-- Grid items with validation edge cases
|
||||||
for i = 1, 12 do
|
for i = 1, 12 do
|
||||||
local gridItem = Gui.new({
|
local gridItem = Gui.new({
|
||||||
w = i % 4 == 0 and 0 or 200, -- Some zero width items
|
width = i % 4 == 0 and 0 or 200, -- Some zero width items
|
||||||
h = i % 3 == 0 and -50 or 150, -- Some negative height items
|
height = i % 3 == 0 and -50 or 150, -- Some negative height items
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -535,8 +535,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Grid item content with extreme values
|
-- Grid item content with extreme values
|
||||||
for j = 1, 3 do
|
for j = 1, 3 do
|
||||||
local itemContent = Gui.new({
|
local itemContent = Gui.new({
|
||||||
h = j == 1 and 999999 or 40, -- Extreme height
|
height = j == 1 and 999999 or 40, -- Extreme height
|
||||||
w = j == 2 and -100 or nil, -- Negative width
|
width = j == 2 and -100 or nil, -- Negative width
|
||||||
positioning = j == 3 and Positioning.ABSOLUTE or nil,
|
positioning = j == 3 and Positioning.ABSOLUTE or nil,
|
||||||
x = j == 3 and -500 or nil, -- Extreme negative position
|
x = j == 3 and -500 or nil, -- Extreme negative position
|
||||||
y = j == 3 and 1000000 or nil, -- Extreme positive position
|
y = j == 3 and 1000000 or nil, -- Extreme positive position
|
||||||
@@ -548,7 +548,7 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
|
|
||||||
-- Footer with final validation tests
|
-- Footer with final validation tests
|
||||||
local footer = Gui.new({
|
local footer = Gui.new({
|
||||||
h = 140,
|
height = 140,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_AROUND,
|
justifyContent = JustifyContent.SPACE_AROUND,
|
||||||
@@ -562,8 +562,8 @@ function TestLayoutValidation:testComplexMultiLevelLayoutValidation()
|
|||||||
-- Footer sections with final edge cases
|
-- Footer sections with final edge cases
|
||||||
for i = 1, 4 do
|
for i = 1, 4 do
|
||||||
local footerSection = Gui.new({
|
local footerSection = Gui.new({
|
||||||
w = i == 1 and 0 or 200,
|
width = i == 1 and 0 or 200,
|
||||||
h = i == 2 and -1000 or 100,
|
height = i == 2 and -1000 or 100,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -618,8 +618,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
local dashboard = Gui.new({
|
local dashboard = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -629,7 +629,7 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
|
|
||||||
-- Metrics row that will be modified
|
-- Metrics row that will be modified
|
||||||
local metricsRow = Gui.new({
|
local metricsRow = Gui.new({
|
||||||
h = 120,
|
height = 120,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -645,8 +645,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
local metrics = {}
|
local metrics = {}
|
||||||
for i = 1, 6 do
|
for i = 1, 6 do
|
||||||
local metric = Gui.new({
|
local metric = Gui.new({
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 80,
|
height = 80,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -660,8 +660,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
-- Metric content
|
-- Metric content
|
||||||
for j = 1, 3 do
|
for j = 1, 3 do
|
||||||
local content = Gui.new({
|
local content = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 20,
|
height = 20,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -674,7 +674,7 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
|
|
||||||
-- Content area that will receive dynamic changes
|
-- Content area that will receive dynamic changes
|
||||||
local contentArea = Gui.new({
|
local contentArea = Gui.new({
|
||||||
h = 480,
|
height = 480,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -687,8 +687,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
|
|
||||||
-- Left panel for modifications
|
-- Left panel for modifications
|
||||||
local leftPanel = Gui.new({
|
local leftPanel = Gui.new({
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 460,
|
height = 460,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -700,8 +700,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
|
|
||||||
-- Right panel with nested complexity
|
-- Right panel with nested complexity
|
||||||
local rightPanel = Gui.new({
|
local rightPanel = Gui.new({
|
||||||
w = 640,
|
width = 640,
|
||||||
h = 460,
|
height = 460,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -714,7 +714,7 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
-- Create nested content for validation testing
|
-- Create nested content for validation testing
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
h = 140,
|
height = 140,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -729,8 +729,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
-- Section items for modification testing
|
-- Section items for modification testing
|
||||||
for j = 1, 8 do
|
for j = 1, 8 do
|
||||||
local item = Gui.new({
|
local item = Gui.new({
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -796,8 +796,8 @@ function TestLayoutValidation:testComplexDynamicPropertyValidation()
|
|||||||
|
|
||||||
-- Test 9: Add/remove children dynamically
|
-- Test 9: Add/remove children dynamically
|
||||||
local newMetric = Gui.new({
|
local newMetric = Gui.new({
|
||||||
w = 0,
|
width = 0,
|
||||||
h = -50,
|
height = -50,
|
||||||
positioning = Positioning.ABSOLUTE,
|
positioning = Positioning.ABSOLUTE,
|
||||||
x = -1000,
|
x = -1000,
|
||||||
y = -1000,
|
y = -1000,
|
||||||
@@ -847,22 +847,22 @@ function TestLayoutValidation:testCircularReferenceValidation()
|
|||||||
local container1 = Gui.new({
|
local container1 = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
local container2 = Gui.new({
|
local container2 = Gui.new({
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 180,
|
height = 180,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
local container3 = Gui.new({
|
local container3 = Gui.new({
|
||||||
w = 160,
|
width = 160,
|
||||||
h = 160,
|
height = 160,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -899,15 +899,15 @@ function TestLayoutValidation:testCircularReferenceValidation()
|
|||||||
|
|
||||||
-- Test case 2: Complex nested structure with potential circular refs
|
-- Test case 2: Complex nested structure with potential circular refs
|
||||||
local container4 = Gui.new({
|
local container4 = Gui.new({
|
||||||
w = 140,
|
width = 140,
|
||||||
h = 140,
|
height = 140,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
local container5 = Gui.new({
|
local container5 = Gui.new({
|
||||||
w = 120,
|
width = 120,
|
||||||
h = 120,
|
height = 120,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -962,8 +962,8 @@ function TestLayoutValidation:testLargeStructureValidation()
|
|||||||
local root = Gui.new({
|
local root = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 2000,
|
width = 2000,
|
||||||
h = 1500,
|
height = 1500,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -983,8 +983,8 @@ function TestLayoutValidation:testLargeStructureValidation()
|
|||||||
|
|
||||||
for i = 1, items do
|
for i = 1, items do
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
w = depth == 1 and 400 or 100,
|
width = depth == 1 and 400 or 100,
|
||||||
h = depth == 1 and 200 or 50,
|
height = depth == 1 and 200 or 50,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = i % 2 == 0 and FlexDirection.HORIZONTAL or FlexDirection.VERTICAL,
|
flexDirection = i % 2 == 0 and FlexDirection.HORIZONTAL or FlexDirection.VERTICAL,
|
||||||
flexWrap = i % 3 == 0 and FlexWrap.WRAP or FlexWrap.NOWRAP,
|
flexWrap = i % 3 == 0 and FlexWrap.WRAP or FlexWrap.NOWRAP,
|
||||||
@@ -1000,8 +1000,8 @@ function TestLayoutValidation:testLargeStructureValidation()
|
|||||||
if depth >= 3 then
|
if depth >= 3 then
|
||||||
for j = 1, 3 do
|
for j = 1, 3 do
|
||||||
local leaf = Gui.new({
|
local leaf = Gui.new({
|
||||||
w = 20 + j * 5,
|
width = 20 + j * 5,
|
||||||
h = 15 + j * 3,
|
height = 15 + j * 3,
|
||||||
positioning = j == 3 and Positioning.ABSOLUTE or nil,
|
positioning = j == 3 and Positioning.ABSOLUTE or nil,
|
||||||
x = j == 3 and j * 10 or nil,
|
x = j == 3 and j * 10 or nil,
|
||||||
y = j == 3 and j * 10 or nil,
|
y = j == 3 and j * 10 or nil,
|
||||||
@@ -1128,8 +1128,8 @@ function TestLayoutValidation:testComplexFlexCombinationValidation()
|
|||||||
local mainContainer = Gui.new({
|
local mainContainer = Gui.new({
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 2400,
|
width = 2400,
|
||||||
h = 1800,
|
height = 1800,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -1149,8 +1149,8 @@ function TestLayoutValidation:testComplexFlexCombinationValidation()
|
|||||||
combinationCount = combinationCount + 1
|
combinationCount = combinationCount + 1
|
||||||
|
|
||||||
local testContainer = Gui.new({
|
local testContainer = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = flexDir,
|
flexDirection = flexDir,
|
||||||
justifyContent = justify,
|
justifyContent = justify,
|
||||||
@@ -1165,8 +1165,8 @@ function TestLayoutValidation:testComplexFlexCombinationValidation()
|
|||||||
-- Add children with edge case properties
|
-- Add children with edge case properties
|
||||||
for i = 1, 6 do
|
for i = 1, 6 do
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
w = i == 1 and 0 or (i == 2 and -10 or (i == 6 and 999999 or 30)),
|
width = i == 1 and 0 or (i == 2 and -10 or (i == 6 and 999999 or 30)),
|
||||||
h = i == 3 and 0 or (i == 4 and -5 or (i == 5 and 1000000 or 20)),
|
height = i == 3 and 0 or (i == 4 and -5 or (i == 5 and 1000000 or 20)),
|
||||||
positioning = i == 6 and Positioning.ABSOLUTE or nil,
|
positioning = i == 6 and Positioning.ABSOLUTE or nil,
|
||||||
x = i == 6 and -100 or nil,
|
x = i == 6 and -100 or nil,
|
||||||
y = i == 6 and 200 or nil,
|
y = i == 6 and 200 or nil,
|
||||||
@@ -1177,8 +1177,8 @@ function TestLayoutValidation:testComplexFlexCombinationValidation()
|
|||||||
-- Add nested content to some children
|
-- Add nested content to some children
|
||||||
if i <= 3 then
|
if i <= 3 then
|
||||||
local nested = Gui.new({
|
local nested = Gui.new({
|
||||||
w = 15,
|
width = 15,
|
||||||
h = 10,
|
height = 10,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ local function createTestContainer(props)
|
|||||||
local defaults = {
|
local defaults = {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_START,
|
justifyContent = JustifyContent.FLEX_START,
|
||||||
@@ -61,8 +61,8 @@ local function createManyChildren(parent, count, child_props)
|
|||||||
|
|
||||||
for i = 1, count do
|
for i = 1, count do
|
||||||
local props = {
|
local props = {
|
||||||
w = child_props.w or 50,
|
width = child_props.w or 50,
|
||||||
h = child_props.h or 30,
|
height = child_props.h or 30,
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Add any additional properties
|
-- Add any additional properties
|
||||||
@@ -152,8 +152,8 @@ end
|
|||||||
function TestPerformance:testComplexNestedLayoutPerformance()
|
function TestPerformance:testComplexNestedLayoutPerformance()
|
||||||
-- Create a deeply nested structure with multiple levels
|
-- Create a deeply nested structure with multiple levels
|
||||||
local root = createTestContainer({
|
local root = createTestContainer({
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 800,
|
height = 800,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -161,8 +161,8 @@ function TestPerformance:testComplexNestedLayoutPerformance()
|
|||||||
-- Level 1: 5 sections
|
-- Level 1: 5 sections
|
||||||
for i = 1, 5 do
|
for i = 1, 5 do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = 950,
|
width = 950,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -173,8 +173,8 @@ function TestPerformance:testComplexNestedLayoutPerformance()
|
|||||||
-- Level 2: 4 columns per section
|
-- Level 2: 4 columns per section
|
||||||
for j = 1, 4 do
|
for j = 1, 4 do
|
||||||
local column = Gui.new({
|
local column = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 140,
|
height = 140,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
alignItems = AlignItems.CENTER,
|
alignItems = AlignItems.CENTER,
|
||||||
@@ -185,8 +185,8 @@ function TestPerformance:testComplexNestedLayoutPerformance()
|
|||||||
-- Level 3: 3 items per column
|
-- Level 3: 3 items per column
|
||||||
for k = 1, 3 do
|
for k = 1, 3 do
|
||||||
local item = Gui.new({
|
local item = Gui.new({
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
item.parent = column
|
item.parent = column
|
||||||
table.insert(column.children, item)
|
table.insert(column.children, item)
|
||||||
@@ -212,8 +212,8 @@ end
|
|||||||
-- Test 4: Flex Wrap Performance with Many Elements
|
-- Test 4: Flex Wrap Performance with Many Elements
|
||||||
function TestPerformance:testFlexWrapPerformanceWithManyElements()
|
function TestPerformance:testFlexWrapPerformanceWithManyElements()
|
||||||
local container = createTestContainer({
|
local container = createTestContainer({
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 600,
|
height = 600,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
justifyContent = JustifyContent.SPACE_AROUND,
|
justifyContent = JustifyContent.SPACE_AROUND,
|
||||||
@@ -222,8 +222,8 @@ function TestPerformance:testFlexWrapPerformanceWithManyElements()
|
|||||||
|
|
||||||
-- Create many children that will wrap
|
-- Create many children that will wrap
|
||||||
local children = createManyChildren(container, 50, {
|
local children = createManyChildren(container, 50, {
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
local time, _ = measureTime(function()
|
local time, _ = measureTime(function()
|
||||||
@@ -366,8 +366,8 @@ end
|
|||||||
-- Test 8: Stress Test with Maximum Elements
|
-- Test 8: Stress Test with Maximum Elements
|
||||||
function TestPerformance:testStressTestWithMaximumElements()
|
function TestPerformance:testStressTestWithMaximumElements()
|
||||||
local container = createTestContainer({
|
local container = createTestContainer({
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 900,
|
height = 900,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
})
|
})
|
||||||
@@ -375,8 +375,8 @@ function TestPerformance:testStressTestWithMaximumElements()
|
|||||||
-- Create a large number of children for stress testing
|
-- Create a large number of children for stress testing
|
||||||
local stress_count = 300
|
local stress_count = 300
|
||||||
local children = createManyChildren(container, stress_count, {
|
local children = createManyChildren(container, stress_count, {
|
||||||
w = 30,
|
width = 30,
|
||||||
h = 20,
|
height = 20,
|
||||||
})
|
})
|
||||||
|
|
||||||
local time, _ = measureTime(function()
|
local time, _ = measureTime(function()
|
||||||
@@ -408,8 +408,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
|
|
||||||
-- Create enterprise-grade dashboard with deep nesting (5 levels)
|
-- Create enterprise-grade dashboard with deep nesting (5 levels)
|
||||||
local dashboard = createTestContainer({
|
local dashboard = createTestContainer({
|
||||||
w = 1920,
|
width = 1920,
|
||||||
h = 1080,
|
height = 1080,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
})
|
})
|
||||||
@@ -417,8 +417,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
local time, structure_info = measureTime(function()
|
local time, structure_info = measureTime(function()
|
||||||
-- Level 1: Header, Main Content, Footer
|
-- Level 1: Header, Main Content, Footer
|
||||||
local header = Gui.new({
|
local header = Gui.new({
|
||||||
w = 1900,
|
width = 1900,
|
||||||
h = 80,
|
height = 80,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -429,8 +429,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(dashboard.children, header)
|
table.insert(dashboard.children, header)
|
||||||
|
|
||||||
local main_content = Gui.new({
|
local main_content = Gui.new({
|
||||||
w = 1900,
|
width = 1900,
|
||||||
h = 980,
|
height = 980,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
gap = 15,
|
gap = 15,
|
||||||
@@ -439,8 +439,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(dashboard.children, main_content)
|
table.insert(dashboard.children, main_content)
|
||||||
|
|
||||||
local footer = Gui.new({
|
local footer = Gui.new({
|
||||||
w = 1900,
|
width = 1900,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -452,8 +452,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
local header_sections = { "logo", "navigation", "search", "notifications", "user_menu" }
|
local header_sections = { "logo", "navigation", "search", "notifications", "user_menu" }
|
||||||
for i, section_name in ipairs(header_sections) do
|
for i, section_name in ipairs(header_sections) do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = section_name == "navigation" and 400 or 150,
|
width = section_name == "navigation" and 400 or 150,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -466,8 +466,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
local item_count = section_name == "navigation" and 6 or 3
|
local item_count = section_name == "navigation" and 6 or 3
|
||||||
for j = 1, item_count do
|
for j = 1, item_count do
|
||||||
local item = Gui.new({
|
local item = Gui.new({
|
||||||
w = section_name == "navigation" and 60 or 45,
|
width = section_name == "navigation" and 60 or 45,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
item.parent = section
|
item.parent = section
|
||||||
table.insert(section.children, item)
|
table.insert(section.children, item)
|
||||||
@@ -476,8 +476,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
|
|
||||||
-- Level 2: Main content areas (sidebar, dashboard grid)
|
-- Level 2: Main content areas (sidebar, dashboard grid)
|
||||||
local sidebar = Gui.new({
|
local sidebar = Gui.new({
|
||||||
w = 280,
|
width = 280,
|
||||||
h = 960,
|
height = 960,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
@@ -486,8 +486,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(main_content.children, sidebar)
|
table.insert(main_content.children, sidebar)
|
||||||
|
|
||||||
local dashboard_grid = Gui.new({
|
local dashboard_grid = Gui.new({
|
||||||
w = 1600,
|
width = 1600,
|
||||||
h = 960,
|
height = 960,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 20,
|
gap = 20,
|
||||||
@@ -506,8 +506,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
|
|
||||||
for _, category in ipairs(menu_categories) do
|
for _, category in ipairs(menu_categories) do
|
||||||
local category_container = Gui.new({
|
local category_container = Gui.new({
|
||||||
w = 260,
|
width = 260,
|
||||||
h = 40 + (category.items * 35),
|
height = 40 + (category.items * 35),
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 2,
|
gap = 2,
|
||||||
@@ -516,15 +516,15 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(sidebar.children, category_container)
|
table.insert(sidebar.children, category_container)
|
||||||
|
|
||||||
-- Category header
|
-- Category header
|
||||||
local category_header = Gui.new({ w = 250, h = 35 })
|
local category_header = Gui.new({ width = 250, height = 35 })
|
||||||
category_header.parent = category_container
|
category_header.parent = category_container
|
||||||
table.insert(category_container.children, category_header)
|
table.insert(category_container.children, category_header)
|
||||||
|
|
||||||
-- Level 4: Menu items with sub-indicators
|
-- Level 4: Menu items with sub-indicators
|
||||||
for i = 1, category.items do
|
for i = 1, category.items do
|
||||||
local menu_item = Gui.new({
|
local menu_item = Gui.new({
|
||||||
w = 240,
|
width = 240,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -534,15 +534,15 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(category_container.children, menu_item)
|
table.insert(category_container.children, menu_item)
|
||||||
|
|
||||||
-- Level 5: Menu item components (text, icon, badge)
|
-- Level 5: Menu item components (text, icon, badge)
|
||||||
local item_icon = Gui.new({ w = 20, h = 20 })
|
local item_icon = Gui.new({ width = 20, height = 20 })
|
||||||
item_icon.parent = menu_item
|
item_icon.parent = menu_item
|
||||||
table.insert(menu_item.children, item_icon)
|
table.insert(menu_item.children, item_icon)
|
||||||
|
|
||||||
local item_text = Gui.new({ w = 180, h = 25 })
|
local item_text = Gui.new({ width = 180, height = 25 })
|
||||||
item_text.parent = menu_item
|
item_text.parent = menu_item
|
||||||
table.insert(menu_item.children, item_text)
|
table.insert(menu_item.children, item_text)
|
||||||
|
|
||||||
local item_badge = Gui.new({ w = 25, h = 18 })
|
local item_badge = Gui.new({ width = 25, height = 18 })
|
||||||
item_badge.parent = menu_item
|
item_badge.parent = menu_item
|
||||||
table.insert(menu_item.children, item_badge)
|
table.insert(menu_item.children, item_badge)
|
||||||
end
|
end
|
||||||
@@ -551,8 +551,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
-- Level 3: Dashboard grid (4x3 widget grid with complex internals)
|
-- Level 3: Dashboard grid (4x3 widget grid with complex internals)
|
||||||
for row = 1, 4 do
|
for row = 1, 4 do
|
||||||
local grid_row = Gui.new({
|
local grid_row = Gui.new({
|
||||||
w = 1580,
|
width = 1580,
|
||||||
h = 220,
|
height = 220,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -563,8 +563,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
|
|
||||||
for col = 1, 3 do
|
for col = 1, 3 do
|
||||||
local widget = Gui.new({
|
local widget = Gui.new({
|
||||||
w = 500,
|
width = 500,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 8,
|
gap = 8,
|
||||||
@@ -574,8 +574,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
|
|
||||||
-- Level 4: Widget components (header, content, footer)
|
-- Level 4: Widget components (header, content, footer)
|
||||||
local widget_header = Gui.new({
|
local widget_header = Gui.new({
|
||||||
w = 480,
|
width = 480,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -585,8 +585,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(widget.children, widget_header)
|
table.insert(widget.children, widget_header)
|
||||||
|
|
||||||
local widget_content = Gui.new({
|
local widget_content = Gui.new({
|
||||||
w = 480,
|
width = 480,
|
||||||
h = 120,
|
height = 120,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -598,8 +598,8 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(widget.children, widget_content)
|
table.insert(widget.children, widget_content)
|
||||||
|
|
||||||
local widget_footer = Gui.new({
|
local widget_footer = Gui.new({
|
||||||
w = 480,
|
width = 480,
|
||||||
h = 32,
|
height = 32,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_END,
|
justifyContent = JustifyContent.FLEX_END,
|
||||||
@@ -612,21 +612,21 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
local content_elements = (row * col) % 4 == 0 and 12 or 8
|
local content_elements = (row * col) % 4 == 0 and 12 or 8
|
||||||
for i = 1, content_elements do
|
for i = 1, content_elements do
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = content_elements > 10 and 35 or 55,
|
width = content_elements > 10 and 35 or 55,
|
||||||
h = content_elements > 10 and 25 or 35,
|
height = content_elements > 10 and 25 or 35,
|
||||||
})
|
})
|
||||||
element.parent = widget_content
|
element.parent = widget_content
|
||||||
table.insert(widget_content.children, element)
|
table.insert(widget_content.children, element)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Widget header components
|
-- Widget header components
|
||||||
local widget_title = Gui.new({ w = 200, h = 30 })
|
local widget_title = Gui.new({ width = 200, height = 30 })
|
||||||
widget_title.parent = widget_header
|
widget_title.parent = widget_header
|
||||||
table.insert(widget_header.children, widget_title)
|
table.insert(widget_header.children, widget_title)
|
||||||
|
|
||||||
local widget_actions = Gui.new({
|
local widget_actions = Gui.new({
|
||||||
w = 120,
|
width = 120,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
gap = 5,
|
gap = 5,
|
||||||
@@ -635,13 +635,13 @@ function TestPerformance:testComplexEnterpriseApplicationPerformance()
|
|||||||
table.insert(widget_header.children, widget_actions)
|
table.insert(widget_header.children, widget_actions)
|
||||||
|
|
||||||
for j = 1, 3 do
|
for j = 1, 3 do
|
||||||
local action_btn = Gui.new({ w = 30, h = 25 })
|
local action_btn = Gui.new({ width = 30, height = 25 })
|
||||||
action_btn.parent = widget_actions
|
action_btn.parent = widget_actions
|
||||||
table.insert(widget_actions.children, action_btn)
|
table.insert(widget_actions.children, action_btn)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Widget footer components
|
-- Widget footer components
|
||||||
local footer_info = Gui.new({ w = 100, h = 25 })
|
local footer_info = Gui.new({ width = 100, height = 25 })
|
||||||
footer_info.parent = widget_footer
|
footer_info.parent = widget_footer
|
||||||
table.insert(widget_footer.children, footer_info)
|
table.insert(widget_footer.children, footer_info)
|
||||||
end
|
end
|
||||||
@@ -693,8 +693,8 @@ function TestPerformance:testHighFrequencyDynamicLayoutUpdates()
|
|||||||
print("\n=== Test 10: High-Frequency Dynamic Updates Performance ===")
|
print("\n=== Test 10: High-Frequency Dynamic Updates Performance ===")
|
||||||
|
|
||||||
local container = createTestContainer({
|
local container = createTestContainer({
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 800,
|
height = 800,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
})
|
})
|
||||||
@@ -703,8 +703,8 @@ function TestPerformance:testHighFrequencyDynamicLayoutUpdates()
|
|||||||
local sections = {}
|
local sections = {}
|
||||||
for i = 1, 8 do
|
for i = 1, 8 do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = 1180,
|
width = 1180,
|
||||||
h = 90,
|
height = 90,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -718,8 +718,8 @@ function TestPerformance:testHighFrequencyDynamicLayoutUpdates()
|
|||||||
-- Create dynamic items in each section
|
-- Create dynamic items in each section
|
||||||
for j = 1, 10 do
|
for j = 1, 10 do
|
||||||
local item = Gui.new({
|
local item = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 70,
|
height = 70,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -730,7 +730,7 @@ function TestPerformance:testHighFrequencyDynamicLayoutUpdates()
|
|||||||
|
|
||||||
-- Sub-items for more complex updates
|
-- Sub-items for more complex updates
|
||||||
for k = 1, 3 do
|
for k = 1, 3 do
|
||||||
local sub_item = Gui.new({ w = 80, h = 20 })
|
local sub_item = Gui.new({ width = 80, height = 20 })
|
||||||
sub_item.parent = item
|
sub_item.parent = item
|
||||||
table.insert(item.children, sub_item)
|
table.insert(item.children, sub_item)
|
||||||
end
|
end
|
||||||
@@ -821,8 +821,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
|
|
||||||
-- Create animation-heavy interface structure
|
-- Create animation-heavy interface structure
|
||||||
local animation_container = createTestContainer({
|
local animation_container = createTestContainer({
|
||||||
w = 1400,
|
width = 1400,
|
||||||
h = 900,
|
height = 900,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 15,
|
gap = 15,
|
||||||
})
|
})
|
||||||
@@ -832,8 +832,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
-- Create multiple animated sections with complex layouts
|
-- Create multiple animated sections with complex layouts
|
||||||
for section_id = 1, 6 do
|
for section_id = 1, 6 do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = 1380,
|
width = 1380,
|
||||||
h = 140,
|
height = 140,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_AROUND,
|
justifyContent = JustifyContent.SPACE_AROUND,
|
||||||
@@ -846,8 +846,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
-- Create animated cards/panels
|
-- Create animated cards/panels
|
||||||
for card_id = 1, 8 do
|
for card_id = 1, 8 do
|
||||||
local card = Gui.new({
|
local card = Gui.new({
|
||||||
w = 160,
|
width = 160,
|
||||||
h = 120,
|
height = 120,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -859,8 +859,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
|
|
||||||
-- Card header with animated elements
|
-- Card header with animated elements
|
||||||
local card_header = Gui.new({
|
local card_header = Gui.new({
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -870,18 +870,18 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
table.insert(card.children, card_header)
|
table.insert(card.children, card_header)
|
||||||
|
|
||||||
-- Animated header components
|
-- Animated header components
|
||||||
local title = Gui.new({ w = 100, h = 25 })
|
local title = Gui.new({ width = 100, height = 25 })
|
||||||
title.parent = card_header
|
title.parent = card_header
|
||||||
table.insert(card_header.children, title)
|
table.insert(card_header.children, title)
|
||||||
|
|
||||||
local status_indicator = Gui.new({ w = 20, h = 20 })
|
local status_indicator = Gui.new({ width = 20, height = 20 })
|
||||||
status_indicator.parent = card_header
|
status_indicator.parent = card_header
|
||||||
table.insert(card_header.children, status_indicator)
|
table.insert(card_header.children, status_indicator)
|
||||||
|
|
||||||
-- Card content with animated metrics
|
-- Card content with animated metrics
|
||||||
local card_content = Gui.new({
|
local card_content = Gui.new({
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -896,8 +896,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
local metric_count = 4 + (section_id % 3)
|
local metric_count = 4 + (section_id % 3)
|
||||||
for i = 1, metric_count do
|
for i = 1, metric_count do
|
||||||
local metric = Gui.new({
|
local metric = Gui.new({
|
||||||
w = 35,
|
width = 35,
|
||||||
h = 25,
|
height = 25,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
alignItems = AlignItems.CENTER,
|
alignItems = AlignItems.CENTER,
|
||||||
@@ -909,8 +909,8 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
|
|
||||||
-- Card footer with action buttons
|
-- Card footer with action buttons
|
||||||
local card_footer = Gui.new({
|
local card_footer = Gui.new({
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 25,
|
height = 25,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.FLEX_END,
|
justifyContent = JustifyContent.FLEX_END,
|
||||||
@@ -920,7 +920,7 @@ function TestPerformance:testComplexAnimationReadyLayoutPerformance()
|
|||||||
table.insert(card.children, card_footer)
|
table.insert(card.children, card_footer)
|
||||||
|
|
||||||
for i = 1, 2 do
|
for i = 1, 2 do
|
||||||
local action_btn = Gui.new({ w = 25, h = 20 })
|
local action_btn = Gui.new({ width = 25, height = 20 })
|
||||||
action_btn.parent = card_footer
|
action_btn.parent = card_footer
|
||||||
table.insert(card_footer.children, action_btn)
|
table.insert(card_footer.children, action_btn)
|
||||||
table.insert(animation_elements, action_btn)
|
table.insert(animation_elements, action_btn)
|
||||||
@@ -1024,8 +1024,8 @@ function TestPerformance:testMemoryIntensiveLayoutPerformanceWithCleanup()
|
|||||||
-- Create intensive layout structure
|
-- Create intensive layout structure
|
||||||
local cycle_start = os.clock()
|
local cycle_start = os.clock()
|
||||||
local root = createTestContainer({
|
local root = createTestContainer({
|
||||||
w = 1600,
|
width = 1600,
|
||||||
h = 1000,
|
height = 1000,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
gap = 8,
|
gap = 8,
|
||||||
})
|
})
|
||||||
@@ -1035,8 +1035,8 @@ function TestPerformance:testMemoryIntensiveLayoutPerformanceWithCleanup()
|
|||||||
-- Create memory-intensive nested structure
|
-- Create memory-intensive nested structure
|
||||||
for level1 = 1, 10 do
|
for level1 = 1, 10 do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = 1580,
|
width = 1580,
|
||||||
h = 95,
|
height = 95,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -1049,8 +1049,8 @@ function TestPerformance:testMemoryIntensiveLayoutPerformanceWithCleanup()
|
|||||||
|
|
||||||
for level2 = 1, 15 do
|
for level2 = 1, 15 do
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 85,
|
height = 85,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -1062,8 +1062,8 @@ function TestPerformance:testMemoryIntensiveLayoutPerformanceWithCleanup()
|
|||||||
|
|
||||||
for level3 = 1, 3 do
|
for level3 = 1, 3 do
|
||||||
local item = Gui.new({
|
local item = Gui.new({
|
||||||
w = 95,
|
width = 95,
|
||||||
h = 25,
|
height = 25,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.CENTER,
|
justifyContent = JustifyContent.CENTER,
|
||||||
@@ -1075,7 +1075,7 @@ function TestPerformance:testMemoryIntensiveLayoutPerformanceWithCleanup()
|
|||||||
|
|
||||||
-- Add some leaf nodes for memory pressure
|
-- Add some leaf nodes for memory pressure
|
||||||
for level4 = 1, 2 do
|
for level4 = 1, 2 do
|
||||||
local leaf = Gui.new({ w = 40, h = 20 })
|
local leaf = Gui.new({ width = 40, height = 20 })
|
||||||
leaf.parent = item
|
leaf.parent = item
|
||||||
table.insert(item.children, leaf)
|
table.insert(item.children, leaf)
|
||||||
table.insert(all_elements, leaf)
|
table.insert(all_elements, leaf)
|
||||||
@@ -1172,8 +1172,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
local test_time, test_metrics = measureTime(function()
|
local test_time, test_metrics = measureTime(function()
|
||||||
local root = createTestContainer({
|
local root = createTestContainer({
|
||||||
w = 2000,
|
width = 2000,
|
||||||
h = 1500,
|
height = 1500,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
gap = 5,
|
gap = 5,
|
||||||
@@ -1189,8 +1189,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
for row = 1, rows do
|
for row = 1, rows do
|
||||||
local row_container = Gui.new({
|
local row_container = Gui.new({
|
||||||
w = 1980,
|
width = 1980,
|
||||||
h = 25,
|
height = 25,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -1202,7 +1202,7 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
local items_in_this_row = math.min(items_per_row, test_config.elements - (row - 1) * items_per_row)
|
local items_in_this_row = math.min(items_per_row, test_config.elements - (row - 1) * items_per_row)
|
||||||
for col = 1, items_in_this_row do
|
for col = 1, items_in_this_row do
|
||||||
local item = Gui.new({ w = 35, h = 20 })
|
local item = Gui.new({ width = 35, height = 20 })
|
||||||
item.parent = row_container
|
item.parent = row_container
|
||||||
table.insert(row_container.children, item)
|
table.insert(row_container.children, item)
|
||||||
created_elements = created_elements + 1
|
created_elements = created_elements + 1
|
||||||
@@ -1216,8 +1216,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
for depth = 1, test_config.depth do
|
for depth = 1, test_config.depth do
|
||||||
local level_container = Gui.new({
|
local level_container = Gui.new({
|
||||||
w = 1900 - (depth * 50),
|
width = 1900 - (depth * 50),
|
||||||
h = 1400 - (depth * 100),
|
height = 1400 - (depth * 100),
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = (depth % 2 == 0) and FlexDirection.VERTICAL or FlexDirection.HORIZONTAL,
|
flexDirection = (depth % 2 == 0) and FlexDirection.VERTICAL or FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -1232,7 +1232,7 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
else
|
else
|
||||||
-- Final level - add many elements
|
-- Final level - add many elements
|
||||||
for i = 1, elements_per_level do
|
for i = 1, elements_per_level do
|
||||||
local leaf = Gui.new({ w = 30 + (i % 20), h = 25 + (i % 15) })
|
local leaf = Gui.new({ width = 30 + (i % 20), height = 25 + (i % 15) })
|
||||||
leaf.parent = level_container
|
leaf.parent = level_container
|
||||||
table.insert(level_container.children, leaf)
|
table.insert(level_container.children, leaf)
|
||||||
created_elements = created_elements + 1
|
created_elements = created_elements + 1
|
||||||
@@ -1252,8 +1252,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
for i = 1, children_count do
|
for i = 1, children_count do
|
||||||
local branch = Gui.new({
|
local branch = Gui.new({
|
||||||
w = 150 - (current_depth * 15),
|
width = 150 - (current_depth * 15),
|
||||||
h = 100 - (current_depth * 10),
|
height = 100 - (current_depth * 10),
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = (i % 2 == 0) and FlexDirection.VERTICAL or FlexDirection.HORIZONTAL,
|
flexDirection = (i % 2 == 0) and FlexDirection.VERTICAL or FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_AROUND,
|
justifyContent = JustifyContent.SPACE_AROUND,
|
||||||
@@ -1285,8 +1285,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
|
|
||||||
for section_id = 1, sections do
|
for section_id = 1, sections do
|
||||||
local section = Gui.new({
|
local section = Gui.new({
|
||||||
w = 1900,
|
width = 1900,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
flexWrap = FlexWrap.WRAP,
|
flexWrap = FlexWrap.WRAP,
|
||||||
@@ -1301,8 +1301,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
local subsections = 5 + (section_id % 3)
|
local subsections = 5 + (section_id % 3)
|
||||||
for sub_id = 1, subsections do
|
for sub_id = 1, subsections do
|
||||||
local subsection = Gui.new({
|
local subsection = Gui.new({
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 180,
|
height = 180,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
justifyContent = JustifyContent.SPACE_AROUND,
|
justifyContent = JustifyContent.SPACE_AROUND,
|
||||||
@@ -1318,8 +1318,8 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
if elem_id % 3 == 0 then
|
if elem_id % 3 == 0 then
|
||||||
-- Complex element with children
|
-- Complex element with children
|
||||||
local complex_elem = Gui.new({
|
local complex_elem = Gui.new({
|
||||||
w = 280,
|
width = 280,
|
||||||
h = 35,
|
height = 35,
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
justifyContent = JustifyContent.SPACE_BETWEEN,
|
justifyContent = JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -1330,14 +1330,14 @@ function TestPerformance:testExtremeScalePerformanceBenchmark()
|
|||||||
created_elements = created_elements + 1
|
created_elements = created_elements + 1
|
||||||
|
|
||||||
for child_id = 1, 4 do
|
for child_id = 1, 4 do
|
||||||
local child = Gui.new({ w = 60, h = 30 })
|
local child = Gui.new({ width = 60, height = 30 })
|
||||||
child.parent = complex_elem
|
child.parent = complex_elem
|
||||||
table.insert(complex_elem.children, child)
|
table.insert(complex_elem.children, child)
|
||||||
created_elements = created_elements + 1
|
created_elements = created_elements + 1
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Simple element
|
-- Simple element
|
||||||
local simple_elem = Gui.new({ w = 270, h = 25 })
|
local simple_elem = Gui.new({ width = 270, height = 25 })
|
||||||
simple_elem.parent = subsection
|
simple_elem.parent = subsection
|
||||||
table.insert(subsection.children, simple_elem)
|
table.insert(subsection.children, simple_elem)
|
||||||
created_elements = created_elements + 1
|
created_elements = created_elements + 1
|
||||||
|
|||||||
@@ -144,14 +144,14 @@ function TestAuxiliaryFunctions:testCalculateAutoWidthWithChildren()
|
|||||||
|
|
||||||
local child1 = Gui.new({
|
local child1 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
})
|
})
|
||||||
|
|
||||||
local width = parent:calculateAutoWidth()
|
local width = parent:calculateAutoWidth()
|
||||||
@@ -176,14 +176,14 @@ function TestAuxiliaryFunctions:testCalculateAutoHeightWithChildren()
|
|||||||
|
|
||||||
local child1 = Gui.new({
|
local child1 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
})
|
})
|
||||||
|
|
||||||
local height = parent:calculateAutoHeight()
|
local height = parent:calculateAutoHeight()
|
||||||
@@ -198,8 +198,8 @@ function TestAuxiliaryFunctions:testGetBounds()
|
|||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 80,
|
height = 80,
|
||||||
})
|
})
|
||||||
|
|
||||||
local bounds = element:getBounds()
|
local bounds = element:getBounds()
|
||||||
@@ -212,8 +212,8 @@ end
|
|||||||
function TestAuxiliaryFunctions:testUpdateText()
|
function TestAuxiliaryFunctions:testUpdateText()
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
text = "Original Text",
|
text = "Original Text",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
element:updateText("New Text")
|
element:updateText("New Text")
|
||||||
@@ -327,8 +327,8 @@ end
|
|||||||
|
|
||||||
function TestAuxiliaryFunctions:testAnimationApplyToElement()
|
function TestAuxiliaryFunctions:testAnimationApplyToElement()
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
local fadeAnim = Gui.Animation.fade(1.0, 1.0, 0.0)
|
local fadeAnim = Gui.Animation.fade(1.0, 1.0, 0.0)
|
||||||
@@ -339,8 +339,8 @@ end
|
|||||||
|
|
||||||
function TestAuxiliaryFunctions:testAnimationReplaceExisting()
|
function TestAuxiliaryFunctions:testAnimationReplaceExisting()
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
local fadeAnim1 = Gui.Animation.fade(1.0, 1.0, 0.0)
|
local fadeAnim1 = Gui.Animation.fade(1.0, 1.0, 0.0)
|
||||||
@@ -366,15 +366,15 @@ function TestAuxiliaryFunctions:testGuiDestroyWithElements()
|
|||||||
local element1 = Gui.new({
|
local element1 = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
local element2 = Gui.new({
|
local element2 = Gui.new({
|
||||||
x = 20,
|
x = 20,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 80,
|
width = 80,
|
||||||
h = 40,
|
height = 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(#Gui.topElements, 2)
|
luaunit.assertEquals(#Gui.topElements, 2)
|
||||||
@@ -385,20 +385,20 @@ end
|
|||||||
|
|
||||||
function TestAuxiliaryFunctions:testGuiDestroyWithNestedElements()
|
function TestAuxiliaryFunctions:testGuiDestroyWithNestedElements()
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child1 = Gui.new({
|
local child1 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 25,
|
height = 25,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(#Gui.topElements, 1)
|
luaunit.assertEquals(#Gui.topElements, 1)
|
||||||
@@ -410,14 +410,14 @@ end
|
|||||||
|
|
||||||
function TestAuxiliaryFunctions:testElementDestroyRemovesFromParent()
|
function TestAuxiliaryFunctions:testElementDestroyRemovesFromParent()
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(#parent.children, 1)
|
luaunit.assertEquals(#parent.children, 1)
|
||||||
@@ -432,8 +432,8 @@ function TestAuxiliaryFunctions:testElementDestroyRemovesFromTopElements()
|
|||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 10,
|
y = 10,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(#Gui.topElements, 1)
|
luaunit.assertEquals(#Gui.topElements, 1)
|
||||||
@@ -445,20 +445,20 @@ end
|
|||||||
|
|
||||||
function TestAuxiliaryFunctions:testElementDestroyNestedChildren()
|
function TestAuxiliaryFunctions:testElementDestroyNestedChildren()
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 75,
|
height = 75,
|
||||||
})
|
})
|
||||||
|
|
||||||
local grandchild = Gui.new({
|
local grandchild = Gui.new({
|
||||||
parent = child,
|
parent = child,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 30,
|
height = 30,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(#parent.children, 1)
|
luaunit.assertEquals(#parent.children, 1)
|
||||||
@@ -629,8 +629,8 @@ function TestAuxiliaryFunctions:testComplexColorManagementSystem()
|
|||||||
|
|
||||||
-- Test color application to complex UI structure
|
-- Test color application to complex UI structure
|
||||||
local ui_container = Gui.new({
|
local ui_container = Gui.new({
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 600,
|
height = 600,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.VERTICAL,
|
flexDirection = enums.FlexDirection.VERTICAL,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
@@ -640,8 +640,8 @@ function TestAuxiliaryFunctions:testComplexColorManagementSystem()
|
|||||||
local component_types = { "header", "content", "sidebar", "footer", "modal" }
|
local component_types = { "header", "content", "sidebar", "footer", "modal" }
|
||||||
for i, comp_type in ipairs(component_types) do
|
for i, comp_type in ipairs(component_types) do
|
||||||
local component = Gui.new({
|
local component = Gui.new({
|
||||||
w = 780,
|
width = 780,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
justifyContent = enums.JustifyContent.SPACE_BETWEEN,
|
justifyContent = enums.JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -659,8 +659,8 @@ function TestAuxiliaryFunctions:testComplexColorManagementSystem()
|
|||||||
-- Add sub-components with color variations
|
-- Add sub-components with color variations
|
||||||
for j = 1, 4 do
|
for j = 1, 4 do
|
||||||
local sub_component = Gui.new({
|
local sub_component = Gui.new({
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 80,
|
height = 80,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
justifyContent = enums.JustifyContent.CENTER,
|
justifyContent = enums.JustifyContent.CENTER,
|
||||||
alignItems = enums.AlignItems.CENTER,
|
alignItems = enums.AlignItems.CENTER,
|
||||||
@@ -748,8 +748,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
|
|
||||||
-- Create dynamic text containers with auto-sizing
|
-- Create dynamic text containers with auto-sizing
|
||||||
local main_container = Gui.new({
|
local main_container = Gui.new({
|
||||||
w = 1000,
|
width = 1000,
|
||||||
h = 800,
|
height = 800,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.VERTICAL,
|
flexDirection = enums.FlexDirection.VERTICAL,
|
||||||
gap = 15,
|
gap = 15,
|
||||||
@@ -757,8 +757,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
|
|
||||||
for _, scenario in ipairs(text_scenarios) do
|
for _, scenario in ipairs(text_scenarios) do
|
||||||
local text_container = Gui.new({
|
local text_container = Gui.new({
|
||||||
w = 900,
|
width = 900,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
justifyContent = enums.JustifyContent.SPACE_BETWEEN,
|
justifyContent = enums.JustifyContent.SPACE_BETWEEN,
|
||||||
@@ -772,8 +772,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
local text_element = Gui.new({
|
local text_element = Gui.new({
|
||||||
text = scenario.content,
|
text = scenario.content,
|
||||||
textSize = scenario.size,
|
textSize = scenario.size,
|
||||||
w = 0,
|
width = 0,
|
||||||
h = 0, -- Start with zero size for auto-sizing
|
height = 0, -- Start with zero size for auto-sizing
|
||||||
})
|
})
|
||||||
text_element.parent = text_container
|
text_element.parent = text_container
|
||||||
table.insert(text_container.children, text_element)
|
table.insert(text_container.children, text_element)
|
||||||
@@ -820,8 +820,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
local fixed_element = Gui.new({
|
local fixed_element = Gui.new({
|
||||||
text = scenario.content,
|
text = scenario.content,
|
||||||
textSize = scenario.size,
|
textSize = scenario.size,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 50, -- Fixed size
|
height = 50, -- Fixed size
|
||||||
})
|
})
|
||||||
fixed_element.parent = text_container
|
fixed_element.parent = text_container
|
||||||
table.insert(text_container.children, fixed_element)
|
table.insert(text_container.children, fixed_element)
|
||||||
@@ -830,8 +830,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
local adaptive_element = Gui.new({
|
local adaptive_element = Gui.new({
|
||||||
text = scenario.content,
|
text = scenario.content,
|
||||||
textSize = scenario.size,
|
textSize = scenario.size,
|
||||||
w = math.max(150, auto_width * 0.8),
|
width = math.max(150, auto_width * 0.8),
|
||||||
h = math.max(30, auto_height * 1.2),
|
height = math.max(30, auto_height * 1.2),
|
||||||
})
|
})
|
||||||
adaptive_element.parent = text_container
|
adaptive_element.parent = text_container
|
||||||
table.insert(text_container.children, adaptive_element)
|
table.insert(text_container.children, adaptive_element)
|
||||||
@@ -892,8 +892,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
|
|
||||||
-- Test complex auto-sizing with nested structures
|
-- Test complex auto-sizing with nested structures
|
||||||
local nested_container = Gui.new({
|
local nested_container = Gui.new({
|
||||||
w = 800,
|
width = 800,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.VERTICAL,
|
flexDirection = enums.FlexDirection.VERTICAL,
|
||||||
gap = 10,
|
gap = 10,
|
||||||
@@ -904,8 +904,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
-- Create nested structure with auto-sizing children
|
-- Create nested structure with auto-sizing children
|
||||||
for level = 1, 3 do
|
for level = 1, 3 do
|
||||||
local level_container = Gui.new({
|
local level_container = Gui.new({
|
||||||
w = 750 - (level * 50),
|
width = 750 - (level * 50),
|
||||||
h = 60,
|
height = 60,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
justifyContent = enums.JustifyContent.SPACE_AROUND,
|
justifyContent = enums.JustifyContent.SPACE_AROUND,
|
||||||
@@ -923,8 +923,8 @@ function TestAuxiliaryFunctions:testAdvancedTextAndAutoSizingSystem()
|
|||||||
local text_item = Gui.new({
|
local text_item = Gui.new({
|
||||||
text = item_text,
|
text = item_text,
|
||||||
textSize = 14 - level,
|
textSize = 14 - level,
|
||||||
w = 0,
|
width = 0,
|
||||||
h = 0,
|
height = 0,
|
||||||
})
|
})
|
||||||
text_item.parent = level_container
|
text_item.parent = level_container
|
||||||
table.insert(level_container.children, text_item)
|
table.insert(level_container.children, text_item)
|
||||||
@@ -972,8 +972,8 @@ function TestAuxiliaryFunctions:testComprehensiveAnimationEngine()
|
|||||||
|
|
||||||
-- Create container for animated elements
|
-- Create container for animated elements
|
||||||
local animation_container = Gui.new({
|
local animation_container = Gui.new({
|
||||||
w = 1200,
|
width = 1200,
|
||||||
h = 800,
|
height = 800,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.VERTICAL,
|
flexDirection = enums.FlexDirection.VERTICAL,
|
||||||
gap = 20,
|
gap = 20,
|
||||||
@@ -1014,8 +1014,8 @@ function TestAuxiliaryFunctions:testComprehensiveAnimationEngine()
|
|||||||
-- Create and configure animations for each test case
|
-- Create and configure animations for each test case
|
||||||
for case_idx, test_case in ipairs(animation_test_cases) do
|
for case_idx, test_case in ipairs(animation_test_cases) do
|
||||||
local case_container = Gui.new({
|
local case_container = Gui.new({
|
||||||
w = 1180,
|
width = 1180,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
flexWrap = enums.FlexWrap.WRAP,
|
flexWrap = enums.FlexWrap.WRAP,
|
||||||
@@ -1029,8 +1029,8 @@ function TestAuxiliaryFunctions:testComprehensiveAnimationEngine()
|
|||||||
|
|
||||||
for elem_idx = 1, test_case.elements do
|
for elem_idx = 1, test_case.elements do
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = test_case.properties.width and test_case.properties.width.from or 120,
|
width = test_case.properties.width and test_case.properties.width.from or 120,
|
||||||
h = test_case.properties.height and test_case.properties.height.from or 60,
|
height = test_case.properties.height and test_case.properties.height.from or 60,
|
||||||
opacity = test_case.properties.opacity and test_case.properties.opacity.from or 1.0,
|
opacity = test_case.properties.opacity and test_case.properties.opacity.from or 1.0,
|
||||||
})
|
})
|
||||||
element.parent = case_container
|
element.parent = case_container
|
||||||
@@ -1216,7 +1216,7 @@ function TestAuxiliaryFunctions:testComprehensiveAnimationEngine()
|
|||||||
)
|
)
|
||||||
|
|
||||||
-- Test animation chaining and sequencing
|
-- Test animation chaining and sequencing
|
||||||
local chain_element = Gui.new({ w = 100, h = 50, opacity = 1.0 })
|
local chain_element = Gui.new({ width = 100, height = 50, opacity = 1.0 })
|
||||||
chain_element.parent = animation_container
|
chain_element.parent = animation_container
|
||||||
table.insert(animation_container.children, chain_element)
|
table.insert(animation_container.children, chain_element)
|
||||||
|
|
||||||
@@ -1402,8 +1402,8 @@ function TestAuxiliaryFunctions:testAdvancedGUIManagementAndCleanup()
|
|||||||
|
|
||||||
for _, item in ipairs(structure) do
|
for _, item in ipairs(structure) do
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = math.max(100, 300 - level * 20),
|
width = math.max(100, 300 - level * 20),
|
||||||
h = math.max(30, 80 - level * 5),
|
height = math.max(30, 80 - level * 5),
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = level % 2 == 0 and enums.FlexDirection.HORIZONTAL or enums.FlexDirection.VERTICAL,
|
flexDirection = level % 2 == 0 and enums.FlexDirection.HORIZONTAL or enums.FlexDirection.VERTICAL,
|
||||||
justifyContent = enums.JustifyContent.FLEX_START,
|
justifyContent = enums.JustifyContent.FLEX_START,
|
||||||
@@ -1574,8 +1574,8 @@ function TestAuxiliaryFunctions:testAdvancedGUIManagementAndCleanup()
|
|||||||
|
|
||||||
-- Test complex element retrieval and manipulation
|
-- Test complex element retrieval and manipulation
|
||||||
local final_container = Gui.new({
|
local final_container = Gui.new({
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.VERTICAL,
|
flexDirection = enums.FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -1584,8 +1584,8 @@ function TestAuxiliaryFunctions:testAdvancedGUIManagementAndCleanup()
|
|||||||
local managed_elements = {}
|
local managed_elements = {}
|
||||||
for i = 1, 10 do
|
for i = 1, 10 do
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
w = 350,
|
width = 350,
|
||||||
h = 25,
|
height = 25,
|
||||||
text = "Managed Element " .. i,
|
text = "Managed Element " .. i,
|
||||||
textSize = 12,
|
textSize = 12,
|
||||||
})
|
})
|
||||||
@@ -1729,8 +1729,8 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
text = test.text,
|
text = test.text,
|
||||||
textSize = 14,
|
textSize = 14,
|
||||||
w = 0,
|
width = 0,
|
||||||
h = 0,
|
height = 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
local text_width = element:calculateTextWidth()
|
local text_width = element:calculateTextWidth()
|
||||||
@@ -1794,14 +1794,14 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
|
|
||||||
-- Extreme hierarchy testing
|
-- Extreme hierarchy testing
|
||||||
local max_depth = 20
|
local max_depth = 20
|
||||||
local extreme_hierarchy_element = Gui.new({ w = 1000, h = 800 })
|
local extreme_hierarchy_element = Gui.new({ width = 1000, height = 800 })
|
||||||
local current_parent = extreme_hierarchy_element
|
local current_parent = extreme_hierarchy_element
|
||||||
|
|
||||||
-- Create extremely deep hierarchy
|
-- Create extremely deep hierarchy
|
||||||
for depth = 1, max_depth do
|
for depth = 1, max_depth do
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
w = math.max(50, 1000 - depth * 45),
|
width = math.max(50, 1000 - depth * 45),
|
||||||
h = math.max(30, 800 - depth * 35),
|
height = math.max(30, 800 - depth * 35),
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = depth % 2 == 0 and enums.FlexDirection.HORIZONTAL or enums.FlexDirection.VERTICAL,
|
flexDirection = depth % 2 == 0 and enums.FlexDirection.HORIZONTAL or enums.FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
@@ -1828,8 +1828,8 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
|
|
||||||
-- Test extreme width hierarchy (many siblings)
|
-- Test extreme width hierarchy (many siblings)
|
||||||
local wide_container = Gui.new({
|
local wide_container = Gui.new({
|
||||||
w = 2000,
|
width = 2000,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = enums.Positioning.FLEX,
|
positioning = enums.Positioning.FLEX,
|
||||||
flexDirection = enums.FlexDirection.HORIZONTAL,
|
flexDirection = enums.FlexDirection.HORIZONTAL,
|
||||||
flexWrap = enums.FlexWrap.WRAP,
|
flexWrap = enums.FlexWrap.WRAP,
|
||||||
@@ -1838,7 +1838,7 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
|
|
||||||
local max_siblings = 500
|
local max_siblings = 500
|
||||||
for i = 1, max_siblings do
|
for i = 1, max_siblings do
|
||||||
local sibling = Gui.new({ w = 30, h = 25 })
|
local sibling = Gui.new({ width = 30, height = 25 })
|
||||||
sibling.parent = wide_container
|
sibling.parent = wide_container
|
||||||
table.insert(wide_container.children, sibling)
|
table.insert(wide_container.children, sibling)
|
||||||
end
|
end
|
||||||
@@ -1861,7 +1861,7 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
-- Test massive cleanup operations
|
-- Test massive cleanup operations
|
||||||
local cleanup_elements = {}
|
local cleanup_elements = {}
|
||||||
for i = 1, 1000 do
|
for i = 1, 1000 do
|
||||||
local element = Gui.new({ w = 50, h = 30 })
|
local element = Gui.new({ width = 50, height = 30 })
|
||||||
table.insert(cleanup_elements, element)
|
table.insert(cleanup_elements, element)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1882,7 +1882,7 @@ function TestAuxiliaryFunctions:testExtremeEdgeCasesAndErrorResilience()
|
|||||||
luaunit.assertEquals(#Gui.topElements, 0, "All elements should be cleaned up")
|
luaunit.assertEquals(#Gui.topElements, 0, "All elements should be cleaned up")
|
||||||
|
|
||||||
-- Test opacity boundary resilience
|
-- Test opacity boundary resilience
|
||||||
local opacity_element = Gui.new({ w = 100, h = 50, opacity = 0.5 })
|
local opacity_element = Gui.new({ width = 100, height = 50, opacity = 0.5 })
|
||||||
local extreme_opacities = { -999, -1, 0, 0.5, 1, 2, 999, math.huge, -math.huge }
|
local extreme_opacities = { -999, -1, 0, 0.5, 1, 2, 999, math.huge, -math.huge }
|
||||||
|
|
||||||
for _, opacity in ipairs(extreme_opacities) do
|
for _, opacity in ipairs(extreme_opacities) do
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ function TestUnitsSystem:setUp()
|
|||||||
-- Clear any existing GUI elements and reset viewport
|
-- Clear any existing GUI elements and reset viewport
|
||||||
Gui.destroy()
|
Gui.destroy()
|
||||||
-- Set a consistent viewport size for testing
|
-- Set a consistent viewport size for testing
|
||||||
love.graphics.getDimensions = function() return 1200, 800 end
|
love.graphics.getDimensions = function()
|
||||||
|
return 1200, 800
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function TestUnitsSystem:tearDown()
|
function TestUnitsSystem:tearDown()
|
||||||
@@ -30,12 +32,12 @@ function TestUnitsSystem:testUnitsParsePx()
|
|||||||
-- Test pixel unit parsing
|
-- Test pixel unit parsing
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "100px",
|
width = "100px",
|
||||||
h = "200px",
|
height = "200px",
|
||||||
x = "50px",
|
x = "50px",
|
||||||
y = "75px",
|
y = "75px",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 100)
|
luaunit.assertEquals(container.width, 100)
|
||||||
luaunit.assertEquals(container.height, 200)
|
luaunit.assertEquals(container.height, 200)
|
||||||
luaunit.assertEquals(container.x, 50)
|
luaunit.assertEquals(container.x, 50)
|
||||||
@@ -50,19 +52,19 @@ function TestUnitsSystem:testUnitsParsePercentage()
|
|||||||
-- Test percentage unit parsing
|
-- Test percentage unit parsing
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
id = "parent",
|
id = "parent",
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
w = "50%",
|
width = "50%",
|
||||||
h = "25%",
|
height = "25%",
|
||||||
parent = parent,
|
parent = parent,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(child.width, 200) -- 50% of 400
|
luaunit.assertEquals(child.width, 200) -- 50% of 400
|
||||||
luaunit.assertEquals(child.height, 75) -- 25% of 300
|
luaunit.assertEquals(child.height, 75) -- 25% of 300
|
||||||
luaunit.assertEquals(child.units.width.unit, "%")
|
luaunit.assertEquals(child.units.width.unit, "%")
|
||||||
luaunit.assertEquals(child.units.height.unit, "%")
|
luaunit.assertEquals(child.units.height.unit, "%")
|
||||||
luaunit.assertEquals(child.units.width.value, 50)
|
luaunit.assertEquals(child.units.width.value, 50)
|
||||||
@@ -73,10 +75,10 @@ function TestUnitsSystem:testUnitsParseViewportWidth()
|
|||||||
-- Test viewport width units (1200px viewport)
|
-- Test viewport width units (1200px viewport)
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "50vw",
|
width = "50vw",
|
||||||
h = "100px",
|
height = "100px",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 600) -- 50% of 1200
|
luaunit.assertEquals(container.width, 600) -- 50% of 1200
|
||||||
luaunit.assertEquals(container.units.width.unit, "vw")
|
luaunit.assertEquals(container.units.width.unit, "vw")
|
||||||
luaunit.assertEquals(container.units.width.value, 50)
|
luaunit.assertEquals(container.units.width.value, 50)
|
||||||
@@ -86,10 +88,10 @@ function TestUnitsSystem:testUnitsParseViewportHeight()
|
|||||||
-- Test viewport height units (800px viewport)
|
-- Test viewport height units (800px viewport)
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "100px",
|
width = "100px",
|
||||||
h = "25vh",
|
height = "25vh",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.height, 200) -- 25% of 800
|
luaunit.assertEquals(container.height, 200) -- 25% of 800
|
||||||
luaunit.assertEquals(container.units.height.unit, "vh")
|
luaunit.assertEquals(container.units.height.unit, "vh")
|
||||||
luaunit.assertEquals(container.units.height.value, 25)
|
luaunit.assertEquals(container.units.height.value, 25)
|
||||||
@@ -102,7 +104,7 @@ function TestUnitsSystem:testUnitsAutoSizing()
|
|||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(autoContainer.units.width.unit, "auto")
|
luaunit.assertEquals(autoContainer.units.width.unit, "auto")
|
||||||
luaunit.assertEquals(autoContainer.units.height.unit, "auto")
|
luaunit.assertEquals(autoContainer.units.height.unit, "auto")
|
||||||
luaunit.assertTrue(autoContainer.autosizing.width)
|
luaunit.assertTrue(autoContainer.autosizing.width)
|
||||||
@@ -113,19 +115,19 @@ function TestUnitsSystem:testMixedUnits()
|
|||||||
-- Test elements with different unit types
|
-- Test elements with different unit types
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "80vw", -- viewport width
|
width = "80vw", -- viewport width
|
||||||
h = "400px", -- pixels
|
height = "400px", -- pixels
|
||||||
x = "10%", -- percentage of viewport
|
x = "10%", -- percentage of viewport
|
||||||
y = "5vh", -- viewport height
|
y = "5vh", -- viewport height
|
||||||
gap = "2vw", -- viewport width for gap
|
gap = "2vw", -- viewport width for gap
|
||||||
textSize = "16px" -- pixel font size
|
textSize = "16px", -- pixel font size
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 960) -- 80% of 1200
|
luaunit.assertEquals(container.width, 960) -- 80% of 1200
|
||||||
luaunit.assertEquals(container.height, 400) -- 400px
|
luaunit.assertEquals(container.height, 400) -- 400px
|
||||||
luaunit.assertEquals(container.x, 120) -- 10% of 1200
|
luaunit.assertEquals(container.x, 120) -- 10% of 1200
|
||||||
luaunit.assertEquals(container.y, 40) -- 5% of 800
|
luaunit.assertEquals(container.y, 40) -- 5% of 800
|
||||||
luaunit.assertEquals(container.gap, 24) -- 2% of 1200
|
luaunit.assertEquals(container.gap, 24) -- 2% of 1200
|
||||||
luaunit.assertEquals(container.textSize, 16) -- 16px
|
luaunit.assertEquals(container.textSize, 16) -- 16px
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -137,18 +139,20 @@ function TestUnitsSystem:testResizeViewportUnits()
|
|||||||
-- Test that viewport units recalculate on resize
|
-- Test that viewport units recalculate on resize
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "50vw",
|
width = "50vw",
|
||||||
h = "25vh",
|
height = "25vh",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 600) -- 50% of 1200
|
luaunit.assertEquals(container.width, 600) -- 50% of 1200
|
||||||
luaunit.assertEquals(container.height, 200) -- 25% of 800
|
luaunit.assertEquals(container.height, 200) -- 25% of 800
|
||||||
|
|
||||||
-- Simulate viewport resize
|
-- Simulate viewport resize
|
||||||
love.graphics.getDimensions = function() return 1600, 1000 end
|
love.graphics.getDimensions = function()
|
||||||
|
return 1600, 1000
|
||||||
|
end
|
||||||
container:resize(1600, 1000)
|
container:resize(1600, 1000)
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 800) -- 50% of 1600
|
luaunit.assertEquals(container.width, 800) -- 50% of 1600
|
||||||
luaunit.assertEquals(container.height, 250) -- 25% of 1000
|
luaunit.assertEquals(container.height, 250) -- 25% of 1000
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -156,43 +160,43 @@ function TestUnitsSystem:testResizePercentageUnits()
|
|||||||
-- Test percentage units during parent resize
|
-- Test percentage units during parent resize
|
||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
id = "parent",
|
id = "parent",
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
id = "child",
|
id = "child",
|
||||||
w = "75%",
|
width = "75%",
|
||||||
h = "50%",
|
height = "50%",
|
||||||
parent = parent,
|
parent = parent,
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(child.width, 300) -- 75% of 400
|
luaunit.assertEquals(child.width, 300) -- 75% of 400
|
||||||
luaunit.assertEquals(child.height, 150) -- 50% of 300
|
luaunit.assertEquals(child.height, 150) -- 50% of 300
|
||||||
|
|
||||||
-- Resize parent
|
-- Resize parent
|
||||||
parent.width = 600
|
parent.width = 600
|
||||||
parent.height = 500
|
parent.height = 500
|
||||||
child:resize(1200, 800)
|
child:resize(1200, 800)
|
||||||
|
|
||||||
luaunit.assertEquals(child.width, 450) -- 75% of 600
|
luaunit.assertEquals(child.width, 450) -- 75% of 600
|
||||||
luaunit.assertEquals(child.height, 250) -- 50% of 500
|
luaunit.assertEquals(child.height, 250) -- 50% of 500
|
||||||
end
|
end
|
||||||
|
|
||||||
function TestUnitsSystem:testResizePixelUnitsNoChange()
|
function TestUnitsSystem:testResizePixelUnitsNoChange()
|
||||||
-- Test that pixel units don't change during resize
|
-- Test that pixel units don't change during resize
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "300px",
|
width = "300px",
|
||||||
h = "200px",
|
height = "200px",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 300)
|
luaunit.assertEquals(container.width, 300)
|
||||||
luaunit.assertEquals(container.height, 200)
|
luaunit.assertEquals(container.height, 200)
|
||||||
|
|
||||||
-- Resize viewport - pixel values should stay the same
|
-- Resize viewport - pixel values should stay the same
|
||||||
container:resize(1600, 1000)
|
container:resize(1600, 1000)
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 300)
|
luaunit.assertEquals(container.width, 300)
|
||||||
luaunit.assertEquals(container.height, 200)
|
luaunit.assertEquals(container.height, 200)
|
||||||
end
|
end
|
||||||
@@ -205,21 +209,21 @@ function TestUnitsSystem:testPaddingUnits()
|
|||||||
-- Test different unit types for padding
|
-- Test different unit types for padding
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
padding = {
|
padding = {
|
||||||
top = "10px",
|
top = "10px",
|
||||||
right = "5%",
|
right = "5%",
|
||||||
bottom = "2vh",
|
bottom = "2vh",
|
||||||
left = "1vw"
|
left = "1vw",
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.padding.top, 10) -- 10px
|
luaunit.assertEquals(container.padding.top, 10) -- 10px
|
||||||
luaunit.assertEquals(container.padding.right, 20) -- 5% of 400
|
luaunit.assertEquals(container.padding.right, 20) -- 5% of 400
|
||||||
luaunit.assertEquals(container.padding.bottom, 16) -- 2% of 800
|
luaunit.assertEquals(container.padding.bottom, 16) -- 2% of 800
|
||||||
luaunit.assertEquals(container.padding.left, 12) -- 1% of 1200
|
luaunit.assertEquals(container.padding.left, 12) -- 1% of 1200
|
||||||
|
|
||||||
luaunit.assertEquals(container.units.padding.top.unit, "px")
|
luaunit.assertEquals(container.units.padding.top.unit, "px")
|
||||||
luaunit.assertEquals(container.units.padding.right.unit, "%")
|
luaunit.assertEquals(container.units.padding.right.unit, "%")
|
||||||
luaunit.assertEquals(container.units.padding.bottom.unit, "vh")
|
luaunit.assertEquals(container.units.padding.bottom.unit, "vh")
|
||||||
@@ -230,21 +234,21 @@ function TestUnitsSystem:testMarginUnits()
|
|||||||
-- Test different unit types for margin
|
-- Test different unit types for margin
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
margin = {
|
margin = {
|
||||||
top = "8px",
|
top = "8px",
|
||||||
right = "3%",
|
right = "3%",
|
||||||
bottom = "1vh",
|
bottom = "1vh",
|
||||||
left = "2vw"
|
left = "2vw",
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.margin.top, 8) -- 8px
|
luaunit.assertEquals(container.margin.top, 8) -- 8px
|
||||||
luaunit.assertEquals(container.margin.right, 12) -- 3% of 400
|
luaunit.assertEquals(container.margin.right, 12) -- 3% of 400
|
||||||
luaunit.assertEquals(container.margin.bottom, 8) -- 1% of 800
|
luaunit.assertEquals(container.margin.bottom, 8) -- 1% of 800
|
||||||
luaunit.assertEquals(container.margin.left, 24) -- 2% of 1200
|
luaunit.assertEquals(container.margin.left, 24) -- 2% of 1200
|
||||||
|
|
||||||
luaunit.assertEquals(container.units.margin.top.unit, "px")
|
luaunit.assertEquals(container.units.margin.top.unit, "px")
|
||||||
luaunit.assertEquals(container.units.margin.right.unit, "%")
|
luaunit.assertEquals(container.units.margin.right.unit, "%")
|
||||||
luaunit.assertEquals(container.units.margin.bottom.unit, "vh")
|
luaunit.assertEquals(container.units.margin.bottom.unit, "vh")
|
||||||
@@ -261,25 +265,25 @@ function TestUnitsSystem:testGapUnits()
|
|||||||
id = "flexContainer",
|
id = "flexContainer",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
flexDirection = FlexDirection.HORIZONTAL,
|
||||||
w = 600,
|
width = 600,
|
||||||
h = 400,
|
height = 400,
|
||||||
gap = "2%", -- 2% of container width
|
gap = "2%", -- 2% of container width
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(flexContainer.gap, 12) -- 2% of 600
|
luaunit.assertEquals(flexContainer.gap, 12) -- 2% of 600
|
||||||
luaunit.assertEquals(flexContainer.units.gap.unit, "%")
|
luaunit.assertEquals(flexContainer.units.gap.unit, "%")
|
||||||
luaunit.assertEquals(flexContainer.units.gap.value, 2)
|
luaunit.assertEquals(flexContainer.units.gap.value, 2)
|
||||||
|
|
||||||
-- Test with viewport units
|
-- Test with viewport units
|
||||||
local viewportGapContainer = Gui.new({
|
local viewportGapContainer = Gui.new({
|
||||||
id = "viewportGapContainer",
|
id = "viewportGapContainer",
|
||||||
positioning = Positioning.FLEX,
|
positioning = Positioning.FLEX,
|
||||||
flexDirection = FlexDirection.VERTICAL,
|
flexDirection = FlexDirection.VERTICAL,
|
||||||
w = 400,
|
width = 400,
|
||||||
h = 300,
|
height = 300,
|
||||||
gap = "1vw",
|
gap = "1vw",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(viewportGapContainer.gap, 12) -- 1% of 1200 viewport width
|
luaunit.assertEquals(viewportGapContainer.gap, 12) -- 1% of 1200 viewport width
|
||||||
luaunit.assertEquals(viewportGapContainer.units.gap.unit, "vw")
|
luaunit.assertEquals(viewportGapContainer.units.gap.unit, "vw")
|
||||||
end
|
end
|
||||||
@@ -288,23 +292,23 @@ function TestUnitsSystem:testTextSizeUnits()
|
|||||||
-- Test textSize with different units
|
-- Test textSize with different units
|
||||||
local textElement = Gui.new({
|
local textElement = Gui.new({
|
||||||
id = "textElement",
|
id = "textElement",
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
textSize = "16px"
|
textSize = "16px",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(textElement.textSize, 16)
|
luaunit.assertEquals(textElement.textSize, 16)
|
||||||
luaunit.assertEquals(textElement.units.textSize.unit, "px")
|
luaunit.assertEquals(textElement.units.textSize.unit, "px")
|
||||||
luaunit.assertEquals(textElement.units.textSize.value, 16)
|
luaunit.assertEquals(textElement.units.textSize.value, 16)
|
||||||
|
|
||||||
-- Test with viewport units
|
-- Test with viewport units
|
||||||
local viewportTextElement = Gui.new({
|
local viewportTextElement = Gui.new({
|
||||||
id = "viewportTextElement",
|
id = "viewportTextElement",
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
textSize = "2vw"
|
textSize = "2vw",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(viewportTextElement.textSize, 24) -- 2% of 1200
|
luaunit.assertEquals(viewportTextElement.textSize, 24) -- 2% of 1200
|
||||||
luaunit.assertEquals(viewportTextElement.units.textSize.unit, "vw")
|
luaunit.assertEquals(viewportTextElement.units.textSize.unit, "vw")
|
||||||
end
|
end
|
||||||
@@ -317,10 +321,10 @@ function TestUnitsSystem:testInvalidUnits()
|
|||||||
-- Test handling of invalid unit specifications (should default to pixels)
|
-- Test handling of invalid unit specifications (should default to pixels)
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "100invalid", -- Should be treated as 100px
|
width = "100invalid", -- Should be treated as 100px
|
||||||
h = "50badunit" -- Should be treated as 50px
|
height = "50badunit", -- Should be treated as 50px
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Should fallback to pixel values
|
-- Should fallback to pixel values
|
||||||
luaunit.assertEquals(container.width, 100)
|
luaunit.assertEquals(container.width, 100)
|
||||||
luaunit.assertEquals(container.height, 50)
|
luaunit.assertEquals(container.height, 50)
|
||||||
@@ -332,12 +336,12 @@ function TestUnitsSystem:testZeroAndNegativeValues()
|
|||||||
-- Test zero and negative values with units
|
-- Test zero and negative values with units
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "0px",
|
width = "0px",
|
||||||
h = "0vh",
|
height = "0vh",
|
||||||
x = "-10px",
|
x = "-10px",
|
||||||
y = "-5%"
|
y = "-5%",
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 0)
|
luaunit.assertEquals(container.width, 0)
|
||||||
luaunit.assertEquals(container.height, 0)
|
luaunit.assertEquals(container.height, 0)
|
||||||
luaunit.assertEquals(container.x, -10)
|
luaunit.assertEquals(container.x, -10)
|
||||||
@@ -348,13 +352,13 @@ function TestUnitsSystem:testVeryLargeValues()
|
|||||||
-- Test very large percentage values
|
-- Test very large percentage values
|
||||||
local container = Gui.new({
|
local container = Gui.new({
|
||||||
id = "container",
|
id = "container",
|
||||||
w = "200%", -- 200% of viewport
|
width = "200%", -- 200% of viewport
|
||||||
h = "150vh" -- 150% of viewport height
|
height = "150vh", -- 150% of viewport height
|
||||||
})
|
})
|
||||||
|
|
||||||
luaunit.assertEquals(container.width, 2400) -- 200% of 1200
|
luaunit.assertEquals(container.width, 2400) -- 200% of 1200
|
||||||
luaunit.assertEquals(container.height, 1200) -- 150% of 800
|
luaunit.assertEquals(container.height, 1200) -- 150% of 800
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Run the tests
|
-- Run the tests
|
||||||
os.exit(luaunit.LuaUnit.run())
|
luaunit.LuaUnit.run()
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ function TestRelativePositioning.testBasicRelativePositioning()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 50,
|
y = 50,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
@@ -25,16 +25,16 @@ function TestRelativePositioning.testBasicRelativePositioning()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 20,
|
x = 20,
|
||||||
y = 30,
|
y = 30,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.8, 0.2, 0.2, 1.0)
|
background = Color.new(0.8, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Child should be positioned relative to parent
|
-- Child should be positioned relative to parent
|
||||||
luaunit.assertEquals(child.positioning, Positioning.RELATIVE)
|
luaunit.assertEquals(child.positioning, Positioning.RELATIVE)
|
||||||
luaunit.assertEquals(child.x, 120) -- parent.x (100) + offset (20)
|
luaunit.assertEquals(child.x, 120) -- parent.x (100) + offset (20)
|
||||||
luaunit.assertEquals(child.y, 80) -- parent.y (50) + offset (30)
|
luaunit.assertEquals(child.y, 80) -- parent.y (50) + offset (30)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Test 2: Relative positioning with percentage values
|
-- Test 2: Relative positioning with percentage values
|
||||||
@@ -42,8 +42,8 @@ function TestRelativePositioning.testRelativePositioningPercentages()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 100,
|
y = 100,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
@@ -52,10 +52,10 @@ function TestRelativePositioning.testRelativePositioningPercentages()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = "10%", -- 10% of parent width = 20px
|
x = "10%", -- 10% of parent width = 20px
|
||||||
y = "20%", -- 20% of parent height = 20px
|
y = "20%", -- 20% of parent height = 20px
|
||||||
w = 30,
|
width = 30,
|
||||||
h = 20,
|
height = 20,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.8, 0.2, 0.2, 1.0)
|
background = Color.new(0.8, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Child should be positioned relative to parent with percentage offsets
|
-- Child should be positioned relative to parent with percentage offsets
|
||||||
@@ -69,23 +69,23 @@ function TestRelativePositioning.testRelativePositioningNoOffset()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 75,
|
x = 75,
|
||||||
y = 125,
|
y = 125,
|
||||||
w = 150,
|
width = 150,
|
||||||
h = 200,
|
height = 200,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
local child = Gui.new({
|
local child = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
w = 40,
|
width = 40,
|
||||||
h = 30,
|
height = 30,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.8, 0.2, 1.0)
|
background = Color.new(0.2, 0.8, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Child should be positioned at parent's position with no offset
|
-- Child should be positioned at parent's position with no offset
|
||||||
luaunit.assertEquals(child.positioning, Positioning.RELATIVE)
|
luaunit.assertEquals(child.positioning, Positioning.RELATIVE)
|
||||||
luaunit.assertEquals(child.x, 75) -- same as parent.x
|
luaunit.assertEquals(child.x, 75) -- same as parent.x
|
||||||
luaunit.assertEquals(child.y, 125) -- same as parent.y
|
luaunit.assertEquals(child.y, 125) -- same as parent.y
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -94,8 +94,8 @@ function TestRelativePositioning.testMultipleRelativeChildren()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 200,
|
x = 200,
|
||||||
y = 300,
|
y = 300,
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 100,
|
height = 100,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
@@ -104,20 +104,20 @@ function TestRelativePositioning.testMultipleRelativeChildren()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 10,
|
x = 10,
|
||||||
y = 15,
|
y = 15,
|
||||||
w = 20,
|
width = 20,
|
||||||
h = 20,
|
height = 20,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.8, 0.2, 0.2, 1.0)
|
background = Color.new(0.8, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
local child2 = Gui.new({
|
local child2 = Gui.new({
|
||||||
parent = parent,
|
parent = parent,
|
||||||
x = 30,
|
x = 30,
|
||||||
y = 45,
|
y = 45,
|
||||||
w = 25,
|
width = 25,
|
||||||
h = 25,
|
height = 25,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.2, 0.8, 0.2, 1.0)
|
background = Color.new(0.2, 0.8, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Both children should be positioned relative to parent
|
-- Both children should be positioned relative to parent
|
||||||
@@ -133,8 +133,8 @@ function TestRelativePositioning.testNestedRelativePositioning()
|
|||||||
local grandparent = Gui.new({
|
local grandparent = Gui.new({
|
||||||
x = 50,
|
x = 50,
|
||||||
y = 60,
|
y = 60,
|
||||||
w = 300,
|
width = 300,
|
||||||
h = 250,
|
height = 250,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.1, 0.1, 0.1, 1.0),
|
background = Color.new(0.1, 0.1, 0.1, 1.0),
|
||||||
})
|
})
|
||||||
@@ -143,8 +143,8 @@ function TestRelativePositioning.testNestedRelativePositioning()
|
|||||||
parent = grandparent,
|
parent = grandparent,
|
||||||
x = 25,
|
x = 25,
|
||||||
y = 35,
|
y = 35,
|
||||||
w = 200,
|
width = 200,
|
||||||
h = 150,
|
height = 150,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.3, 0.3, 0.3, 1.0),
|
background = Color.new(0.3, 0.3, 0.3, 1.0),
|
||||||
})
|
})
|
||||||
@@ -153,18 +153,18 @@ function TestRelativePositioning.testNestedRelativePositioning()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 15,
|
x = 15,
|
||||||
y = 20,
|
y = 20,
|
||||||
w = 50,
|
width = 50,
|
||||||
h = 40,
|
height = 40,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.8, 0.8, 0.8, 1.0)
|
background = Color.new(0.8, 0.8, 0.8, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Each level should be positioned relative to its parent
|
-- Each level should be positioned relative to its parent
|
||||||
luaunit.assertEquals(parent.x, 75) -- grandparent.x (50) + offset (25)
|
luaunit.assertEquals(parent.x, 75) -- grandparent.x (50) + offset (25)
|
||||||
luaunit.assertEquals(parent.y, 95) -- grandparent.y (60) + offset (35)
|
luaunit.assertEquals(parent.y, 95) -- grandparent.y (60) + offset (35)
|
||||||
|
|
||||||
luaunit.assertEquals(child.x, 90) -- parent.x (75) + offset (15)
|
luaunit.assertEquals(child.x, 90) -- parent.x (75) + offset (15)
|
||||||
luaunit.assertEquals(child.y, 115) -- parent.y (95) + offset (20)
|
luaunit.assertEquals(child.y, 115) -- parent.y (95) + offset (20)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Test 6: Mixed positioning types (relative child in absolute parent)
|
-- Test 6: Mixed positioning types (relative child in absolute parent)
|
||||||
@@ -172,8 +172,8 @@ function TestRelativePositioning.testMixedPositioning()
|
|||||||
local parent = Gui.new({
|
local parent = Gui.new({
|
||||||
x = 100,
|
x = 100,
|
||||||
y = 200,
|
y = 200,
|
||||||
w = 180,
|
width = 180,
|
||||||
h = 120,
|
height = 120,
|
||||||
positioning = "absolute",
|
positioning = "absolute",
|
||||||
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
background = Color.new(0.2, 0.2, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
@@ -182,10 +182,10 @@ function TestRelativePositioning.testMixedPositioning()
|
|||||||
parent = parent,
|
parent = parent,
|
||||||
x = 40,
|
x = 40,
|
||||||
y = 25,
|
y = 25,
|
||||||
w = 60,
|
width = 60,
|
||||||
h = 35,
|
height = 35,
|
||||||
positioning = "relative",
|
positioning = "relative",
|
||||||
background = Color.new(0.8, 0.8, 0.2, 1.0)
|
background = Color.new(0.8, 0.8, 0.2, 1.0),
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Relative child should still be positioned relative to absolute parent
|
-- Relative child should still be positioned relative to absolute parent
|
||||||
@@ -196,4 +196,4 @@ function TestRelativePositioning.testMixedPositioning()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Run all tests
|
-- Run all tests
|
||||||
os.exit(luaunit.LuaUnit.run())
|
luaunit.LuaUnit.run()
|
||||||
|
|||||||
@@ -1,124 +1,473 @@
|
|||||||
-- Test file for basic text scaling functionality
|
-- Test file for comprehensive text scaling functionality
|
||||||
-- This tests simple cases where elements scale text appropriately during resize
|
-- This tests all text scaling scenarios including edge cases and multiple resize events
|
||||||
|
|
||||||
package.path = './testing/?.lua;./?.lua;' .. package.path
|
package.path = package.path .. ";?.lua"
|
||||||
local luaunit = require("luaunit")
|
|
||||||
|
|
||||||
-- Mock love module for testing
|
local luaunit = require("testing/luaunit")
|
||||||
love = {
|
require("testing/loveStub") -- Required to mock LOVE functions
|
||||||
graphics = {
|
|
||||||
getDimensions = function() return 800, 600 end,
|
|
||||||
newFont = function(size) return { getWidth = function(text) return size * #text end, getHeight = function() return size end } end,
|
|
||||||
getFont = function() return { getWidth = function(text) return 12 * #text end, getHeight = function() return 12 end } end,
|
|
||||||
},
|
|
||||||
window = {
|
|
||||||
getMode = function() return 800, 600 end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Import the FlexLove library
|
|
||||||
local FlexLove = require("FlexLove")
|
local FlexLove = require("FlexLove")
|
||||||
local Gui = FlexLove.GUI
|
local Gui = FlexLove.GUI
|
||||||
|
|
||||||
-- Test suite for basic text scaling
|
-- Test suite for comprehensive text scaling
|
||||||
local BasicTextScalingTests = {}
|
TestTextScaling = {}
|
||||||
|
|
||||||
function BasicTextScalingTests.testFixedTextSize()
|
-- Basic functionality tests
|
||||||
|
function TestTextScaling.testFixedTextSize()
|
||||||
-- Create an element with fixed textSize in pixels
|
-- Create an element with fixed textSize in pixels
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
id = "testElement",
|
id = "testElement",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
textSize = 16, -- Fixed size in pixels
|
textSize = 16, -- Fixed size in pixels
|
||||||
text = "Hello World"
|
text = "Hello World",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Check initial state
|
-- Check initial state
|
||||||
luaunit.assertEquals(element.textSize, 16)
|
luaunit.assertEquals(element.textSize, 16)
|
||||||
|
luaunit.assertEquals(element.units.textSize.unit, "px")
|
||||||
-- Simulate a resize with larger viewport
|
|
||||||
local newWidth, newHeight = 800, 600
|
-- Simulate multiple resizes
|
||||||
element:resize(newWidth, newHeight)
|
element:resize(1600, 1200)
|
||||||
|
luaunit.assertEquals(element.textSize, 16) -- Should remain unchanged
|
||||||
-- Fixed textSize should remain unchanged
|
|
||||||
luaunit.assertEquals(element.textSize, 16)
|
element:resize(400, 300)
|
||||||
|
luaunit.assertEquals(element.textSize, 16) -- Should remain unchanged
|
||||||
end
|
end
|
||||||
|
|
||||||
function BasicTextScalingTests.testPercentageTextSize()
|
function TestTextScaling.testPercentageTextSize()
|
||||||
-- Create an element with percentage textSize
|
-- Create an element with percentage textSize (relative to viewport height)
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
id = "testElement",
|
id = "testElement",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
textSize = "5%", -- Percentage of viewport height
|
textSize = "5%", -- Percentage of viewport height
|
||||||
text = "Hello World"
|
text = "Hello World",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Check initial state
|
-- Check initial state (5% of 600px = 30px)
|
||||||
luaunit.assertEquals(element.units.textSize.unit, "%")
|
luaunit.assertEquals(element.units.textSize.unit, "%")
|
||||||
|
luaunit.assertEquals(element.units.textSize.value, 5)
|
||||||
-- Simulate a resize with larger viewport
|
luaunit.assertEquals(element.textSize, 30.0)
|
||||||
local newWidth, newHeight = 800, 600
|
|
||||||
element:resize(newWidth, newHeight)
|
-- Simulate resize to larger viewport (5% of 1200px = 60px)
|
||||||
|
element:resize(1600, 1200)
|
||||||
-- Percentage textSize should be recalculated
|
luaunit.assertEquals(element.textSize, 60.0)
|
||||||
luaunit.assertEquals(element.textSize, 30) -- 5% of 600 height = 30
|
|
||||||
|
-- Simulate resize to smaller viewport (5% of 300px = 15px)
|
||||||
|
element:resize(400, 300)
|
||||||
|
luaunit.assertEquals(element.textSize, 15.0)
|
||||||
end
|
end
|
||||||
|
|
||||||
function BasicTextScalingTests.testVwTextSize()
|
function TestTextScaling.testVwTextSize()
|
||||||
-- Create an element with vw textSize
|
-- Create an element with vw textSize
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
id = "testElement",
|
id = "testElement",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
textSize = "2vw", -- 2% of viewport width
|
textSize = "2vw", -- 2% of viewport width
|
||||||
text = "Hello World"
|
text = "Hello World",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Check initial state
|
-- Check initial state (2% of 800px = 16px)
|
||||||
luaunit.assertEquals(element.units.textSize.unit, "vw")
|
luaunit.assertEquals(element.units.textSize.unit, "vw")
|
||||||
|
luaunit.assertEquals(element.units.textSize.value, 2)
|
||||||
-- Simulate a resize with larger viewport
|
luaunit.assertEquals(element.textSize, 16.0)
|
||||||
local newWidth, newHeight = 800, 600
|
|
||||||
element:resize(newWidth, newHeight)
|
-- Simulate resize to larger viewport (2% of 1600px = 32px)
|
||||||
|
element:resize(1600, 1200)
|
||||||
-- vw textSize should be recalculated
|
luaunit.assertEquals(element.textSize, 32.0)
|
||||||
luaunit.assertEquals(element.textSize, 16) -- 2% of 800 width = 16
|
|
||||||
|
-- Simulate resize to smaller viewport (2% of 400px = 8px)
|
||||||
|
element:resize(400, 300)
|
||||||
|
luaunit.assertEquals(element.textSize, 8.0)
|
||||||
end
|
end
|
||||||
|
|
||||||
function BasicTextScalingTests.testVhTextSize()
|
function TestTextScaling.testVhTextSize()
|
||||||
-- Create an element with vh textSize
|
-- Create an element with vh textSize
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
id = "testElement",
|
id = "testElement",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
textSize = "3vh", -- 3% of viewport height
|
textSize = "3vh", -- 3% of viewport height
|
||||||
text = "Hello World"
|
text = "Hello World",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Check initial state
|
-- Check initial state (3% of 600px = 18px)
|
||||||
luaunit.assertEquals(element.units.textSize.unit, "vh")
|
luaunit.assertEquals(element.units.textSize.unit, "vh")
|
||||||
|
luaunit.assertEquals(element.units.textSize.value, 3)
|
||||||
-- Simulate a resize with larger viewport
|
luaunit.assertEquals(element.textSize, 18.0)
|
||||||
local newWidth, newHeight = 800, 600
|
|
||||||
element:resize(newWidth, newHeight)
|
-- Simulate resize to larger viewport (3% of 1200px = 36px)
|
||||||
|
element:resize(1600, 1200)
|
||||||
-- vh textSize should be recalculated
|
luaunit.assertEquals(element.textSize, 36.0)
|
||||||
luaunit.assertEquals(element.textSize, 18) -- 3% of 600 height = 18
|
|
||||||
|
-- Simulate resize to smaller viewport (3% of 300px = 9px)
|
||||||
|
element:resize(400, 300)
|
||||||
|
luaunit.assertEquals(element.textSize, 9.0)
|
||||||
end
|
end
|
||||||
|
|
||||||
function BasicTextScalingTests.testNoTextSize()
|
function TestTextScaling.testNoTextSize()
|
||||||
-- Create an element without textSize specified
|
-- Create an element without textSize specified
|
||||||
local element = Gui.new({
|
local element = Gui.new({
|
||||||
id = "testElement",
|
id = "testElement",
|
||||||
w = 100,
|
width = 100,
|
||||||
h = 50,
|
height = 50,
|
||||||
text = "Hello World"
|
text = "Hello World",
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Check initial state - should default to some value
|
-- Check initial state - should default to some value
|
||||||
luaunit.assertEquals(element.units.textSize.value, nil)
|
luaunit.assertEquals(element.units.textSize.value, nil)
|
||||||
luaunit.assertEquals(element.textSize, 12) -- Default fallback
|
luaunit.assertEquals(element.textSize, 12) -- Default fallback
|
||||||
|
|
||||||
|
-- Resize should not affect default textSize
|
||||||
|
element:resize(1600, 1200)
|
||||||
|
luaunit.assertEquals(element.textSize, 12)
|
||||||
end
|
end
|
||||||
|
|
||||||
return BasicTextScalingTests
|
-- Edge case tests
|
||||||
|
function TestTextScaling.testZeroPercentageTextSize()
|
||||||
|
-- Create an element with 0% textSize
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "0%",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
luaunit.assertEquals(element.textSize, 0.0)
|
||||||
|
|
||||||
|
-- Should remain 0 after resize
|
||||||
|
element:resize(1600, 1200)
|
||||||
|
luaunit.assertEquals(element.textSize, 0.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testVerySmallTextSize()
|
||||||
|
-- Create an element with very small textSize
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "0.1vh",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state (0.1% of 600px = 0.6px)
|
||||||
|
luaunit.assertEquals(element.textSize, 0.6)
|
||||||
|
|
||||||
|
-- Should scale proportionally
|
||||||
|
element:resize(1600, 1200)
|
||||||
|
luaunit.assertEquals(element.textSize, 1.2) -- 0.1% of 1200px = 1.2px
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testVeryLargeTextSize()
|
||||||
|
-- Create an element with very large textSize
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "50vh",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state (50% of 600px = 300px)
|
||||||
|
luaunit.assertEquals(element.textSize, 300.0)
|
||||||
|
|
||||||
|
-- Should scale proportionally
|
||||||
|
element:resize(1600, 1200)
|
||||||
|
luaunit.assertEquals(element.textSize, 600.0) -- 50% of 1200px = 600px
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testDecimalUnits()
|
||||||
|
-- Create an element with decimal units
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "2.5vw",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state (2.5% of 800px = 20px)
|
||||||
|
luaunit.assertEquals(element.textSize, 20.0)
|
||||||
|
|
||||||
|
-- Should handle decimal precision
|
||||||
|
element:resize(1000, 800)
|
||||||
|
luaunit.assertEquals(element.textSize, 25.0) -- 2.5% of 1000px = 25px
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Multiple resize tests
|
||||||
|
function TestTextScaling.testMultipleResizes()
|
||||||
|
-- Create an element and perform multiple resize operations
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "4vh",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Initial: 4% of 600px = 24px
|
||||||
|
luaunit.assertEquals(element.textSize, 24.0)
|
||||||
|
|
||||||
|
-- First resize: 4% of 800px = 32px
|
||||||
|
element:resize(1000, 800)
|
||||||
|
luaunit.assertEquals(element.textSize, 32.0)
|
||||||
|
|
||||||
|
-- Second resize: 4% of 400px = 16px
|
||||||
|
element:resize(500, 400)
|
||||||
|
luaunit.assertEquals(element.textSize, 16.0)
|
||||||
|
|
||||||
|
-- Third resize: 4% of 1000px = 40px
|
||||||
|
element:resize(1200, 1000)
|
||||||
|
luaunit.assertEquals(element.textSize, 40.0)
|
||||||
|
|
||||||
|
-- Return to original: 4% of 600px = 24px
|
||||||
|
element:resize(800, 600)
|
||||||
|
luaunit.assertEquals(element.textSize, 24.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Mixed unit tests
|
||||||
|
function TestTextScaling.testMixedUnitsInDifferentElements()
|
||||||
|
-- Create multiple elements with different unit types
|
||||||
|
local elements = {
|
||||||
|
Gui.new({ id = "px", textSize = 20, text = "Fixed" }),
|
||||||
|
Gui.new({ id = "percent", textSize = "5%", text = "Percent" }),
|
||||||
|
Gui.new({ id = "vw", textSize = "3vw", text = "ViewWidth" }),
|
||||||
|
Gui.new({ id = "vh", textSize = "4vh", text = "ViewHeight" }),
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Check initial states
|
||||||
|
luaunit.assertEquals(elements[1].textSize, 20) -- Fixed
|
||||||
|
luaunit.assertEquals(elements[2].textSize, 30.0) -- 5% of 600px
|
||||||
|
luaunit.assertEquals(elements[3].textSize, 24.0) -- 3% of 800px
|
||||||
|
luaunit.assertEquals(elements[4].textSize, 24.0) -- 4% of 600px
|
||||||
|
|
||||||
|
-- Resize all elements
|
||||||
|
for _, element in ipairs(elements) do
|
||||||
|
element:resize(1200, 900)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check after resize
|
||||||
|
luaunit.assertEquals(elements[1].textSize, 20) -- Fixed (unchanged)
|
||||||
|
luaunit.assertEquals(elements[2].textSize, 45.0) -- 5% of 900px
|
||||||
|
luaunit.assertEquals(elements[3].textSize, 36.0) -- 3% of 1200px
|
||||||
|
luaunit.assertEquals(elements[4].textSize, 36.0) -- 4% of 900px
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Test invalid units handling
|
||||||
|
function TestTextScaling.testInvalidUnits()
|
||||||
|
-- Test that invalid units are handled gracefully
|
||||||
|
local success, err = pcall(function()
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "5invalidunit",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Should handle invalid units gracefully (might error or default)
|
||||||
|
-- The exact behavior depends on implementation, but shouldn't crash
|
||||||
|
luaunit.assertTrue(success or string.find(tostring(err), "Unknown unit"))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Performance test for many resizes
|
||||||
|
function TestTextScaling.testPerformanceWithManyResizes()
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "2vh",
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Perform many resize operations
|
||||||
|
local startTime = os.clock()
|
||||||
|
for i = 1, 100 do
|
||||||
|
local width = 800 + (i * 2)
|
||||||
|
local height = 600 + (i * 2)
|
||||||
|
element:resize(width, height)
|
||||||
|
|
||||||
|
-- Verify the calculation is still correct
|
||||||
|
local expected = (2 / 100) * height
|
||||||
|
luaunit.assertEquals(element.textSize, expected)
|
||||||
|
end
|
||||||
|
local endTime = os.clock()
|
||||||
|
|
||||||
|
-- Should complete in reasonable time (less than 1 second for 100 resizes)
|
||||||
|
local duration = endTime - startTime
|
||||||
|
luaunit.assertTrue(duration < 1.0, "Performance test took too long: " .. duration .. " seconds")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Element-relative unit tests
|
||||||
|
function TestTextScaling.testElementWidthUnits()
|
||||||
|
-- Create an element with textSize relative to element width
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = "10ew", -- 10% of element width
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state (10% of 200px = 20px)
|
||||||
|
luaunit.assertEquals(element.units.textSize.unit, "ew")
|
||||||
|
luaunit.assertEquals(element.units.textSize.value, 10)
|
||||||
|
luaunit.assertEquals(element.textSize, 20.0)
|
||||||
|
luaunit.assertEquals(element.width, 200)
|
||||||
|
|
||||||
|
-- Change element width and recalculate
|
||||||
|
element.width = 300
|
||||||
|
element:resize(800, 600)
|
||||||
|
luaunit.assertEquals(element.textSize, 30.0) -- 10% of 300px = 30px
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testElementHeightUnits()
|
||||||
|
-- Create an element with textSize relative to element height
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = "15eh", -- 15% of element height
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state (15% of 100px = 15px)
|
||||||
|
luaunit.assertEquals(element.units.textSize.unit, "eh")
|
||||||
|
luaunit.assertEquals(element.units.textSize.value, 15)
|
||||||
|
luaunit.assertEquals(element.textSize, 15.0)
|
||||||
|
luaunit.assertEquals(element.height, 100)
|
||||||
|
|
||||||
|
-- Change element height and recalculate
|
||||||
|
element.height = 200
|
||||||
|
element:resize(800, 600)
|
||||||
|
luaunit.assertEquals(element.textSize, 30.0) -- 15% of 200px = 30px
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testElementRelativeWithViewportUnits()
|
||||||
|
-- Create an element with viewport-based size and element-relative textSize
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = "25%", -- 25% of viewport width = 200px (800px * 0.25)
|
||||||
|
height = "20%", -- 20% of viewport height = 120px (600px * 0.20)
|
||||||
|
textSize = "8ew", -- 8% of element width
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check initial state
|
||||||
|
luaunit.assertEquals(element.width, 200.0) -- 25% of 800px
|
||||||
|
luaunit.assertEquals(element.height, 120.0) -- 20% of 600px
|
||||||
|
luaunit.assertEquals(element.textSize, 16.0) -- 8% of 200px
|
||||||
|
|
||||||
|
-- Resize viewport
|
||||||
|
element:resize(1600, 1200)
|
||||||
|
|
||||||
|
-- Element size should update with viewport, textSize should update with element size
|
||||||
|
luaunit.assertEquals(element.width, 400.0) -- 25% of 1600px
|
||||||
|
luaunit.assertEquals(element.height, 240.0) -- 20% of 1200px
|
||||||
|
luaunit.assertEquals(element.textSize, 32.0) -- 8% of 400px
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Min/Max constraint tests
|
||||||
|
function TestTextScaling.testMinTextSizeConstraint()
|
||||||
|
-- Create element with textSize that would be smaller than minimum
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = "2vh", -- 2% of 600px = 12px
|
||||||
|
minTextSize = 16, -- Minimum 16px
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Should be clamped to minimum
|
||||||
|
luaunit.assertEquals(element.textSize, 16)
|
||||||
|
|
||||||
|
-- Test with very small viewport
|
||||||
|
element:resize(400, 300) -- 2% of 300px = 6px, should stay at 16px
|
||||||
|
luaunit.assertEquals(element.textSize, 16)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testMaxTextSizeConstraint()
|
||||||
|
-- Create element with textSize that would be larger than maximum
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = "4vh", -- 4% of 600px = 24px
|
||||||
|
maxTextSize = 20, -- Maximum 20px
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Should be clamped to maximum
|
||||||
|
luaunit.assertEquals(element.textSize, 20)
|
||||||
|
|
||||||
|
-- Test with very large viewport
|
||||||
|
element:resize(1600, 1200) -- 4% of 1200px = 48px, should stay at 20px
|
||||||
|
luaunit.assertEquals(element.textSize, 20)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testBothMinMaxConstraints()
|
||||||
|
-- Create element with both min and max constraints
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = "3vh", -- 3% of 600px = 18px (within bounds)
|
||||||
|
minTextSize = 12,
|
||||||
|
maxTextSize = 24,
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Should be within bounds
|
||||||
|
luaunit.assertEquals(element.textSize, 18.0)
|
||||||
|
|
||||||
|
-- Test small viewport (should hit min)
|
||||||
|
element:resize(400, 300) -- 3% of 300px = 9px, should be clamped to 12px
|
||||||
|
luaunit.assertEquals(element.textSize, 12)
|
||||||
|
|
||||||
|
-- Test large viewport (should hit max)
|
||||||
|
element:resize(1600, 1200) -- 3% of 1200px = 36px, should be clamped to 24px
|
||||||
|
luaunit.assertEquals(element.textSize, 24)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testConstraintsWithElementUnits()
|
||||||
|
-- Test constraints with element-relative units
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 100,
|
||||||
|
height = 50,
|
||||||
|
textSize = "20ew", -- 20% of 100px = 20px
|
||||||
|
minTextSize = 8,
|
||||||
|
maxTextSize = 15,
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Should be clamped to maximum
|
||||||
|
luaunit.assertEquals(element.textSize, 15)
|
||||||
|
|
||||||
|
-- Change width to trigger minimum
|
||||||
|
element.width = 30 -- 20% of 30px = 6px, should be clamped to 8px
|
||||||
|
element:resize(800, 600)
|
||||||
|
luaunit.assertEquals(element.textSize, 8)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestTextScaling.testConstraintsWithFixedTextSize()
|
||||||
|
-- Test that constraints work with fixed pixel textSize too
|
||||||
|
local element = Gui.new({
|
||||||
|
id = "testElement",
|
||||||
|
width = 200,
|
||||||
|
height = 100,
|
||||||
|
textSize = 25, -- Fixed 25px
|
||||||
|
minTextSize = 12,
|
||||||
|
maxTextSize = 20,
|
||||||
|
text = "Hello World",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Should be clamped to maximum even for fixed sizes
|
||||||
|
luaunit.assertEquals(element.textSize, 20)
|
||||||
|
end
|
||||||
|
|
||||||
|
luaunit.LuaUnit.run()
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
local FlexDirection = enums.FlexDirection
|
|
||||||
local Positioning = enums.Positioning
|
|
||||||
local JustifyContent = enums.JustifyContent
|
|
||||||
local AlignItems = enums.AlignItems
|
|
||||||
|
|
||||||
-- Create test cases
|
|
||||||
TestFlexDirection = {}
|
|
||||||
|
|
||||||
function TestFlexDirection:testHorizontalFlexBasic()
|
|
||||||
local elem = Gui.new({ ... }) -- fill with props
|
|
||||||
end
|
|
||||||
|
|
||||||
function TestFlexDirection:testHorizontalFlexWithJustifyContentFlexStart() end
|
|
||||||
|
|
||||||
luaunit.LuaUnit.run()
|
|
||||||
@@ -15,6 +15,9 @@ local testFiles = {
|
|||||||
"testing/__tests__/09_layout_validation_tests.lua",
|
"testing/__tests__/09_layout_validation_tests.lua",
|
||||||
"testing/__tests__/10_performance_tests.lua",
|
"testing/__tests__/10_performance_tests.lua",
|
||||||
"testing/__tests__/11_auxiliary_functions_tests.lua",
|
"testing/__tests__/11_auxiliary_functions_tests.lua",
|
||||||
|
"testing/__tests__/12_units_system_tests.lua",
|
||||||
|
"testing/__tests__/13_relative_positioning_tests.lua",
|
||||||
|
"testing/__tests__/14_text_scaling_basic_tests.lua",
|
||||||
}
|
}
|
||||||
|
|
||||||
-- testingun all tests, but don't exit on error
|
-- testingun all tests, but don't exit on error
|
||||||
|
|||||||
Reference in New Issue
Block a user