diff options
Diffstat (limited to 'src/tests')
| -rw-r--r-- | src/tests/fullscreen.rs | 155 | ||||
| -rw-r--r-- | src/tests/mod.rs | 1 |
2 files changed, 156 insertions, 0 deletions
diff --git a/src/tests/fullscreen.rs b/src/tests/fullscreen.rs new file mode 100644 index 00000000..6a39d89a --- /dev/null +++ b/src/tests/fullscreen.rs @@ -0,0 +1,155 @@ +use client::ClientId; +use insta::assert_snapshot; +use wayland_client::protocol::wl_surface::WlSurface; + +use super::*; +use crate::layout::LayoutElement as _; + +// Sets up a fixture with two outputs and 100×100 window. +fn set_up() -> (Fixture, ClientId, WlSurface) { + let mut f = Fixture::new(); + f.add_output(1, (1920, 1080)); + f.add_output(2, (1280, 720)); + + let id = f.add_client(); + let window = f.client(id).create_window(); + let surface = window.surface.clone(); + window.commit(); + f.roundtrip(id); + + let window = f.client(id).window(&surface); + window.attach_new_buffer(); + window.set_size(100, 100); + window.ack_last_and_commit(); + f.double_roundtrip(id); + + (f, id, surface) +} + +#[test] +fn windowed_fullscreen() { + let (mut f, id, surface) = set_up(); + + let _ = f.client(id).window(&surface).recent_configures(); + + let niri = f.niri(); + let mapped = niri.layout.windows().next().unwrap().1; + let window_id = mapped.window.clone(); + + // Enable windowed fullscreen. + niri.layout.toggle_windowed_fullscreen(&window_id); + f.double_roundtrip(id); + + // Should request fullscreen state with the tiled size. + let window = f.client(id).window(&surface); + assert_snapshot!( + window.format_recent_configures(), + @"size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen]" + ); + + let mapped = f.niri().layout.windows().next().unwrap().1; + // Not committed yet. + assert!(!mapped.is_windowed_fullscreen()); + + // Commit in response. + let window = f.client(id).window(&surface); + window.ack_last_and_commit(); + f.roundtrip(id); + + let mapped = f.niri().layout.windows().next().unwrap().1; + // Now it is committed. + assert!(mapped.is_windowed_fullscreen()); + + // Disable windowed fullscreen. + f.niri().layout.toggle_windowed_fullscreen(&window_id); + f.double_roundtrip(id); + + // Should request without fullscreen state with the tiled size. + let window = f.client(id).window(&surface); + assert_snapshot!( + window.format_recent_configures(), + @"size: 936 × 1048, bounds: 1888 × 1048, states: [Activated]" + ); + + let mapped = f.niri().layout.windows().next().unwrap().1; + // Not commited yet. + assert!(mapped.is_windowed_fullscreen()); + + // Commit in response. + let window = f.client(id).window(&surface); + window.ack_last_and_commit(); + f.roundtrip(id); + + let mapped = f.niri().layout.windows().next().unwrap().1; + // Now it is committed. + assert!(!mapped.is_windowed_fullscreen()); +} + +#[test] +fn windowed_fullscreen_chain() { + let (mut f, id, surface) = set_up(); + + let _ = f.client(id).window(&surface).recent_configures(); + + let mapped = f.niri().layout.windows().next().unwrap().1; + let window_id = mapped.window.clone(); + + f.niri().layout.toggle_windowed_fullscreen(&window_id); + f.roundtrip(id); + f.niri().layout.toggle_windowed_fullscreen(&window_id); + f.roundtrip(id); + f.niri().layout.toggle_windowed_fullscreen(&window_id); + f.roundtrip(id); + f.niri().layout.toggle_windowed_fullscreen(&window_id); + f.double_roundtrip(id); + + // Should be four configures matching the four requests. + let window = f.client(id).window(&surface); + assert_snapshot!( + window.format_recent_configures(), + @r" + size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen] + size: 936 × 1048, bounds: 1888 × 1048, states: [Activated] + size: 936 × 1048, bounds: 1888 × 1048, states: [Activated, Fullscreen] + size: 936 × 1048, bounds: 1888 × 1048, states: [Activated] + " + ); + + let window = f.client(id).window(&surface); + let serials = Vec::from_iter( + window.configures_received[window.configures_received.len() - 4..] + .iter() + .map(|(s, _c)| *s), + ); + + let get_state = |f: &mut Fixture| { + let mapped = f.niri().layout.windows().next().unwrap().1; + format!( + "fs {}, wfs {}", + mapped.is_fullscreen(), + mapped.is_windowed_fullscreen() + ) + }; + + let mut states = vec![get_state(&mut f)]; + for serial in serials { + let window = f.client(id).window(&surface); + window.xdg_surface.ack_configure(serial); + window.commit(); + f.roundtrip(id); + states.push(get_state(&mut f)); + } + + // We expect fs to always be false (because each Fullscreen state request corresponded to a + // windowed fullscreen), and wfs to toggle on and off. + assert_snapshot!( + states.join("\n"), + @r" + fs false, wfs false + fs false, wfs true + fs false, wfs false + fs false, wfs true + fs false, wfs false + " + ); +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs index cdb1c072..87841cbc 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -5,4 +5,5 @@ mod fixture; mod server; mod floating; +mod fullscreen; mod window_opening; |
