coverage work
This commit is contained in:
612
testing/__tests__/element_coverage_test.lua
Normal file
612
testing/__tests__/element_coverage_test.lua
Normal file
@@ -0,0 +1,612 @@
|
||||
-- Advanced test suite for Element.lua to increase coverage
|
||||
-- Focuses on uncovered edge cases and complex scenarios
|
||||
|
||||
package.path = package.path .. ";./?.lua;./modules/?.lua"
|
||||
|
||||
require("testing.loveStub")
|
||||
|
||||
local luaunit = require("testing.luaunit")
|
||||
local FlexLove = require("FlexLove")
|
||||
local Color = require("modules.Color")
|
||||
|
||||
-- Initialize FlexLove
|
||||
FlexLove.init()
|
||||
|
||||
-- Test suite for resize behavior with different unit types
|
||||
TestElementResize = {}
|
||||
|
||||
function TestElementResize:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementResize:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementResize:test_resize_with_percentage_units()
|
||||
-- Test that percentage units calculate correctly initially
|
||||
local parent = FlexLove.new({
|
||||
id = "resize_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 1000,
|
||||
height = 500,
|
||||
})
|
||||
|
||||
local child = FlexLove.new({
|
||||
id = "resize_child",
|
||||
width = "50%",
|
||||
height = "50%",
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
-- Initial calculation should be 50% of parent
|
||||
luaunit.assertEquals(child.width, 500)
|
||||
luaunit.assertEquals(child.height, 250)
|
||||
|
||||
-- Verify units are stored correctly
|
||||
luaunit.assertEquals(child.units.width.unit, "%")
|
||||
luaunit.assertEquals(child.units.height.unit, "%")
|
||||
end
|
||||
|
||||
function TestElementResize:test_resize_with_viewport_units()
|
||||
-- Test that viewport units calculate correctly
|
||||
local element = FlexLove.new({
|
||||
id = "vp_resize",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = "50vw",
|
||||
height = "50vh",
|
||||
})
|
||||
|
||||
-- Should be 50% of viewport (1920x1080)
|
||||
luaunit.assertEquals(element.width, 960)
|
||||
luaunit.assertEquals(element.height, 540)
|
||||
|
||||
-- Verify units are stored correctly
|
||||
luaunit.assertEquals(element.units.width.unit, "vw")
|
||||
luaunit.assertEquals(element.units.height.unit, "vh")
|
||||
end
|
||||
|
||||
function TestElementResize:test_resize_with_textSize_scaling()
|
||||
-- Test that textSize with viewport units calculates correctly
|
||||
local element = FlexLove.new({
|
||||
id = "text_resize",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 200,
|
||||
height = 100,
|
||||
text = "Test",
|
||||
textSize = "2vh",
|
||||
autoScaleText = true,
|
||||
})
|
||||
|
||||
-- 2vh of 1080 = 21.6
|
||||
luaunit.assertAlmostEquals(element.textSize, 21.6, 0.1)
|
||||
|
||||
-- Verify unit is stored
|
||||
luaunit.assertEquals(element.units.textSize.unit, "vh")
|
||||
end
|
||||
|
||||
-- Test suite for positioning offset application (top/right/bottom/left)
|
||||
TestElementPositioningOffsets = {}
|
||||
|
||||
function TestElementPositioningOffsets:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementPositioningOffsets:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementPositioningOffsets:test_applyPositioningOffsets_with_absolute()
|
||||
local parent = FlexLove.new({
|
||||
id = "offset_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 500,
|
||||
height = 500,
|
||||
positioning = "absolute",
|
||||
})
|
||||
|
||||
local child = FlexLove.new({
|
||||
id = "offset_child",
|
||||
width = 100,
|
||||
height = 100,
|
||||
positioning = "absolute",
|
||||
top = 50,
|
||||
left = 50,
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
-- Apply positioning offsets
|
||||
parent:applyPositioningOffsets(child)
|
||||
|
||||
-- Child should be offset from parent
|
||||
luaunit.assertTrue(child.y >= parent.y + 50)
|
||||
luaunit.assertTrue(child.x >= parent.x + 50)
|
||||
end
|
||||
|
||||
function TestElementPositioningOffsets:test_applyPositioningOffsets_with_right_bottom()
|
||||
local parent = FlexLove.new({
|
||||
id = "rb_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 500,
|
||||
height = 500,
|
||||
positioning = "relative",
|
||||
})
|
||||
|
||||
local child = FlexLove.new({
|
||||
id = "rb_child",
|
||||
width = 100,
|
||||
height = 100,
|
||||
positioning = "absolute",
|
||||
right = 50,
|
||||
bottom = 50,
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
parent:applyPositioningOffsets(child)
|
||||
|
||||
-- Child should be positioned from right/bottom
|
||||
luaunit.assertNotNil(child.x)
|
||||
luaunit.assertNotNil(child.y)
|
||||
end
|
||||
|
||||
-- Test suite for scroll-related methods
|
||||
TestElementScrollMethods = {}
|
||||
|
||||
function TestElementScrollMethods:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementScrollMethods:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementScrollMethods:test_scrollToTop()
|
||||
local container = FlexLove.new({
|
||||
id = "scroll_container",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 300,
|
||||
height = 200,
|
||||
overflow = "scroll",
|
||||
positioning = "flex",
|
||||
flexDirection = "vertical",
|
||||
})
|
||||
|
||||
-- Add content that overflows
|
||||
for i = 1, 10 do
|
||||
FlexLove.new({
|
||||
id = "item_" .. i,
|
||||
width = 280,
|
||||
height = 50,
|
||||
parent = container,
|
||||
})
|
||||
end
|
||||
|
||||
-- Scroll down first
|
||||
container:setScrollPosition(nil, 100)
|
||||
local _, scrollY = container:getScrollPosition()
|
||||
luaunit.assertEquals(scrollY, 100)
|
||||
|
||||
-- Scroll to top
|
||||
container:scrollToTop()
|
||||
_, scrollY = container:getScrollPosition()
|
||||
luaunit.assertEquals(scrollY, 0)
|
||||
end
|
||||
|
||||
function TestElementScrollMethods:test_scrollToBottom()
|
||||
local container = FlexLove.new({
|
||||
id = "scroll_bottom",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 300,
|
||||
height = 200,
|
||||
overflow = "scroll",
|
||||
positioning = "flex",
|
||||
flexDirection = "vertical",
|
||||
})
|
||||
|
||||
-- Add overflowing content
|
||||
for i = 1, 10 do
|
||||
FlexLove.new({
|
||||
id = "item_" .. i,
|
||||
width = 280,
|
||||
height = 50,
|
||||
parent = container,
|
||||
})
|
||||
end
|
||||
|
||||
container:scrollToBottom()
|
||||
|
||||
local _, scrollY = container:getScrollPosition()
|
||||
local _, maxScrollY = container:getMaxScroll()
|
||||
|
||||
luaunit.assertEquals(scrollY, maxScrollY)
|
||||
end
|
||||
|
||||
function TestElementScrollMethods:test_scrollBy()
|
||||
local container = FlexLove.new({
|
||||
id = "scroll_by",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 300,
|
||||
height = 200,
|
||||
overflow = "scroll",
|
||||
positioning = "flex",
|
||||
flexDirection = "vertical",
|
||||
})
|
||||
|
||||
for i = 1, 10 do
|
||||
FlexLove.new({
|
||||
id = "item_" .. i,
|
||||
width = 280,
|
||||
height = 50,
|
||||
parent = container,
|
||||
})
|
||||
end
|
||||
|
||||
container:scrollBy(nil, 50)
|
||||
local _, scrollY = container:getScrollPosition()
|
||||
luaunit.assertEquals(scrollY, 50)
|
||||
|
||||
container:scrollBy(nil, 25)
|
||||
_, scrollY = container:getScrollPosition()
|
||||
luaunit.assertEquals(scrollY, 75)
|
||||
end
|
||||
|
||||
function TestElementScrollMethods:test_getScrollPercentage()
|
||||
local container = FlexLove.new({
|
||||
id = "scroll_pct",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 300,
|
||||
height = 200,
|
||||
overflow = "scroll",
|
||||
positioning = "flex",
|
||||
flexDirection = "vertical",
|
||||
})
|
||||
|
||||
for i = 1, 10 do
|
||||
FlexLove.new({
|
||||
id = "item_" .. i,
|
||||
width = 280,
|
||||
height = 50,
|
||||
parent = container,
|
||||
})
|
||||
end
|
||||
|
||||
-- At top
|
||||
local _, percentY = container:getScrollPercentage()
|
||||
luaunit.assertEquals(percentY, 0)
|
||||
|
||||
-- Scroll halfway
|
||||
local _, maxScrollY = container:getMaxScroll()
|
||||
container:setScrollPosition(nil, maxScrollY / 2)
|
||||
_, percentY = container:getScrollPercentage()
|
||||
luaunit.assertAlmostEquals(percentY, 0.5, 0.01)
|
||||
end
|
||||
|
||||
-- Test suite for auto-sizing with complex scenarios
|
||||
TestElementComplexAutoSizing = {}
|
||||
|
||||
function TestElementComplexAutoSizing:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementComplexAutoSizing:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementComplexAutoSizing:test_autosize_with_nested_flex()
|
||||
local root = FlexLove.new({
|
||||
id = "root",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
flexDirection = "vertical",
|
||||
})
|
||||
|
||||
local row1 = FlexLove.new({
|
||||
id = "row1",
|
||||
positioning = "flex",
|
||||
flexDirection = "horizontal",
|
||||
parent = root,
|
||||
})
|
||||
|
||||
FlexLove.new({
|
||||
id = "item1",
|
||||
width = 100,
|
||||
height = 50,
|
||||
parent = row1,
|
||||
})
|
||||
|
||||
FlexLove.new({
|
||||
id = "item2",
|
||||
width = 100,
|
||||
height = 50,
|
||||
parent = row1,
|
||||
})
|
||||
|
||||
-- Root should auto-size to contain row
|
||||
luaunit.assertTrue(root.width >= 200)
|
||||
luaunit.assertTrue(root.height >= 50)
|
||||
end
|
||||
|
||||
function TestElementComplexAutoSizing:test_autosize_with_absolutely_positioned_child()
|
||||
local parent = FlexLove.new({
|
||||
id = "abs_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
})
|
||||
|
||||
-- Regular child affects size
|
||||
FlexLove.new({
|
||||
id = "regular",
|
||||
width = 100,
|
||||
height = 100,
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
-- Absolutely positioned child should NOT affect parent size
|
||||
FlexLove.new({
|
||||
id = "absolute",
|
||||
width = 200,
|
||||
height = 200,
|
||||
positioning = "absolute",
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
-- Parent should only size to regular child
|
||||
luaunit.assertTrue(parent.width < 150)
|
||||
luaunit.assertTrue(parent.height < 150)
|
||||
end
|
||||
|
||||
function TestElementComplexAutoSizing:test_autosize_with_margin()
|
||||
local parent = FlexLove.new({
|
||||
id = "margin_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
flexDirection = "horizontal",
|
||||
})
|
||||
|
||||
-- Add two children with margins to test margin collapsing
|
||||
FlexLove.new({
|
||||
id = "margin_child1",
|
||||
width = 100,
|
||||
height = 100,
|
||||
margin = { right = 20 },
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
FlexLove.new({
|
||||
id = "margin_child2",
|
||||
width = 100,
|
||||
height = 100,
|
||||
margin = { left = 20 },
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
-- Parent should size to children (margins don't add to content size in flex layout)
|
||||
luaunit.assertEquals(parent.width, 200)
|
||||
luaunit.assertEquals(parent.height, 100)
|
||||
end
|
||||
|
||||
-- Test suite for theme integration
|
||||
TestElementThemeIntegration = {}
|
||||
|
||||
function TestElementThemeIntegration:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementThemeIntegration:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementThemeIntegration:test_getScaledContentPadding()
|
||||
local element = FlexLove.new({
|
||||
id = "themed",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 200,
|
||||
height = 100,
|
||||
})
|
||||
|
||||
local padding = element:getScaledContentPadding()
|
||||
-- Should return nil if no theme component
|
||||
luaunit.assertNil(padding)
|
||||
end
|
||||
|
||||
function TestElementThemeIntegration:test_getAvailableContentWidth_with_padding()
|
||||
local element = FlexLove.new({
|
||||
id = "content_width",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 200,
|
||||
height = 100,
|
||||
padding = 10,
|
||||
})
|
||||
|
||||
local availableWidth = element:getAvailableContentWidth()
|
||||
-- Should be width minus padding
|
||||
luaunit.assertEquals(availableWidth, 180) -- 200 - 10*2
|
||||
end
|
||||
|
||||
function TestElementThemeIntegration:test_getAvailableContentHeight_with_padding()
|
||||
local element = FlexLove.new({
|
||||
id = "content_height",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 200,
|
||||
height = 100,
|
||||
padding = 10,
|
||||
})
|
||||
|
||||
local availableHeight = element:getAvailableContentHeight()
|
||||
luaunit.assertEquals(availableHeight, 80) -- 100 - 10*2
|
||||
end
|
||||
|
||||
-- Test suite for child management edge cases
|
||||
TestElementChildManagementEdgeCases = {}
|
||||
|
||||
function TestElementChildManagementEdgeCases:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementChildManagementEdgeCases:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementChildManagementEdgeCases:test_addChild_triggers_autosize_recalc()
|
||||
local parent = FlexLove.new({
|
||||
id = "dynamic_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
})
|
||||
|
||||
local initialWidth = parent.width
|
||||
local initialHeight = parent.height
|
||||
|
||||
-- Add child dynamically
|
||||
local child = FlexLove.new({
|
||||
id = "dynamic_child",
|
||||
width = 150,
|
||||
height = 150,
|
||||
})
|
||||
|
||||
parent:addChild(child)
|
||||
|
||||
-- Parent should have resized
|
||||
luaunit.assertTrue(parent.width >= initialWidth)
|
||||
luaunit.assertTrue(parent.height >= initialHeight)
|
||||
end
|
||||
|
||||
function TestElementChildManagementEdgeCases:test_removeChild_triggers_autosize_recalc()
|
||||
local parent = FlexLove.new({
|
||||
id = "shrink_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
})
|
||||
|
||||
local child1 = FlexLove.new({
|
||||
id = "child1",
|
||||
width = 100,
|
||||
height = 100,
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
local child2 = FlexLove.new({
|
||||
id = "child2",
|
||||
width = 100,
|
||||
height = 100,
|
||||
parent = parent,
|
||||
})
|
||||
|
||||
local widthWithTwo = parent.width
|
||||
|
||||
parent:removeChild(child2)
|
||||
|
||||
-- Parent should shrink
|
||||
luaunit.assertTrue(parent.width < widthWithTwo)
|
||||
end
|
||||
|
||||
function TestElementChildManagementEdgeCases:test_clearChildren_resets_autosize()
|
||||
local parent = FlexLove.new({
|
||||
id = "clear_parent",
|
||||
x = 0,
|
||||
y = 0,
|
||||
positioning = "flex",
|
||||
})
|
||||
|
||||
for i = 1, 5 do
|
||||
FlexLove.new({
|
||||
id = "child_" .. i,
|
||||
width = 50,
|
||||
height = 50,
|
||||
parent = parent,
|
||||
})
|
||||
end
|
||||
|
||||
local widthWithChildren = parent.width
|
||||
|
||||
parent:clearChildren()
|
||||
|
||||
-- Parent should shrink to minimal size
|
||||
luaunit.assertTrue(parent.width < widthWithChildren)
|
||||
luaunit.assertEquals(#parent.children, 0)
|
||||
end
|
||||
|
||||
-- Test suite for grid layout edge cases
|
||||
TestElementGridEdgeCases = {}
|
||||
|
||||
function TestElementGridEdgeCases:setUp()
|
||||
love.window.setMode(1920, 1080)
|
||||
FlexLove.beginFrame()
|
||||
end
|
||||
|
||||
function TestElementGridEdgeCases:tearDown()
|
||||
FlexLove.endFrame()
|
||||
end
|
||||
|
||||
function TestElementGridEdgeCases:test_grid_with_uneven_children()
|
||||
local grid = FlexLove.new({
|
||||
id = "uneven_grid",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 300,
|
||||
height = 300,
|
||||
positioning = "grid",
|
||||
gridRows = 2,
|
||||
gridColumns = 2,
|
||||
})
|
||||
|
||||
-- Add only 3 children to a 2x2 grid
|
||||
for i = 1, 3 do
|
||||
FlexLove.new({
|
||||
id = "grid_item_" .. i,
|
||||
width = 50,
|
||||
height = 50,
|
||||
parent = grid,
|
||||
})
|
||||
end
|
||||
|
||||
luaunit.assertEquals(#grid.children, 3)
|
||||
end
|
||||
|
||||
function TestElementGridEdgeCases:test_grid_with_percentage_gaps()
|
||||
local grid = FlexLove.new({
|
||||
id = "pct_gap_grid",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 400,
|
||||
height = 400,
|
||||
positioning = "grid",
|
||||
gridRows = 2,
|
||||
gridColumns = 2,
|
||||
columnGap = "5%",
|
||||
rowGap = "5%",
|
||||
})
|
||||
|
||||
luaunit.assertNotNil(grid.columnGap)
|
||||
luaunit.assertNotNil(grid.rowGap)
|
||||
luaunit.assertTrue(grid.columnGap > 0)
|
||||
luaunit.assertTrue(grid.rowGap > 0)
|
||||
end
|
||||
|
||||
-- Run tests
|
||||
if not _G.RUNNING_ALL_TESTS then
|
||||
os.exit(luaunit.LuaUnit.run())
|
||||
end
|
||||
Reference in New Issue
Block a user