test(lsp): cover protocol framing basics

Add LSP protocol coverage for initialize capabilities, shutdown response, and unknown request errors.

req: diagnostics/008
This commit is contained in:
slhx agent
2026-06-25 23:36:15 +02:00
parent 258524f3b8
commit e77ddd459c
+42
View File
@@ -943,6 +943,48 @@ mod tests {
assert!(hover.to_string().contains("exercise.name: &'static str")); assert!(hover.to_string().contains("exercise.name: &'static str"));
} }
#[test]
fn lsp_protocol_initialize_shutdown_and_unknown_requests_are_framed() {
// req: diagnostics/008
let input = [
lsp_message(serde_json::json!({"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {}})),
lsp_message(serde_json::json!({"jsonrpc": "2.0", "id": 2, "method": "hemx/unknown", "params": {}})),
lsp_message(serde_json::json!({"jsonrpc": "2.0", "id": 3, "method": "shutdown", "params": null})),
lsp_message(serde_json::json!({"jsonrpc": "2.0", "method": "exit"})),
]
.join("");
let mut reader = std::io::BufReader::new(input.as_bytes());
let mut output = Vec::new();
serve_lsp(&mut reader, &mut output).expect("serve LSP");
let messages = lsp_messages(&output);
assert_eq!(
messages.len(),
3,
"initialize, unknown request, shutdown responses"
);
assert_eq!(messages[0]["id"], 1);
assert_eq!(
messages[0]["result"]["capabilities"]["textDocumentSync"]["openClose"],
true
);
assert_eq!(
messages[0]["result"]["capabilities"]["completionProvider"]["triggerCharacters"][0],
"h"
);
assert_eq!(messages[0]["result"]["capabilities"]["hoverProvider"], true);
assert_eq!(messages[1]["id"], 2);
assert_eq!(messages[1]["error"]["code"], -32601);
assert!(messages[1]["error"]["message"]
.as_str()
.unwrap_or_default()
.contains("hemx/unknown"));
assert_eq!(
messages[2],
serde_json::json!({"jsonrpc": "2.0", "id": 3, "result": null})
);
}
#[test] #[test]
fn lsp_publishes_and_clears_build_equivalent_diagnostics() { fn lsp_publishes_and_clears_build_equivalent_diagnostics() {
// req: diagnostics/004 req: diagnostics/005 // req: diagnostics/004 req: diagnostics/005