use super::*; use crate::clipboard::NoClipboard; use crate::event::Modifiers; fn key(stepper: &mut Stepper, key: Key) -> bool { stepper.on_key( &KeyInput { key, modifiers: Modifiers::default(), pressed: true, }, &mut TextContext::hermetic([]), &mut NoClipboard, ) } #[test] fn a_programmatic_set_is_silent() { let mut stepper = Stepper::new(); stepper.set_value(5.0); assert_eq!(stepper.get_value(), 5.0); assert!(stepper.take_emitted().is_empty()); } #[test] fn arrows_step_by_the_step_and_stop_at_the_range() { let mut stepper = Stepper::new(); stepper.set_min(0.0); stepper.set_max(10.0); stepper.set_step(3.0); assert!(key(&mut stepper, Key::Up)); assert_eq!(stepper.get_value(), 3.0); assert!(matches!( stepper.take_emitted().as_slice(), [EventData::ValueChanged(v)] if *v == 3.0 )); for _ in 0..5 { key(&mut stepper, Key::Up); } assert_eq!(stepper.get_value(), 10.0, "clamped to the maximum"); let _ = stepper.take_emitted(); assert!( !key(&mut stepper, Key::Up), "a key that moves nothing is not consumed" ); } /// A step of zero would make the arrows do nothing for ever, so it is read as /// the sensible default rather than taken literally. #[test] fn a_zero_step_is_read_as_one() { let mut stepper = Stepper::new(); stepper.set_step(0.0); key(&mut stepper, Key::Up); assert_eq!(stepper.get_value(), 1.0); } #[test] fn it_announces_its_range_and_its_text() { let mut stepper = Stepper::new(); stepper.set_min(2.0); stepper.set_max(8.0); stepper.set_value(5.0); let mut node = accesskit::Node::new(accesskit::Role::SpinButton); stepper.accessibility(&mut node); assert_eq!(node.numeric_value(), Some(5.0)); assert_eq!(node.min_numeric_value(), Some(2.0)); assert_eq!(node.max_numeric_value(), Some(8.0)); assert_eq!(node.value(), Some("5"), "a whole number reads as one"); assert_eq!(stepper.role(), accesskit::Role::SpinButton); }