#![cfg(test)]
use std::sync::Arc;
use kimun_core::{NoteVault, SystemPath, VaultConfig};
use ratatui::crossterm::event::{
KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers, MouseButton, MouseEvent,
MouseEventKind,
};
use crate::components::events::InputEvent;
pub fn sys<P: AsRef<std::path::Path>>(path: P) -> SystemPath {
SystemPath::try_absolute(&path).unwrap_or_else(|e| panic!("test path must be absolute: {e}"))
}
pub async fn temp_vault(prefix: &str) -> Arc<NoteVault> {
let dir = tempfile::Builder::new()
.prefix(&format!("kimun_{prefix}_test_"))
.tempdir()
.unwrap()
.keep();
Arc::new(NoteVault::new(VaultConfig::new(sys(&dir))).await.unwrap())
}
#[allow(dead_code)]
pub fn key_event(code: KeyCode) -> InputEvent {
InputEvent::Key(KeyEvent {
code,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
})
}
pub fn left_press(col: u16, row: u16) -> MouseEvent {
MouseEvent {
kind: MouseEventKind::Down(MouseButton::Left),
column: col,
row,
modifiers: KeyModifiers::NONE,
}
}
pub fn mouse_moved_at(col: u16, row: u16) -> InputEvent {
InputEvent::Mouse(MouseEvent {
kind: MouseEventKind::Moved,
column: col,
row,
modifiers: KeyModifiers::NONE,
})
}
pub fn drain(
rx: &mut tokio::sync::mpsc::UnboundedReceiver<crate::components::events::AppEvent>,
) -> Vec<crate::components::events::AppEvent> {
std::iter::from_fn(|| rx.try_recv().ok()).collect()
}
pub fn mouse_down_at(col: u16, row: u16) -> InputEvent {
InputEvent::Mouse(MouseEvent {
kind: MouseEventKind::Down(MouseButton::Left),
column: col,
row,
modifiers: KeyModifiers::NONE,
})
}
pub fn find_text(buf: &ratatui::buffer::Buffer, text: &str) -> Option<(u16, u16)> {
let want: Vec<String> = text.chars().map(|c| c.to_string()).collect();
let area = buf.area;
(area.y..area.bottom())
.flat_map(|y| (area.x..area.right()).map(move |x| (x, y)))
.find(|&(x, y)| {
want.iter().enumerate().all(|(i, c)| {
let cx = x + i as u16;
cx < area.right() && buf[(cx, y)].symbol() == c
})
})
}