anybox-rs 0.11.0

one API for the most popular passthrough boxes
Documentation
use std::time::Duration;

use super::{Extension, Interpolation, YscProfile};
use crate::capability::{Action, MakcuAction};
use crate::error::Error;

#[test]
fn arguments_are_checked_in_whole_milliseconds_and_within_their_range() {
    for (request, ok) in [
        (
            Extension::MakcuSetInterpolation(Interpolation::Percent(100)),
            true,
        ),
        (
            Extension::MakcuSetInterpolation(Interpolation::Percent(101)),
            false,
        ),
        (Extension::MakcuSetAutorelease(None), true),
        (
            Extension::MakcuSetAutorelease(Some(Duration::from_secs(60))),
            true,
        ),
        (Extension::MakcuSetAutorelease(Some(Duration::ZERO)), false),
        (
            Extension::FerrumCatchXy {
                window: Duration::ZERO,
                with_software: false,
            },
            true,
        ),
        (
            Extension::FerrumCatchXy {
                window: Duration::from_micros(999_500),
                with_software: false,
            },
            false,
        ),
    ] {
        assert_eq!(request.check().is_ok(), ok, "{request:?}");
    }
    assert!(matches!(
        Extension::MakcuSetInterpolation(Interpolation::Percent(101)).check(),
        Err(Error::InvalidArgument {
            action: Action::Makcu(MakcuAction::Interpolation),
            ..
        })
    ));
}

#[test]
fn a_profile_number_the_vendor_has_no_name_for_is_kept() {
    for n in 0..5 {
        assert_eq!(YscProfile::from_number(n).number(), n);
    }
    assert_eq!(YscProfile::from_number(3), YscProfile::Other(3));
}

#[cfg(feature = "mock")]
mod mock {
    use std::time::Duration;

    use crate::click::ClickTiming;
    use crate::device::Device;
    use crate::extension::Interpolation;

    #[test]
    fn each_mock_box_answers_its_own_calls() {
        let device = Device::mock_makcu(ClickTiming::Makcu).unwrap();
        let makcu = device.makcu().unwrap();
        makcu.set_interpolation(Interpolation::Percent(10)).unwrap();
        assert_eq!(makcu.interpolation().unwrap(), Interpolation::Percent(10));
        makcu
            .set_autorelease(Some(Duration::from_millis(800)))
            .unwrap();
        assert!(!makcu.moving().unwrap());
        let device = Device::mock_ysc(ClickTiming::Makcu).unwrap();
        assert!(device.ysc().unwrap().interpolation().unwrap().enabled);
        assert!(device.ysc().unwrap().serial().is_ok());
        let device = Device::mock_ferrum(ClickTiming::Makcu).unwrap();
        assert_eq!(
            device
                .ferrum()
                .unwrap()
                .catch_xy(Duration::from_millis(10), true)
                .unwrap(),
            (-3, 10)
        );
    }
}