layout/tests: Support forced test window size

This commit is contained in:
Ivan Molodetskikh
2025-08-12 22:34:13 +03:00
parent 5bda3041d0
commit a2767041d9
+23 -1
View File
@@ -24,6 +24,8 @@ struct TestWindowInner {
bbox: Cell<Rectangle<i32, Logical>>, bbox: Cell<Rectangle<i32, Logical>>,
initial_bbox: Rectangle<i32, Logical>, initial_bbox: Rectangle<i32, Logical>,
requested_size: Cell<Option<Size<i32, Logical>>>, requested_size: Cell<Option<Size<i32, Logical>>>,
// Emulates the window ignoring the compositor-provided size.
forced_size: Cell<Option<Size<i32, Logical>>>,
min_size: Size<i32, Logical>, min_size: Size<i32, Logical>,
max_size: Size<i32, Logical>, max_size: Size<i32, Logical>,
pending_fullscreen: Cell<bool>, pending_fullscreen: Cell<bool>,
@@ -71,6 +73,7 @@ impl TestWindow {
bbox: Cell::new(params.bbox), bbox: Cell::new(params.bbox),
initial_bbox: params.bbox, initial_bbox: params.bbox,
requested_size: Cell::new(None), requested_size: Cell::new(None),
forced_size: Cell::new(None),
min_size: params.min_max_size.0, min_size: params.min_max_size.0,
max_size: params.min_max_size.1, max_size: params.min_max_size.1,
pending_fullscreen: Cell::new(false), pending_fullscreen: Cell::new(false),
@@ -86,7 +89,8 @@ impl TestWindow {
fn communicate(&self) -> bool { fn communicate(&self) -> bool {
let mut changed = false; let mut changed = false;
if let Some(size) = self.0.requested_size.get() { let size = self.0.forced_size.get().or(self.0.requested_size.get());
if let Some(size) = size {
assert!(size.w >= 0); assert!(size.w >= 0);
assert!(size.h >= 0); assert!(size.h >= 0);
@@ -284,6 +288,10 @@ impl LayoutElement for TestWindow {
} }
} }
fn arbitrary_size() -> impl Strategy<Value = Size<i32, Logical>> {
any::<(u16, u16)>().prop_map(|(w, h)| Size::from((w.max(1).into(), h.max(1).into())))
}
fn arbitrary_bbox() -> impl Strategy<Value = Rectangle<i32, Logical>> { fn arbitrary_bbox() -> impl Strategy<Value = Rectangle<i32, Logical>> {
any::<(i16, i16, u16, u16)>().prop_map(|(x, y, w, h)| { any::<(i16, i16, u16, u16)>().prop_map(|(x, y, w, h)| {
let loc: Point<i32, _> = Point::from((x.into(), y.into())); let loc: Point<i32, _> = Point::from((x.into(), y.into()));
@@ -592,6 +600,12 @@ enum Op {
#[proptest(strategy = "prop::option::of(1..=5usize)")] #[proptest(strategy = "prop::option::of(1..=5usize)")]
new_parent_id: Option<usize>, new_parent_id: Option<usize>,
}, },
SetForcedSize {
#[proptest(strategy = "1..=5usize")]
id: usize,
#[proptest(strategy = "proptest::option::of(arbitrary_size())")]
size: Option<Size<i32, Logical>>,
},
Communicate(#[proptest(strategy = "1..=5usize")] usize), Communicate(#[proptest(strategy = "1..=5usize")] usize),
Refresh { Refresh {
is_active: bool, is_active: bool,
@@ -1315,6 +1329,14 @@ impl Op {
} }
} }
} }
Op::SetForcedSize { id, size } => {
for (_mon, win) in layout.windows() {
if win.0.id == id {
win.0.forced_size.set(size);
return;
}
}
}
Op::Communicate(id) => { Op::Communicate(id) => {
let mut update = false; let mut update = false;