Files
FlexLove/testing/__tests__/29_drag_event_tests.lua
2025-11-11 13:13:22 -05:00

283 lines
7.3 KiB
Lua

-- Drag Event Tests
-- Tests for the new drag event functionality
package.path = package.path .. ";?.lua"
local lu = require("testing.luaunit")
require("testing.loveStub")
local FlexLove = require("FlexLove")
local Gui = FlexLove.Gui
TestDragEvent = {}
function TestDragEvent:setUp()
-- Initialize GUI before each test
Gui.init({ baseScale = { width = 1920, height = 1080 } })
love.window.setMode(1920, 1080)
Gui.resize(1920, 1080) -- Recalculate scale factors after setMode
end
function TestDragEvent:tearDown()
-- Clean up after each test
Gui.destroy()
end
-- Test 1: Drag event is fired when mouse moves while pressed
function TestDragEvent:test_drag_event_fired_on_mouse_movement()
local dragEventReceived = false
local dragEvent = nil
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
dragEventReceived = true
dragEvent = event
end
end,
})
-- Simulate mouse press
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
-- Move mouse while pressed (drag)
love.mouse.setPosition(160, 155)
element:update(0.016)
lu.assertTrue(dragEventReceived, "Drag event should be fired when mouse moves while pressed")
lu.assertNotNil(dragEvent, "Drag event object should exist")
end
-- Test 2: Drag event contains dx and dy fields
function TestDragEvent:test_drag_event_contains_delta_values()
local dragEvent = nil
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
dragEvent = event
end
end,
})
-- Simulate mouse press at (150, 150)
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
-- Move mouse to (160, 155) - delta should be (10, 5)
love.mouse.setPosition(160, 155)
element:update(0.016)
lu.assertNotNil(dragEvent, "Drag event should be received")
lu.assertNotNil(dragEvent.dx, "Drag event should have dx field")
lu.assertNotNil(dragEvent.dy, "Drag event should have dy field")
lu.assertEquals(dragEvent.dx, 10, "dx should be 10 (160 - 150)")
lu.assertEquals(dragEvent.dy, 5, "dy should be 5 (155 - 150)")
end
-- Test 3: Drag event updates dx/dy as mouse continues to move
function TestDragEvent:test_drag_event_updates_delta_continuously()
local dragEvents = {}
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
table.insert(dragEvents, { dx = event.dx, dy = event.dy })
end
end,
})
-- Press at (150, 150)
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
-- Move to (160, 155)
love.mouse.setPosition(160, 155)
element:update(0.016)
-- Move to (170, 160)
love.mouse.setPosition(170, 160)
element:update(0.016)
lu.assertEquals(#dragEvents, 2, "Should receive 2 drag events")
lu.assertEquals(dragEvents[1].dx, 10, "First drag dx should be 10")
lu.assertEquals(dragEvents[1].dy, 5, "First drag dy should be 5")
lu.assertEquals(dragEvents[2].dx, 20, "Second drag dx should be 20 (170 - 150)")
lu.assertEquals(dragEvents[2].dy, 10, "Second drag dy should be 10 (160 - 150)")
end
-- Test 4: No drag event when mouse doesn't move
function TestDragEvent:test_no_drag_event_when_mouse_stationary()
local dragEventCount = 0
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
dragEventCount = dragEventCount + 1
end
end,
})
-- Press at (150, 150)
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
-- Update again without moving mouse
element:update(0.016)
element:update(0.016)
lu.assertEquals(dragEventCount, 0, "Should not receive drag events when mouse doesn't move")
end
-- Test 5: Drag tracking is cleaned up on release
function TestDragEvent:test_drag_tracking_cleaned_up_on_release()
local dragEvents = {}
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
table.insert(dragEvents, { dx = event.dx, dy = event.dy })
end
end,
})
-- First drag sequence
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
love.mouse.setPosition(160, 155)
element:update(0.016)
-- Release
love.mouse.setDown(1, false)
element:update(0.016)
-- Second drag sequence - should start fresh
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
love.mouse.setPosition(155, 152)
element:update(0.016)
lu.assertEquals(#dragEvents, 2, "Should receive 2 drag events total")
lu.assertEquals(dragEvents[1].dx, 10, "First drag dx should be 10")
lu.assertEquals(dragEvents[2].dx, 5, "Second drag dx should be 5 (new drag start)")
end
-- Test 6: Drag works with different mouse buttons
function TestDragEvent:test_drag_works_with_different_buttons()
local dragEvents = {}
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
table.insert(dragEvents, { button = event.button, dx = event.dx })
end
end,
})
-- Right button drag
-- Make sure no other buttons are down
love.mouse.setDown(1, false)
love.mouse.setDown(3, false)
love.mouse.setPosition(150, 150)
love.mouse.setDown(2, true)
element:update(0.016)
love.mouse.setPosition(160, 150)
element:update(0.016)
lu.assertEquals(#dragEvents, 1, "Should receive drag event for right button")
lu.assertEquals(dragEvents[1].button, 2, "Drag event should be for button 2")
lu.assertEquals(dragEvents[1].dx, 10, "Drag dx should be 10")
end
-- Test 7: Drag event contains correct mouse position
function TestDragEvent:test_drag_event_contains_mouse_position()
local dragEvent = nil
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
dragEvent = event
end
end,
})
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
love.mouse.setPosition(175, 165)
element:update(0.016)
lu.assertNotNil(dragEvent, "Drag event should be received")
lu.assertEquals(dragEvent.x, 175, "Drag event x should match current mouse x")
lu.assertEquals(dragEvent.y, 165, "Drag event y should match current mouse y")
end
-- Test 8: No drag event when mouse leaves element
function TestDragEvent:test_no_drag_when_mouse_leaves_element()
local dragEventCount = 0
local element = Gui.new({
x = 100,
y = 100,
width = 200,
height = 100,
onEvent = function(el, event)
if event.type == "drag" then
dragEventCount = dragEventCount + 1
end
end,
})
-- Press inside element
love.mouse.setPosition(150, 150)
love.mouse.setDown(1, true)
element:update(0.016)
-- Move outside element
love.mouse.setPosition(50, 50)
element:update(0.016)
lu.assertEquals(dragEventCount, 0, "Should not receive drag events when mouse leaves element")
end
lu.LuaUnit.run()