use std::assert_matches;
use super::event::{TouchpadRawEvent, decode_event};
use super::{Origin, RawReportFlags, TouchpadInfo};
#[test]
fn parses_touchpad_info() {
let mut payload = [0; 16];
payload[0..2].copy_from_slice(&1920u16.to_be_bytes());
payload[2..4].copy_from_slice(&1080u16.to_be_bytes());
payload[4] = 0x0f; payload[5] = 0x0f; payload[6] = 1; payload[7] = 5; payload[8] = 1; payload[9] = 1; payload[12] = 2; payload[13..15].copy_from_slice(&1200u16.to_be_bytes());
let info = TouchpadInfo::from_payload(&payload).unwrap();
assert_eq!(info.x_size, 1920);
assert_eq!(info.y_size, 1080);
assert_eq!(info.z_data_range, 0x0f);
assert_eq!(info.timestamp_units, 1);
assert_eq!(info.max_finger_count, 5);
assert_eq!(info.origin, Origin::LowerLeft);
assert!(info.pen_support);
assert_eq!(info.raw_report_mapping_version, 2);
assert_eq!(info.dpi, 1200);
}
#[test]
fn rejects_reserved_origin() {
let mut payload = [0; 16];
payload[8] = 0;
assert_matches!(
TouchpadInfo::from_payload(&payload),
Err(crate::protocol::v20::Hidpp20Error::UnsupportedResponse)
);
}
#[test]
fn decodes_dual_xy_event() {
let mut payload = [0; 16];
payload[0..2].copy_from_slice(&0x1234u16.to_be_bytes()); payload[2] = 0x01; payload[3] = 0x23; payload[4] = 0x40; payload[5] = 0x45; payload[6] = 0x10; payload[7] = 0x20; payload[8] = 0x30 | 0x04; payload[9] = 0x80 | 0x02; payload[10] = 0x10; payload[11] = 0x03; payload[12] = 0x05; payload[13] = 0x11; payload[14] = 0x22; payload[15] = 0x50 | 0x03;
let TouchpadRawEvent::DualXy(frame) = decode_event(0, &payload).unwrap();
assert_eq!(frame.timestamp, 0x1234);
assert_eq!(frame.touch1.contact_type, 0);
assert_eq!(frame.touch1.x, 0x0123);
assert_eq!(frame.touch1.contact_status, 1);
assert_eq!(frame.touch1.y, 0x0045);
assert_eq!(frame.touch1.z, 0x10);
assert_eq!(frame.touch1.area, 0x20);
assert_eq!(frame.touch1.finger_id, 3);
assert_eq!(frame.touch2.contact_type, 2);
assert_eq!(frame.touch2.x, 0x0210);
assert_eq!(frame.touch2.contact_status, 0);
assert_eq!(frame.touch2.y, 0x0305);
assert_eq!(frame.touch2.finger_id, 5);
assert!(frame.button);
assert!(!frame.end_of_frame);
assert_eq!(frame.finger_count, 3);
}
#[test]
fn ignores_unknown_event_sub_id() {
assert!(decode_event(1, &[0; 16]).is_none());
}
#[test]
fn raw_report_flag_bits() {
let flags = RawReportFlags::from_bits_retain(0x05);
assert!(flags.contains(RawReportFlags::RAW));
assert!(flags.contains(RawReportFlags::ENHANCED));
assert!(!flags.contains(RawReportFlags::FORCE_ADD));
}