awesome/tests/test-resize.lua

409 lines
12 KiB
Lua

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 == math.ceil(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 == math.ceil(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 == math.ceil(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 == math.ceil(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)