use crossterm::event::Event;
use crate::event::{get_current_event, peek_current_event as peek_event_internal};
pub fn use_event() -> Option<Event> {
get_current_event().map(|arc_event| (*arc_event).clone())
}
pub fn stop_propagation() {
crate::event::stop_event_propagation();
}
pub fn peek_event() -> Option<Event> {
peek_event_internal().map(|arc_event| (*arc_event).clone())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::event::{clear_current_event, set_current_event};
use crate::fiber_tree::{FiberTree, clear_fiber_tree, set_fiber_tree, with_fiber_tree_mut};
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use std::sync::{Arc, Mutex};
static TEST_MUTEX: Mutex<()> = Mutex::new(());
fn create_test_key_event(c: char) -> Event {
Event::Key(KeyEvent::new_with_kind(
KeyCode::Char(c),
KeyModifiers::NONE,
KeyEventKind::Press,
))
}
fn setup_test_fiber_tree() {
let mut tree = FiberTree::new();
let fiber_id = tree.mount(None, None);
tree.begin_render(fiber_id);
set_fiber_tree(tree);
}
fn teardown_test_fiber_tree() {
with_fiber_tree_mut(|tree| {
tree.end_render();
});
clear_fiber_tree();
}
#[test]
fn test_use_event_returns_event() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('a');
set_current_event(Some(Arc::new(event.clone())));
let result = use_event();
assert!(result.is_some());
if let Some(Event::Key(key)) = result {
assert_eq!(key.code, KeyCode::Char('a'));
} else {
panic!("Expected Key event");
}
teardown_test_fiber_tree();
clear_current_event();
}
#[test]
fn test_use_event_returns_none_when_no_event() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let result = use_event();
assert!(result.is_none());
teardown_test_fiber_tree();
}
#[test]
fn test_use_event_available_multiple_times() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('b');
set_current_event(Some(Arc::new(event)));
let first = use_event();
assert!(first.is_some());
let second = use_event();
assert!(second.is_some());
let third = use_event();
assert!(third.is_some());
teardown_test_fiber_tree();
clear_current_event();
}
#[test]
fn test_stop_propagation_blocks_other_fibers() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
let mut tree = FiberTree::new();
let fiber1 = tree.mount(None, None);
let fiber2 = tree.mount(None, None);
set_fiber_tree(tree);
let event = create_test_key_event('c');
set_current_event(Some(Arc::new(event)));
with_fiber_tree_mut(|tree| {
tree.begin_render(fiber1);
});
let result1 = use_event();
assert!(result1.is_some());
stop_propagation();
with_fiber_tree_mut(|tree| {
tree.end_render();
});
with_fiber_tree_mut(|tree| {
tree.begin_render(fiber2);
});
let result2 = use_event();
assert!(result2.is_none());
with_fiber_tree_mut(|tree| {
tree.end_render();
});
clear_fiber_tree();
clear_current_event();
}
#[test]
fn test_stop_propagation_allows_same_fiber() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('d');
set_current_event(Some(Arc::new(event)));
let result1 = use_event();
assert!(result1.is_some());
stop_propagation();
let result2 = use_event();
assert!(result2.is_some());
teardown_test_fiber_tree();
clear_current_event();
}
#[test]
fn test_peek_event_returns_event() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('e');
set_current_event(Some(Arc::new(event)));
let result = peek_event();
assert!(result.is_some());
if let Some(Event::Key(key)) = result {
assert_eq!(key.code, KeyCode::Char('e'));
} else {
panic!("Expected Key event");
}
teardown_test_fiber_tree();
clear_current_event();
}
#[test]
fn test_peek_event_works_after_stop_propagation() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('f');
set_current_event(Some(Arc::new(event)));
stop_propagation();
let result = peek_event();
assert!(result.is_some());
teardown_test_fiber_tree();
clear_current_event();
}
#[test]
fn test_use_event_clones_event() {
let _lock = TEST_MUTEX.lock().unwrap();
clear_current_event();
setup_test_fiber_tree();
let event = create_test_key_event('g');
set_current_event(Some(Arc::new(event.clone())));
let result = use_event();
assert!(result.is_some());
if let Some(Event::Key(key)) = result {
assert_eq!(key.code, KeyCode::Char('g'));
}
teardown_test_fiber_tree();
clear_current_event();
}
}