system settings
git clone https://git.lucas.co/cce-system-interface.git
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";