continuing testing
This commit is contained in:
490
testing/__tests__/grid_test.lua
Normal file
490
testing/__tests__/grid_test.lua
Normal file
@@ -0,0 +1,490 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user