aboutsummaryrefslogtreecommitdiff
path: root/niri-visual-tests/src/cases
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-06 09:01:26 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-06 09:40:45 +0400
commit122afff7d10ac96250f428a3f06dca6288d3d0b8 (patch)
tree1c6d89f1ee1cf08c42be102907a9e4594dedbb1a /niri-visual-tests/src/cases
parentd2a4e6a0cbc839813c6d4ef68b75820d87cfc5b0 (diff)
downloadniri-122afff7d10ac96250f428a3f06dca6288d3d0b8.tar.gz
niri-122afff7d10ac96250f428a3f06dca6288d3d0b8.tar.bz2
niri-122afff7d10ac96250f428a3f06dca6288d3d0b8.zip
Add niri-visual-tests
Diffstat (limited to 'niri-visual-tests/src/cases')
-rw-r--r--niri-visual-tests/src/cases/mod.rs21
-rw-r--r--niri-visual-tests/src/cases/tile.rs83
-rw-r--r--niri-visual-tests/src/cases/window.rs57
3 files changed, 161 insertions, 0 deletions
diff --git a/niri-visual-tests/src/cases/mod.rs b/niri-visual-tests/src/cases/mod.rs
new file mode 100644
index 00000000..b7d71cd0
--- /dev/null
+++ b/niri-visual-tests/src/cases/mod.rs
@@ -0,0 +1,21 @@
+use std::time::Duration;
+
+use smithay::backend::renderer::element::RenderElement;
+use smithay::backend::renderer::gles::GlesRenderer;
+use smithay::utils::{Physical, Size};
+
+pub mod tile;
+pub mod window;
+
+pub trait TestCase {
+ fn resize(&mut self, width: i32, height: i32);
+ fn are_animations_ongoing(&self) -> bool {
+ false
+ }
+ fn advance_animations(&mut self, _current_time: Duration) {}
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ ) -> Vec<Box<dyn RenderElement<GlesRenderer>>>;
+}
diff --git a/niri-visual-tests/src/cases/tile.rs b/niri-visual-tests/src/cases/tile.rs
new file mode 100644
index 00000000..cdf1e5f6
--- /dev/null
+++ b/niri-visual-tests/src/cases/tile.rs
@@ -0,0 +1,83 @@
+use std::rc::Rc;
+use std::time::Duration;
+
+use niri::layout::tile::Tile;
+use niri::layout::Options;
+use niri_config::Color;
+use smithay::backend::renderer::element::RenderElement;
+use smithay::backend::renderer::gles::GlesRenderer;
+use smithay::utils::{Logical, Physical, Point, Scale, Size};
+
+use super::TestCase;
+use crate::test_window::TestWindow;
+
+pub struct JustTile {
+ window: TestWindow,
+ tile: Tile<TestWindow>,
+}
+
+impl JustTile {
+ pub fn freeform(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::freeform(0);
+ let mut rv = Self::with_window(window);
+ rv.tile.request_tile_size(size);
+ rv.window.communicate();
+ rv
+ }
+
+ pub fn fixed_size(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::fixed_size(0);
+ let mut rv = Self::with_window(window);
+ rv.tile.request_tile_size(size);
+ rv.window.communicate();
+ rv
+ }
+
+ pub fn fixed_size_with_csd_shadow(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::fixed_size(0);
+ window.set_csd_shadow_width(64);
+ let mut rv = Self::with_window(window);
+ rv.tile.request_tile_size(size);
+ rv.window.communicate();
+ rv
+ }
+
+ pub fn with_window(window: TestWindow) -> Self {
+ let options = Options {
+ border: niri_config::FocusRing {
+ off: false,
+ width: 32,
+ active_color: Color::new(255, 163, 72, 255),
+ ..Default::default()
+ },
+ ..Default::default()
+ };
+ let tile = Tile::new(window.clone(), Rc::new(options));
+ Self { window, tile }
+ }
+}
+
+impl TestCase for JustTile {
+ fn resize(&mut self, width: i32, height: i32) {
+ self.tile.request_tile_size(Size::from((width, height)));
+ self.window.communicate();
+ }
+
+ fn advance_animations(&mut self, current_time: Duration) {
+ self.tile.advance_animations(current_time, true);
+ }
+
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> {
+ let tile_size = self.tile.tile_size().to_physical(1);
+ let location = Point::from(((size.w - tile_size.w) / 2, (size.h - tile_size.h) / 2));
+
+ self.tile
+ .render(renderer, location, Scale::from(1.))
+ .map(|elem| Box::new(elem) as _)
+ .collect()
+ }
+}
diff --git a/niri-visual-tests/src/cases/window.rs b/niri-visual-tests/src/cases/window.rs
new file mode 100644
index 00000000..869cbf45
--- /dev/null
+++ b/niri-visual-tests/src/cases/window.rs
@@ -0,0 +1,57 @@
+use niri::layout::LayoutElement;
+use smithay::backend::renderer::element::RenderElement;
+use smithay::backend::renderer::gles::GlesRenderer;
+use smithay::utils::{Logical, Physical, Point, Scale, Size};
+
+use super::TestCase;
+use crate::test_window::TestWindow;
+
+pub struct JustWindow {
+ window: TestWindow,
+}
+
+impl JustWindow {
+ pub fn freeform(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::freeform(0);
+ window.request_size(size);
+ window.communicate();
+ Self { window }
+ }
+
+ pub fn fixed_size(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::fixed_size(0);
+ window.request_size(size);
+ window.communicate();
+ Self { window }
+ }
+
+ pub fn fixed_size_with_csd_shadow(size: Size<i32, Logical>) -> Self {
+ let window = TestWindow::fixed_size(0);
+ window.set_csd_shadow_width(64);
+ window.request_size(size);
+ window.communicate();
+ Self { window }
+ }
+}
+
+impl TestCase for JustWindow {
+ fn resize(&mut self, width: i32, height: i32) {
+ self.window.request_size(Size::from((width, height)));
+ self.window.communicate();
+ }
+
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> {
+ let win_size = self.window.size().to_physical(1);
+ let location = Point::from(((size.w - win_size.w) / 2, (size.h - win_size.h) / 2));
+
+ self.window
+ .render(renderer, location, Scale::from(1.))
+ .into_iter()
+ .map(|elem| Box::new(elem) as _)
+ .collect()
+ }
+}