-- Tests for screen additions & removals local runner = require("_runner") local test_client = require("_client") local naughty = require("naughty") local max = require("awful.layout.suit.max") local real_screen = screen[1] local fake_screen = screen.fake_add(50, 50, 500, 500) local test_client1, test_client2 local list_count = 0 screen.connect_signal("list", function() list_count = list_count + 1 end) local steps = { -- Step 1: Set up some clients to experiment with and assign them as needed function(count) if count == 1 then -- Setup. test_client() test_client() end local cls = client.get() if #cls == 2 then test_client1, test_client2 = cls[1], cls[2] test_client1.screen = real_screen test_client2.screen = fake_screen -- Use a tiled layout fake_screen.selected_tag.layout = max -- Display a notification on the screen-to-be-removed naughty.notify{ text = "test", screen = fake_screen } return true end end, -- Step 2: Move the screen function(count) if count == 1 then fake_screen:fake_resize(100, 110, 600, 610) return end -- Everything should be done by now local geom = test_client2:geometry() local bw = test_client2.border_width assert(geom.x == 100, geom.x) assert(geom.y == 110, geom.y) assert(geom.width + 2*bw == 600, geom.width + 2*bw) assert(geom.height + 2*bw == 610, geom.height + 2*bw) local wb = fake_screen.mywibox assert(wb.screen == fake_screen, tostring(wb.screen) .. " ~= " .. tostring(fake_screen)) assert(wb.x == 100, wb.x) assert(wb.y == 110, wb.y) assert(wb.width == 600, wb.width) -- Test screen order changes assert(list_count == 0) assert(screen[1] == real_screen) assert(screen[2] == fake_screen) real_screen:swap(fake_screen) assert(list_count == 1) assert(screen[2] == real_screen) assert(screen[1] == fake_screen) return true end, -- Step 3: Say goodbye to the screen function() local wb = fake_screen.mywibox fake_screen:fake_remove() -- Now that the screen is invalid, the wibox shouldn't refer to it any -- more assert(wb.screen ~= fake_screen) -- Wrap in a weak table to allow garbage collection fake_screen = setmetatable({ fake_screen }, { __mode = "v" }) return true end, -- Step 4: Everything should now be on the main screen, the old screen -- should be garbage collectable function() assert(test_client1.screen == real_screen, test_client1.screen) assert(test_client2.screen == real_screen, test_client2.screen) collectgarbage("collect") if #fake_screen == 0 then return true end end, } runner.run_steps(steps) -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80