Files
FlexLove/testing/__tests__/10_animation_and_transform.lua
Michael Freno d5f85e82d1 tests
2025-09-18 18:27:57 -04:00

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()