Optimize generated toString()
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / test / java / org / opendaylight / mdsal / binding / java / api / generator / BuilderGeneratorTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.java.api.generator;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.spy;
14
15 import java.lang.reflect.Field;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.List;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
21 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
22 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
23 import org.opendaylight.mdsal.binding.model.api.Type;
24
25 public class BuilderGeneratorTest {
26
27     private static final String PROPERTIES_FIELD_NAME = "properties";
28     private static final String GEN_TO_STRING_FIRST_PART =
29             "@Override\npublic java.lang.String toString() {\n    java.lang.String name = \"test [\";\n    "
30                     + "java.lang.StringBuilder builder = new java.lang.StringBuilder (name);";
31     private static final String GEN_TO_STRING_LAST_PART = "\n    return builder.append(']').toString();\n}\n";
32     private static final String GEN_TO_STRING_AUGMENT_PART =
33             "\n    builder.append(\"augmentation=\");\n    builder.append(augmentation.values());";
34     private static final String APPEND_COMMA = "builder.append(\", \");";
35     private static final String APPEND_COMMA_AUGMENT = "final int builderLength = builder.length();\n"
36             + "    final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();\n"
37             + "    if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
38             + "        " + APPEND_COMMA + "\n" + "    }";
39     private static final String TEST = "test";
40
41     @Test
42     public void basicTest() {
43         assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
44     }
45
46     @Test
47     public void builderTemplateGenerateToStringWithPropertyTest() {
48         final GeneratedType genType = mockGenType("get" + TEST);
49
50         assertEquals("@Override\n" +
51                 "public java.lang.String toString() {\n" +
52                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
53                 "    CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
54                 "    return helper.toString();\n" +
55                 "}\n", genToString(genType).toString());
56     }
57
58     @Test
59     public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
60         assertEquals("@Override\n" +
61                 "public java.lang.String toString() {\n" +
62                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
63                 "    return helper.toString();\n" +
64                 "}\n", genToString(mockGenType(TEST)).toString());
65     }
66
67     @Test
68     public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
69         assertEquals("@Override\n" +
70                 "public java.lang.String toString() {\n" +
71                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
72                 "    CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
73                 "    CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
74                 "    return helper.toString();\n" +
75                 "}\n", genToString(mockGenTypeMoreMeth("get" + TEST)).toString());
76     }
77
78     @Test
79     public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
80         assertEquals("@Override\n" +
81                 "public java.lang.String toString() {\n" +
82                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
83                 "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
84                 "    return helper.toString();\n" +
85                 "}\n", genToString(mockAugment(mockGenType(TEST))).toString());
86     }
87
88     @Test
89     public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
90         assertEquals("@Override\n" +
91                 "public java.lang.String toString() {\n" +
92                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
93                 "    CodeHelpers.appendValue(helper, \"_test\", _test);\n" +
94                 "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
95                 "    return helper.toString();\n" +
96                 "}\n", genToString(mockAugment(mockGenType("get" + TEST))).toString());
97     }
98
99     @Test
100     public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
101         assertEquals("@Override\n" +
102                 "public java.lang.String toString() {\n" +
103                 "    final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(\"test\");\n" +
104                 "    CodeHelpers.appendValue(helper, \"_test1\", _test1);\n" +
105                 "    CodeHelpers.appendValue(helper, \"_test2\", _test2);\n" +
106                 "    CodeHelpers.appendValue(helper, \"augmentation\", augmentation.values()); \n" +
107                 "    return helper.toString();\n" +
108                 "}\n", genToString(mockAugment(mockGenTypeMoreMeth("get" + TEST))).toString());
109     }
110
111     private static GeneratedType mockAugment(final GeneratedType genType) {
112         final List<Type> impls = new ArrayList<>();
113         final Type impl = mock(Type.class);
114         doReturn("org.opendaylight.yangtools.yang.binding.Augmentable").when(impl).getFullyQualifiedName();
115         impls.add(impl);
116         doReturn(impls).when(genType).getImplements();
117         return genType;
118     }
119
120     private static GeneratedType mockGenTypeMoreMeth(final String methodeName) {
121         final GeneratedType genType = spy(GeneratedType.class);
122         doReturn(TEST).when(genType).getName();
123         doReturn(TEST).when(genType).getPackageName();
124
125         final List<MethodSignature> listMethodSign = new ArrayList<>();
126         for (int i = 0; i < 2; i++) {
127             final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
128             listMethodSign.add(methSign);
129         }
130         doReturn(listMethodSign).when(genType).getMethodDefinitions();
131
132         final List<Type> impls = new ArrayList<>();
133         doReturn(impls).when(genType).getImplements();
134         return genType;
135     }
136
137     @SuppressWarnings("unchecked")
138     private static CharSequence genToString(final GeneratedType genType) {
139         try {
140             final BuilderTemplate bt = new BuilderTemplate(genType);
141             final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
142             propertiesField.setAccessible(true);
143             return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
144         } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
145             throw new RuntimeException(e);
146         }
147     }
148
149     private static GeneratedType mockGenType(final String methodeName) {
150         final GeneratedType genType = spy(GeneratedType.class);
151         doReturn(TEST).when(genType).getName();
152         doReturn(TEST).when(genType).getPackageName();
153
154         final List<MethodSignature> listMethodSign = new ArrayList<>();
155         final MethodSignature methSign = mockMethSign(methodeName);
156         listMethodSign.add(methSign);
157         doReturn(listMethodSign).when(genType).getMethodDefinitions();
158
159         final List<Type> impls = new ArrayList<>();
160         doReturn(impls).when(genType).getImplements();
161         return genType;
162     }
163
164     private static MethodSignature mockMethSign(final String methodeName) {
165         final MethodSignature methSign = mock(MethodSignature.class);
166         doReturn(methodeName).when(methSign).getName();
167         final Type methType = mock(Type.class);
168         doReturn(TEST).when(methType).getName();
169         doReturn(TEST).when(methType).getPackageName();
170         doReturn(methType).when(methSign).getReturnType();
171         return methSign;
172     }
173 }