Bug 3147 - Improve generating of toString() method in builderTemplate 04/55904/2
authorJakub Toth <jatoth@cisco.com>
Fri, 21 Apr 2017 20:45:47 +0000 (22:45 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 24 Apr 2017 14:54:30 +0000 (14:54 +0000)
Change-Id: I0904401c9046831cdc6b4a103fc07a179b954cfb
Signed-off-by: Jakub Toth <jatoth@cisco.com>
(cherry picked from commit e7b881490bcc02ae58da4be5b4b357f474b9d68c)

binding2/mdsal-binding2-java-api-generator/src/main/test/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java [new file with mode: 0644]
binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt

diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/test/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java b/binding2/mdsal-binding2-java-api-generator/src/main/test/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java
new file mode 100644 (file)
index 0000000..25b6b77
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2017 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.mdsal.binding.javav2.java.api.generator.renderers;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
+import org.opendaylight.mdsal.binding.javav2.model.api.Type;
+
+public class BuilderRendererTest {
+    private static final String TEST = "test";
+
+    @Test
+    public void builderTemplateGenerateToStringWithPropertyTest() throws Exception {
+        final GeneratedType genType = mockGenType("get" + TEST);
+        final String generateToString = genToString(genType);
+        assertTrue(generateToString.contains("java.lang.String toString() {"));
+        assertTrue(generateToString.contains("java.lang.String name = \"test [\";"));
+        assertTrue(generateToString.contains("java.lang.StringBuilder builder = new java.lang.StringBuilder(name);"));
+        assertTrue(generateToString.contains("if (_test != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test=\");"));
+        assertTrue(generateToString.contains("builder.append(_test);"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
+        final GeneratedType genType = mockGenType(TEST);
+        final String generateToString = genToString(genType);
+        assertTrue(generateToString.contains("java.lang.String toString() {"));
+        assertTrue(generateToString.contains("java.lang.String name = \"test [\";"));
+        assertTrue(generateToString.contains("java.lang.StringBuilder builder = new java.lang.StringBuilder(name);"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
+        final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
+        final String generateToString = genToString(genType);
+        assertTrue(generateToString.contains("java.lang.String toString() {"));
+        assertTrue(generateToString.contains("java.lang.String name = \"test [\";"));
+        assertTrue(generateToString.contains("java.lang.StringBuilder builder = new java.lang.StringBuilder(name);"));
+        assertTrue(generateToString.contains("if (_test1 != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test1=\");"));
+        assertTrue(generateToString.contains("builder.append(_test1);"));
+        assertTrue(generateToString.contains("builder.append(\", \");"));
+        assertTrue(generateToString.contains("if (_test2 != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test2=\");"));
+        assertTrue(generateToString.contains("builder.append(_test2);"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenType(TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType);
+        assertTrue(generateToString.contains("java.lang.String toString() {"));
+        assertTrue(generateToString.contains("java.lang.String name = \"test [\";"));
+        assertTrue(generateToString.contains("java.lang.StringBuilder builder = new java.lang.StringBuilder(name);"));
+        assertTrue(generateToString.contains("builder.append(\"augmentation=\");"));
+        assertTrue(generateToString.contains("builder.append(augmentation.values());"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenType("get" + TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType);
+        assertTrue(generateToString.contains("java.lang.String toString() {"));
+        assertTrue(generateToString.contains("java.lang.String name = \"test [\";"));
+        assertTrue(generateToString.contains("java.lang.StringBuilder builder = new java.lang.StringBuilder(name);"));
+        assertTrue(generateToString.contains("if (_test != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test=\");"));
+        assertTrue(generateToString.contains("builder.append(_test);"));
+        assertTrue(generateToString.contains("builder.append(\", \");"));
+        assertTrue(generateToString.contains("builder.append(\"augmentation=\");"));
+        assertTrue(generateToString.contains("builder.append(augmentation.values());"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType).toString();
+        assertTrue(generateToString.contains("if (_test1 != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test1=\");"));
+        assertTrue(generateToString.contains("builder.append(_test1);"));
+        assertTrue(generateToString.contains("builder.append(\", \");"));
+        assertTrue(generateToString.contains("if (_test2 != null) {"));
+        assertTrue(generateToString.contains("builder.append(\"_test2=\");"));
+        assertTrue(generateToString.contains("builder.append(_test2);"));
+        assertTrue(generateToString.contains("builder.append(\", \");"));
+        assertTrue(generateToString.contains("builder.append(\"augmentation=\");"));
+        assertTrue(generateToString.contains("builder.append(augmentation.values());"));
+        assertTrue(generateToString.contains("return builder.append(']').toString();"));
+    }
+
+    private void mockAugment(final GeneratedType genType) {
+        final List<Type> impls = new ArrayList<>();
+        final Type impl = mock(Type.class);
+        doReturn("org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable").when(impl)
+                .getFullyQualifiedName();
+        impls.add(impl);
+        doReturn(impls).when(genType).getImplements();
+    }
+
+    private GeneratedType mockGenTypeMoreMeth(final String methodeName) {
+        final GeneratedType genType = spy(GeneratedType.class);
+        doReturn(TEST).when(genType).getName();
+        doReturn(TEST).when(genType).getPackageName();
+
+        final List<MethodSignature> listMethodSign = new ArrayList<>();
+        for (int i = 0; i < 2; i++) {
+            final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
+            listMethodSign.add(methSign);
+        }
+        doReturn(listMethodSign).when(genType).getMethodDefinitions();
+
+        final List<Type> impls = new ArrayList<>();
+        doReturn(impls).when(genType).getImplements();
+        return genType;
+    }
+
+    private String genToString(final GeneratedType genType) {
+        final BuilderRenderer bt = new BuilderRenderer(genType);
+        return bt.body();
+    }
+
+    private GeneratedType mockGenType(final String methodeName) {
+        final GeneratedType genType = spy(GeneratedType.class);
+        doReturn(TEST).when(genType).getName();
+        doReturn(TEST).when(genType).getPackageName();
+
+        final List<MethodSignature> listMethodSign = new ArrayList<>();
+        final MethodSignature methSign = mockMethSign(methodeName);
+        listMethodSign.add(methSign);
+        doReturn(listMethodSign).when(genType).getMethodDefinitions();
+
+        final List<Type> impls = new ArrayList<>();
+        doReturn(impls).when(genType).getImplements();
+        return genType;
+    }
+
+    private MethodSignature mockMethSign(final String methodeName) {
+        final MethodSignature methSign = mock(MethodSignature.class);
+        doReturn(methodeName).when(methSign).getName();
+        final Type methType = mock(Type.class);
+        doReturn(TEST).when(methType).getName();
+        doReturn(TEST).when(methType).getPackageName();
+        doReturn(methType).when(methSign).getReturnType();
+        return methSign;
+    }
+}
index e4fa8a075c927347ac44b695fcc632ba09247641..0355cc591bf17572c9ab5d0614d20b3f3c6079df 100644 (file)
@@ -343,33 +343,39 @@ public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{
     @if(properties != null) {
         @@Override
         public @{importedNames.get("string")} toString() {
-            @{importedNames.get("stringBuilder")} builder = new @{importedNames.get("stringBuilder")} ("@{genType.getName} [");
-            boolean first = true;
-            @for(property <- properties) {
+            @{importedNames.get("string")} name = "@{genType.getName} [";
+            @{importedNames.get("stringBuilder")} builder = new @{importedNames.get("stringBuilder")}(name);
+            @for((property, index) <- properties.zipWithIndex) {
                 if (@{fieldName(property)} != null) {
-                    if (first) {
-                        first = false;
-                    } else {
-                        builder.append(", ");
-                    }
                     builder.append("@{fieldName(property)}=");
                     @if(property.getReturnType.getName.contains("[")) {
                         builder.append(@{importedNames.get("arrays")}.toString(@{fieldName(property)}));
                     } else {
                         builder.append(@{fieldName(property)});
                     }
+                    @if(properties.size() > 1 && index < properties.size()-1){
+                        builder.append(", ");
+                    }
                 }
             }
             @if(augmentField != null) {
-                if (first) {
-                    first = false;
-                } @{"else"} {
-                    builder.append(", ");
+                @if(!properties.isEmpty()){
+                    final int builderLength = builder.length();
+                    final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();
+                    if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(", ")) {
+                        builder.append(", ");
+                    }
                 }
                 builder.append("@{augmentField.getName}=");
                 builder.append(@{augmentField.getName}.values());
+                return builder.append(']').toString();
+            } else {
+                @if(properties.isEmpty()){
+                    return builder.append(']').toString();
+                } else {
+                    return builder.append(']').toString();
+                }
             }
-            return builder.append(']').toString();
         }
     }
 }