use aethermapd::hotplug::{DeviceEvent, format_device_id};
#[test]
fn test_format_device_id() {
assert_eq!(format_device_id(0x1532, 0x0220), "1532:0220");
assert_eq!(format_device_id(0xABCD, 0x1234), "abcd:1234");
assert_eq!(format_device_id(0x0001, 0x0002), "0001:0002");
assert_eq!(format_device_id(0x1, 0x2), "0001:0002");
assert_eq!(format_device_id(0x046D, 0xC52B), "046d:c52b");
}
#[test]
fn test_device_event_add() {
let event = DeviceEvent::Add {
devnode: "/dev/input/event0".to_string(),
device_id: "1532:0220".to_string(),
};
match &event {
DeviceEvent::Add { devnode, device_id } => {
assert_eq!(devnode, "/dev/input/event0");
assert_eq!(device_id, "1532:0220");
}
_ => panic!("Expected Add event"),
}
let event_clone = event.clone();
match &event_clone {
DeviceEvent::Add { device_id, .. } => {
assert_eq!(device_id, "1532:0220");
}
_ => panic!("Cloned event should be Add"),
}
}
#[test]
fn test_device_event_remove() {
let event = DeviceEvent::Remove {
devnode: "/dev/input/event1".to_string(),
device_id: "046d:c52b".to_string(),
};
match &event {
DeviceEvent::Remove { devnode, device_id } => {
assert_eq!(devnode, "/dev/input/event1");
assert_eq!(device_id, "046d:c52b");
}
_ => panic!("Expected Remove event"),
}
let event_clone = event.clone();
match &event_clone {
DeviceEvent::Remove { device_id, .. } => {
assert_eq!(device_id, "046d:c52b");
}
_ => panic!("Cloned event should be Remove"),
}
}
#[test]
fn test_device_id_format_consistency() {
let test_cases = vec![
((0x1532, 0x0220), "1532:0220"),
((0x046D, 0xC52B), "046d:c52b"),
((0x1234, 0x5678), "1234:5678"),
];
for ((vid, pid), expected) in test_cases {
let formatted = format_device_id(vid, pid);
assert_eq!(
formatted, expected,
"Device ID format mismatch for VID:0x{:04x} PID:0x{:04x}",
vid, pid
);
}
}
#[test]
fn test_device_event_completeness() {
let add_event = DeviceEvent::Add {
devnode: "/dev/input/event5".to_string(),
device_id: "1532:0220".to_string(),
};
let remove_event = DeviceEvent::Remove {
devnode: "/dev/input/event5".to_string(),
device_id: "1532:0220".to_string(),
};
match &add_event {
DeviceEvent::Add { devnode, device_id } => {
assert!(!devnode.is_empty(), "devnode must not be empty");
assert!(!device_id.is_empty(), "device_id must not be empty");
assert!(devnode.starts_with("/dev/"), "devnode must be absolute path");
assert!(device_id.contains(":"), "device_id must contain separator");
}
_ => panic!("Expected Add event"),
}
match &remove_event {
DeviceEvent::Remove { devnode, device_id } => {
assert!(!devnode.is_empty(), "devnode must not be empty");
assert!(!device_id.is_empty(), "device_id must not be empty");
assert!(devnode.starts_with("/dev/"), "devnode must be absolute path");
assert!(device_id.contains(":"), "device_id must contain separator");
}
_ => panic!("Expected Remove event"),
}
}
#[test]
fn test_device_event_debug() {
let event = DeviceEvent::Add {
devnode: "/dev/input/event0".to_string(),
device_id: "1532:0220".to_string(),
};
let debug_str = format!("{:?}", event);
assert!(debug_str.contains("Add"), "Debug output should show event type");
assert!(debug_str.contains("/dev/input/event0"), "Debug output should show devnode");
assert!(debug_str.contains("1532:0220"), "Debug output should show device_id");
}