From db1402cf6b8658e9f6f8a5bd79e91edcb0b7a2d3 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 1 Dec 2016 15:45:21 -0500 Subject: [PATCH] Switch HTML hover tests to markdown tests --- .../ide/vscode/commons/util/Renderable.java | 3 +- .../ide/vscode/commons/util/Renderables.java | 46 +++++- .../yaml/hover/YPropertyHoverInfo.java | 1 + .../hover/PropertiesHoverCalculator.java | 2 +- .../AbstractPropertyRenderableProvider.java | 138 +++++++++--------- .../tools}/PropertyRenderableProvider.java | 2 +- .../ApplicationYamlAssistContext.java | 2 +- .../JavaTypeNavigationHoverInfo.java | 2 +- .../test/ApplicationPropertiesEditorTest.java | 26 ++-- 9 files changed, 130 insertions(+), 92 deletions(-) rename vscode-extensions/{commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover => vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools}/AbstractPropertyRenderableProvider.java (50%) rename vscode-extensions/{commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover => vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools}/PropertyRenderableProvider.java (98%) diff --git a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java index 06195392f..59e6c9ac1 100644 --- a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java +++ b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java @@ -11,8 +11,7 @@ package org.springframework.ide.vscode.commons.util; /** - * Placeholder. Still need to figure out what exactly we should do with this in - * vscode. TODO: rename to Renderable + * Renderable can be rendered with various mark-up languages */ public interface Renderable { diff --git a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java index 389917dbc..282676d33 100644 --- a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java +++ b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java @@ -95,6 +95,44 @@ public class Renderables { } }; } + + public static Renderable paragraph(Renderable text) { + return new Renderable() { + + @Override + public void renderAsMarkdown(StringBuilder buffer) { + buffer.append("\n"); + text.renderAsMarkdown(buffer); + buffer.append("\n"); + } + + @Override + public void renderAsHtml(HtmlBuffer buffer) { + buffer.raw("

"); + text.renderAsHtml(buffer); + buffer.raw("

"); + } + }; + } + + public static Renderable strikeThrough(Renderable text) { + return new Renderable() { + + @Override + public void renderAsMarkdown(StringBuilder buffer) { + buffer.append("~~"); + text.renderAsMarkdown(buffer); + buffer.append("~~"); + } + + @Override + public void renderAsHtml(HtmlBuffer buffer) { + buffer.raw(""); + text.renderAsHtml(buffer); + buffer.raw(""); + } + }; + } public static Renderable link(String text, String url) { return new Renderable() { @@ -127,7 +165,11 @@ public class Renderables { @Override public void renderAsMarkdown(StringBuilder buffer) { - buffer.append("\n\n"); + if (buffer.charAt(buffer.length() - 1) != '\n') { + // 2 spaces and then new line would create a line break in text + buffer.append(" "); + } + buffer.append("\n"); } @Override @@ -230,7 +272,7 @@ public class Renderables { private Renderable[] pieces; - ConcatRenderables(Renderable[] pieces) { + ConcatRenderables(Renderable... pieces) { this.pieces = pieces; } diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java index 7eaae4287..6948deb02 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java @@ -50,6 +50,7 @@ public class YPropertyHoverInfo { Renderable description = prop.getDescription(); if (description != null) { + html.add(lineBreak()); html.add(lineBreak()); html.add(description); } diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java index 620abe1e2..2cf3a0424 100644 --- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java @@ -10,11 +10,11 @@ import java.util.Optional; import org.springframework.ide.vscode.application.properties.metadata.PropertyInfo; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndex; import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint; -import org.springframework.ide.vscode.application.properties.metadata.hover.PropertyRenderableProvider; import org.springframework.ide.vscode.application.properties.metadata.types.Type; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.EnumCaseMode; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; +import org.springframework.ide.vscode.boot.properties.tools.PropertyRenderableProvider; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.util.BadLocationException; import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion; diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java similarity index 50% rename from vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java rename to vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java index 7ac1ed12a..37838521b 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java @@ -8,16 +8,19 @@ * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.application.properties.metadata.hover; +package org.springframework.ide.vscode.boot.properties.tools; + +import static org.springframework.ide.vscode.commons.util.Renderables.*; import java.util.Collection; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.util.HtmlBuffer; import org.springframework.ide.vscode.commons.util.Renderable; -import org.springframework.ide.vscode.commons.util.Renderables; import org.springframework.ide.vscode.commons.util.StringUtil; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList.Builder; + public abstract class AbstractPropertyRenderableProvider { /** @@ -27,71 +30,45 @@ public abstract class AbstractPropertyRenderableProvider { private static final String ACTION_HOST = "action"; public Renderable getRenderable() { - return new Renderable() { + Builder renderableBuilder = ImmutableList.builder(); - @Override - public void renderAsHtml(HtmlBuffer buffer) { -// JavaTypeLinks jtLinks = new JavaTypeLinks(this); - - renderId(buffer); - - String type = getType(); - if (type==null) { - type = Object.class.getName(); - } -// jtLinks.javaTypeLink(html, getJavaProject(), type); - actionLink(buffer, type); - - String deflt = formatDefaultValue(getDefaultValue()); - if (deflt!=null) { - buffer.raw("

"); - buffer.text("Default: "); - buffer.raw(""); - buffer.text(deflt); - buffer.raw(""); - } - - if (isDeprecated()) { - buffer.raw("

"); - String reason = getDeprecationReason(); - if (StringUtil.hasText(reason)) { - buffer.bold("Deprecated: "); - buffer.text(reason); - } else { - buffer.bold("Deprecated!"); - } - } - - Renderable description = getDescription(); - if (description!=null) { - buffer.raw("

"); - buffer.p(description.toHtml()); - } - - } - - @Override - public void renderAsMarkdown(StringBuilder buffer) { - buffer.append(Renderables.getHtmlToMarkdownConverter().convert(toHtml())); - } - - }; + renderId(renderableBuilder); + + String type = getType(); + if (type==null) { + type = Object.class.getName(); + } + actionLink(renderableBuilder, type); + + String deflt = formatDefaultValue(getDefaultValue()); + if (deflt!=null) { + defaultValueRenderable(renderableBuilder, deflt); + } + + if (isDeprecated()) { + depreactionRenderable(renderableBuilder); + } + + Renderable description = getDescription(); + if (description!=null) { + descriptionRenderable(renderableBuilder, description); + } + + return concat(renderableBuilder.build()); } - final protected void renderId(HtmlBuffer html) { - boolean deprecated = isDeprecated(); - String tag = deprecated ? "s" : "b"; - String replacement = getDeprecationReplacement(); - - html.raw("<"+tag+">"); - html.text(getId()); - html.raw(""); - if (StringUtil.hasText(replacement)) { - html.text(" -> "+ replacement); + final protected void renderId(Builder renderableBuilder) { + if (isDeprecated()) { + renderableBuilder.add(strikeThrough(text(getId()))); + String replacement = getDeprecationReplacement(); + if (StringUtil.hasText(replacement)) { + renderableBuilder.add(text(" -> " + replacement)); + } + } else { + renderableBuilder.add(bold(text(getId()))); } - html.raw("
"); } - + protected abstract Object getDefaultValue(); protected abstract IJavaProject getJavaProject(); protected abstract Renderable getDescription(); @@ -125,13 +102,34 @@ public abstract class AbstractPropertyRenderableProvider { * Creates an 'action' link and adds it to the html buffer. When the user clicks the given * link then the provided runnable is to be executed. */ - public void actionLink(HtmlBuffer html, String displayString/*, Runnable runnable*/) { -// String actionId = registerAction(runnable); - html.raw(""); - html.text(displayString); - html.raw(""); + public void actionLink(Builder renderableBuilder, String displayString) { + String url = "http://"+ACTION_HOST+"/action-id"; + renderableBuilder.add(lineBreak()); + renderableBuilder.add(link(displayString, url)); + } + + private void defaultValueRenderable(Builder renderableBuilder, String defaultValue) { + renderableBuilder.add(lineBreak()); + renderableBuilder.add(lineBreak()); + renderableBuilder.add(text("Default: ")); + renderableBuilder.add(italic(text(defaultValue))); + } + + private void depreactionRenderable(Builder renderableBuilder) { + renderableBuilder.add(lineBreak()); + renderableBuilder.add(lineBreak()); + String reason = getDeprecationReason(); + if (StringUtil.hasText(reason)) { + renderableBuilder.add(bold(text("Deprecated: "))); + renderableBuilder.add(text(reason)); + } else { + renderableBuilder.add(bold(text("Deprecated!"))); + } + } + + private void descriptionRenderable(Builder renderableBuilder, Renderable description) { + renderableBuilder.add(lineBreak()); + renderableBuilder.add(paragraph(description)); } } diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java similarity index 98% rename from vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java rename to vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java index 3bd66282f..8a3f55ee4 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java @@ -8,7 +8,7 @@ * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.application.properties.metadata.hover; +package org.springframework.ide.vscode.boot.properties.tools; import java.util.ArrayList; import java.util.Collections; diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java index 4a5e7016e..63ff9933d 100644 --- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java @@ -25,7 +25,6 @@ import org.springframework.ide.vscode.application.properties.metadata.completion import org.springframework.ide.vscode.application.properties.metadata.hints.HintProvider; import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint; import org.springframework.ide.vscode.application.properties.metadata.hints.ValueHintHoverInfo; -import org.springframework.ide.vscode.application.properties.metadata.hover.PropertyRenderableProvider; import org.springframework.ide.vscode.application.properties.metadata.types.Type; import org.springframework.ide.vscode.application.properties.metadata.types.TypeParser; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; @@ -34,6 +33,7 @@ import org.springframework.ide.vscode.application.properties.metadata.types.Type import org.springframework.ide.vscode.application.properties.metadata.types.TypedProperty; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap.Match; +import org.springframework.ide.vscode.boot.properties.tools.PropertyRenderableProvider; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier; diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java index 4dc571373..8ba3aa4ca 100644 --- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java @@ -18,11 +18,11 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.boot.configurationmetadata.Deprecation; -import org.springframework.ide.vscode.application.properties.metadata.hover.AbstractPropertyRenderableProvider; import org.springframework.ide.vscode.application.properties.metadata.types.Type; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.BeanPropertyNameMode; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.EnumCaseMode; +import org.springframework.ide.vscode.boot.properties.tools.AbstractPropertyRenderableProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypedProperty; import org.springframework.ide.vscode.commons.java.IField; import org.springframework.ide.vscode.commons.java.IJavaElement; diff --git a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java index 31160c7cf..95a18db46 100644 --- a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java +++ b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java @@ -29,7 +29,6 @@ import org.springframework.ide.vscode.application.properties.metadata.Properties import org.springframework.ide.vscode.boot.BootPropertiesLanguageServer; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IType; -import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter.HoverType; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; import org.springframework.ide.vscode.languageserver.testharness.Editor; @@ -180,10 +179,10 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { ); //Case 1: an 'exact' match of the property is in the hover region editor.assertHoverText("server.", - "server.port" + "**server.port**" ); //Case 2: an object/map property has extra text after the property name - editor.assertHoverText("logging.", "logging.level"); + editor.assertHoverText("logging.", "**logging.level**"); } @Test public void testHoverInfosWithSpaces() throws Exception { @@ -197,10 +196,10 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { ); //Case 1: an 'exact' match of the property is in the hover region editor.assertHoverText("server.", - "server.port" + "**server.port**" ); //Case 2: an object/map property has extra text after the property name - editor.assertHoverText("logging.", "logging.level"); + editor.assertHoverText("logging.", "**logging.level**"); } @Test public void testHoverLongAndShort() throws Exception { @@ -210,8 +209,8 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { "server.port=8080\n" + "server.port.fancy=true\n" ); - editor.assertHoverText("server.", "server.port"); - editor.assertHoverText("port.fa", "server.port.fancy"); + editor.assertHoverText("server.", "**server.port**"); + editor.assertHoverText("port.fa", "**server.port.fancy**"); } @@ -924,18 +923,18 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { ); deprecate("error.path", "server.error.path", null); - editor.assertHoverText("path", "error.path -> server.error.path"); - editor.assertHoverText("path", "Deprecated!"); + editor.assertHoverText("path", "~~error.path~~ -> server.error.path"); + editor.assertHoverText("path", "**Deprecated!**"); deprecate("error.path", "server.error.path", "This is old."); - editor.assertHoverText("path", "error.path -> server.error.path"); - editor.assertHoverText("path", "Deprecated: This is old"); + editor.assertHoverText("path", "~~error.path~~ -> server.error.path"); + editor.assertHoverText("path", "**Deprecated: **This is old"); deprecate("error.path", null, "This is old."); - editor.assertHoverText("path", "Deprecated: This is old"); + editor.assertHoverText("path", "**Deprecated: **This is old"); deprecate("error.path", null, null); - editor.assertHoverText("path", "Deprecated!"); + editor.assertHoverText("path", "**Deprecated!**"); } @Ignore @Test public void testDeprecatedPropertyQuickfix() throws Exception { @@ -1573,7 +1572,6 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest { protected SimpleLanguageServer newLanguageServer() { BootPropertiesLanguageServer server = new BootPropertiesLanguageServer(md.getIndexProvider(), typeUtilProvider, javaProjectFinder); server.setMaxCompletionsNumber(-1); - server.setHoverType(HoverType.HTML); return server; }