use std::{error::Error, io};
use evdevil::{
Evdev,
event::{Rel, RelEvent},
};
use crate::Tester;
#[test]
fn revoke() -> io::Result<()> {
let t = Tester::get();
let dev = t.evdev();
let dev2 = Evdev::open(&t.evdev_path)?;
assert!(!dev2.is_readable()?);
dev2.revoke()?;
t.uinput.write(&[RelEvent::new(Rel::DIAL, 1).into()])?;
assert!(dev.is_readable()?);
assert!(!dev2.is_readable()?);
match dev2.revoke() {
Err(e) => {
let mut e: &dyn Error = &e;
while let Some(s) = e.source() {
e = s;
}
let os = e
.downcast_ref::<io::Error>()
.unwrap()
.raw_os_error()
.unwrap();
assert_eq!(os, libc::ENODEV);
}
e => panic!("unexpected result: {e:?}"),
}
while dev.is_readable()? {
dev.raw_events().next().unwrap()?;
}
Ok(())
}