Files
FlexLove/testing/__tests__/grid_test.lua
Michael Freno 472bf358f4 more testing
2025-11-15 02:02:02 -05:00

491 lines
13 KiB
Lua

-- Test suite for Grid layout functionality
-- Grid layout has 0% test coverage despite being integrated into the system
package.path = package.path .. ";./?.lua;./modules/?.lua"
require("testing.loveStub")
local luaunit = require("testing.luaunit")
local FlexLove = require("FlexLove")
TestGridLayout = {}
function TestGridLayout:setUp()
FlexLove.beginFrame(1920, 1080)
end
function TestGridLayout:tearDown()
FlexLove.endFrame()
end
-- Test basic grid layout with default 1x1 grid
function TestGridLayout:test_default_grid_single_child()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 300,
positioning = "grid",
-- Default: gridRows=1, gridColumns=1
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 50, -- Will be stretched by grid
height = 50,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Child should be stretched to fill the entire grid cell
luaunit.assertEquals(child.x, 0, "Child should be at x=0")
luaunit.assertEquals(child.y, 0, "Child should be at y=0")
luaunit.assertEquals(child.width, 400, "Child should be stretched to container width")
luaunit.assertEquals(child.height, 300, "Child should be stretched to container height")
end
-- Test 2x2 grid layout
function TestGridLayout:test_2x2_grid_four_children()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
local children = {}
for i = 1, 4 do
children[i] = FlexLove.new({
id = "child" .. i,
parent = container,
width = 50,
height = 50,
})
end
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Each cell should be 200x200
-- Child 1: top-left (0, 0)
luaunit.assertEquals(children[1].x, 0, "Child 1 should be at x=0")
luaunit.assertEquals(children[1].y, 0, "Child 1 should be at y=0")
luaunit.assertEquals(children[1].width, 200, "Cell width should be 200")
luaunit.assertEquals(children[1].height, 200, "Cell height should be 200")
-- Child 2: top-right (200, 0)
luaunit.assertEquals(children[2].x, 200, "Child 2 should be at x=200")
luaunit.assertEquals(children[2].y, 0, "Child 2 should be at y=0")
-- Child 3: bottom-left (0, 200)
luaunit.assertEquals(children[3].x, 0, "Child 3 should be at x=0")
luaunit.assertEquals(children[3].y, 200, "Child 3 should be at y=200")
-- Child 4: bottom-right (200, 200)
luaunit.assertEquals(children[4].x, 200, "Child 4 should be at x=200")
luaunit.assertEquals(children[4].y, 200, "Child 4 should be at y=200")
end
-- Test grid with column and row gaps
function TestGridLayout:test_grid_with_gaps()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 420, -- 2 cells * 200 + 1 gap * 20
height = 320, -- 2 cells * 150 + 1 gap * 20
positioning = "grid",
gridRows = 2,
gridColumns = 2,
columnGap = 20,
rowGap = 20,
})
local children = {}
for i = 1, 4 do
children[i] = FlexLove.new({
id = "child" .. i,
parent = container,
width = 50,
height = 50,
})
end
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Cell size: (420 - 20) / 2 = 200, (320 - 20) / 2 = 150
luaunit.assertEquals(children[1].width, 200, "Cell width should be 200")
luaunit.assertEquals(children[1].height, 150, "Cell height should be 150")
-- Child 2 should be offset by cell width + gap
luaunit.assertEquals(children[2].x, 220, "Child 2 x = 200 + 20 gap")
luaunit.assertEquals(children[2].y, 0, "Child 2 should be at y=0")
-- Child 3 should be offset by cell height + gap
luaunit.assertEquals(children[3].x, 0, "Child 3 should be at x=0")
luaunit.assertEquals(children[3].y, 170, "Child 3 y = 150 + 20 gap")
end
-- Test grid with more children than cells (overflow)
function TestGridLayout:test_grid_overflow_children()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 200,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
-- Only 4 cells available
})
local children = {}
for i = 1, 6 do -- 6 children, but only 4 cells
children[i] = FlexLove.new({
id = "child" .. i,
parent = container,
width = 50,
height = 50,
})
end
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- First 4 children should be positioned
luaunit.assertNotNil(children[1].x, "Child 1 should be positioned")
luaunit.assertNotNil(children[4].x, "Child 4 should be positioned")
-- Children 5 and 6 should NOT be positioned (or positioned at 0,0 by default)
-- This tests the overflow behavior: row >= rows breaks the loop
end
-- Test grid with alignItems center
function TestGridLayout:test_grid_align_center()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
alignItems = "center",
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 100,
height = 100,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Cell is 200x200, child is 100x100, should be centered
-- Center position: (200 - 100) / 2 = 50
luaunit.assertEquals(child.x, 50, "Child should be centered horizontally in cell")
luaunit.assertEquals(child.y, 50, "Child should be centered vertically in cell")
luaunit.assertEquals(child.width, 100, "Child width should not be stretched")
luaunit.assertEquals(child.height, 100, "Child height should not be stretched")
end
-- Test grid with alignItems flex-start
function TestGridLayout:test_grid_align_flex_start()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
alignItems = "flex-start",
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 100,
height = 100,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Child should be at top-left of cell
luaunit.assertEquals(child.x, 0, "Child should be at left of cell")
luaunit.assertEquals(child.y, 0, "Child should be at top of cell")
luaunit.assertEquals(child.width, 100, "Child width should not be stretched")
luaunit.assertEquals(child.height, 100, "Child height should not be stretched")
end
-- Test grid with alignItems flex-end
function TestGridLayout:test_grid_align_flex_end()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
alignItems = "flex-end",
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 100,
height = 100,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Cell is 200x200, child is 100x100, should be at bottom-right
luaunit.assertEquals(child.x, 100, "Child should be at right of cell (200 - 100)")
luaunit.assertEquals(child.y, 100, "Child should be at bottom of cell (200 - 100)")
luaunit.assertEquals(child.width, 100, "Child width should not be stretched")
luaunit.assertEquals(child.height, 100, "Child height should not be stretched")
end
-- Test grid with padding
function TestGridLayout:test_grid_with_padding()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 500, -- Total width
height = 500,
padding = { top = 50, right = 50, bottom = 50, left = 50 },
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 50,
height = 50,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Available space: 500 - 50 - 50 = 400
-- Cell size: 400 / 2 = 200
-- Child should be positioned at padding.left, padding.top
luaunit.assertEquals(child.x, 50, "Child x should account for left padding")
luaunit.assertEquals(child.y, 50, "Child y should account for top padding")
luaunit.assertEquals(child.width, 200, "Cell width should be 200")
luaunit.assertEquals(child.height, 200, "Cell height should be 200")
end
-- Test grid with absolutely positioned child (should be skipped in grid layout)
function TestGridLayout:test_grid_with_absolute_child()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
-- Regular child
local child1 = FlexLove.new({
id = "child1",
parent = container,
width = 50,
height = 50,
})
-- Absolutely positioned child (should be ignored by grid layout)
local child2 = FlexLove.new({
id = "child2",
parent = container,
positioning = "absolute",
x = 10,
y = 10,
width = 30,
height = 30,
})
-- Another regular child
local child3 = FlexLove.new({
id = "child3",
parent = container,
width = 50,
height = 50,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- child1 should be in first grid cell (0, 0)
luaunit.assertEquals(child1.x, 0, "Child 1 should be at x=0")
luaunit.assertEquals(child1.y, 0, "Child 1 should be at y=0")
-- child2 should keep its absolute position
luaunit.assertEquals(child2.x, 10, "Absolute child should keep x=10")
luaunit.assertEquals(child2.y, 10, "Absolute child should keep y=10")
-- child3 should be in second grid cell (200, 0), not third
luaunit.assertEquals(child3.x, 200, "Child 3 should be in second cell at x=200")
luaunit.assertEquals(child3.y, 0, "Child 3 should be in second cell at y=0")
end
-- Test edge case: empty grid
function TestGridLayout:test_empty_grid()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
-- No children
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Should not crash
luaunit.assertEquals(#container.children, 0, "Grid should have no children")
end
-- Test edge case: grid with 0 columns or rows
function TestGridLayout:test_grid_zero_dimensions()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 0, -- Invalid: 0 rows
gridColumns = 0, -- Invalid: 0 columns
})
local child = FlexLove.new({
id = "child1",
parent = container,
width = 50,
height = 50,
})
-- This might cause division by zero or other errors
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Test passes if it doesn't crash
luaunit.assertTrue(true, "Grid with 0 dimensions should not crash")
end
-- Test nested grids
function TestGridLayout:test_nested_grids()
local outerGrid = FlexLove.new({
id = "outer",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
-- First cell contains another grid
local innerGrid = FlexLove.new({
id = "inner",
parent = outerGrid,
width = 200,
height = 200,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
-- Add children to inner grid
for i = 1, 4 do
FlexLove.new({
id = "inner_child" .. i,
parent = innerGrid,
width = 25,
height = 25,
})
end
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Inner grid should be positioned in first cell of outer grid
luaunit.assertEquals(innerGrid.x, 0, "Inner grid should be at x=0")
luaunit.assertEquals(innerGrid.y, 0, "Inner grid should be at y=0")
luaunit.assertEquals(#innerGrid.children, 4, "Inner grid should have 4 children")
end
-- Test grid with reserved space from absolute children
function TestGridLayout:test_grid_with_reserved_space()
local container = FlexLove.new({
id = "grid",
x = 0,
y = 0,
width = 400,
height = 400,
positioning = "grid",
gridRows = 2,
gridColumns = 2,
})
-- Absolute child with left positioning (reserves left space)
FlexLove.new({
id = "absolute_left",
parent = container,
positioning = "absolute",
left = 0,
top = 0,
width = 50,
height = 50,
})
-- Regular grid child
local child1 = FlexLove.new({
id = "child1",
parent = container,
width = 50,
height = 50,
})
FlexLove.endFrame()
FlexLove.beginFrame(1920, 1080)
-- Grid should account for reserved space
-- Available width: 400 - 50 (reserved left) = 350
-- Cell width: 350 / 2 = 175
-- Child should start at x = reserved left = 50
luaunit.assertEquals(child1.x, 50, "Child should be offset by reserved left space")
luaunit.assertEquals(child1.width, 175, "Cell width should account for reserved space")
end
if not _G.RUNNING_ALL_TESTS then
os.exit(luaunit.LuaUnit.run())
end