diff --git a/src/highlight.rs b/src/highlight.rs
index 872bbc7..7947e0d 100644
--- a/src/highlight.rs
+++ b/src/highlight.rs
@@ -69,7 +69,8 @@ pub mod server {
("golang", "go"),
];
for &(from, to) in aliases {
- if lang == from {
+ // 别名比较同样不区分大小写,保证 "RUST" 与 "rust" 等价。
+ if lang.eq_ignore_ascii_case(from) {
if let Some(s) = ss.find_syntax_by_extension(to) {
return s;
}
@@ -151,4 +152,71 @@ mod tests {
assert!(result.contains(r#"let"#));
assert!(result.contains(r#"1"#));
}
+
+ #[test]
+ fn highlight_code_uppercase_language_falls_back_via_lowercase() {
+ // 大写语言标识应通过小写回退路径匹配到对应语法。
+ let lower = highlight_code("fn main() {}", Some("rust"));
+ let upper = highlight_code("fn main() {}", Some("RUST"));
+ // 大写标识的输出必须与小写标识完全一致,证明回退路径生效。
+ assert_eq!(lower, upper);
+ assert!(lower.contains(r#"fn"#));
+ }
+
+ #[test]
+ fn highlight_code_resolves_golang_alias() {
+ // 别名表中 "golang" 映射到 "go" 扩展名,输出应与直接用 "go" 一致。
+ let by_alias = highlight_code("package main", Some("golang"));
+ let by_ext = highlight_code("package main", Some("go"));
+ assert_eq!(by_alias, by_ext);
+ // 别名解析必须产出带 span 的高亮输出,而非纯文本。
+ assert!(by_alias.contains("span"));
+ }
+
+ #[test]
+ fn highlight_code_resolves_bash_alias() {
+ // 别名表中 "bash" 映射到 "sh" 扩展名。
+ let result = highlight_code("echo hello", Some("bash"));
+ assert!(result.contains("span"));
+ }
+
+ #[test]
+ fn highlight_code_resolves_yml_alias() {
+ // 别名表中 "yml" 映射到 "yaml" 扩展名。
+ let result = highlight_code("key: value", Some("yml"));
+ assert!(!result.is_empty());
+ }
+
+ #[test]
+ fn highlight_code_unknown_language_falls_back_to_plain_text() {
+ // 无法识别的语言应回退到纯文本语法,仍能输出内容。
+ let result = highlight_code("hello world", Some("totally-not-a-language-xyz"));
+ assert!(result.contains("hello world"));
+ }
+
+ #[test]
+ fn highlight_code_empty_language_string_falls_back_to_plain_text() {
+ // 空字符串语言标识应走纯文本回退路径。
+ let result = highlight_code("just text", Some(""));
+ assert!(result.contains("just text"));
+ }
+
+ #[test]
+ fn highlight_code_trims_surrounding_whitespace() {
+ // 代码首尾的空白会被 trim 掉再高亮。
+ let result = highlight_code(" \nfn main() {}\n ", Some("rust"));
+ assert!(result.contains(r#"fn"#));
+ }
+
+ #[test]
+ fn highlight_code_multiline_output_spans_all_lines() {
+ // 多行代码每一行都应被解析为带 span 的输出。
+ let code = "fn a() {}\nfn b() {}";
+ let result = highlight_code(code, Some("rust"));
+ // 两处 fn 关键字都应出现
+ assert_eq!(
+ result.matches(r#"fn"#).count(),
+ 2
+ );
+ }
}