layout/tests: Extract fullscreen tests to submodule

This commit is contained in:
Ivan Molodetskikh
2025-09-02 16:46:38 +03:00
parent 08f5c6fecb
commit 5357db39cd
2 changed files with 398 additions and 396 deletions

View File

@@ -12,6 +12,7 @@ use smithay::utils::Rectangle;
use super::*;
mod animations;
mod fullscreen;
impl<W: LayoutElement> Default for Layout<W> {
fn default() -> Self {
@@ -2185,39 +2186,6 @@ fn move_workspace_to_output() {
assert!(monitors[1].workspaces[0].has_windows());
}
#[test]
fn fullscreen() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_window_in_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::SetFullscreenWindow {
window: 2,
is_fullscreen: false,
},
];
check_ops(&ops);
}
#[test]
fn open_right_of_on_different_workspace() {
let ops = [
@@ -2293,95 +2261,6 @@ fn open_right_of_on_different_workspace_ewaf() {
);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_removal() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowRight { id: None },
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_consume() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeWindowIntoColumn,
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_quick_double_toggle() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::FullscreenWindow(0),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_set_on_fullscreening_inactive_tile_in_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::FullscreenWindow(0),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: true,
},
Op::ViewOffsetGestureEnd {
is_touchpad: Some(true),
},
];
check_ops(&ops);
}
#[test]
fn removing_all_outputs_preserves_empty_named_workspaces() {
let ops = [
@@ -2521,39 +2400,6 @@ fn one_window_in_column_becomes_weight_1() {
check_ops(&ops);
}
#[test]
fn one_window_in_column_becomes_weight_1_after_fullscreen() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::SetWindowHeight {
id: None,
change: SizeChange::SetFixed(100),
},
Op::Communicate(2),
Op::FocusWindowUp,
Op::SetWindowHeight {
id: None,
change: SizeChange::SetFixed(200),
},
Op::Communicate(1),
Op::CloseWindow(0),
Op::FullscreenWindow(1),
];
check_ops(&ops);
}
#[test]
fn fixed_height_takes_max_non_auto_into_account() {
let ops = [
@@ -3364,146 +3210,6 @@ fn preset_column_width_reset_after_set_width() {
assert_eq!(win.requested_size().unwrap().w, 500);
}
#[test]
fn disable_tabbed_mode_in_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::ToggleColumnTabbedDisplay,
Op::FullscreenWindow(0),
Op::ToggleColumnTabbedDisplay,
];
check_ops(&ops);
}
#[test]
fn unfullscreen_with_large_border() {
let ops = [
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0),
Op::FullscreenWindow(0),
];
let options = Options {
border: niri_config::Border {
off: false,
width: niri_config::FloatOrInt(10000.),
..Default::default()
},
..Default::default()
};
check_ops_with_options(options, &ops);
}
#[test]
fn fullscreen_to_windowed_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0), // Make sure it goes into fullscreen.
Op::ToggleWindowedFullscreen(0),
];
check_ops(&ops);
}
#[test]
fn windowed_fullscreen_to_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0), // Commit fullscreen state.
Op::ToggleWindowedFullscreen(0), // Switch is_fullscreen() to false.
Op::FullscreenWindow(0), // Switch is_fullscreen() back to true.
];
check_ops(&ops);
}
#[test]
fn move_pending_unfullscreen_window_out_of_active_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::Communicate(1),
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeWindowIntoColumn,
// Window 1 is now pending unfullscreen.
// Moving it out should reset view_offset_before_fullscreen.
Op::MoveWindowToWorkspaceDown(true),
];
check_ops(&ops);
}
#[test]
fn move_unfocused_pending_unfullscreen_window_out_of_active_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::Communicate(1),
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeWindowIntoColumn,
// Window 1 is now pending unfullscreen.
// Moving it out should reset view_offset_before_fullscreen.
Op::FocusWindowDown,
Op::MoveWindowToWorkspace {
window_id: Some(1),
workspace_idx: 1,
},
];
check_ops(&ops);
}
#[test]
fn interactive_resize_on_pending_unfullscreen_column() {
let ops = [
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::FullscreenWindow(2),
Op::Communicate(2),
Op::SetFullscreenWindow {
window: 2,
is_fullscreen: false,
},
Op::InteractiveResizeBegin {
window: 2,
edges: ResizeEdge::RIGHT,
},
Op::Communicate(2),
];
check_ops(&ops);
}
#[test]
fn move_column_to_workspace_unfocused_with_multiple_monitors() {
let ops = [
@@ -3567,107 +3273,6 @@ fn move_column_to_workspace_unfocused_with_multiple_monitors() {
}
}
#[test]
fn interactive_move_unfullscreen_to_floating_stops_dnd_scroll() {
let ops = [
Op::AddOutput(3),
Op::AddWindow {
params: TestWindowParams {
is_floating: true,
..TestWindowParams::new(4)
},
},
// This moves the window to tiling.
Op::SetFullscreenWindow {
window: 4,
is_fullscreen: true,
},
// This starts a DnD scroll since we're dragging a tiled window.
Op::InteractiveMoveBegin {
window: 4,
output_idx: 3,
px: 0.0,
py: 0.0,
},
// This will cause the window to unfullscreen to floating, and should stop the DnD scroll
// since we're no longer dragging a tiled window, but rather a floating one.
Op::InteractiveMoveUpdate {
window: 4,
dx: 0.0,
dy: 15035.31210741684,
output_idx: 3,
px: 0.0,
py: 0.0,
},
Op::InteractiveMoveEnd { window: 4 },
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_dnd_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::DndUpdate {
output_idx: 1,
px: 0.0,
py: 0.0,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: false,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_ongoing_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: false,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}
#[test]
fn move_column_to_workspace_down_focus_false_on_floating_window() {
let ops = [

View File

@@ -0,0 +1,397 @@
use super::*;
#[test]
fn fullscreen() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_window_in_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::SetFullscreenWindow {
window: 2,
is_fullscreen: false,
},
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_removal() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowRight { id: None },
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_consume() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeWindowIntoColumn,
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_quick_double_toggle() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::FullscreenWindow(0),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_set_on_fullscreening_inactive_tile_in_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::FullscreenWindow(0),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_on_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: true,
},
Op::ViewOffsetGestureEnd {
is_touchpad: Some(true),
},
];
check_ops(&ops);
}
#[test]
fn one_window_in_column_becomes_weight_1_after_fullscreen() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::SetWindowHeight {
id: None,
change: SizeChange::SetFixed(100),
},
Op::Communicate(2),
Op::FocusWindowUp,
Op::SetWindowHeight {
id: None,
change: SizeChange::SetFixed(200),
},
Op::Communicate(1),
Op::CloseWindow(0),
Op::FullscreenWindow(1),
];
check_ops(&ops);
}
#[test]
fn disable_tabbed_mode_in_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::ConsumeOrExpelWindowLeft { id: None },
Op::ToggleColumnTabbedDisplay,
Op::FullscreenWindow(0),
Op::ToggleColumnTabbedDisplay,
];
check_ops(&ops);
}
#[test]
fn unfullscreen_with_large_border() {
let ops = [
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0),
Op::FullscreenWindow(0),
];
let options = Options {
border: niri_config::Border {
off: false,
width: niri_config::FloatOrInt(10000.),
..Default::default()
},
..Default::default()
};
check_ops_with_options(options, &ops);
}
#[test]
fn fullscreen_to_windowed_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0), // Make sure it goes into fullscreen.
Op::ToggleWindowedFullscreen(0),
];
check_ops(&ops);
}
#[test]
fn windowed_fullscreen_to_fullscreen() {
let ops = [
Op::AddOutput(0),
Op::AddWindow {
params: TestWindowParams::new(0),
},
Op::FullscreenWindow(0),
Op::Communicate(0), // Commit fullscreen state.
Op::ToggleWindowedFullscreen(0), // Switch is_fullscreen() to false.
Op::FullscreenWindow(0), // Switch is_fullscreen() back to true.
];
check_ops(&ops);
}
#[test]
fn move_pending_unfullscreen_window_out_of_active_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::Communicate(1),
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeWindowIntoColumn,
// Window 1 is now pending unfullscreen.
// Moving it out should reset view_offset_before_fullscreen.
Op::MoveWindowToWorkspaceDown(true),
];
check_ops(&ops);
}
#[test]
fn move_unfocused_pending_unfullscreen_window_out_of_active_column() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(1),
},
Op::FullscreenWindow(1),
Op::Communicate(1),
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::ConsumeWindowIntoColumn,
// Window 1 is now pending unfullscreen.
// Moving it out should reset view_offset_before_fullscreen.
Op::FocusWindowDown,
Op::MoveWindowToWorkspace {
window_id: Some(1),
workspace_idx: 1,
},
];
check_ops(&ops);
}
#[test]
fn interactive_resize_on_pending_unfullscreen_column() {
let ops = [
Op::AddWindow {
params: TestWindowParams::new(2),
},
Op::FullscreenWindow(2),
Op::Communicate(2),
Op::SetFullscreenWindow {
window: 2,
is_fullscreen: false,
},
Op::InteractiveResizeBegin {
window: 2,
edges: ResizeEdge::RIGHT,
},
Op::Communicate(2),
];
check_ops(&ops);
}
#[test]
fn interactive_move_unfullscreen_to_floating_stops_dnd_scroll() {
let ops = [
Op::AddOutput(3),
Op::AddWindow {
params: TestWindowParams {
is_floating: true,
..TestWindowParams::new(4)
},
},
// This moves the window to tiling.
Op::SetFullscreenWindow {
window: 4,
is_fullscreen: true,
},
// This starts a DnD scroll since we're dragging a tiled window.
Op::InteractiveMoveBegin {
window: 4,
output_idx: 3,
px: 0.0,
py: 0.0,
},
// This will cause the window to unfullscreen to floating, and should stop the DnD scroll
// since we're no longer dragging a tiled window, but rather a floating one.
Op::InteractiveMoveUpdate {
window: 4,
dx: 0.0,
dy: 15035.31210741684,
output_idx: 3,
px: 0.0,
py: 0.0,
},
Op::InteractiveMoveEnd { window: 4 },
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_dnd_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::DndUpdate {
output_idx: 1,
px: 0.0,
py: 0.0,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: false,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}
#[test]
fn unfullscreen_view_offset_not_reset_during_ongoing_gesture() {
let ops = [
Op::AddOutput(1),
Op::AddWindow {
params: TestWindowParams::new(3),
},
Op::ViewOffsetGestureBegin {
output_idx: 1,
workspace_idx: None,
is_touchpad: false,
},
Op::FullscreenWindow(3),
Op::Communicate(3),
Op::FullscreenWindow(3),
Op::Communicate(3),
];
check_ops(&ops);
}