From 54339a95b89d6ab55d45f9e8e36fa2464eff68f2 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 8 May 2026 10:15:17 +0100 Subject: [PATCH] implements PLN-0077 --- .../PrometeuTextDocumentServiceTest.java | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/services/protocol/PrometeuTextDocumentServiceTest.java diff --git a/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/services/protocol/PrometeuTextDocumentServiceTest.java b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/services/protocol/PrometeuTextDocumentServiceTest.java new file mode 100644 index 00000000..05908c78 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/services/protocol/PrometeuTextDocumentServiceTest.java @@ -0,0 +1,212 @@ +package p.studio.lsp.services.protocol; + +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.CompletionParams; +import org.eclipse.lsp4j.DidOpenTextDocumentParams; +import org.eclipse.lsp4j.Hover; +import org.eclipse.lsp4j.HoverParams; +import org.eclipse.lsp4j.MarkupContent; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.SignatureHelp; +import org.eclipse.lsp4j.SignatureHelpParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextDocumentItem; +import org.junit.jupiter.api.Test; +import p.studio.lsp.messages.BaselineCompletion; +import p.studio.lsp.messages.BaselineCompletionItem; +import p.studio.lsp.messages.BaselineCompletionItemKind; +import p.studio.lsp.messages.BaselineDocumentAnalysis; +import p.studio.lsp.messages.BaselineHover; +import p.studio.lsp.messages.BaselineSemanticTokens; +import p.studio.lsp.messages.BaselineServerDescription; +import p.studio.lsp.messages.BaselineSignature; +import p.studio.lsp.messages.BaselineSignatureHelp; +import p.studio.lsp.messages.LspProjectContext; +import p.studio.lsp.services.LanguageServiceBridge; +import p.studio.lsp.services.protocol.mapping.ProtocolMessageMapper; + +import java.nio.file.Path; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +final class PrometeuTextDocumentServiceTest { + + @Test + void shouldPassOpenDocumentOverlayToCompletionHoverAndSignatureHelp() { + final var bridge = new RecordingBridge(); + final var mapper = new RecordingMapper(); + final var service = new PrometeuTextDocumentService( + new LspProjectContext("main", "pbs", Path.of(".")), + bridge, + mapper); + final String uri = Path.of("demo.pbs").toUri().toString(); + final String text = """ + fn frame() -> void { + demo(); + } + """; + + final var openParams = new DidOpenTextDocumentParams(new TextDocumentItem(uri, "pbs", 1, text)); + service.didOpen(openParams); + + final var completion = service.completion(new CompletionParams( + new TextDocumentIdentifier(uri), + new Position(1, 2))).join(); + final var completionList = completion.getRight(); + assertSame(mapper.completionList, completionList); + assertEquals(text, bridge.lastCompletionText); + assertEquals(1, bridge.lastCompletionLine); + assertEquals(2, bridge.lastCompletionCharacter); + + final Hover hover = service.hover(new HoverParams( + new TextDocumentIdentifier(uri), + new Position(1, 4))).join(); + final var hoverContent = (MarkupContent) hover.getContents().getRight(); + assertEquals("hover", hoverContent.getValue()); + assertEquals(text, bridge.lastHoverText); + + final SignatureHelp signatureHelp = service.signatureHelp(new SignatureHelpParams( + new TextDocumentIdentifier(uri), + new Position(1, 6))).join(); + assertSame(mapper.signatureHelp, signatureHelp); + assertEquals(text, bridge.lastSignatureHelpText); + assertEquals(1, bridge.lastSignatureHelpLine); + assertEquals(6, bridge.lastSignatureHelpCharacter); + assertTrue(mapper.mappedSignatureHelp.signatures().getFirst().label().contains("demo")); + } + + private static final class RecordingBridge implements LanguageServiceBridge { + private String lastCompletionText; + private int lastCompletionLine; + private int lastCompletionCharacter; + private String lastHoverText; + private String lastSignatureHelpText; + private int lastSignatureHelpLine; + private int lastSignatureHelpCharacter; + + @Override + public BaselineServerDescription describeServer(final LspProjectContext context) { + throw new UnsupportedOperationException(); + } + + @Override + public BaselineDocumentAnalysis analyzeDocument(final LspProjectContext context, final String documentUri, final String text) { + return new BaselineDocumentAnalysis(List.of()); + } + + @Override + public BaselineCompletion completion( + final LspProjectContext context, + final String documentUri, + final String text, + final int line, + final int character) { + lastCompletionText = text; + lastCompletionLine = line; + lastCompletionCharacter = character; + return new BaselineCompletion(false, List.of( + new BaselineCompletionItem("demo", BaselineCompletionItemKind.FUNCTION, "", ""))); + } + + @Override + public BaselineHover hover( + final LspProjectContext context, + final String documentUri, + final String text, + final int line, + final int character) { + lastHoverText = text; + return new BaselineHover("hover"); + } + + @Override + public BaselineSignatureHelp signatureHelp( + final LspProjectContext context, + final String documentUri, + final String text, + final int line, + final int character) { + lastSignatureHelpText = text; + lastSignatureHelpLine = line; + lastSignatureHelpCharacter = character; + return new BaselineSignatureHelp(List.of( + new BaselineSignature("demo()", List.of(), "")), 0, 0); + } + + @Override + public BaselineSemanticTokens semanticTokens(final LspProjectContext context, final String documentUri, final String text) { + return new BaselineSemanticTokens(List.of(), List.of()); + } + + @Override + public String onSave(final LspProjectContext context, final String documentUri) { + return "saved"; + } + } + + private static final class RecordingMapper implements ProtocolMessageMapper { + private final CompletionList completionList = new CompletionList(false, List.of(new CompletionItem("demo"))); + private final SignatureHelp signatureHelp = new SignatureHelp(); + private BaselineSignatureHelp mappedSignatureHelp; + + @Override + public org.eclipse.lsp4j.InitializeResult mapInitializeResult(final BaselineServerDescription description) { + throw new UnsupportedOperationException(); + } + + @Override + public org.eclipse.lsp4j.PublishDiagnosticsParams mapDiagnostics( + final String uri, + final BaselineDocumentAnalysis analysis) { + throw new UnsupportedOperationException(); + } + + @Override + public org.eclipse.lsp4j.PublishDiagnosticsParams emptyDiagnostics(final String uri) { + throw new UnsupportedOperationException(); + } + + @Override + public Hover mapHover(final BaselineHover hover) { + final var content = new MarkupContent(); + content.setKind("markdown"); + content.setValue(hover.markdown()); + return new Hover(content); + } + + @Override + public CompletionList mapCompletion(final BaselineCompletion completion) { + return completionList; + } + + @Override + public SignatureHelp mapSignatureHelp(final BaselineSignatureHelp signatureHelp) { + this.mappedSignatureHelp = signatureHelp; + return this.signatureHelp; + } + + @Override + public org.eclipse.lsp4j.SemanticTokens mapSemanticTokens(final BaselineSemanticTokens semanticTokens) { + throw new UnsupportedOperationException(); + } + + @Override + public org.eclipse.lsp4j.MessageParams mapInfoMessage(final String message) { + throw new UnsupportedOperationException(); + } + + @Override + public org.eclipse.lsp4j.MessageParams mapErrorMessage(final String message) { + throw new UnsupportedOperationException(); + } + + @Override + public org.eclipse.lsp4j.MessageParams mapWarningMessage(final String message) { + throw new UnsupportedOperationException(); + } + } +}