tests.rs raw

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);
}