From c0684e88ab7f8a65a3efb36dd93ae30dbb600e04 Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Thu, 18 Sep 2025 22:26:25 -0400 Subject: [PATCH] working --- FlexLove.lua | 69 +---------- .../01_absolute_positioning_basic_tests.lua | 113 +++++++++--------- 2 files changed, 57 insertions(+), 125 deletions(-) diff --git a/FlexLove.lua b/FlexLove.lua index b9d2875..54c2717 100644 --- a/FlexLove.lua +++ b/FlexLove.lua @@ -804,43 +804,14 @@ function Element:layoutChildren() for _, child in ipairs(line) do -- Determine effective cross-axis alignment local effectiveAlign = child.alignSelf - if effectiveAlign == AlignSelf.AUTO then + if effectiveAlign == nil or effectiveAlign == AlignSelf.AUTO then effectiveAlign = self.alignItems end - -- DEBUG: Print alignment info for last child - -- DEBUG: Output alignment information for troubleshooting - if child.debugId or (_ == #line) then - local debugPrefix = child.debugId and string.format("[%s]", child.debugId) or "[LAST_CHILD]" - print( - string.format( - "DEBUG %s: effectiveAlign='%s', alignSelf='%s', parent.alignItems='%s'", - debugPrefix, - tostring(effectiveAlign), - tostring(child.alignSelf), - tostring(self.alignItems) - ) - ) - end - if self.flexDirection == FlexDirection.HORIZONTAL then -- Horizontal layout: main axis is X, cross axis is Y child.x = self.x + self.padding.left + currentMainPos - -- Apply cross-axis (vertical) alignment within the line - -- Additional DEBUG: Log detailed positioning for elements with debugId - if child.debugId then - print( - string.format( - "DEBUG [%s]: HORIZONTAL layout - lineHeight=%.2f, childHeight=%.2f, currentCrossPos=%.2f", - child.debugId, - lineHeight, - child.height or 0, - currentCrossPos - ) - ) - end - if effectiveAlign == AlignItems.FLEX_START then child.y = self.y + self.padding.top + currentCrossPos elseif effectiveAlign == AlignItems.CENTER then @@ -850,15 +821,6 @@ function Element:layoutChildren() elseif effectiveAlign == AlignItems.STRETCH then child.height = lineHeight child.y = self.y + self.padding.top + currentCrossPos - else - -- Default fallback: treat as FLEX_START - print( - string.format( - "WARNING: Unknown effectiveAlign value '%s', defaulting to FLEX_START", - tostring(effectiveAlign) - ) - ) - child.y = self.y + self.padding.top + currentCrossPos end -- Final position DEBUG for elements with debugId @@ -871,44 +833,15 @@ function Element:layoutChildren() -- Vertical layout: main axis is Y, cross axis is X child.y = self.y + self.padding.top + currentMainPos - -- Apply cross-axis (horizontal) alignment within the line - -- Additional DEBUG: Log detailed positioning for elements with debugId - if child.debugId then - print( - string.format( - "DEBUG [%s]: VERTICAL layout - lineHeight=%.2f, childWidth=%.2f, currentCrossPos=%.2f", - child.debugId, - lineHeight, - child.width or 0, - currentCrossPos - ) - ) - end - if effectiveAlign == AlignItems.FLEX_START then child.x = self.x + self.padding.left + currentCrossPos elseif effectiveAlign == AlignItems.CENTER then - Logger:debug(lineHeight) child.x = self.x + self.padding.left + currentCrossPos + ((lineHeight - (child.width or 0)) / 2) elseif effectiveAlign == AlignItems.FLEX_END then child.x = self.x + self.padding.left + currentCrossPos + lineHeight - (child.width or 0) elseif effectiveAlign == AlignItems.STRETCH then child.width = lineHeight child.x = self.x + self.padding.left + currentCrossPos - else - -- Default fallback: treat as FLEX_START - print( - string.format( - "WARNING: Unknown effectiveAlign value '%s', defaulting to FLEX_START", - tostring(effectiveAlign) - ) - ) - child.x = self.x + self.padding.left + currentCrossPos - end - - -- Final position DEBUG for elements with debugId - if child.debugId then - print(string.format("DEBUG [%s]: Final X position: %.2f", child.debugId, child.x)) end currentMainPos = currentMainPos + (child.height or 0) + itemSpacing diff --git a/testing/__tests__/01_absolute_positioning_basic_tests.lua b/testing/__tests__/01_absolute_positioning_basic_tests.lua index f511a13..05f13bc 100644 --- a/testing/__tests__/01_absolute_positioning_basic_tests.lua +++ b/testing/__tests__/01_absolute_positioning_basic_tests.lua @@ -27,16 +27,16 @@ function TestAbsolutePositioningBasic:testCreateElementWithAbsolutePositioning() y = 200, w = 300, h = 150, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Verify element was created with correct properties luaunit.assertEquals(elem.x, 100) luaunit.assertEquals(elem.y, 200) luaunit.assertEquals(elem.width, 300) luaunit.assertEquals(elem.height, 150) luaunit.assertEquals(elem.positioning, Positioning.ABSOLUTE) - + -- Verify element was added to topElements luaunit.assertEquals(#Gui.topElements, 1) luaunit.assertEquals(Gui.topElements[1], elem) @@ -48,9 +48,9 @@ function TestAbsolutePositioningBasic:testDefaultAbsolutePositioning() x = 50, y = 75, w = 200, - h = 100 + h = 100, }) - + -- Default should be absolute positioning luaunit.assertEquals(elem.positioning, Positioning.ABSOLUTE) luaunit.assertEquals(elem.x, 50) @@ -65,31 +65,31 @@ function TestAbsolutePositioningBasic:testZIndexHandling() w = 100, h = 100, z = 1, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local elem2 = Gui.new({ x = 50, y = 50, w = 100, h = 100, z = 5, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local elem3 = Gui.new({ x = 25, y = 25, w = 100, h = 100, z = 3, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + luaunit.assertEquals(elem1.z, 1) luaunit.assertEquals(elem2.z, 5) luaunit.assertEquals(elem3.z, 3) - + -- All should be in topElements luaunit.assertEquals(#Gui.topElements, 3) end @@ -101,9 +101,9 @@ function TestAbsolutePositioningBasic:testDefaultZIndex() y = 20, w = 50, h = 50, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + luaunit.assertEquals(elem.z, 0) end @@ -114,23 +114,23 @@ function TestAbsolutePositioningBasic:testCoordinateIndependence() y = 100, w = 50, h = 50, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local elem2 = Gui.new({ x = 200, y = 200, w = 50, h = 50, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Elements should maintain their own coordinates luaunit.assertEquals(elem1.x, 100) luaunit.assertEquals(elem1.y, 100) luaunit.assertEquals(elem2.x, 200) luaunit.assertEquals(elem2.y, 200) - + -- Modifying one shouldn't affect the other elem1.x = 150 luaunit.assertEquals(elem1.x, 150) @@ -144,23 +144,23 @@ function TestAbsolutePositioningBasic:testAbsoluteWithParentIndependentCoordinat y = 50, w = 200, h = 200, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local child = Gui.new({ parent = parent, x = 25, y = 25, w = 50, h = 50, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Child should maintain its absolute coordinates (CSS absolute behavior) luaunit.assertEquals(child.x, 25) luaunit.assertEquals(child.y, 25) luaunit.assertEquals(child.positioning, Positioning.ABSOLUTE) - + -- Parent should have the child luaunit.assertEquals(#parent.children, 1) luaunit.assertEquals(parent.children[1], child) @@ -169,7 +169,7 @@ end -- Test 7: Multiple absolute elements should not interfere function TestAbsolutePositioningBasic:testMultipleAbsoluteElementsNonInterference() local elements = {} - + for i = 1, 5 do elements[i] = Gui.new({ x = i * 10, @@ -177,10 +177,10 @@ function TestAbsolutePositioningBasic:testMultipleAbsoluteElementsNonInterferenc w = 30, h = 40, z = i, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) end - + -- Verify all elements maintain their properties for i = 1, 5 do luaunit.assertEquals(elements[i].x, i * 10) @@ -189,7 +189,7 @@ function TestAbsolutePositioningBasic:testMultipleAbsoluteElementsNonInterferenc luaunit.assertEquals(elements[i].height, 40) luaunit.assertEquals(elements[i].z, i) end - + luaunit.assertEquals(#Gui.topElements, 5) end @@ -200,9 +200,9 @@ function TestAbsolutePositioningBasic:testNegativeCoordinates() y = -100, w = 200, h = 150, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + luaunit.assertEquals(elem.x, -50) luaunit.assertEquals(elem.y, -100) end @@ -214,9 +214,9 @@ function TestAbsolutePositioningBasic:testZeroCoordinates() y = 0, w = 100, h = 100, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + luaunit.assertEquals(elem.x, 0) luaunit.assertEquals(elem.y, 0) end @@ -226,9 +226,9 @@ function TestAbsolutePositioningBasic:testDefaultCoordinates() local elem = Gui.new({ w = 100, h = 100, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Default coordinates should be 0,0 luaunit.assertEquals(elem.x, 0) luaunit.assertEquals(elem.y, 0) @@ -241,9 +241,9 @@ function TestAbsolutePositioningBasic:testElementBounds() y = 200, w = 300, h = 400, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local bounds = elem:getBounds() luaunit.assertEquals(bounds.x, 100) luaunit.assertEquals(bounds.y, 200) @@ -258,23 +258,23 @@ function TestAbsolutePositioningBasic:testParentChildRelationshipAbsolute() y = 100, w = 300, h = 300, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + local child = Gui.new({ parent = parent, x = 50, y = 75, w = 100, h = 150, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Verify parent-child relationship luaunit.assertEquals(child.parent, parent) luaunit.assertEquals(#parent.children, 1) luaunit.assertEquals(parent.children[1], child) - + -- Child should maintain absolute coordinates luaunit.assertEquals(child.x, 50) luaunit.assertEquals(child.y, 75) @@ -285,22 +285,21 @@ function TestAbsolutePositioningBasic:testAbsoluteChildNoParentAutoSizeAffect() local parent = Gui.new({ x = 0, y = 0, - positioning = Positioning.ABSOLUTE - -- No w/h specified, should auto-size + positioning = Positioning.ABSOLUTE, }) - + local originalParentWidth = parent.width local originalParentHeight = parent.height - + local child = Gui.new({ parent = parent, x = 1000, -- Far outside parent y = 1000, w = 500, h = 500, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Parent size should not be affected by absolute positioned child -- (In CSS, absolute children don't affect parent size) luaunit.assertEquals(parent.width, originalParentWidth) @@ -315,30 +314,30 @@ function TestAbsolutePositioningBasic:testAbsoluteNoFlexParticipation() w = 400, h = 200, positioning = Positioning.FLEX, - flexDirection = enums.FlexDirection.HORIZONTAL + flexDirection = enums.FlexDirection.HORIZONTAL, }) - + local flexChild = Gui.new({ parent = flexParent, w = 100, h = 50, - positioning = Positioning.FLEX + positioning = Positioning.FLEX, }) - + local absoluteChild = Gui.new({ parent = flexParent, x = 300, y = 150, w = 80, h = 40, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + -- Absolute child should maintain its coordinates luaunit.assertEquals(absoluteChild.x, 300) luaunit.assertEquals(absoluteChild.y, 150) luaunit.assertEquals(absoluteChild.positioning, Positioning.ABSOLUTE) - + -- Both children should be in parent luaunit.assertEquals(#flexParent.children, 2) end @@ -351,12 +350,12 @@ function TestAbsolutePositioningBasic:testLargeCoordinateValues() w = 100, h = 100, z = 1000, - positioning = Positioning.ABSOLUTE + positioning = Positioning.ABSOLUTE, }) - + luaunit.assertEquals(elem.x, 9999) luaunit.assertEquals(elem.y, 8888) luaunit.assertEquals(elem.z, 1000) end -luaunit.LuaUnit.run() \ No newline at end of file +luaunit.LuaUnit.run()