217 lines
4.9 KiB
Lua
217 lines
4.9 KiB
Lua
package.path = package.path .. ";?.lua"
|
|
|
|
local luaunit = require("testing/luaunit")
|
|
require("testing/loveStub") -- Required to mock LOVE functions
|
|
local FlexLove = require("FlexLove")
|
|
|
|
-- Create test cases
|
|
TestAnimationAndTransform = {}
|
|
|
|
function TestAnimationAndTransform:setUp()
|
|
self.GUI = FlexLove.GUI
|
|
end
|
|
|
|
function TestAnimationAndTransform:testBasicTranslation()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Test translate transformation
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.translate)
|
|
element:translate(50, 30)
|
|
luaunit.assertEquals(element.x, 50)
|
|
luaunit.assertEquals(element.y, 30)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testScale()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Test scale transformation
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.scale)
|
|
element:scale(2, 1.5)
|
|
luaunit.assertEquals(element.width, 200)
|
|
luaunit.assertEquals(element.height, 150)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testRotation()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Test rotation transformation (in radians)
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.rotate)
|
|
local angle = math.pi / 4 -- 45 degrees
|
|
element:rotate(angle)
|
|
luaunit.assertNotNil(element.rotation)
|
|
luaunit.assertEquals(element.rotation, angle)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testAnimationTweening()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Start position animation
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.animate)
|
|
luaunit.assertNotNil(element.update)
|
|
element:animate({
|
|
x = 200,
|
|
y = 150,
|
|
duration = 1.0,
|
|
easing = "linear",
|
|
})
|
|
|
|
-- Test initial state
|
|
luaunit.assertEquals(element.x, 0)
|
|
luaunit.assertEquals(element.y, 0)
|
|
|
|
-- Simulate time passing (0.5 seconds)
|
|
element:update(0.5)
|
|
|
|
-- Test mid-animation state (linear interpolation)
|
|
luaunit.assertEquals(element.x, 100) -- Half way there
|
|
luaunit.assertEquals(element.y, 75) -- Half way there
|
|
end
|
|
|
|
function TestAnimationAndTransform:testChainedTransformations()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Apply multiple transformations in sequence
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.translate)
|
|
luaunit.assertNotNil(element.scale)
|
|
luaunit.assertNotNil(element.rotate)
|
|
element:translate(50, 50):scale(2, 2):rotate(math.pi / 2)
|
|
|
|
-- Verify final state
|
|
luaunit.assertEquals(element.x, 50)
|
|
luaunit.assertEquals(element.y, 50)
|
|
luaunit.assertEquals(element.width, 200)
|
|
luaunit.assertEquals(element.height, 200)
|
|
luaunit.assertNotNil(element.rotation)
|
|
luaunit.assertEquals(element.rotation, math.pi / 2)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testAnimationCancellation()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Start animation
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.animate)
|
|
luaunit.assertNotNil(element.update)
|
|
luaunit.assertNotNil(element.stopAnimation)
|
|
element:animate({
|
|
x = 200,
|
|
y = 200,
|
|
duration = 2.0,
|
|
})
|
|
|
|
-- Update partially
|
|
element:update(0.5)
|
|
|
|
-- Cancel animation
|
|
element:stopAnimation()
|
|
|
|
-- Position should remain at last updated position
|
|
local x = element.x
|
|
local y = element.y
|
|
|
|
-- Update again to ensure animation stopped
|
|
element:update(0.5)
|
|
|
|
luaunit.assertEquals(element.x, x)
|
|
luaunit.assertEquals(element.y, y)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testMultiplePropertyAnimation()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
alpha = 1.0,
|
|
})
|
|
|
|
-- Animate multiple properties simultaneously
|
|
luaunit.assertNotNil(element)
|
|
luaunit.assertNotNil(element.animate)
|
|
luaunit.assertNotNil(element.update)
|
|
element:animate({
|
|
x = 200,
|
|
y = 200,
|
|
width = 200,
|
|
height = 200,
|
|
alpha = 0.5,
|
|
duration = 1.0,
|
|
easing = "linear",
|
|
})
|
|
|
|
-- Update halfway
|
|
element:update(0.5)
|
|
|
|
-- Test all properties at midpoint
|
|
luaunit.assertEquals(element.x, 100)
|
|
luaunit.assertEquals(element.y, 100)
|
|
luaunit.assertEquals(element.width, 150)
|
|
luaunit.assertEquals(element.height, 150)
|
|
luaunit.assertNotNil(element.alpha)
|
|
luaunit.assertEquals(element.alpha, 0.75)
|
|
end
|
|
|
|
function TestAnimationAndTransform:testEasingFunctions()
|
|
local element = self.GUI.new({
|
|
x = 0,
|
|
y = 0,
|
|
w = 100,
|
|
h = 100,
|
|
})
|
|
|
|
-- Test different easing functions
|
|
local easings = { "linear", "easeInQuad", "easeOutQuad", "easeInOutQuad" }
|
|
|
|
for _, easing in ipairs(easings) do
|
|
element.x = 0
|
|
luaunit.assertNotNil(element.animate)
|
|
element:animate({
|
|
x = 100,
|
|
duration = 1.0,
|
|
easing = easing,
|
|
})
|
|
|
|
element:update(0.5)
|
|
|
|
-- Ensure animation is progressing (exact values depend on easing function)
|
|
luaunit.assertTrue(element.x > 0 and element.x < 100)
|
|
end
|
|
end
|
|
|
|
luaunit.LuaUnit.run()
|