#![allow(dead_code)]
use super::constants::*;
use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent};
use smallvec::SmallVec;
pub fn handle_input_event(event: Event) -> Option<SmallVec<[u8; 64]>> {
match event {
Event::Key(key_event) => {
if key_event.kind != KeyEventKind::Press {
return None;
}
key_event_to_bytes(key_event)
}
Event::Mouse(mouse_event) => {
mouse_event_to_bytes(mouse_event)
}
Event::Paste(text) => {
if text.is_empty() {
return None;
}
const MAX_PASTE_SIZE: usize = 1024 * 1024; let bytes = text.into_bytes();
if bytes.len() > MAX_PASTE_SIZE {
Some(SmallVec::from_vec(bytes[..MAX_PASTE_SIZE].to_vec()))
} else {
Some(SmallVec::from_vec(bytes))
}
}
Event::Resize(_width, _height) => {
None
}
_ => None,
}
}
pub fn key_event_to_bytes(key_event: KeyEvent) -> Option<SmallVec<[u8; 64]>> {
match key_event {
KeyEvent {
code: KeyCode::Char(c),
modifiers: KeyModifiers::CONTROL,
..
} => {
match c {
'c' | 'C' => Some(SmallVec::from_slice(CTRL_C_SEQUENCE)), 'd' | 'D' => Some(SmallVec::from_slice(CTRL_D_SEQUENCE)), 'z' | 'Z' => Some(SmallVec::from_slice(CTRL_Z_SEQUENCE)), 'a' | 'A' => Some(SmallVec::from_slice(CTRL_A_SEQUENCE)), 'e' | 'E' => Some(SmallVec::from_slice(CTRL_E_SEQUENCE)), 'u' | 'U' => Some(SmallVec::from_slice(CTRL_U_SEQUENCE)), 'k' | 'K' => Some(SmallVec::from_slice(CTRL_K_SEQUENCE)), 'w' | 'W' => Some(SmallVec::from_slice(CTRL_W_SEQUENCE)), 'l' | 'L' => Some(SmallVec::from_slice(CTRL_L_SEQUENCE)), 'r' | 'R' => Some(SmallVec::from_slice(CTRL_R_SEQUENCE)), _ => {
let byte = (c.to_ascii_lowercase() as u8).saturating_sub(b'a' - 1);
if byte <= 26 {
Some(SmallVec::from_slice(&[byte]))
} else {
None
}
}
}
}
KeyEvent {
code: KeyCode::Char(c),
modifiers,
..
} if !modifiers
.intersects(KeyModifiers::CONTROL | KeyModifiers::ALT | KeyModifiers::META) =>
{
let bytes = c.to_string().into_bytes();
Some(SmallVec::from_slice(&bytes))
}
KeyEvent {
code: KeyCode::Enter,
..
} => Some(SmallVec::from_slice(ENTER_SEQUENCE)),
KeyEvent {
code: KeyCode::Tab, ..
} => Some(SmallVec::from_slice(TAB_SEQUENCE)),
KeyEvent {
code: KeyCode::Backspace,
..
} => Some(SmallVec::from_slice(BACKSPACE_SEQUENCE)),
KeyEvent {
code: KeyCode::Esc, ..
} => Some(SmallVec::from_slice(ESC_SEQUENCE)),
KeyEvent {
code: KeyCode::Up, ..
} => Some(SmallVec::from_slice(UP_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Down,
..
} => Some(SmallVec::from_slice(DOWN_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Right,
..
} => Some(SmallVec::from_slice(RIGHT_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::Left,
..
} => Some(SmallVec::from_slice(LEFT_ARROW_SEQUENCE)),
KeyEvent {
code: KeyCode::F(n),
..
} => {
match n {
1 => Some(SmallVec::from_slice(F1_SEQUENCE)), 2 => Some(SmallVec::from_slice(F2_SEQUENCE)), 3 => Some(SmallVec::from_slice(F3_SEQUENCE)), 4 => Some(SmallVec::from_slice(F4_SEQUENCE)), 5 => Some(SmallVec::from_slice(F5_SEQUENCE)), 6 => Some(SmallVec::from_slice(F6_SEQUENCE)), 7 => Some(SmallVec::from_slice(F7_SEQUENCE)), 8 => Some(SmallVec::from_slice(F8_SEQUENCE)), 9 => Some(SmallVec::from_slice(F9_SEQUENCE)), 10 => Some(SmallVec::from_slice(F10_SEQUENCE)), 11 => Some(SmallVec::from_slice(F11_SEQUENCE)), 12 => Some(SmallVec::from_slice(F12_SEQUENCE)), _ => None, }
}
KeyEvent {
code: KeyCode::Home,
..
} => Some(SmallVec::from_slice(HOME_SEQUENCE)),
KeyEvent {
code: KeyCode::End, ..
} => Some(SmallVec::from_slice(END_SEQUENCE)),
KeyEvent {
code: KeyCode::PageUp,
..
} => Some(SmallVec::from_slice(PAGE_UP_SEQUENCE)),
KeyEvent {
code: KeyCode::PageDown,
..
} => Some(SmallVec::from_slice(PAGE_DOWN_SEQUENCE)),
KeyEvent {
code: KeyCode::Insert,
..
} => Some(SmallVec::from_slice(INSERT_SEQUENCE)),
KeyEvent {
code: KeyCode::Delete,
..
} => Some(SmallVec::from_slice(DELETE_SEQUENCE)),
_ => None,
}
}
pub fn mouse_event_to_bytes(_mouse_event: MouseEvent) -> Option<SmallVec<[u8; 64]>> {
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_paste_event_small() {
let text = "Hello, World!".to_string();
let event = Event::Paste(text.clone());
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), text.as_bytes());
}
#[test]
fn test_paste_event_large() {
let text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris."
.to_string();
let event = Event::Paste(text.clone());
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), text.as_bytes());
assert!(
bytes.len() > 64,
"Test data should be larger than SmallVec inline capacity"
);
}
#[test]
fn test_paste_event_empty() {
let text = String::new();
let event = Event::Paste(text);
let result = handle_input_event(event);
assert!(result.is_none(), "Empty paste should return None");
}
#[test]
fn test_paste_event_special_chars() {
let text = "Line 1\nLine 2\nLine 3\n\tTabbed\r\nCRLF".to_string();
let event = Event::Paste(text.clone());
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), text.as_bytes());
}
#[test]
fn test_paste_event_unicode() {
let text = "Hello 世界 🌍 مرحبا".to_string();
let event = Event::Paste(text.clone());
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), text.as_bytes());
}
#[test]
fn test_paste_event_multiline() {
let text = "#!/bin/bash\n\
echo 'Hello, World!'\n\
for i in {1..5}; do\n\
\techo \"Number: $i\"\n\
done"
.to_string();
let event = Event::Paste(text.clone());
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), text.as_bytes());
}
#[test]
fn test_key_event_still_works() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(bytes.as_slice(), b"a");
}
#[test]
fn test_resize_event_ignored() {
let event = Event::Resize(80, 24);
let result = handle_input_event(event);
assert!(result.is_none());
}
#[test]
fn test_paste_event_size_limit() {
const MAX_PASTE_SIZE: usize = 1024 * 1024;
let text = "A".repeat(MAX_PASTE_SIZE + 1000);
let event = Event::Paste(text);
let result = handle_input_event(event);
assert!(result.is_some());
let bytes = result.unwrap();
assert_eq!(
bytes.len(),
MAX_PASTE_SIZE,
"Paste should be truncated to MAX_PASTE_SIZE"
);
}
#[test]
fn test_ctrl_c_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_C_SEQUENCE);
}
#[test]
fn test_ctrl_c_uppercase() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('C'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_C_SEQUENCE);
}
#[test]
fn test_ctrl_d_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('d'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_D_SEQUENCE);
}
#[test]
fn test_ctrl_z_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('z'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_Z_SEQUENCE);
}
#[test]
fn test_ctrl_a_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_A_SEQUENCE);
}
#[test]
fn test_ctrl_e_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('e'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_E_SEQUENCE);
}
#[test]
fn test_ctrl_u_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('u'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_U_SEQUENCE);
}
#[test]
fn test_ctrl_k_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('k'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_K_SEQUENCE);
}
#[test]
fn test_ctrl_w_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('w'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_W_SEQUENCE);
}
#[test]
fn test_ctrl_l_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('l'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_L_SEQUENCE);
}
#[test]
fn test_ctrl_r_sequence() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('r'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), CTRL_R_SEQUENCE);
}
#[test]
fn test_ctrl_b_general_handler() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('b'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), &[0x02]);
}
#[test]
fn test_ctrl_f_general_handler() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('f'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), &[0x06]);
}
#[test]
fn test_up_arrow() {
let event = Event::Key(KeyEvent {
code: KeyCode::Up,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), UP_ARROW_SEQUENCE);
}
#[test]
fn test_down_arrow() {
let event = Event::Key(KeyEvent {
code: KeyCode::Down,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), DOWN_ARROW_SEQUENCE);
}
#[test]
fn test_left_arrow() {
let event = Event::Key(KeyEvent {
code: KeyCode::Left,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), LEFT_ARROW_SEQUENCE);
}
#[test]
fn test_right_arrow() {
let event = Event::Key(KeyEvent {
code: KeyCode::Right,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), RIGHT_ARROW_SEQUENCE);
}
#[test]
fn test_f1_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(1),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F1_SEQUENCE);
}
#[test]
fn test_f2_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(2),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F2_SEQUENCE);
}
#[test]
fn test_f3_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(3),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F3_SEQUENCE);
}
#[test]
fn test_f4_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(4),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F4_SEQUENCE);
}
#[test]
fn test_f5_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(5),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F5_SEQUENCE);
}
#[test]
fn test_f6_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(6),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F6_SEQUENCE);
}
#[test]
fn test_f7_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(7),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F7_SEQUENCE);
}
#[test]
fn test_f8_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(8),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F8_SEQUENCE);
}
#[test]
fn test_f9_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(9),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F9_SEQUENCE);
}
#[test]
fn test_f10_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(10),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F10_SEQUENCE);
}
#[test]
fn test_f11_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(11),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F11_SEQUENCE);
}
#[test]
fn test_f12_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(12),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), F12_SEQUENCE);
}
#[test]
fn test_f13_key_not_supported() {
let event = Event::Key(KeyEvent {
code: KeyCode::F(13),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_none());
}
#[test]
fn test_enter_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Enter,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), ENTER_SEQUENCE);
}
#[test]
fn test_tab_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Tab,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), TAB_SEQUENCE);
}
#[test]
fn test_backspace_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Backspace,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), BACKSPACE_SEQUENCE);
}
#[test]
fn test_escape_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Esc,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), ESC_SEQUENCE);
}
#[test]
fn test_home_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Home,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), HOME_SEQUENCE);
}
#[test]
fn test_end_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::End,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), END_SEQUENCE);
}
#[test]
fn test_page_up_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::PageUp,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), PAGE_UP_SEQUENCE);
}
#[test]
fn test_page_down_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::PageDown,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), PAGE_DOWN_SEQUENCE);
}
#[test]
fn test_insert_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Insert,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), INSERT_SEQUENCE);
}
#[test]
fn test_delete_key() {
let event = Event::Key(KeyEvent {
code: KeyCode::Delete,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), DELETE_SEQUENCE);
}
#[test]
fn test_key_release_ignored() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Release,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_none(), "Key release events should be ignored");
}
#[test]
fn test_key_repeat_ignored() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Repeat,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_none(), "Key repeat events should be ignored");
}
#[test]
fn test_shift_character() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('A'),
modifiers: KeyModifiers::SHIFT,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), b"A");
}
#[test]
fn test_alt_character_ignored() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::ALT,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(
result.is_none(),
"Alt+char should be ignored (no special handler)"
);
}
#[test]
fn test_meta_character_ignored() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::META,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(
result.is_none(),
"Meta+char should be ignored (no special handler)"
);
}
#[test]
fn test_unicode_character() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('한'),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), "한".as_bytes());
}
#[test]
fn test_emoji_character() {
let event = Event::Key(KeyEvent {
code: KeyCode::Char('🚀'),
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
});
let result = handle_input_event(event);
assert!(result.is_some());
assert_eq!(result.unwrap().as_slice(), "🚀".as_bytes());
}
#[test]
fn test_mouse_event_returns_none() {
let event = Event::Mouse(MouseEvent {
kind: crossterm::event::MouseEventKind::Down(crossterm::event::MouseButton::Left),
column: 0,
row: 0,
modifiers: KeyModifiers::NONE,
});
let result = handle_input_event(event);
assert!(result.is_none(), "Mouse events should return None");
}
#[test]
fn test_key_event_to_bytes_ctrl_out_of_range() {
let key_event = KeyEvent {
code: KeyCode::Char('{'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: crossterm::event::KeyEventState::NONE,
};
let result = key_event_to_bytes(key_event);
assert!(result.is_none());
}
}