Bug 3147 - Binding spec v1: auto generated code by YANGTOOLS could 12/51612/1
authorRobert Varga <rovarga@cisco.com>
Thu, 2 Feb 2017 16:24:09 +0000 (17:24 +0100)
committerJakub Toth <jatoth@cisco.com>
Thu, 9 Feb 2017 09:00:37 +0000 (09:00 +0000)
be more efficient

  *fix generating of commas in toString() for more effecient
  *tests

Change-Id: I13b59c3c5be90446a9511a9cd46969850cb77595
Signed-off-by: Jakub Toth <jatoth@cisco.com>
(cherry picked from commit e6f9ca95834a6d081ce663c24f17cc3467a18100)

binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderGeneratorTest.java

index 300d725f97847938ce89cc39b76ebaf324930264..a57e10aba874f2e6d7a596fadf27bfeda0d01c8d 100644 (file)
@@ -711,33 +711,33 @@ class BuilderTemplate extends BaseTemplate {
             @Override
             public «String.importedName» toString() {
                 «StringBuilder.importedName» builder = new «StringBuilder.importedName» ("«type.name» [");
-                boolean first = true;
-
-                «FOR property : properties»
+                «FOR property : properties SEPARATOR "\n    builder.append(\", \");\n}" AFTER "    }\n"»
                     if («property.fieldName» != null) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            builder.append(", ");
-                        }
                         builder.append("«property.fieldName»=");
                         «IF property.returnType.name.contains("[")»
                             builder.append(«Arrays.importedName».toString(«property.fieldName»));
                         «ELSE»
                             builder.append(«property.fieldName»);
                         «ENDIF»
-                     }
                 «ENDFOR»
                 «IF augmentField != null»
-                    if (first) {
-                        first = false;
-                    } else {
+                    «IF !properties.empty»
+                «««Append comma separator only if it's not there already from previous operation»»»
+int builderLength = builder.length();
+                    if (builderLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(", ")) {
                         builder.append(", ");
                     }
+                    «ENDIF»
                     builder.append("«augmentField.name»=");
-                    builder.append(«augmentField.name».values());
+                    builder.append(«augmentField.name».values());«"\n"»
+                    return builder.append(']').toString();
+                «ELSE»
+                    «IF properties.empty»
+                    return builder.append(']').toString();
+                    «ELSE»
+            return builder.append(']').toString();
+                    «ENDIF»
                 «ENDIF»
-                return builder.append(']').toString();
             }
         «ENDIF»
     '''
index f7a0c4586a86b3f8ef47d1c03036bcd7f2057dba..7385e7fec0231c3dbef5c4d59aac462a41044ce3 100644 (file)
 package org.opendaylight.yangtools.sal.java.api.generator;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import org.junit.Test;
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
+import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 
+@SuppressWarnings("deprecation")
 public class BuilderGeneratorTest {
 
+    private static final String PROPERTIES_FIELD_NAME = "properties";
+    private static final String GEN_TO_STRING_FIRST_PART =
+            "@Override\npublic java.lang.String toString() {\n    java.lang.StringBuilder builder = new java.lang.StringBuilder ("
+                    + "\"test [\");";
+    private static final String GEN_TO_STRING_LAST_PART = "\n    return builder.append(']').toString();\n}\n";
+    private static final String GEN_TO_STRING_AUGMENT_PART =
+            "\n    builder.append(\"augmentation=\");\n    builder.append(augmentation.values());";
+    private static final String APPEND_COMMA = "builder.append(\", \");";
+    private static final String APPEND_COMMA_AUGMENT = "int builderLength = builder.length();\n"
+            + "    if (builderLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
+            + "        " + APPEND_COMMA + "\n" + "    }";
+    private static final String TEST = "test";
+
     @Test
     public void basicTest() throws Exception {
         assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
     }
-}
\ No newline at end of file
+
+    @Test
+    public void builderTemplateGenerateToStringWithPropertyTest() throws Exception {
+        final GeneratedType genType = mockGenType("get" + TEST);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART
+                + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
+                + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
+        final GeneratedType genType = mockGenType(TEST);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
+        final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART
+                + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);"
+                + "\n        " + APPEND_COMMA + "\n    }"
+                + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
+                + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenType(TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenType("get" + TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART
+                + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
+                + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    @Test
+    public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
+        final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
+        mockAugment(genType);
+        final String generateToString = genToString(genType).toString();
+        final String expected = GEN_TO_STRING_FIRST_PART
+                + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);\n        "
+                + APPEND_COMMA + "\n    }"
+                + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
+                + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
+        assertEquals(expected, generateToString);
+    }
+
+    private void mockAugment(final GeneratedType genType) {
+        final List<Type> impls = new ArrayList<>();
+        final Type impl = mock(Type.class);
+        doReturn("org.opendaylight.yangtools.yang.binding.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;
+    }
+
+    @SuppressWarnings("unchecked")
+    private CharSequence genToString(final GeneratedType genType)
+            throws NoSuchFieldException, IllegalAccessException {
+        final BuilderTemplate bt = new BuilderTemplate(genType);
+        final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
+        propertiesField.setAccessible(true);
+        return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
+    }
+
+    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;
+    }
+}