From e7b881490bcc02ae58da4be5b4b357f474b9d68c Mon Sep 17 00:00:00 2001 From: Jakub Toth Date: Fri, 21 Apr 2017 22:45:47 +0200 Subject: [PATCH] Bug 3147 - Improve generating of toString() method in builderTemplate Change-Id: I0904401c9046831cdc6b4a103fc07a179b954cfb Signed-off-by: Jakub Toth --- .../renderers/BuilderRendererTest.java | 168 ++++++++++++++++++ .../api/generator/builderTemplate.scala.txt | 32 ++-- 2 files changed, 187 insertions(+), 13 deletions(-) create mode 100644 binding2/mdsal-binding2-java-api-generator/src/main/test/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java 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 index 0000000000..25b6b7728c --- /dev/null +++ b/binding2/mdsal-binding2-java-api-generator/src/main/test/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java @@ -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 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 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; + } + + 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 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; + } +} diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt index e4fa8a075c..0355cc591b 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt +++ b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt @@ -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(); } } } -- 2.36.6