use super::*;
use ratatui_kit_keymap::crokey::key;
#[test]
fn chapter_search_keys_and_overrides_preserve_case() {
let mut km = reader_defaults();
assert_eq!(km.action_for(key!(s)), Some(ReaderAction::SearchContent));
assert_eq!(km.action_for(key!(n)), Some(ReaderAction::NextSearchMatch));
assert_eq!(
km.action_for(key!(shift - n)),
Some(ReaderAction::PrevSearchMatch)
);
assert_eq!(
km.action_for(key!(esc)),
Some(ReaderAction::ClearContentSearch)
);
assert_eq!(display_first_key(&km, ReaderAction::NextSearchMatch), "n");
assert_eq!(display_first_key(&km, ReaderAction::PrevSearchMatch), "N");
let table = ratatui_kit_keymap::toml::from_str(
"search_content = [\"ctrl-s\"]\nnext_search_match = [\"f3\"]\nprev_search_match = [\"shift-f3\"]\nclear_content_search = [\"ctrl-x\"]"
).unwrap();
assert!(km.merge_toml_table(table).is_empty());
assert_eq!(km.action_for(key!(s)), None);
assert_eq!(
km.action_for(key!(ctrl - s)),
Some(ReaderAction::SearchContent)
);
assert_eq!(km.action_for(key!(f3)), Some(ReaderAction::NextSearchMatch));
assert_eq!(
km.action_for(key!(shift - f3)),
Some(ReaderAction::PrevSearchMatch)
);
assert_eq!(
km.action_for(key!(ctrl - x)),
Some(ReaderAction::ClearContentSearch)
);
}
#[test]
fn reader_defaults_build_and_match_legacy_keys() {
let km = reader_defaults();
assert_eq!(km.action_for(key!(k)), Some(ReaderAction::ScrollUp));
assert_eq!(km.action_for(key!(down)), Some(ReaderAction::ScrollDown));
assert_eq!(km.action_for(key!(pagedown)), Some(ReaderAction::PageDown));
assert_eq!(km.action_for(key!(home)), Some(ReaderAction::GoTop));
assert_eq!(km.action_for(key!('+')), Some(ReaderAction::VolumeUp));
assert_eq!(km.action_for(key!('-')), Some(ReaderAction::VolumeDown));
assert_eq!(km.action_for(key!(tab)), Some(ReaderAction::ToggleReadMode));
assert_eq!(km.action_for(key!(i)), Some(ReaderAction::ToggleInfo));
assert_eq!(
km.action_for(key!(shift - i)),
Some(ReaderAction::ToggleInfo)
);
assert_eq!(
km.action_for(key!(shift - t)),
Some(ReaderAction::ToggleTts)
);
assert_eq!(
km.action_for(key!(o)),
Some(ReaderAction::ToggleReaderSettings)
);
assert_eq!(km.action_for(key!(ctrl - f)), Some(ReaderAction::PageDown));
assert_eq!(km.action_for(key!(ctrl - b)), Some(ReaderAction::PageUp));
}
#[test]
fn reader_override_merges() {
let mut km = reader_defaults();
let table: ratatui_kit_keymap::toml::Table =
ratatui_kit_keymap::toml::from_str("page_down = [\"ctrl-d\"]").unwrap();
let warnings = km.merge_toml_table(table);
assert!(warnings.is_empty());
assert_eq!(km.action_for(key!(ctrl - d)), Some(ReaderAction::PageDown));
assert_eq!(km.action_for(key!(pagedown)), None);
assert_eq!(km.action_for(key!(ctrl - f)), None);
assert_eq!(km.action_for(key!(k)), Some(ReaderAction::ScrollUp));
}
#[test]
fn display_keys_follow_project_style() {
let mut km = reader_defaults();
assert_eq!(display_keys(&km, ReaderAction::ScrollUp), "↑ / K");
assert_eq!(display_keys(&km, ReaderAction::VolumeDown), "-");
assert_eq!(display_keys(&km, ReaderAction::ToggleTts), "T");
let table: ratatui_kit_keymap::toml::Table =
ratatui_kit_keymap::toml::from_str("page_down = [\"ctrl-d\"]").unwrap();
km.merge_toml_table(table);
assert_eq!(display_keys(&km, ReaderAction::PageDown), "Ctrl-d");
}
#[test]
fn warnings_render_in_chinese() {
let mut km = reader_defaults();
let table: ratatui_kit_keymap::toml::Table =
ratatui_kit_keymap::toml::from_str("page_down = \"ctrl-\"\ntypo = \"x\"\ntoggle_play = 3")
.unwrap();
let messages: Vec<String> = km
.merge_toml_table(table)
.iter()
.map(render_warning)
.collect();
assert_eq!(messages.len(), 3);
assert!(messages.iter().any(|m| m.contains("无法解析")));
assert!(messages.iter().any(|m| m.contains("未知操作")));
assert!(messages.iter().any(|m| m.contains("值类型不对")));
assert_eq!(km.action_for(key!(pagedown)), Some(ReaderAction::PageDown));
}