/* * Copyright (c) 2016 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.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.util.ArrayList; import java.util.List; import org.junit.Test; import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.model.api.JavaTypeName; import org.opendaylight.mdsal.binding.model.api.MethodSignature; import org.opendaylight.mdsal.binding.model.api.MethodSignature.ValueMechanics; import org.opendaylight.mdsal.binding.model.api.Type; public class BuilderGeneratorTest { private static final String TEST = "test"; private static final JavaTypeName TYPE_NAME = JavaTypeName.create(TEST, TEST); @Test public void basicTest() { assertEquals("", new BuilderGenerator().generate(mock(Type.class))); } @Test public void builderTemplateGenerateToStringWithPropertyTest() { final GeneratedType genType = mockGenType("get" + TEST); assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static String bindingToString(final test.test obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " CodeHelpers.appendValue(helper, \"test\", obj.gettest());\n" + " return helper.toString();\n" + "}\n", genToString(genType).toString()); } @Test public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception { assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static String bindingToString(final test.test obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " return helper.toString();\n" + "}\n", genToString(mockGenType(TEST)).toString()); } @Test public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception { assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static String bindingToString(final test.test obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " CodeHelpers.appendValue(helper, \"test1\", obj.gettest1());\n" + " CodeHelpers.appendValue(helper, \"test2\", obj.gettest2());\n" + " return helper.toString();\n" + "}\n", genToString(mockGenTypeMoreMeth("get" + TEST)).toString()); } @Test public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception { assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " *

\n" + " * @param implementation type, which has to also implement AugmentationHolder interface\n" + " * contract.\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static > String bindingToString(final @NonNull" + " T$$ obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " CodeHelpers.appendValue(helper, \"augmentation\", obj.augmentations().values());\n" + " return helper.toString();\n" + "}\n", genToString(mockAugment(mockGenType(TEST))).toString()); } @Test public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception { assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " *

\n" + " * @param implementation type, which has to also implement AugmentationHolder interface\n" + " * contract.\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static > String bindingToString(final @NonNull" + " T$$ obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " CodeHelpers.appendValue(helper, \"test\", obj.gettest());\n" + " CodeHelpers.appendValue(helper, \"augmentation\", obj.augmentations().values());\n" + " return helper.toString();\n" + "}\n", genToString(mockAugment(mockGenType("get" + TEST))).toString()); } @Test public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception { assertEquals("/**\n" + " * Default implementation of {@link Object#toString()} contract for this interface.\n" + " * Implementations of this interface are encouraged to defer to this method to get consistent string" + "\n * representations across all implementation.\n" + " *\n" + " *

\n" + " * @param implementation type, which has to also implement AugmentationHolder interface\n" + " * contract.\n" + " * @param obj Object for which to generate toString() result.\n" + " * @return {@link String} value of data modeled by this interface.\n" + " * @throws NullPointerException if {@code obj} is null\n" + " */\n" + "static > String bindingToString(final @NonNull" + " T$$ obj) {\n" + " final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" + " CodeHelpers.appendValue(helper, \"test1\", obj.gettest1());\n" + " CodeHelpers.appendValue(helper, \"test2\", obj.gettest2());\n" + " CodeHelpers.appendValue(helper, \"augmentation\", obj.augmentations().values());\n" + " return helper.toString();\n" + "}\n", genToString(mockAugment(mockGenTypeMoreMeth("get" + TEST))).toString()); } private static GeneratedType 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(); return genType; } private static GeneratedType mockGenTypeMoreMeth(final String methodeName) { final GeneratedType genType = spy(GeneratedType.class); doReturn(TYPE_NAME).when(genType).getIdentifier(); 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 static CharSequence genToString(final GeneratedType genType) { return new InterfaceTemplate(genType).generateBindingToString(); } private static GeneratedType mockGenType(final String methodeName) { final GeneratedType genType = spy(GeneratedType.class); doReturn(TYPE_NAME).when(genType).getIdentifier(); 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 static MethodSignature mockMethSign(final String methodeName) { final MethodSignature methSign = mock(MethodSignature.class); doReturn(methodeName).when(methSign).getName(); final Type methType = mock(Type.class); doReturn(TYPE_NAME).when(methType).getIdentifier(); doReturn(methType).when(methSign).getReturnType(); doReturn(ValueMechanics.NORMAL).when(methSign).getMechanics(); return methSign; } }