evdevil 0.4.1

Bindings to Linux' input device APIs: evdev and uinput
Documentation
use std::io;

use evdevil::event::Abs;

use crate::Tester;

#[test]
fn smoke() -> io::Result<()> {
    let mut t = Tester::get();

    t.with_reader(|uinput, reader| {
        uinput
            .writer()
            .slot(0)?
            .set_tracking_id(5)?
            .set_position(123, -400)?
            .set_tracking_id(0)?
            .finish_slot()?
            .slot(3)?
            .set_tracking_id(7)?
            .set_position(900, 999)?
            .finish_slot()?
            .finish()?;

        reader.update()?;
        assert_eq!(reader.current_slot(), 3);

        let slots = reader.valid_slots().collect::<Vec<_>>();
        assert_eq!(slots, &[0, 3]);

        assert_eq!(reader.slot_state(0, Abs::MT_TRACKING_ID), Some(0));
        assert_eq!(reader.slot_state(0, Abs::MT_POSITION_X), Some(123));
        assert_eq!(reader.slot_state(0, Abs::MT_POSITION_Y), Some(-400));

        assert_eq!(reader.slot_state(3, Abs::MT_TRACKING_ID), Some(7));
        assert_eq!(reader.slot_state(3, Abs::MT_POSITION_X), Some(900));
        assert_eq!(reader.slot_state(3, Abs::MT_POSITION_Y), Some(999));

        uinput
            .writer()
            .slot(0)?
            .set_tracking_id(-1)?
            .finish_slot()?
            .finish()?;

        reader.update()?;

        let slots = reader.valid_slots().collect::<Vec<_>>();
        assert_eq!(slots, &[3]);

        // Clear all slot state. Otherwise every subsequently created `EventReader` will emit MT events on creation.
        uinput
            .writer()
            .slot(3)?
            .set_position(0, 0)?
            .set_tracking_id(-1)?
            .finish_slot()?
            .slot(0)?
            .set_position(0, 0)?
            .set_tracking_id(-1)?
            .finish_slot()?
            .finish()?;

        reader.update()?;

        let slots = reader.valid_slots().collect::<Vec<_>>();
        assert_eq!(slots, &[] as &[i32]);

        Ok(())
    })?;

    Ok(())
}