#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CompletionItem {
pub label: String,
pub insert_text: String,
pub detail: String,
}
pub fn get_markdown_completions(query: &str) -> Vec<CompletionItem> {
crate::logic::text_completion::emoji_completion_items()
.iter()
.filter(|item| {
crate::logic::text_completion::emoji_shortcode_matches_query(&item.shortcode, query)
})
.map(|item| CompletionItem {
label: item.display.clone(),
insert_text: item.shortcode.clone(),
detail: "Emoji shortcode".to_string(),
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn smoke_test_get_markdown_completions_empty_query_returns_all() {
let items = get_markdown_completions("");
assert!(
!items.is_empty(),
"empty query should return all emoji completions"
);
for item in &items {
assert!(
!item.insert_text.is_empty(),
"insert_text must not be empty"
);
assert!(!item.label.is_empty(), "label must not be empty");
assert_eq!(item.detail, "Emoji shortcode");
}
}
#[test]
fn smoke_test_get_markdown_completions_filters_by_prefix() {
let smile_items = get_markdown_completions("smile");
assert!(
!smile_items.is_empty(),
"query 'smile' should match at least one emoji shortcode"
);
for item in &smile_items {
assert!(
item.insert_text.contains("smile"),
"shortcode '{}' should contain 'smile'",
item.insert_text
);
}
}
#[test]
fn smoke_test_get_markdown_completions_unknown_query_returns_empty() {
let items = get_markdown_completions("xyzzy_no_such_emoji_exists_42");
assert!(
items.is_empty(),
"nonsense query should return no completions"
);
}
}