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() {
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) {
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();
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();
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;
}
}