From d368d320d7e444940bbe622c022d1ca9c1353e54 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Thu, 1 Mar 2018 11:44:47 +0100 Subject: [PATCH] added test for webflux code lenses --- .../testharness/LanguageServerHarness.java | 8 ++ .../BootJavaLanguageServerComponents.java | 10 ++- .../WebfluxHandlerCodeLensProvider.java | 2 +- .../test/WebFluxCodeLensProviderTest.java | 78 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 8dc25b309..3591ce223 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -46,6 +46,8 @@ import org.eclipse.lsp4j.ApplyWorkspaceEditResponse; import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.CodeActionContext; import org.eclipse.lsp4j.CodeActionParams; +import org.eclipse.lsp4j.CodeLens; +import org.eclipse.lsp4j.CodeLensParams; import org.eclipse.lsp4j.Command; import org.eclipse.lsp4j.CompletionCapabilities; import org.eclipse.lsp4j.CompletionItem; @@ -471,6 +473,12 @@ public class LanguageServerHarness { return getServer().getTextDocumentService().hover(params ).get(); } + public List getCodeLenses(TextDocumentInfo document) throws Exception { + CodeLensParams params = new CodeLensParams(); + params.setTextDocument(document.getId()); + return getServer().getTextDocumentService().codeLens(params).get(); + } + public CompletionItem resolveCompletionItem(CompletionItem maybeUnresolved) { if (getServer().hasLazyCompletionResolver()) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index 814a35111..fc932d065 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -60,6 +60,7 @@ import org.springframework.ide.vscode.commons.languageserver.completion.IComplet import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; +import org.springframework.ide.vscode.commons.languageserver.util.CodeLensHandler; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler; @@ -92,6 +93,7 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent private JavaProjectFinder projectFinder; private BootJavaHoverProvider hoverProvider; + private CodeLensHandler codeLensHandler; public BootJavaLanguageServerComponents(SimpleLanguageServer server, LSFactory _params) { this.server = server; @@ -147,8 +149,8 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent // } }); - BootJavaCodeLensEngine codeLensEngine = createCodeLensEngine(); - documents.onCodeLens(codeLensEngine); + codeLensHandler = createCodeLensEngine(); + documents.onCodeLens(codeLensHandler); workspaceService.onDidChangeConfiguraton(settings -> { config.handleConfigurationChange(settings); @@ -174,6 +176,10 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent return hoverProvider; } + public CodeLensHandler getCodeLensHandler() { + return codeLensHandler; + } + private void initialize(InitializeParams params) { this.indexer.initialize(server.getWorkspaceRoots()); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java index 91fdbf44c..857a33470 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java @@ -64,7 +64,7 @@ public class WebfluxHandlerCodeLensProvider implements CodeLensProvider { WebfluxHandlerInformation handlerInfo = (WebfluxHandlerInformation) object; CodeLens codeLens = new CodeLens(); - codeLens.setRange(document.toRange(node.getStartPosition(), node.getLength())); + codeLens.setRange(document.toRange(node.getName().getStartPosition(), node.getName().getLength())); codeLens.setCommand(new Command(handlerInfo.getSymbol(), null)); resultAccumulator.add(codeLens); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java new file mode 100644 index 000000000..d374973b4 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java.requestmapping.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.net.URI; +import java.util.List; + +import org.eclipse.lsp4j.CodeLens; +import org.eclipse.lsp4j.Command; +import org.eclipse.lsp4j.Range; +import org.junit.Before; +import org.junit.Test; +import org.springframework.ide.vscode.commons.util.text.LanguageId; +import org.springframework.ide.vscode.languageserver.testharness.TextDocumentInfo; +import org.springframework.ide.vscode.project.harness.BootJavaLanguageServerHarness; +import org.springframework.ide.vscode.project.harness.ProjectsHarness; + +/** + * @author Martin Lippert + */ +@SuppressWarnings("deprecation") +public class WebFluxCodeLensProviderTest { + + private BootJavaLanguageServerHarness harness; + + @Before + public void setup() throws Exception { + harness = BootJavaLanguageServerHarness.builder().build(); + } + + @Test + public void testRoutesCodeLenses() throws Exception { + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-webflux-project/").toURI())); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-webflux-project/").toURI()); + + String docUri = directory.toPath().resolve("src/main/java/org/test/QuoteHandler.java").toUri().toString(); + TextDocumentInfo doc = harness.getOrReadFile(new File(new URI(docUri)), LanguageId.JAVA.toString()); + TextDocumentInfo openedDoc = harness.openDocument(doc); + + List codeLenses = harness.getCodeLenses(openedDoc); + + assertEquals(4, codeLenses.size()); + + assertTrue(containsCodeLens(codeLenses, "@/hello -- GET", 25, 29, 25, 34)); + assertTrue(containsCodeLens(codeLenses, "@/echo -- POST", 30, 29, 30, 33)); + assertTrue(containsCodeLens(codeLenses, "@/quotes -- GET", 35, 29, 35, 41)); + assertTrue(containsCodeLens(codeLenses, "@/quotes -- GET", 41, 29, 41, 40)); + } + + private boolean containsCodeLens(List codeLenses, String commandTitle, int startLine, int startPosition, int endLine, int endPosition) { + for (CodeLens codeLens : codeLenses) { + Command command = codeLens.getCommand(); + Range range = codeLens.getRange(); + if (command.getTitle().equals(commandTitle) + && range.getStart().getLine() == startLine + && range.getStart().getCharacter() == startPosition + && range.getEnd().getLine() == endLine + && range.getEnd().getCharacter() == endPosition) { + return true; + } + } + + return false; + } + +}