aboutsummaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/fullscreen.rs155
-rw-r--r--src/tests/mod.rs1
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;