Generate bindingEquals() and use it in generated implementations
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / test / java / org / opendaylight / mdsal / binding / java / api / generator / BuilderGeneratorTest.java
index 2fa5bc79711c200cca47104577412542d605603d..8415c74cddec270e11d857cdc745b65d795f9c42 100644 (file)
@@ -12,31 +12,18 @@ 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.mdsal.binding.model.api.GeneratedProperty;
 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 PROPERTIES_FIELD_NAME = "properties";
-    private static final String GEN_TO_STRING_FIRST_PART =
-            "@Override\npublic java.lang.String toString() {\n    java.lang.String name = \"test [\";\n    "
-                    + "java.lang.StringBuilder builder = new java.lang.StringBuilder (name);";
-    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 = "final int builderLength = builder.length();\n"
-            + "    final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();\n"
-            + "    if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
-            + "        " + APPEND_COMMA + "\n" + "    }";
     private static final String TEST = "test";
+    private static final JavaTypeName TYPE_NAME = JavaTypeName.create(TEST, TEST);
 
     @Test
     public void basicTest() {
@@ -47,65 +34,122 @@ public class BuilderGeneratorTest {
     public void builderTemplateGenerateToStringWithPropertyTest() {
         final GeneratedType genType = mockGenType("get" + TEST);
 
-        assertEquals("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(genType).toString());
+        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 implementations.\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("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(mockGenType(TEST)).toString());
+        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 implementations.\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("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
-                "    CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(mockGenTypeMoreMeth("get" + TEST)).toString());
+        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 implementations.\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("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(mockAugment(mockGenType(TEST))).toString());
+        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 implementations.\n"
+                + " *\n"
+                + " * @param <T$$> 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 <T$$ extends test.test & AugmentationHolder<test.test>> 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("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
-                "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(mockAugment(mockGenType("get" + TEST))).toString());
+        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 implementations.\n"
+                + " *\n"
+                + " * @param <T$$> 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 <T$$ extends test.test & AugmentationHolder<test.test>> 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("@Override\n" +
-                "public java.lang.String toString() {\n" +
-                "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
-                "    CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
-                "    CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
-                "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
-                "    return helper.toString();\n" +
-                "}\n", genToString(mockAugment(mockGenTypeMoreMeth("get" + TEST))).toString());
+        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 implementations.\n"
+                + " *\n"
+                + " * @param <T$$> 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 <T$$ extends test.test & AugmentationHolder<test.test>> 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) {
@@ -119,6 +163,7 @@ public class BuilderGeneratorTest {
 
     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();
 
@@ -134,20 +179,13 @@ public class BuilderGeneratorTest {
         return genType;
     }
 
-    @SuppressWarnings("unchecked")
     private static CharSequence genToString(final GeneratedType genType) {
-        try {
-            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));
-        } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
-            throw new RuntimeException(e);
-        }
+        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();
 
@@ -165,9 +203,9 @@ public class BuilderGeneratorTest {
         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(TYPE_NAME).when(methType).getIdentifier();
         doReturn(methType).when(methSign).getReturnType();
+        doReturn(ValueMechanics.NORMAL).when(methSign).getMechanics();
         return methSign;
     }
 }