From d094d966d9e0347fda2c38fb93eab9901c32c0c8 Mon Sep 17 00:00:00 2001 From: nsingh Date: Fri, 3 Nov 2017 14:33:08 -0700 Subject: [PATCH] PT 152535713 - Fix and additional junits covering fix --- .../ConditionalsLiveHoverProvider.java | 7 + .../test/ConditionalsLiveHoverTest.java | 182 ++++++++++-------- .../MultipleConditionalsPT152535713.java | 17 ++ .../languageserver/testharness/Editor.java | 10 +- 4 files changed, 136 insertions(+), 80 deletions(-) create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-conditionals-live-hover/src/main/java/example/MultipleConditionalsPT152535713.java diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionals/ConditionalsLiveHoverProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionals/ConditionalsLiveHoverProvider.java index 6edc357b9..fbffb34f2 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionals/ConditionalsLiveHoverProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/conditionals/ConditionalsLiveHoverProvider.java @@ -132,6 +132,13 @@ public class ConditionalsLiveHoverProvider implements HoverProvider { */ protected boolean matchesAnnotation(Annotation annotation, LiveConditional liveConditional) { + // First check that the annotation matches the live conditional annotation + String annotationName = annotation.resolveTypeBinding().getName(); + if (!liveConditional.getMessage().contains(annotationName)) { + return false; + } + + // Check that Java type in annotation in editor matches Java information in the live Conditional ASTNode parent = annotation.getParent(); String rawJsonKey = liveConditional.getPositiveMatchKey(); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/conditionals/test/ConditionalsLiveHoverTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/conditionals/test/ConditionalsLiveHoverTest.java index 354c5cc64..1783967d3 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/conditionals/test/ConditionalsLiveHoverTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/conditionals/test/ConditionalsLiveHoverTest.java @@ -10,11 +10,13 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.conditionals.test; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.time.Duration; +import org.eclipse.lsp4j.Hover; import org.junit.Before; import org.junit.Test; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; @@ -144,10 +146,10 @@ public class ConditionalsLiveHoverTest { "Process 22022: test-conditionals-live-hover"); } - @Test - public void testMultipleAppsLiveHover() throws Exception { + public void testMultipleAppInstances() throws Exception { + // Test that live hover shows information for multiple app instances File directory = new File( ProjectsHarness.class.getResource("/test-projects/test-conditionals-live-hover/").toURI()); String docUri = "file://" + directory.getAbsolutePath() @@ -161,16 +163,16 @@ public class ConditionalsLiveHoverTest { .build(); mockAppProvider.builder().isSpringBootApp(true).port("1001").processId("80000").host("cfapps.io") - .processName("test-conditionals-live-hover") - .getLiveConditionals( - "{\"positiveMatches\":{\"ConditionalOnMissingBeanConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}]}}") - .build(); + .processName("test-conditionals-live-hover") + .getLiveConditionals( + "{\"positiveMatches\":{\"ConditionalOnMissingBeanConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}]}}") + .build(); mockAppProvider.builder().isSpringBootApp(true).port("1002").processId("90000").host("cfapps.io") - .processName("test-conditionals-live-hover") - .getLiveConditionals( - "{\"positiveMatches\":{\"ConditionalOnMissingBeanConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}]}}") - .build(); + .processName("test-conditionals-live-hover") + .getLiveConditionals( + "{\"positiveMatches\":{\"ConditionalOnMissingBeanConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}]}}") + .build(); harness.intialize(directory); @@ -195,73 +197,95 @@ public class ConditionalsLiveHoverTest { } -// @Test -// public void testMultipleLiveHoverHints() throws Exception { -// -// File directory = new File( -// ProjectsHarness.class.getResource("/test-projects/test-conditionals-live-hover/").toURI()); -// String docUri = "file://" + directory.getAbsolutePath() + "/src/main/java/example/MultipleConditionals.java"; -// -// // Build a mock running boot app -// mockAppProvider.builder().isSpringBootApp(true).port("1111").processId("22022").host("cfapps.io") -// .processName("test-conditionals-live-hover") -// .getAutoConfigReport( -// "{\"positiveMatches\":{\"HelloConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}],\"HelloConfig2#hi\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnBean (types: example.Hello; SearchStrategy: all) found bean 'missing'\"}],\"MultipleConditionals#hi\":[{\"condition\":\"OnClassCondition\",\"message\":\"@ConditionalOnClass found required class; @ConditionalOnMissingClass did not find unwanted class\"},{\"condition\":\"OnWebApplicationCondition\",\"message\":\"@ConditionalOnWebApplication (required) found StandardServletEnvironment\"},{\"condition\":\"OnJavaCondition\",\"message\":\"@ConditionalOnJava (1.8 or newer) found 1.8\"},{\"condition\":\"OnExpressionCondition\",\"message\":\"@ConditionalOnExpression (#{true}) resulted in true\"},{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnBean (types: example.Hello; SearchStrategy: all) found beans 'hi', 'missing'\"}]}}") -// .build(); -// -// harness.intialize(directory); -// -// Editor editor = harness.newEditor(LanguageId.JAVA, "package example;\n" + -// "\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;\n" + -// "import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;\n" + -// "import org.springframework.context.annotation.Bean;\n" + -// "import org.springframework.context.annotation.Configuration;\n" + -// "\n" + -// "@Configuration\n" + -// "public class MultipleConditionals {\n" + -// "\n" + -// " @Bean\n" + -// " @ConditionalOnBean\n" + -// " @ConditionalOnWebApplication\n" + -// " @ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)\n" + -// " @ConditionalOnMissingClass\n" + -// " @ConditionalOnExpression\n" + -// " public Hello hi() {\n" + -// " return null;\n" + -// " }\n" + -// " \n" + -// " @Bean\n" + -// " @ConditionalOnMissingBean\n" + -// " @ConditionalOnNotWebApplication\n" + -// " public Hello missing() {\n" + -// " return null;\n" + -// " }\n" + -// "}"); -// -//// editor.assertHoverContains("@ConditionalOnBean", "Condition: OnBeanCondition\n" + "\n" -//// + "Message: @ConditionalOnBean (types: example.Hello; SearchStrategy: all) found beans 'hi', 'missing'"); -//// -//// editor.assertHoverContains("@ConditionalOnWebApplication", "Condition: OnWebApplicationCondition\n" + "\n" -//// + "Message: @ConditionalOnWebApplication (required) found StandardServletEnvironment"); -//// -//// editor.assertHoverContains("@ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)", -//// "Condition: OnJavaCondition\n" + "\n" + "Message: @ConditionalOnJava (1.8 or newer) found 1.8"); -//// -//// editor.assertHoverContains("@ConditionalOnMissingClass", "Condition: OnClassCondition\n" + "\n" -//// + "Message: @ConditionalOnClass found required class; @ConditionalOnMissingClass did not find unwanted class"); -//// -//// editor.assertHoverContains("@ConditionalOnExpression", "Condition: OnExpressionCondition\n" + "\n" -//// + "Message: @ConditionalOnExpression (#{true}) resulted in true"); -// -// editor.assertHighlights("@ConditionalOnBean", "@ConditionalOnWebApplication", -// "@ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)", "@ConditionalOnMissingClass", -// "@ConditionalOnExpression"); -// -// } + @Test + public void testMultipleConditionalsSameMethod() throws Exception { + + // Tests something like this: +// @Bean +// @ConditionalOnBean +// @ConditionalOnWebApplication +// @ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT) +// @ConditionalOnMissingClass +// @ConditionalOnExpression +// public Hello hi() { +// return null; +// } + + File directory = new File( + ProjectsHarness.class.getResource("/test-projects/test-conditionals-live-hover/").toURI()); + String docUri = "file://" + directory.getAbsolutePath() + "/src/main/java/example/MultipleConditionals.java"; + + // Build a mock running boot app + mockAppProvider.builder().isSpringBootApp(true).port("1000").processId("70000").host("cfapps.io") + .processName("test-conditionals-live-hover") + .getLiveConditionals( + "{\"positiveMatches\":{\"HelloConfig#missing\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnMissingBean (types: example.Hello; SearchStrategy: all) did not find any beans\"}],\"HelloConfig2#hi\":[{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnBean (types: example.Hello; SearchStrategy: all) found bean 'missing'\"}],\"MultipleConditionals#hi\":[{\"condition\":\"OnClassCondition\",\"message\":\"@ConditionalOnClass found required class; @ConditionalOnMissingClass did not find unwanted class\"},{\"condition\":\"OnWebApplicationCondition\",\"message\":\"@ConditionalOnWebApplication (required) found StandardServletEnvironment\"},{\"condition\":\"OnJavaCondition\",\"message\":\"@ConditionalOnJava (1.8 or newer) found 1.8\"},{\"condition\":\"OnExpressionCondition\",\"message\":\"@ConditionalOnExpression (#{true}) resulted in true\"},{\"condition\":\"OnBeanCondition\",\"message\":\"@ConditionalOnBean (types: example.Hello; SearchStrategy: all) found beans 'hi', 'missing'\"}]}}") + .build(); + + harness.intialize(directory); + + Editor editor = harness.newEditorFromFileUri(docUri, LanguageId.JAVA); + + // IMPORTANT: test EXACT text to ensure that multiple conditionals on the same method do not show + // up while + // hovering over only one of the conditional annotations + editor.assertHoverExactText("@ConditionalOnBean", + "@ConditionalOnBean (types: example.Hello; SearchStrategy: all) found beans 'hi', 'missing'\n" + "\n" + + "Process 70000: test-conditionals-live-hover"); + + editor.assertHoverExactText("@ConditionalOnWebApplication", + "@ConditionalOnWebApplication (required) found StandardServletEnvironment\n" + "\n" + + "Process 70000: test-conditionals-live-hover"); + + editor.assertHoverExactText("@ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)", + "@ConditionalOnJava (1.8 or newer) found 1.8\n" + "\n" + "Process 70000: test-conditionals-live-hover"); + + editor.assertHoverExactText("@ConditionalOnMissingClass", + "@ConditionalOnClass found required class; @ConditionalOnMissingClass did not find unwanted class\n" + + "\n" + "Process 70000: test-conditionals-live-hover"); + + editor.assertHoverExactText("@ConditionalOnExpression", "@ConditionalOnExpression (#{true}) resulted in true\n" + + "\n" + "Process 70000: test-conditionals-live-hover"); + } + + @Test + public void PT152535713testMultipleLiveHoverHints() throws Exception { + + // Tests fix for PT152535713. Ensure that in a method with multiple + // conditionals, + // hovering over any one conditional annotation only shows content for that + // conditional + // and not any of the other ones + File directory = new File( + ProjectsHarness.class.getResource("/test-projects/test-conditionals-live-hover/").toURI()); + String docUri = "file://" + directory.getAbsolutePath() + + "/src/main/java/example/MultipleConditionalsPT152535713.java"; + + // Build a mock running boot app + mockAppProvider.builder().isSpringBootApp(true).port("1000").processId("70000").host("cfapps.io") + .processName("test-conditionals-live-hover") + .getLiveConditionals( + "{\"positiveMatches\":{\"MultipleConditionalsPT152535713#hi\":[{\"condition\":\"OnWebApplicationCondition\",\"message\":\"@ConditionalOnWebApplication (required) found StandardServletEnvironment\"},{\"condition\":\"OnJavaCondition\",\"message\":\"@ConditionalOnJava (1.8 or newer) found 1.8\"}]}}") + .build(); + + harness.intialize(directory); + + Editor editor = harness.newEditorFromFileUri(docUri, LanguageId.JAVA); + + editor.assertHoverExactText("@ConditionalOnWebApplication", + "@ConditionalOnWebApplication (required) found StandardServletEnvironment\n" + "\n" + + "Process 70000: test-conditionals-live-hover"); + + editor.assertHoverExactText("@ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)", + "@ConditionalOnJava (1.8 or newer) found 1.8\n" + "\n" + "Process 70000: test-conditionals-live-hover"); + + // Test that the hovers dont have extra information of the other conditionals: + Hover hover = editor.getHover("@ConditionalOnWebApplication"); + String hoverContent = editor.hoverString(hover); + assertFalse(hoverContent.contains("@ConditionalOnJava")); + + hover = editor.getHover("@ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT)"); + hoverContent = editor.hoverString(hover); + assertFalse(hoverContent.contains("@ConditionalOnWebApplication")); + } } diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-conditionals-live-hover/src/main/java/example/MultipleConditionalsPT152535713.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-conditionals-live-hover/src/main/java/example/MultipleConditionalsPT152535713.java new file mode 100644 index 000000000..1d49e9bd0 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-conditionals-live-hover/src/main/java/example/MultipleConditionalsPT152535713.java @@ -0,0 +1,17 @@ +package example; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnJava; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MultipleConditionalsPT152535713 { + + @Bean + @ConditionalOnWebApplication + @ConditionalOnJava(value=ConditionalOnJava.JavaVersion.EIGHT) + public Hello hi() { + return null; + } +} diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index 42e281fc8..48ce44d82 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -550,7 +550,7 @@ public class Editor { assertContains(snippet, hoverString(hover)); } - protected String hoverString(Hover hover) { + public String hoverString(Hover hover) { StringBuilder buf = new StringBuilder(); boolean first = true; for (Either block : hover.getContents()) { @@ -644,6 +644,14 @@ public class Editor { assertEquals(expectedHover, hoverString(hover)); } + public Hover getHover(String afterString) throws Exception { + int pos = getRawText().indexOf(afterString); + if (pos>=0) { + pos += afterString.length(); + } + return harness.getHover(doc, doc.toPosition(pos)); + } + public CompletionItem assertCompletionDetails(String expectLabel, String expectDetail, String expectDocSnippet) throws Exception { CompletionItem it = harness.resolveCompletionItem(assertCompletionWithLabel(expectLabel)); if (expectDetail!=null) {