Bug 1672: Generated javadoc contains symbols of javadoc comment tags 60/34060/1
authorIgor Foltin <ifoltin@cisco.com>
Thu, 21 Jan 2016 13:26:16 +0000 (14:26 +0100)
committerRobert Varga <nite@hq.sk>
Thu, 4 Feb 2016 10:36:06 +0000 (10:36 +0000)
Angle brackets in javadoc comments generated from
yang statement descriptions are now properly encoded.

Change-Id: I9138c32cc912d2c4695da8e1d2e2e988f16194e1
Signed-off-by: Igor Foltin <ifoltin@cisco.com>
(cherry picked from commit e48bd1d8063e49ea4d5604ce5dbeff9ac1de4e63)

binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/EnumTemplate.xtend
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/EncodingInJavaDocTest.java [moved from binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/EndodingInJavaDocTest.java with 83% similarity]
binding/mdsal-binding-java-api-generator/src/test/resources/compilation/encoding-javadoc/encoding-javadoc.yang

index f093709e2b93ee51d665e22b6ad5747a8c404216..a3eb8cd50a7cadd895518846fecc5be9963af5ff 100644 (file)
@@ -11,6 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.computeDefaultSUID;
+import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.encodeAngleBrackets;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForAugmentedGeneratedType;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForGeneratedType;
 import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_OBJECT;
@@ -340,7 +341,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
             final GeneratedTypeBuilder childOf, final ListSchemaNode node) {
         final GeneratedTypeBuilder genType = processDataSchemaNode(module, basePackageName, childOf, node);
         if (genType != null) {
-            constructGetter(parent, node.getQName().getLocalName(), node.getDescription(), Types.listTypeFor(genType));
+            constructGetter(parent, node.getQName().getLocalName(), node.getDescription(),
+                    Types.listTypeFor(genType));
 
             final List<String> listKeys = listKeys(node);
             final String packageName = packageNameForGeneratedType(basePackageName, node.getPath());
@@ -487,7 +489,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             if (rpc != null) {
                 final String rpcName = BindingMapping.getClassName(rpc.getQName());
                 final String rpcMethodName = BindingMapping.getPropertyName(rpcName);
-                final String rpcComment = rpc.getDescription();
+                final String rpcComment = encodeAngleBrackets(rpc.getDescription());
                 final MethodSignatureBuilder method = interfaceBuilder.addMethod(rpcMethodName);
                 final ContainerSchemaNode input = rpc.getInput();
                 final ContainerSchemaNode output = rpc.getOutput();
@@ -572,7 +574,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
                 listenerInterface.addMethod("on" + notificationInterface.getName())
                 .setAccessModifier(AccessModifier.PUBLIC).addParameter(notificationInterface, "notification")
-                .setComment(notification.getDescription()).setReturnType(Types.VOID);
+                .setComment(encodeAngleBrackets(notification.getDescription())).setReturnType(Types.VOID);
             }
         }
         listenerInterface.setDescription(createDescription(notifications, module.getName(), module.getModuleSourcePath()));
@@ -733,7 +735,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 && (enumTypeDef.getQName().getLocalName() != null)) {
             final String enumerationName = BindingMapping.getClassName(enumName);
             final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumerationName);
-            enumBuilder.setDescription(enumTypeDef.getDescription());
+            final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
+            enumBuilder.setDescription(enumTypedefDescription);
             enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
             ModuleContext ctx = genCtx.get(module);
             ctx.addInnerTypedefType(enumTypeDef.getPath(), enumBuilder);
@@ -1167,8 +1170,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
         if (!choiceNode.isAddedByUses()) {
             final String packageName = packageNameForGeneratedType(basePackageName, choiceNode.getPath());
             final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(packageName, choiceNode);
-            constructGetter(parent, choiceNode.getQName().getLocalName(), choiceNode.getDescription(),
-                    choiceTypeBuilder);
+            constructGetter(parent, choiceNode.getQName().getLocalName(),
+                    choiceNode.getDescription(), choiceTypeBuilder);
             choiceTypeBuilder.addImplementsType(typeForClass(DataContainer.class));
             annotateDeprecatedIfNecessary(choiceNode.getStatus(), choiceTypeBuilder);
             genCtx.get(module).addChildNodeType(choiceNode, choiceTypeBuilder);
@@ -1573,7 +1576,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             return false;
         }
         final String leafName = leaf.getQName().getLocalName();
-        final String leafDesc = leaf.getDescription();
+        final String leafDesc = encodeAngleBrackets(leaf.getDescription());
         final GeneratedPropertyBuilder propBuilder = toBuilder.addProperty(BindingMapping.getPropertyName(leafName));
         propBuilder.setReadOnly(isReadOnly);
         propBuilder.setReturnType(returnType);
@@ -1650,8 +1653,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
             final GeneratedTypeBuilder typeBuilder, final Module parentModule) {
         final GeneratedTOBuilderImpl returnType = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(),
                 genTOBuilder.getName());
+        final String typedefDescription = encodeAngleBrackets(typeDef.getDescription());
 
-        returnType.setDescription(typeDef.getDescription());
+        returnType.setDescription(typedefDescription);
         returnType.setReference(typeDef.getReference());
         returnType.setSchemaPath(typeDef.getPath().getPathFromRoot());
         returnType.setModuleName(parentModule.getName());
@@ -1868,7 +1872,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             final String schemaNodeName, final String comment, final Type returnType) {
         final MethodSignatureBuilder getMethod = interfaceBuilder
                 .addMethod(getterMethodName(schemaNodeName, returnType));
-        getMethod.setComment(comment);
+        getMethod.setComment(encodeAngleBrackets(comment));
         getMethod.setReturnType(returnType);
         return getMethod;
     }
@@ -2108,7 +2112,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         if (verboseClassComments) {
             sb.append("<pre>");
             sb.append(NEW_LINE);
-            sb.append(YangTemplate.generateYangSnipet(schemaNodes));
+            sb.append(encodeAngleBrackets(YangTemplate.generateYangSnipet(schemaNodes)));
             sb.append("</pre>");
             sb.append(NEW_LINE);
         }
@@ -2118,7 +2122,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private String createDescription(final SchemaNode schemaNode, final String fullyQualifiedName) {
         final StringBuilder sb = new StringBuilder();
-        final String formattedDescription = YangTemplate.formatToParagraph(schemaNode.getDescription(), 0);
+        final String nodeDescription = encodeAngleBrackets(schemaNode.getDescription());
+        final String formattedDescription = YangTemplate.formatToParagraph(nodeDescription, 0);
 
         if (!Strings.isNullOrEmpty(formattedDescription)) {
             sb.append(formattedDescription);
@@ -2147,7 +2152,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             sb.append(NEW_LINE);
             sb.append("<pre>");
             sb.append(NEW_LINE);
-            sb.append(YangTemplate.generateYangSnipet(schemaNode));
+            sb.append(encodeAngleBrackets(YangTemplate.generateYangSnipet(schemaNode)));
             sb.append("</pre>");
             sb.append(NEW_LINE);
             sb.append("The schema path to identify an instance is");
@@ -2189,7 +2194,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private String createDescription(final Module module) {
         final StringBuilder sb = new StringBuilder();
-        final String formattedDescription = YangTemplate.formatToParagraph(module.getDescription(), 0);
+        final String moduleDescription = encodeAngleBrackets(module.getDescription());
+        final String formattedDescription = YangTemplate.formatToParagraph(moduleDescription, 0);
 
         if (!Strings.isNullOrEmpty(formattedDescription)) {
             sb.append(formattedDescription);
@@ -2208,7 +2214,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             sb.append(NEW_LINE);
             sb.append("<pre>");
             sb.append(NEW_LINE);
-            sb.append(YangTemplate.generateYangSnipet(module));
+            sb.append(encodeAngleBrackets(YangTemplate.generateYangSnipet(module)));
             sb.append("</pre>");
         }
 
index a5b82e9c1a4444c12806a87be154c8ab1af34cf8..df1cc86b08848ddf7ee6f61c39a7ddae175a6b03 100644 (file)
@@ -795,7 +795,6 @@ class YangTemplate {
         var boolean isFirstElementOnNewLineEmptyChar = false;
         val lineIndent = computeNextLineIndent(nextLineIndent);
 
-        formattedText = formattedText.replace("*/", "&#42;&#47;");
         formattedText = NEWLINE_OR_TAB.removeFrom(formattedText);
         formattedText = formattedText.replaceAll(" +", " ");
 
index 66e200bfa0f13d8f32a937443204cae54c2bca8c..80571e4b6a7b60e4330367b7201edf3bd8032d3a 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.sal.binding.yang.types;
 
+import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.encodeAngleBrackets;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNodeForRelativeXPath;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule;
@@ -593,7 +594,8 @@ public final class TypeProviderImpl implements TypeProvider {
         final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
 
         final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(basePackageName, enumerationName);
-        enumBuilder.setDescription(enumTypeDef.getDescription());
+        final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
+        enumBuilder.setDescription(enumTypedefDescription);
         enumBuilder.setReference(enumTypeDef.getReference());
         enumBuilder.setModuleName(module.getName());
         enumBuilder.setSchemaPath(enumTypeDef.getPath().getPathFromRoot());
@@ -636,7 +638,8 @@ public final class TypeProviderImpl implements TypeProvider {
         final String enumerationName = BindingMapping.getClassName(enumName);
 
         final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumerationName);
-        enumBuilder.setDescription(enumTypeDef.getDescription());
+        final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
+        enumBuilder.setDescription(enumTypedefDescription);
         enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
         return enumBuilder.toInstance(enumBuilder);
     }
@@ -899,7 +902,8 @@ public final class TypeProviderImpl implements TypeProvider {
         if (typeDefName != null && !typeDefName.isEmpty()) {
             final String typeName = BindingMapping.getClassName(typeDefName);
             unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeName);
-            unionGenTOBuilder.setDescription(typedef.getDescription());
+            final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
+            unionGenTOBuilder.setDescription(typedefDescription);
             unionGenTOBuilder.setReference(typedef.getReference());
             unionGenTOBuilder.setSchemaPath(typedef.getPath().getPathFromRoot());
             unionGenTOBuilder.setModuleName(module.getName());
@@ -1099,8 +1103,9 @@ public final class TypeProviderImpl implements TypeProvider {
         if ((packageName != null) && (typeDefTOName != null)) {
             final String genTOName = BindingMapping.getClassName(typeDefTOName);
             final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(packageName, genTOName);
+            final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
 
-            newType.setDescription(typedef.getDescription());
+            newType.setDescription(typedefDescription);
             newType.setReference(typedef.getReference());
             newType.setSchemaPath(typedef.getPath().getPathFromRoot());
             newType.setModuleName(moduleName);
@@ -1140,8 +1145,9 @@ public final class TypeProviderImpl implements TypeProvider {
 
             final String typeName = BindingMapping.getClassName(typeDefName);
             final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeName);
+            final String typedefDescription = encodeAngleBrackets(typeDef.getDescription());
 
-            genTOBuilder.setDescription(typeDef.getDescription());
+            genTOBuilder.setDescription(typedefDescription);
             genTOBuilder.setReference(typeDef.getReference());
             genTOBuilder.setSchemaPath(typeDef.getPath().getPathFromRoot());
             genTOBuilder.setModuleName(moduleName);
@@ -1268,8 +1274,9 @@ public final class TypeProviderImpl implements TypeProvider {
         final String classTypedefName = BindingMapping.getClassName(typedefName);
         final String innerTypeDef = innerExtendedType.getQName().getLocalName();
         final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, classTypedefName);
+        final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
 
-        genTOBuilder.setDescription(typedef.getDescription());
+        genTOBuilder.setDescription(typedefDescription);
         genTOBuilder.setReference(typedef.getReference());
         genTOBuilder.setSchemaPath(typedef.getPath().getPathFromRoot());
         genTOBuilder.setModuleName(moduleName);
index 7d48ad069a12e906f1225a25d15e4f78c35b827c..9507a00861c16456265ca7b7c6fa0e0f6119b5c0 100644 (file)
@@ -50,7 +50,7 @@ import org.opendaylight.yangtools.yang.model.util.type.DecimalTypeBuilder;
 
 /**
  * Contains the methods for converting strings to valid JAVA language strings
- * (package names, class names, attribute names).
+ * (package names, class names, attribute names) and to valid javadoc comments.
  *
  *
  */
@@ -68,6 +68,8 @@ public final class BindingGeneratorUtil {
      */
     private static final CharMatcher DOT_MATCHER = CharMatcher.is('.');
     private static final CharMatcher DASH_COLON_MATCHER = CharMatcher.anyOf("-:");
+    private static final CharMatcher GT_MATCHER = CharMatcher.is('>');
+    private static final CharMatcher LT_MATCHER = CharMatcher.is('<');
 
     private static final Restrictions EMPTY_RESTRICTIONS = new Restrictions() {
         @Override
@@ -653,4 +655,17 @@ public final class BindingGeneratorUtil {
             }
         };
     }
+
+    /**
+     * Encodes angle brackets in yang statement description
+     * @param description description of a yang statement which is used to generate javadoc comments
+     * @return string with encoded angle brackets
+     */
+    public static String encodeAngleBrackets(String description) {
+        if (description != null) {
+            description = LT_MATCHER.replaceFrom(description, "&lt;");
+            description = GT_MATCHER.replaceFrom(description, "&gt;");
+        }
+        return description;
+    }
 }
index 6d766221cf141ee8869735c8e8977e0f6194bec7..eba6b3a39d908f59df263f28e5cf1b69ca179876 100644 (file)
@@ -213,20 +213,15 @@ abstract class BaseTemplate {
     }
 
     private static final CharMatcher AMP_MATCHER = CharMatcher.is('&');
-    private static final CharMatcher GT_MATCHER = CharMatcher.is('>');
-    private static final CharMatcher LT_MATCHER = CharMatcher.is('<');
 
     def encodeJavadocSymbols(String description) {
         if (description.nullOrEmpty) {
             return description;
         }
 
-        var ret = description.replace("*/", "&#42;&#47;")
-
-        // FIXME: Use Guava's HtmlEscapers once we have it available
+        var ret = description.replace("*/", "&#42;&#47;");
         ret = AMP_MATCHER.replaceFrom(ret, "&amp;");
-        ret = GT_MATCHER.replaceFrom(ret, "&gt;");
-        ret = LT_MATCHER.replaceFrom(ret, "&lt;");
+
         return ret;
     }
 
@@ -279,7 +274,7 @@ abstract class BaseTemplate {
         var StringBuilder lineBuilder = new StringBuilder();
         var boolean isFirstElementOnNewLineEmptyChar = false;
 
-        formattedText = formattedText.encodeJavadocSymbols
+        formattedText = encodeJavadocSymbols(formattedText)
         formattedText = NL_MATCHER.removeFrom(formattedText)
         formattedText = TAB_MATCHER.removeFrom(formattedText)
         formattedText = SPACES_PATTERN.matcher(formattedText).replaceAll(" ")
index 92466b2bd2b2d7ad8e27360ddca0c982dc860cc6..8fbfc4326786db31ac331f557683ca718b170615 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.sal.java.api.generator
 
+import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.encodeAngleBrackets;
+
 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
 
@@ -42,7 +44,7 @@ class EnumTemplate extends BaseTemplate {
     }
 
     def writeEnumItem(String name, int value, String description) '''
-        «asJavadoc(formatToParagraph(description))»
+        «asJavadoc(encodeAngleBrackets(description))»
         «name»(«value»)
     '''
 
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  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
+ */
 package org.opendaylight.yangtools.sal.java.api.generator.test;
 
 import static org.junit.Assert.assertTrue;
@@ -7,6 +14,7 @@ import static org.opendaylight.yangtools.sal.java.api.generator.test.Compilation
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.cleanUp;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation;
+
 import com.google.common.collect.ImmutableSet;
 import java.io.File;
 import java.util.List;
@@ -19,10 +27,10 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
  * Test if generated classes from yang file is compilable, generated javadoc comments contains
  * symbols as javadoc comment tag, which caused of compilation problem.
  */
-public class EndodingInJavaDocTest extends BaseCompilationTest {
+public class EncodingInJavaDocTest extends BaseCompilationTest {
 
     @Test
-    public void testAugmentToUsesInAugment() throws Exception {
+    public void testJavadocEncodingCompilation() throws Exception {
         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "encoding-javadoc");
         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "encoding-javadoc");
index c66cef99ae5ea9c1c447745ec7c6e685ea64369c..07ca36aacca7631134705367a3f16a8887ddd380 100644 (file)
@@ -10,46 +10,100 @@ module encoding-javadoc {
     namespace "urn:opendaylight:encoding-javadoc";
     prefix "enc";
 
+    description "testing module description <should_be_encoded>";
+
     revision "2014-04-09" {
     }
 
+    extension test-extension {
+        description "testing extension description <should_be_encoded>";
+        argument "name";
+    }
+
+    identity test-identity {
+        description "testing identity description <should_be_ encoded>";
+    }
+
+    typedef port-number {
+         type uint16 {
+            range "0..65535";
+         }
+
+         description "testing typedef description <should_be_encoded>";
+     }
+
+    rpc rock-the-house {
+        input {
+            leaf zip-code {
+                type string;
+            }
+        }
+
+        description "testing rpc description <should_be_encoded>";
+    }
+
+    notification event {
+        leaf event-class {
+            type string;
+        }
+
+        anyxml reporting-entity;
+
+        leaf severity {
+            type string;
+        }
+
+        description "testing notification description <should_be_encoded>";
+    }
+
+    augment "/enc:cont1" {
+        leaf augment-leaf {
+            type string;
+        }
+
+        description "testing augment description <should_be_encoded>";
+    }
+
     container cont1 {
-        description "/e.g. 1/*/*";
+        description "/e.g. 1/*/* testing container description <should_be_encoded>";
         reference "RFC 6020 - http://tools.ietf.org/html/rfc6020";
 
         list list1 {
-            description "/e.g. 1/*/*";
+            description "/e.g. 1/*/* testing list description <should_be_encoded>";
             reference "RFC 6020 - http://tools.ietf.org/html/rfc6020";
 
             key "topology-id";
             leaf topology-id {
-                description "/e.g. 1/*/*";
+                description "/e.g. 1/*/* testing leaf description <should_be_encoded>";
                 reference "RFC 6020 - http://tools.ietf.org/html/rfc6020";
                 type int32;
             }
+
             uses link1;
         }
     }
 
     grouping link1 {
         list link1 {
-            description "/e.g. 1/*/*";
+            description "/e.g. 1/*/* testing list description <should_be_encoded>";
             reference "RFC 6020 - http://tools.ietf.org/html/rfc6020";
             key "link-id";
             uses link-attributes;
         }
+
+        description "testing grouping description <should_be_encoded>";
     }
 
     grouping link-attributes {
         leaf link-id {
-            description "/e.g. 1/*/*";
+            description "/e.g. 1/*/* testing leaf description <should_be_encoded>";
             reference "RFC 6020 - http://tools.ietf.org/html/rfc6020";
             type int8;
         }
     }
 
     leaf inclusion-rulez {
-        description "/e.g. 1/*/*";
+        description "/e.g. 1/*/* testing leaf description <should be encoded>";
         reference "RFC 6020 http://technet.com";
 
         type string;
@@ -62,7 +116,7 @@ module encoding-javadoc {
         type enumeration {
             enum include {
                 description
-                    "/e.g. 1/*/*";
+                    "/e.g. 1/*/* testing enum description <should be encoded>";
             }
             enum exclude {
                 description
@@ -70,4 +124,31 @@ module encoding-javadoc {
             }
         }
     }
+
+    leaf-list test-leaf-list {
+        type string;
+        description "testing leaf-list description <should be encoded>";
+    }
+
+    choice test-choice {
+        description "testing choice description <should be encoded>";
+
+        case test-case-1 {
+            description "testing case description <should be encoded>";
+
+            leaf case-1-leaf {
+                type string;
+                description "testing leaf in case description <should be encoded>";
+            }
+        }
+
+        case test-case-2 {
+            description "testing case description <should be encoded>";
+
+            leaf case-2-leaf {
+                type string;
+                description "testing leaf in case description <should be encoded>";
+            }
+        }
+    }
 }