From e77ddd459c0988fa86f4ba46ca9d48f73c65246d Mon Sep 17 00:00:00 2001 From: slhx agent Date: Thu, 25 Jun 2026 23:36:15 +0200 Subject: [PATCH] test(lsp): cover protocol framing basics Add LSP protocol coverage for initialize capabilities, shutdown response, and unknown request errors. req: diagnostics/008 --- hemx-lsp/src/main.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/hemx-lsp/src/main.rs b/hemx-lsp/src/main.rs index 3438e94..ba95755 100644 --- a/hemx-lsp/src/main.rs +++ b/hemx-lsp/src/main.rs @@ -943,6 +943,48 @@ mod tests { 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] fn lsp_publishes_and_clears_build_equivalent_diagnostics() { // req: diagnostics/004 req: diagnostics/005