reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use reaction::mapping::action::InputAction;
use reaction::mapping::binding::{BindingConfig, InputBinding};
use reaction::mapping::resolver::InputMap;
use reaction::prelude::*;
use reaction::raw_input::common::*;
use reaction::raw_input::windows::WindowsRawInput;
use std::collections::HashMap;

#[test]
fn test_integration_input_flow() {
    // 1. Setup Raw Provider
    let raw_provider = WindowsRawInput::new();

    // 2. Setup System Manager
    let _manager = InputSystemManager::new(Box::new(raw_provider)).unwrap();

    // 3. Setup Input Map
    let mut map = InputMap::new();
    map.bind(
        InputAction::MoveX,
        BindingConfig::new(InputBinding::Key(KeyCode::KeyD)),
    )
    .unwrap();

    // 4. Simulate Raw Data (D key press)
    let mut keys = HashMap::new();
    keys.insert(KeyCode::KeyD, true);

    let raw_data = RawInputData {
        keys,
        mouse_buttons: HashMap::new(),
        mouse_delta: (10, 0),
    };

    // 5. Inject simulated data into the backend (simulated)
    // We need to re-cast or use the manager's provider if we can.
    // Actually, let's just create a test provider.

    struct TestProvider {
        data: Option<RawInputData>,
    }
    impl RawInputProvider for TestProvider {
        fn initialize(&mut self) -> Result<()> {
            Ok(())
        }
        fn poll(&mut self) -> Result<Option<RawInputData>> {
            Ok(self.data.take())
        }
        fn shutdown(&mut self) -> Result<()> {
            Ok(())
        }
    }

    let mut manager = InputSystemManager::new(Box::new(TestProvider {
        data: Some(raw_data),
    }))
    .unwrap();

    // 6. Poll and Update
    manager.poll_and_update(1).unwrap();

    // 7. Verify State
    assert!(manager.state().is_key_down(KeyCode::KeyD));
    assert_eq!(manager.state().get_mouse_delta(), (10.0, 0.0));

    // 8. Verify Mapping
    let val = map.resolve(InputAction::MoveX, manager.state(), None);
    assert_eq!(val, 1.0);

    // 9. End Frame
    manager.end_frame(16.67);
    assert_eq!(manager.state().get_mouse_delta(), (0.0, 0.0));
}