module; export module lsp.test.provider.surface; import std; import lsp.test.framework; import lsp.codec.facade; import lsp.protocol; import lsp.core.dispatcher; import lsp.manager.manager_hub; import lsp.scheduler.async_executor; import lsp.test.provider.fixtures; import lsp.provider.cancel_request.cancel_request; import lsp.provider.code_action.resolve; import lsp.provider.code_lens.resolve; import lsp.provider.completion_item.resolve; import lsp.provider.document_link.resolve; import lsp.provider.exit.exit; import lsp.provider.initialize.initialize; import lsp.provider.initialized.initialized; import lsp.provider.inlay_hint.resolve; import lsp.provider.shutdown.shutdown; import lsp.provider.trace.set_trace; import lsp.provider.call_hierarchy.incoming_calls; import lsp.provider.call_hierarchy.outgoing_calls; import lsp.provider.type_hierarchy.supertypes; import lsp.provider.type_hierarchy.subtypes; import lsp.provider.client.register_capability; import lsp.provider.client.unregister_capability; import lsp.provider.workspace.diagnostic; import lsp.provider.workspace.did_change_configuration; import lsp.provider.workspace.did_change_watched_files; import lsp.provider.workspace.did_change_workspace_folders; import lsp.provider.workspace.did_create_files; import lsp.provider.workspace.did_delete_files; import lsp.provider.workspace.did_rename_files; import lsp.provider.workspace.configuration; import lsp.provider.workspace.apply_edit; import lsp.provider.workspace.workspace_folders; import lsp.provider.workspace.code_lens_refresh; import lsp.provider.workspace.diagnostic_refresh; import lsp.provider.workspace.inlay_hint_refresh; import lsp.provider.workspace.inline_value_refresh; import lsp.provider.workspace.semantic_tokens_refresh; import lsp.provider.workspace.execute_command; import lsp.provider.workspace.symbol; import lsp.provider.workspace.will_create_files; import lsp.provider.workspace.will_delete_files; import lsp.provider.workspace.will_rename_files; import lsp.provider.workspace_symbol.resolve; import lsp.provider.window.work_done_progress_create; import lsp.provider.window.show_message_request; import lsp.provider.window.show_document; import lsp.provider.window.log_message; import lsp.provider.window.show_message; import lsp.provider.telemetry.event; import lsp.provider.text_document.code_action; import lsp.provider.text_document.code_lens; import lsp.provider.text_document.color_presentation; import lsp.provider.text_document.completion; import lsp.provider.text_document.definition; import lsp.provider.text_document.diagnostic; import lsp.provider.text_document.did_change; import lsp.provider.text_document.did_close; import lsp.provider.text_document.did_open; import lsp.provider.text_document.document_color; import lsp.provider.text_document.document_highlight; import lsp.provider.text_document.document_link; import lsp.provider.text_document.document_symbol; import lsp.provider.text_document.folding_range; import lsp.provider.text_document.formatting; import lsp.provider.text_document.hover; import lsp.provider.text_document.implementation; import lsp.provider.text_document.inlay_hint; import lsp.provider.text_document.inline_value; import lsp.provider.text_document.linked_editing_range; import lsp.provider.text_document.moniker; import lsp.provider.text_document.on_type_formatting; import lsp.provider.text_document.prepare_call_hierarchy; import lsp.provider.text_document.prepare_rename; import lsp.provider.text_document.prepare_type_hierarchy; import lsp.provider.text_document.range_formatting; import lsp.provider.text_document.references; import lsp.provider.text_document.rename; import lsp.provider.text_document.selection_range; import lsp.provider.text_document.semantic_tokens; import lsp.provider.text_document.signature_help; import lsp.provider.text_document.type_definition; import lsp.provider.text_document.publish_diagnostics; export namespace lsp::test::provider { class ProviderSurfaceTests { public: static void Register(TestRunner& runner); private: static TestResult TestProviderMetadata(); static TestResult TestRequestProviderResponses(); static TestResult TestNotificationProviderHandlers(); }; } namespace lsp::test::provider { namespace { namespace codec = lsp::codec; namespace provider = lsp::provider; struct ProviderEnv { scheduler::AsyncExecutor scheduler{ 1 }; manager::ManagerHub hub{}; core::ExecutionContext context; ProviderEnv() : context([](core::ServerLifecycleEvent) {}, scheduler, hub) { hub.Initialize(); } }; template void CheckProviderMetadata(const std::string& expected_method, const std::string& expected_name) { Provider provider; assertEqual(expected_method, provider.GetMethod(), "GetMethod mismatch for " + expected_name); assertEqual(expected_name, provider.GetProviderName(), "GetProviderName mismatch for " + expected_name); } template void CheckRequestResponse() { ProviderEnv env; Provider provider; protocol::RequestMessage request; request.id = "probe"; request.method = provider.GetMethod(); request.params = std::nullopt; auto json = provider.ProvideResponse(request, env.context); assertTrue(!json.empty(), "ProvideResponse should return JSON for " + provider.GetProviderName()); auto parsed = codec::Deserialize(json); assertTrue(parsed.has_value(), "ProvideResponse should return valid JSON for " + provider.GetProviderName()); } template void CheckNotificationHandler(const std::optional& params) { ProviderEnv env; Provider provider; protocol::NotificationMessage notification; notification.method = provider.GetMethod(); notification.params = params; provider.HandleNotification(notification, env.context); } } void ProviderSurfaceTests::Register(TestRunner& runner) { runner.addTest("provider metadata", TestProviderMetadata); runner.addTest("provider request responses", TestRequestProviderResponses); runner.addTest("provider notification handlers", TestNotificationProviderHandlers); } TestResult ProviderSurfaceTests::TestProviderMetadata() { TestResult result{ "", true, "ok" }; CheckProviderMetadata("initialize", "Initialize"); CheckProviderMetadata("shutdown", "Shutdown"); CheckProviderMetadata("completionItem/resolve", "CompletionItemResolve"); CheckProviderMetadata("textDocument/completion", "TextDocumentCompletion"); CheckProviderMetadata("textDocument/definition", "TextDocumentDefinition"); CheckProviderMetadata("textDocument/rename", "TextDocumentRename"); CheckProviderMetadata("textDocument/references", "TextDocumentReferences"); CheckProviderMetadata("textDocument/semanticTokens/range", "TextDocumentSemanticTokensRange"); CheckProviderMetadata("textDocument/semanticTokens/full", "SemanticTokensFull"); CheckProviderMetadata("textDocument/semanticTokens/full/delta", "SemanticTokensFullDelta"); CheckProviderMetadata("textDocument/hover", "TextDocumentHover"); CheckProviderMetadata("textDocument/formatting", "TextDocumentFormatting"); CheckProviderMetadata("textDocument/rangeFormatting", "TextDocumentRangeFormatting"); CheckProviderMetadata("textDocument/onTypeFormatting", "TextDocumentOnTypeFormatting"); CheckProviderMetadata("textDocument/documentSymbol", "TextDocumentDocumentSymbol"); CheckProviderMetadata("textDocument/documentLink", "TextDocumentDocumentLink"); CheckProviderMetadata("textDocument/documentHighlight", "TextDocumentDocumentHighlight"); CheckProviderMetadata("textDocument/documentColor", "TextDocumentDocumentColor"); CheckProviderMetadata("textDocument/colorPresentation", "TextDocumentColorPresentation"); CheckProviderMetadata("textDocument/codeLens", "TextDocumentCodeLens"); CheckProviderMetadata("textDocument/codeAction", "TextDocumentCodeAction"); CheckProviderMetadata("textDocument/prepareTypeHierarchy", "TextDocumentPrepareTypeHierarchy"); CheckProviderMetadata("textDocument/prepareRename", "TextDocumentPrepareRename"); CheckProviderMetadata("textDocument/prepareCallHierarchy", "TextDocumentPrepareCallHierarchy"); CheckProviderMetadata("textDocument/typeDefinition", "TextDocumentTypeDefinition"); CheckProviderMetadata("textDocument/implementation", "TextDocumentImplementation"); CheckProviderMetadata("textDocument/selectionRange", "TextDocumentSelectionRange"); CheckProviderMetadata("textDocument/signatureHelp", "TextDocumentSignatureHelp"); CheckProviderMetadata("textDocument/inlayHint", "TextDocumentInlayHint"); CheckProviderMetadata("textDocument/inlineValue", "TextDocumentInlineValue"); CheckProviderMetadata("textDocument/linkedEditingRange", "TextDocumentLinkedEditingRange"); CheckProviderMetadata("textDocument/moniker", "TextDocumentMoniker"); CheckProviderMetadata("textDocument/diagnostic", "TextDocumentDiagnostic"); CheckProviderMetadata("textDocument/foldingRange", "TextDocumentFoldingRange"); CheckProviderMetadata("codeAction/resolve", "CodeActionResolve"); CheckProviderMetadata("codeLens/resolve", "CodeLensResolve"); CheckProviderMetadata("documentLink/resolve", "DocumentLinkResolve"); CheckProviderMetadata("inlayHint/resolve", "InlayHintResolve"); CheckProviderMetadata("workspaceSymbol/resolve", "WorkspaceSymbResolve"); CheckProviderMetadata("typeHierarchy/supertypes", "TypeHierarchySupertypes"); CheckProviderMetadata("typeHierarchy/subtypes", "TypeHierarchySubtypes"); CheckProviderMetadata("callHierarchy/incomingCalls", "CallHierarchyIncomingCalls"); CheckProviderMetadata("callHierarchy/outgoingCalls", "CallHierarchyOutgoingCalls"); CheckProviderMetadata("workspace/diagnostic", "WorkspaceDiagnostic"); CheckProviderMetadata("workspace/executeCommand", "WorkspaceExecuteCommand"); CheckProviderMetadata("workspace/willCreateFiles", "WorkspaceWillCreateFiles"); CheckProviderMetadata("workspace/willDeleteFiles", "WorkspaceWillDeleteFiles"); CheckProviderMetadata("workspace/willRenameFiles", "WorkspaceWillRenameFiles"); CheckProviderMetadata("workspace/symbol", "WorkSpaceSymbol"); CheckProviderMetadata("workspace/configuration", "WorkspaceConfiguration"); CheckProviderMetadata("workspace/applyEdit", "WorkspaceApplyEdit"); CheckProviderMetadata("workspace/workspaceFolders", "WorkspaceWorkspaceFolders"); CheckProviderMetadata("workspace/codeLens/refresh", "WorkspaceCodeLensRefresh"); CheckProviderMetadata("workspace/diagnostic/refresh", "WorkspaceDiagnosticRefresh"); CheckProviderMetadata("workspace/inlayHint/refresh", "WorkspaceInlayHintRefresh"); CheckProviderMetadata("workspace/inlineValue/refresh", "WorkspaceInlineValueRefresh"); CheckProviderMetadata("workspace/semanticTokens/refresh", "WorkspaceSemanticTokensRefresh"); CheckProviderMetadata("client/registerCapability", "ClientRegisterCapability"); CheckProviderMetadata("client/unregisterCapability", "ClientUnregisterCapability"); CheckProviderMetadata("window/workDoneProgress/create", "WindowWorkDoneProgressCreate"); CheckProviderMetadata("window/showMessageRequest", "WindowShowMessageRequest"); CheckProviderMetadata("window/showDocument", "WindowShowDocument"); CheckProviderMetadata("window/logMessage", "WindowLogMessage"); CheckProviderMetadata("window/showMessage", "WindowShowMessage"); CheckProviderMetadata("telemetry/event", "TelemetryEvent"); CheckProviderMetadata("textDocument/publishDiagnostics", "TextDocumentPublishDiagnostics"); CheckProviderMetadata("workspace/didChangeConfiguration", "WorkspaceDidChangeConfiguration"); CheckProviderMetadata("workspace/didChangeWatchedFiles", "WorkspaceDidChangeWatchedFiles"); CheckProviderMetadata("workspace/didChangeWorkspaceFolders", "WorkspaceDidChangeWorkspaceFolders"); CheckProviderMetadata("workspace/didCreateFiles", "WorkspaceDidCreateFiles"); CheckProviderMetadata("workspace/didDeleteFiles", "WorkspaceDidDeleteFiles"); CheckProviderMetadata("workspace/didRenameFiles", "WorkspaceDidRenameFiles"); CheckProviderMetadata("initialized", "Initialized"); CheckProviderMetadata("exit", "Exit"); CheckProviderMetadata("$/cancelRequest", "CancelRequest"); CheckProviderMetadata("$/setTrace", "SetTrace"); CheckProviderMetadata("textDocument/didOpen", "TextDocumentDidOpen"); CheckProviderMetadata("textDocument/didChange", "TextDocumentDidChange"); CheckProviderMetadata("textDocument/didClose", "TextDocumentDidClose"); return result; } TestResult ProviderSurfaceTests::TestRequestProviderResponses() { TestResult result{ "", true, "ok" }; CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); CheckRequestResponse(); return result; } TestResult ProviderSurfaceTests::TestNotificationProviderHandlers() { TestResult result{ "", true, "ok" }; CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); CheckNotificationHandler(std::nullopt); return result; } }