reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
#[cfg(test)]
mod mouse_tests {
    use reaction::prelude::*;

    #[test]
    fn test_multiple_move_calls_accumulate() {
        let mut mouse = MouseState::new();

        // Simulate high-frequency polling: 3 polls in one frame
        mouse.move_to(100.0, 50.0); // Poll 1: absolute position
        mouse.move_to(102.0, 52.0); // Poll 2: absolute position
        mouse.move_to(104.0, 54.0); // Poll 3: absolute position

        // ✅ Delta should be sum of all movements: (100, 50) + (2, 2) + (2, 2)
        assert_eq!(mouse.delta, (104.0, 54.0), "Deltas should accumulate");
        assert_eq!(mouse.position, (104.0, 54.0), "Position should be final");

        // After end_frame, delta should reset
        mouse.end_frame(16.67);
        assert_eq!(mouse.delta, (0.0, 0.0), "Delta should reset after frame");
        assert_eq!(mouse.position, (104.0, 54.0), "Position should persist");
    }

    #[test]
    fn test_move_rel_accumulation() {
        let mut mouse = MouseState::new();

        // Direct relative movement
        mouse.move_rel(10.0, 5.0);
        mouse.move_rel(5.0, 3.0);
        mouse.move_rel(2.0, 1.0);

        assert_eq!(mouse.delta, (17.0, 9.0), "Relative movements should sum");
        assert_eq!(mouse.position, (17.0, 9.0), "Position should update");
    }

    #[test]
    fn test_scroll_accumulation() {
        let mut mouse = MouseState::new();

        mouse.scroll(1.0, 0.0);
        mouse.scroll(1.0, 0.0);
        mouse.scroll(1.0, 0.0);

        assert_eq!(mouse.scroll, (3.0, 0.0), "Scroll should accumulate");

        mouse.end_frame(16.67);
        assert_eq!(mouse.scroll, (0.0, 0.0), "Scroll should reset after frame");
    }
}