git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commit4a614ea74189f5aa5a9cdfc53099fbedd263ca19
parent4ef8126bda
authorLucas Galante <[email protected]>
date2026-06-18 02:01
Add spinbox right-click behavior tests for audio and interface pages

 src/pages/audio.rs     | 27 +++++++++++++++++++++++++++
 src/pages/interface.rs | 26 ++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/src/pages/audio.rs b/src/pages/audio.rs
index 1364dad..65352d2 100644
--- a/src/pages/audio.rs
+++ b/src/pages/audio.rs
@@ -410,5 +410,32 @@ mod tests {
         let pc = view(&mut state, 10.0, 20.0, 800.0, 600.0, &[false, false], &mut layout, &mut cce_ui::context::UiContext::new());
         assert!(!pc.rects.is_empty() || !pc.texts.is_empty());
     }
+
+    #[test]
+    fn test_boxed_spinbox_right_click_crash() {
+        use cce_ui::widget::{Element, Spinbox};
+        let mut state = AudioState::default();
+        state.sink_spinboxes.push(Box::new(Spinbox::new(50, 0, 100, 1)));
+        let mut ctx = cce_ui::context::UiContext::new();
+        let sb = &mut state.sink_spinboxes[0];
+        sb.set_rect(0.0, 0.0, 100.0, 44.0);
+        let res = sb.mouse_input(
+            cce_ui::widget::MouseButton::Right,
+            cce_ui::widget::ElementState::Pressed,
+            50.0,
+            20.0,
+            &mut ctx,
+        );
+        assert!(res);
+        assert!(cce_ui::widget::context_menu::is_visible());
+
+        // Now replace the state simulating config reload/refresh
+        let new_state = AudioState::default();
+        state = new_state;
+
+        // Assert that the context menu is hidden (cleared)
+        assert!(!cce_ui::widget::context_menu::is_visible());
+    }
 }
 
+
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index d82fc0f..7564304 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -3272,6 +3272,32 @@ mod tests {
         assert_eq!(parse_hex("invalid"), [0x0a, 0x1a, 0x0e]);
     }
 
+    #[test]
+    fn test_interface_spinbox_right_click_crash() {
+        use cce_ui::widget::Element;
+        let mut state = InterfaceState::default();
+        let mut ctx = cce_ui::context::UiContext::new();
+        let sb = &mut state.window_corner_radius_spinbox;
+        sb.set_rect(0.0, 0.0, 100.0, 44.0);
+        let res = sb.mouse_input(
+            cce_ui::widget::MouseButton::Right,
+            cce_ui::widget::ElementState::Pressed,
+            50.0,
+            20.0,
+            &mut ctx,
+        );
+        assert!(res);
+        assert!(cce_ui::widget::context_menu::is_visible());
+
+        // Now simulate update(InterfaceMessage::Refreshed)
+        let new_state = InterfaceState::default();
+        update(&mut state, InterfaceMessage::Refreshed(new_state));
+
+        // Assert that the context menu is hidden (cleared)
+        assert!(!cce_ui::widget::context_menu::is_visible());
+    }
+
+
     #[test]
     fn test_parse_color_from_key() {
         let content = "\n[layout]\nlow_color = \"#112233\"\nhigh_color = \"#445566\"\ndisabled_color = \"#778899\"\nstatus_separator_color = \"#aabbcc\"\nvisual_guides_color = \"#ddeeff\"\nslider_track_color = \"#123456\"\npage_low_color = \"#474751\"\ncolor_borders_color = \"#abcdef\"\nstatus_normal_color = \"#ccccd8\"\npaginator_sidebar_color = \"#5a5a65\"\nprimary_highlight_color = \"#ffffff\"\nmenubar_tab_label_color = \"#e6e6f2\"\ntoggle_enabled_color = \"#68d8a5\"\ntoggle_disabled_color = \"#878794\"\nscrollinglist_bg_color = \"#515161\"\nbreadcrumb_bg_color = \"#515161\"\n";