openlogi-device 0.8.14

The contract between OpenLogi's HID++ layer and the HID stack beneath it.
Documentation
//! What a reporting restore writes and leaves alone.

use super::*;

/// A control that was *already* diverted when the session armed it — an agent
/// killed mid-session, or another Logitech app — must not be handed that state
/// back. Replaying it leaves the button diverted with no listener: no OS event
/// and no HID++ consumer, dead until the device sleeps.
#[test]
fn restore_clears_a_diversion_it_found_already_set() {
    let change = undivert_change(reporting(true, None));

    assert_eq!(change.diverted, Some(false));
    assert_eq!(change.raw_xy, Some(false));
}

/// Arming only ever writes `diverted` / `raw_xy` and re-asserts `remap`, so
/// restoring must leave every other bit alone rather than writing back a
/// snapshot that may itself be this session's leftovers.
#[test]
fn restore_returns_the_remap_target_and_touches_nothing_else() {
    let remap = reprog_controls::ControlId(0x0053);

    let change = undivert_change(reporting(false, Some(remap)));

    assert_eq!(change.remap, Some(remap));
    assert_eq!(change.persistently_diverted, None);
    assert_eq!(change.force_raw_xy, None);
    assert_eq!(change.analytics_key_events, None);
    assert_eq!(change.raw_wheel, None);
}

#[test]
fn wake_rearm_restores_diversion_mode_and_remap_target() {
    let remap = reprog_controls::ControlId(0x0053);

    let change = divert_change(reporting(false, Some(remap)), true);

    assert_eq!(change.diverted, Some(true));
    assert_eq!(change.raw_xy, Some(true));
    assert_eq!(change.remap, Some(remap));
}

#[test]
fn plain_diversion_clears_raw_xy() {
    let remap = reprog_controls::ControlId(0x0053);

    let change = divert_change(reporting(false, Some(remap)), false);

    assert_eq!(change.diverted, Some(true));
    assert_eq!(change.raw_xy, Some(false));
    assert_eq!(change.remap, Some(remap));
}

#[test]
fn keyboard_diversion_leaves_raw_xy_unset() {
    let remap = reprog_controls::ControlId(0x0053);

    let change = divert_keyboard_key(reporting(false, Some(remap)));

    assert_eq!(change.diverted, Some(true));
    assert_eq!(change.raw_xy, None);
    assert_eq!(change.remap, Some(remap));
}

#[test]
fn keyboard_restore_leaves_raw_xy_unset() {
    let remap = reprog_controls::ControlId(0x0053);

    let change = undivert_keyboard_key(reporting(false, Some(remap)));

    assert_eq!(change.diverted, Some(false));
    assert_eq!(change.raw_xy, None);
    assert_eq!(change.remap, Some(remap));
}