reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use reaction::mapping::binding::InputBinding;
use reaction::prelude::*;
use reaction::trigger::evaluator::Triggerable;
use reaction::trigger::trigger::InputTrigger;

#[test]
fn test_held_trigger() {
    let mut input = AdvancedInputState::new();
    let binding = InputBinding::Key(KeyCode::KeyA);
    let trigger = InputTrigger::Held {
        min_duration: 100.0,
    };

    // Press frame 1
    input.keyboard.press(KeyCode::KeyA, 0.0, 1);
    input.end_frame(16.0); // Held 16ms

    assert!(!binding.evaluate(&trigger, &input, None));

    // Held longer
    input.end_frame(100.0); // Held 116ms total

    assert!(binding.evaluate(&trigger, &input, None));

    // Release
    input.keyboard.release(KeyCode::KeyA, 2);
    input.end_frame(16.0);
    assert!(!binding.evaluate(&trigger, &input, None));
}

#[test]
fn test_edge_triggers() {
    let mut input = AdvancedInputState::new();
    let binding = InputBinding::Key(KeyCode::KeyB);

    input.keyboard.press(KeyCode::KeyB, 0.0, 1);

    assert!(binding.evaluate(&InputTrigger::Pressed, &input, None));
    assert!(binding.evaluate(&InputTrigger::Down, &input, None));

    input.end_frame(16.0);

    assert!(!binding.evaluate(&InputTrigger::Pressed, &input, None)); // No longer JUST pressed
    assert!(binding.evaluate(&InputTrigger::Down, &input, None));
}