Fix generate of comma before augmentations in toString generator
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / test / java / org / opendaylight / yangtools / sal / 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.yangtools.sal.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
20 import org.junit.Test;
21 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;
22 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
23 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature;
24 import org.opendaylight.yangtools.sal.binding.model.api.Type;
25
26 @SuppressWarnings("deprecation")
27 public class BuilderGeneratorTest {
28
29     private static final String PROPERTIES_FIELD_NAME = "properties";
30     private static final String GEN_TO_STRING_FIRST_PART =
31             "@Override\npublic java.lang.String toString() {\n    java.lang.String name = \"test [\";\n    "
32                     + "java.lang.StringBuilder builder = new java.lang.StringBuilder (name);";
33     private static final String GEN_TO_STRING_LAST_PART = "\n    return builder.append(']').toString();\n}\n";
34     private static final String GEN_TO_STRING_AUGMENT_PART =
35             "\n    builder.append(\"augmentation=\");\n    builder.append(augmentation.values());";
36     private static final String APPEND_COMMA = "builder.append(\", \");";
37     private static final String APPEND_COMMA_AUGMENT = "final int builderLength = builder.length();\n"
38             + "    final int builderAdditionalLength = builder.substring(name.length(), builderLength).length();\n"
39             + "    if (builderAdditionalLength > 2 && !builder.substring(builderLength - 2, builderLength).equals(\", \")) {\n"
40             + "        " + APPEND_COMMA + "\n" + "    }";
41     private static final String TEST = "test";
42
43     @Test
44     public void basicTest() throws Exception {
45         assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
46     }
47
48     @Test
49     public void builderTemplateGenerateToStringWithPropertyTest() throws Exception {
50         final GeneratedType genType = mockGenType("get" + TEST);
51         final String generateToString = genToString(genType).toString();
52         final String expected = GEN_TO_STRING_FIRST_PART
53                 + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
54                 + GEN_TO_STRING_LAST_PART;
55         assertEquals(expected, generateToString);
56     }
57
58     @Test
59     public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
60         final GeneratedType genType = mockGenType(TEST);
61         final String generateToString = genToString(genType).toString();
62         final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_LAST_PART;
63         assertEquals(expected, generateToString);
64     }
65
66     @Test
67     public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
68         final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
69         final String generateToString = genToString(genType).toString();
70         final String expected = GEN_TO_STRING_FIRST_PART
71                 + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);"
72                 + "\n        " + APPEND_COMMA + "\n    }"
73                 + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
74                 + GEN_TO_STRING_LAST_PART;
75         assertEquals(expected, generateToString);
76     }
77
78     @Test
79     public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
80         final GeneratedType genType = mockGenType(TEST);
81         mockAugment(genType);
82         final String generateToString = genToString(genType).toString();
83         final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
84         assertEquals(expected, generateToString);
85     }
86
87     @Test
88     public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
89         final GeneratedType genType = mockGenType("get" + TEST);
90         mockAugment(genType);
91         final String generateToString = genToString(genType).toString();
92         final String expected = GEN_TO_STRING_FIRST_PART
93                 + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
94                 + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
95         assertEquals(expected, generateToString);
96     }
97
98     @Test
99     public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
100         final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
101         mockAugment(genType);
102         final String generateToString = genToString(genType).toString();
103         final String expected = GEN_TO_STRING_FIRST_PART
104                 + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);\n        "
105                 + APPEND_COMMA + "\n    }"
106                 + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
107                 + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
108         assertEquals(expected, generateToString);
109     }
110
111     private void 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     }
118
119     private GeneratedType mockGenTypeMoreMeth(final String methodeName) {
120         final GeneratedType genType = spy(GeneratedType.class);
121         doReturn(TEST).when(genType).getName();
122         doReturn(TEST).when(genType).getPackageName();
123
124         final List<MethodSignature> listMethodSign = new ArrayList<>();
125         for (int i = 0; i < 2; i++) {
126             final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
127             listMethodSign.add(methSign);
128         }
129         doReturn(listMethodSign).when(genType).getMethodDefinitions();
130
131         final List<Type> impls = new ArrayList<>();
132         doReturn(impls).when(genType).getImplements();
133         return genType;
134     }
135
136     @SuppressWarnings("unchecked")
137     private CharSequence genToString(final GeneratedType genType)
138             throws NoSuchFieldException, IllegalAccessException {
139         final BuilderTemplate bt = new BuilderTemplate(genType);
140         final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
141         propertiesField.setAccessible(true);
142         return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
143     }
144
145     private GeneratedType mockGenType(final String methodeName) {
146         final GeneratedType genType = spy(GeneratedType.class);
147         doReturn(TEST).when(genType).getName();
148         doReturn(TEST).when(genType).getPackageName();
149
150         final List<MethodSignature> listMethodSign = new ArrayList<>();
151         final MethodSignature methSign = mockMethSign(methodeName);
152         listMethodSign.add(methSign);
153         doReturn(listMethodSign).when(genType).getMethodDefinitions();
154
155         final List<Type> impls = new ArrayList<>();
156         doReturn(impls).when(genType).getImplements();
157         return genType;
158     }
159
160     private MethodSignature mockMethSign(final String methodeName) {
161         final MethodSignature methSign = mock(MethodSignature.class);
162         doReturn(methodeName).when(methSign).getName();
163         final Type methType = mock(Type.class);
164         doReturn(TEST).when(methType).getName();
165         doReturn(TEST).when(methType).getPackageName();
166         doReturn(methType).when(methSign).getReturnType();
167         return methSign;
168     }
169 }