156 lines
4.0 KiB
Lua
156 lines
4.0 KiB
Lua
|
-- Test that awful.widget.only_on_screen works correctly
|
||
|
|
||
|
local runner = require("_runner")
|
||
|
local wibox = require("wibox")
|
||
|
local awful = require("awful")
|
||
|
|
||
|
-- Make sure we have at least two screens to test this on
|
||
|
screen.fake_add(-100, -100, 50, 50)
|
||
|
assert(screen.count() == 2)
|
||
|
|
||
|
-- Each screen gets a wibox displaying our only_on_screen widget
|
||
|
local inner_widget = wibox.widget.textbox("This is only visible on some screen")
|
||
|
local only_widget = awful.widget.only_on_screen()
|
||
|
awful.screen.connect_for_each_screen(function(s)
|
||
|
local geo = s.geometry
|
||
|
-- Just so that :fit() also gets code coverage, we use an align layout
|
||
|
local widget = wibox.layout.align.horizontal(only_widget)
|
||
|
s.testwibox = wibox{
|
||
|
x = geo.x + geo.width / 4,
|
||
|
y = geo.y + geo.height / 4,
|
||
|
width = geo.width / 2,
|
||
|
height = geo.height / 2,
|
||
|
widget = widget,
|
||
|
visible = true,
|
||
|
}
|
||
|
end)
|
||
|
|
||
|
-- Check if the inner_widget is visible on the given screen
|
||
|
local function widget_visible_on(s)
|
||
|
for _, entry in ipairs(s.testwibox:find_widgets(1, 1)) do
|
||
|
if entry.widget == inner_widget then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- Test the widget's constructor
|
||
|
do
|
||
|
local widget = awful.widget.only_on_screen()
|
||
|
assert(widget.screen == "primary")
|
||
|
assert(widget.widget == nil)
|
||
|
|
||
|
widget = awful.widget.only_on_screen(inner_widget, 42)
|
||
|
assert(widget.screen == 42)
|
||
|
assert(widget.widget == inner_widget)
|
||
|
end
|
||
|
|
||
|
local steps = {}
|
||
|
|
||
|
-- Test that the widget "does nothing" when no widget is set
|
||
|
table.insert(steps, function()
|
||
|
-- Idle step so that the testwibox added above is drawn
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
for s in screen do
|
||
|
local res = s.testwibox:find_widgets(1, 1)
|
||
|
assert(#res == 1, #res)
|
||
|
end
|
||
|
return true
|
||
|
end)
|
||
|
|
||
|
-- Test that the widget by default is displayed on the primary screen
|
||
|
table.insert(steps, function()
|
||
|
only_widget.widget = inner_widget
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
assert(only_widget.screen == "primary", only_widget.screen)
|
||
|
for s in screen do
|
||
|
if s == screen.primary then
|
||
|
assert(widget_visible_on(s))
|
||
|
else
|
||
|
assert(not widget_visible_on(s))
|
||
|
end
|
||
|
end
|
||
|
return true
|
||
|
end)
|
||
|
|
||
|
-- Test setting the screen
|
||
|
for s in screen do
|
||
|
local index = s.index
|
||
|
local function check_result()
|
||
|
for t in screen do
|
||
|
assert(widget_visible_on(t) == (t.index == index))
|
||
|
end
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
-- Test by screen object
|
||
|
table.insert(steps, function()
|
||
|
only_widget.screen = s
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, check_result)
|
||
|
|
||
|
-- Test by index
|
||
|
table.insert(steps, function()
|
||
|
only_widget.screen = index
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, check_result)
|
||
|
end
|
||
|
|
||
|
-- Test that the widget is correctly updated when screen "2" is removed
|
||
|
table.insert(steps, function()
|
||
|
only_widget.screen = 2
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
screen[2]:fake_remove()
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
for s in screen do
|
||
|
assert(not widget_visible_on(s))
|
||
|
end
|
||
|
screen.fake_add(-100, -100, 50, 50)
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
for s in screen do
|
||
|
assert(widget_visible_on(s) == (s.index == 2))
|
||
|
end
|
||
|
return true
|
||
|
end)
|
||
|
|
||
|
-- Test what happens when the primary screen is removed
|
||
|
table.insert(steps, function()
|
||
|
only_widget.screen = "primary"
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
local s, s2 = screen.primary, screen[2]
|
||
|
assert(s.index == 1)
|
||
|
s:fake_remove()
|
||
|
assert(screen.primary == s2)
|
||
|
return true
|
||
|
end)
|
||
|
table.insert(steps, function()
|
||
|
assert(only_widget.screen == "primary", only_widget.screen)
|
||
|
for s in screen do
|
||
|
if s == screen.primary then
|
||
|
assert(widget_visible_on(s))
|
||
|
else
|
||
|
assert(not widget_visible_on(s))
|
||
|
end
|
||
|
end
|
||
|
return true
|
||
|
end)
|
||
|
|
||
|
runner.run_steps(steps)
|
||
|
|
||
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|