auto handle late init call(and error report) with element creation queue
This commit is contained in:
170
testing/__tests__/init_queue_test.lua
Normal file
170
testing/__tests__/init_queue_test.lua
Normal file
@@ -0,0 +1,170 @@
|
||||
package.path = package.path .. ";./?.lua;./modules/?.lua"
|
||||
local originalSearchers = package.searchers or package.loaders
|
||||
table.insert(originalSearchers, 2, function(modname)
|
||||
if modname:match("^FlexLove%.modules%.") then
|
||||
local moduleName = modname:gsub("^FlexLove%.modules%.", "")
|
||||
return function()
|
||||
return require("modules." .. moduleName)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Test automatic initialization queue functionality
|
||||
require("testing.loveStub")
|
||||
local luaunit = require("testing.luaunit")
|
||||
local FlexLove = require("FlexLove")
|
||||
|
||||
TestInitQueue = {}
|
||||
|
||||
function TestInitQueue:setUp()
|
||||
-- Reset FlexLove state before each test
|
||||
FlexLove.destroy()
|
||||
-- Reset initialization state
|
||||
FlexLove._initState = "uninitialized"
|
||||
FlexLove.initialized = false
|
||||
FlexLove._initQueue = {}
|
||||
end
|
||||
|
||||
function TestInitQueue:tearDown()
|
||||
FlexLove.destroy()
|
||||
end
|
||||
|
||||
function TestInitQueue:test_elementCreationIsQueuedBeforeInit()
|
||||
-- Element creation before init should be queued
|
||||
local element = FlexLove.new({ text = "Test" })
|
||||
|
||||
-- Should return nil when queued
|
||||
luaunit.assertNil(element)
|
||||
|
||||
-- Queue should have one item
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 1)
|
||||
luaunit.assertEquals(FlexLove._initQueue[1].props.text, "Test")
|
||||
end
|
||||
|
||||
function TestInitQueue:test_queuedElementsCreatedAfterInit()
|
||||
local createdElement = nil
|
||||
|
||||
-- Create element before init with callback
|
||||
FlexLove.new({
|
||||
text = "Queued Element",
|
||||
width = 100,
|
||||
height = 50,
|
||||
}, function(element)
|
||||
createdElement = element
|
||||
end)
|
||||
|
||||
-- Should be queued
|
||||
luaunit.assertNil(createdElement)
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 1)
|
||||
|
||||
-- Initialize FlexLove
|
||||
FlexLove.init()
|
||||
|
||||
-- Callback should have been called with created element
|
||||
luaunit.assertNotNil(createdElement)
|
||||
luaunit.assertEquals(createdElement.text, "Queued Element")
|
||||
luaunit.assertEquals(createdElement.width, 100)
|
||||
luaunit.assertEquals(createdElement.height, 50)
|
||||
|
||||
-- Queue should be empty after init
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 0)
|
||||
end
|
||||
|
||||
function TestInitQueue:test_multipleElementsQueuedAndCreated()
|
||||
local elements = {}
|
||||
|
||||
-- Queue multiple elements
|
||||
for i = 1, 5 do
|
||||
FlexLove.new({
|
||||
text = "Element " .. i,
|
||||
width = i * 10,
|
||||
}, function(element)
|
||||
table.insert(elements, element)
|
||||
end)
|
||||
end
|
||||
|
||||
-- All should be queued
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 5)
|
||||
luaunit.assertEquals(#elements, 0)
|
||||
|
||||
-- Initialize
|
||||
FlexLove.init()
|
||||
|
||||
-- All should be created
|
||||
luaunit.assertEquals(#elements, 5)
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 0)
|
||||
|
||||
-- Verify properties
|
||||
for i = 1, 5 do
|
||||
luaunit.assertEquals(elements[i].text, "Element " .. i)
|
||||
luaunit.assertEquals(elements[i].width, i * 10)
|
||||
end
|
||||
end
|
||||
|
||||
function TestInitQueue:test_elementCreatedImmediatelyAfterInit()
|
||||
-- Initialize first
|
||||
FlexLove.init()
|
||||
|
||||
-- Element creation after init should work immediately
|
||||
local element = FlexLove.new({ text = "Immediate" })
|
||||
|
||||
-- Should return element, not nil
|
||||
luaunit.assertNotNil(element)
|
||||
luaunit.assertEquals(element.text, "Immediate")
|
||||
|
||||
-- Queue should remain empty
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 0)
|
||||
end
|
||||
|
||||
function TestInitQueue:test_isReadyReturnsFalseBeforeInit()
|
||||
luaunit.assertFalse(FlexLove.isReady())
|
||||
luaunit.assertEquals(FlexLove._initState, "uninitialized")
|
||||
end
|
||||
|
||||
function TestInitQueue:test_isReadyReturnsTrueAfterInit()
|
||||
FlexLove.init()
|
||||
|
||||
luaunit.assertTrue(FlexLove.isReady())
|
||||
luaunit.assertEquals(FlexLove._initState, "ready")
|
||||
end
|
||||
|
||||
function TestInitQueue:test_callbackErrorDoesNotStopQueue()
|
||||
local elements = {}
|
||||
|
||||
-- First element with failing callback
|
||||
FlexLove.new({ text = "Element 1" }, function(element)
|
||||
table.insert(elements, element)
|
||||
error("Intentional error")
|
||||
end)
|
||||
|
||||
-- Second element with working callback
|
||||
FlexLove.new({ text = "Element 2" }, function(element)
|
||||
table.insert(elements, element)
|
||||
end)
|
||||
|
||||
-- Initialize (errors should be caught and logged)
|
||||
FlexLove.init()
|
||||
|
||||
-- Both elements should have been created despite error
|
||||
luaunit.assertEquals(#elements, 2)
|
||||
luaunit.assertEquals(elements[1].text, "Element 1")
|
||||
luaunit.assertEquals(elements[2].text, "Element 2")
|
||||
end
|
||||
|
||||
function TestInitQueue:test_queueWithoutCallback()
|
||||
-- Element without callback
|
||||
FlexLove.new({ text = "No Callback" })
|
||||
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 1)
|
||||
luaunit.assertNil(FlexLove._initQueue[1].callback)
|
||||
|
||||
-- Should still be created after init
|
||||
FlexLove.init()
|
||||
|
||||
luaunit.assertEquals(#FlexLove._initQueue, 0)
|
||||
-- Element was created, just no way to reference it without callback
|
||||
end
|
||||
|
||||
if not _G.RUNNING_ALL_TESTS then
|
||||
os.exit(luaunit.LuaUnit.run())
|
||||
end
|
||||
Reference in New Issue
Block a user