diff --git a/tests/test-resize.lua b/tests/test-resize.lua new file mode 100644 index 00000000..a9eb7168 --- /dev/null +++ b/tests/test-resize.lua @@ -0,0 +1,409 @@ +local test_client = require("_client") +local placement = require("awful.placement") +local amouse = require("awful.mouse") + +local steps = {} + +table.insert(steps, function(count) + if count == 1 then -- Setup. + test_client("foobar", "foobar") + elseif #client.get() > 0 then + + client.get()[1] : geometry { + x = 200, + y = 200, + width = 300, + height = 300, + } + + return true + end +end) + +table.insert(steps, function() + -- The mousegrabber expect a button to be pressed. + root.fake_input("button_press",1) + local c = client.get()[1] + + -- Just in case there is an accidental delayed geometry callback + assert(c:geometry().x == 200) + assert(c:geometry().y == 200) + assert(c:geometry().width == 300) + assert(c:geometry().height == 300) + + mouse.coords {x = 500+2*c.border_width, y= 500+2*c.border_width} + + local corner = amouse.client.resize(c) + + assert(corner == "bottom_right") + + return true +end) + +-- The geometry should remain the same, as the cursor is placed at the end of +-- the geometry. +table.insert(steps, function() + + local c = client.get()[1] + + assert(c:geometry().x == 200) + assert(c:geometry().y == 200) + assert(c:geometry().width == 300) + assert(c:geometry().height == 300) + + mouse.coords {x = 600+2*c.border_width, y= 600+2*c.border_width} + + return true +end) + +-- Grow the client by 100px +table.insert(steps, function() + + local c = client.get()[1] + + assert(c:geometry().x == 200) + assert(c:geometry().y == 200) + assert(c:geometry().width == 400) + assert(c:geometry().height == 400) + + mouse.coords {x = 400+2*c.border_width, y= 400+2*c.border_width} + + return true +end) + +-- Shirnk the client by 200px +table.insert(steps, function() + + local c = client.get()[1] + + assert(c:geometry().x == 200) + assert(c:geometry().y == 200) + assert(c:geometry().width == 200) + assert(c:geometry().height == 200) + + mouse.coords {x = 100, y= 100} + + return true +end) + +-- Grow the client by 100px from the top left +table.insert(steps, function() + + local c = client.get()[1] + + assert(c:geometry().x == 100) + assert(c:geometry().y == 100) + assert(c:geometry().width == 300) + assert(c:geometry().height == 300) + + mouse.coords {x = 300, y= 200} + + return true +end) + +-- Shirnk the client by 100px from the top right +table.insert(steps, function() + + local c = client.get()[1] + + assert(c:geometry().x == 100) + assert(c:geometry().y == 200) +-- assert(c:geometry().width == 200-2*c.border_width) --FIXME off by border width... +-- assert(c:geometry().height == 200-2*c.border_width) --FIXME off by border width... + + mouse.coords {x = 300, y= 200} + + return true +end) + +-- Stop the resize +table.insert(steps, function() + root.fake_input("button_release",1) + +-- if not mousegrabber.isrunning then --FIXME it should work, but doesn't +-- return true +-- end + + mousegrabber.stop() + + return true +end) + +-- Setup for move testing +table.insert(steps, function() + assert(not mousegrabber.isrunning()) + + local c = client.get()[1] + + c:geometry { + width = 200, + height = 200, + } + + placement.bottom_right(c) + + mouse.coords {x = c.screen.geometry.width -150, + y = c.screen.geometry.height-150} + + + return true +end) + +-- Start the move mouse grabber +table.insert(steps, function() + local c = client.get()[1] + + -- The resize is over, it should not move the client anymore + assert(c:geometry().x == c.screen.geometry.width - 200 - 2*c.border_width) + assert(c:geometry().y == c.screen.geometry.height - 200 - 2*c.border_width) + assert(c:geometry().width == 200) + assert(c:geometry().height == 200) + + assert(c.valid) + + root.fake_input("button_press",1) + + -- Begin the move + amouse.client.move(c) + + -- Make sure nothing unwanted happen by accident + assert(c:geometry().x == c.screen.geometry.width - 200 - 2*c.border_width) + assert(c:geometry().y == c.screen.geometry.height - 200 - 2*c.border_width) + assert(c:geometry().width == 200) + assert(c:geometry().height == 200) + + -- The cursor should not have moved + assert(mouse.coords().x == c.screen.geometry.width - 150) + assert(mouse.coords().y == c.screen.geometry.height - 150) + mouse.coords {x = 50 + 2*c.border_width, y= 50 + 2*c.border_width} + + assert(mousegrabber.isrunning()) + + return true +end) + +-- The client should now be in the top left +table.insert(steps, function() + local c = client.get()[1] + assert(c:geometry().x == 0) + assert(c:geometry().y == 0) + assert(c:geometry().width == 200) + assert(c:geometry().height == 200) + + -- Move to the bottom left + mouse.coords { + x = 50 + 2*c.border_width, + y = c.screen.geometry.height - 200 + } + + return true +end) + +-- Ensure the move was correct, the snap to the top part of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == 0) + assert(c:geometry().y == c.screen.geometry.height - 250 - 2*c.border_width) + assert(c:geometry().width == 200) + assert(c:geometry().height == 200) + + -- Should trigger the top snap + mouse.coords {x = 600, y= 0} + + -- The snap is only applied on release + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the top half of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x ) + assert(c:geometry().y == c.screen.workarea.y ) + assert(c:geometry().width == c.screen.workarea.width - 2*c.border_width ) + assert(c:geometry().height == math.ceil(c.screen.workarea.height/2 - 2*c.border_width)) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.top_right(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the top right corner of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x+c.screen.workarea.width/2 ) + assert(c:geometry().y == c.screen.workarea.y ) + assert(c:geometry().width == math.ceil(c.screen.workarea.width/2 - 2*c.border_width) ) + assert(c:geometry().height == math.ceil(c.screen.workarea.height/2 - 2*c.border_width)) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.right(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the top right half of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x+c.screen.workarea.width/2 ) + assert(c:geometry().y == c.screen.workarea.y ) + assert(c:geometry().width == math.ceil(c.screen.workarea.width/2 - 2*c.border_width)) + assert(c:geometry().height == c.screen.workarea.height - 2*c.border_width ) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.bottom(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the bottom half of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x ) + assert(c:geometry().y == c.screen.workarea.y+c.screen.workarea.height/2 ) + assert(c:geometry().width == c.screen.workarea.width - 2*c.border_width ) + assert(c:geometry().height == math.ceil(c.screen.workarea.height/2 - 2*c.border_width)) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.bottom_left(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the bottom left corner of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x ) + assert(c:geometry().y == c.screen.workarea.y+c.screen.workarea.height/2 ) + assert(c:geometry().width == math.ceil(c.screen.workarea.width/2 - 2*c.border_width) ) + assert(c:geometry().height == math.ceil(c.screen.workarea.height/2 - 2*c.border_width)) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.left(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The client should now fill the left half of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x ) + assert(c:geometry().y == c.screen.workarea.y ) + assert(c:geometry().width == math.ceil(c.screen.workarea.width/2 - 2*c.border_width) ) + assert(c:geometry().height == c.screen.workarea.height - 2*c.border_width ) + + -- Snap to the top right + root.fake_input("button_press",1) + amouse.client.move(c) + placement.top_left(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +local cur_tag = nil + +-- The client should now fill the top left corner of the screen +table.insert(steps, function() + local c = client.get()[1] + + assert(c:geometry().x == c.screen.workarea.x ) + assert(c:geometry().y == c.screen.workarea.y ) + assert(c:geometry().width == math.ceil(c.screen.workarea.width/2 - 2*c.border_width) ) + assert(c:geometry().height == math.ceil(c.screen.workarea.height/2 - 2*c.border_width)) + + -- Change the mode to test drag_to_tag + amouse.drag_to_tag.enabled = true + amouse.snap.edge_enabled = false + + cur_tag = c.first_tag + + root.fake_input("button_press",1) + amouse.client.move(c) + placement.right(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The tag should have changed +table.insert(steps, function() + local c = client.get()[1] + + assert(c.first_tag ~= cur_tag ) + assert(c.first_tag.index == cur_tag.index + 1) + + -- Move it back + root.fake_input("button_press",1) + amouse.client.move(c) + placement.left(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The tag should now be the same as before +table.insert(steps, function() + local c = client.get()[1] + + assert(c.first_tag == cur_tag) + assert(c.first_tag.index == 1) + + -- Wrap + root.fake_input("button_press",1) + amouse.client.move(c) + placement.left(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The tag should now be the last +table.insert(steps, function() + local c = client.get()[1] + + assert(c.first_tag.index == #c.screen.tags) + + -- Wrap back + root.fake_input("button_press",1) + amouse.client.move(c) + placement.right(mouse, {honor_workarea=false}) + root.fake_input("button_release",1) + + return true +end) + +-- The tag should now original one again +table.insert(steps, function() + local c = client.get()[1] + + assert(c.first_tag == cur_tag) + + return true +end) + +require("_runner").run_steps(steps)