From 9c244e2fa7e6b2762529d6273485e4068cc326ce Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Feb 2017 17:24:09 +0100 Subject: [PATCH] Bug 3147 - Binding spec v1: auto generated code by YANGTOOLS could be more efficient *fix generating of commas in toString() for more effecient *tests Change-Id: I13b59c3c5be90446a9511a9cd46969850cb77595 Signed-off-by: Jakub Toth (cherry picked from commit e6f9ca95834a6d081ce663c24f17cc3467a18100) --- .../java/api/generator/BuilderTemplate.xtend | 28 ++-- .../api/generator/BuilderGeneratorTest.java | 148 +++++++++++++++++- 2 files changed, 161 insertions(+), 15 deletions(-) diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend index 300d725f97..a57e10aba8 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend @@ -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» ''' diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderGeneratorTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderGeneratorTest.java index f7a0c4586a..7385e7fec0 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderGeneratorTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderGeneratorTest.java @@ -8,15 +8,161 @@ 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 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 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 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) 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 listMethodSign = new ArrayList<>(); + final MethodSignature methSign = mockMethSign(methodeName); + listMethodSign.add(methSign); + doReturn(listMethodSign).when(genType).getMethodDefinitions(); + + final List 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; + } +} -- 2.36.6