Fix a few warnings
[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() throws Exception {
43         assertEquals("", new BuilderGenerator().generate(mock(Type.class)));
44     }
45
46     @Test
47     public void builderTemplateGenerateToStringWithPropertyTest() throws Exception {
48         final GeneratedType genType = mockGenType("get" + TEST);
49         final String generateToString = genToString(genType).toString();
50         final String expected = GEN_TO_STRING_FIRST_PART
51                 + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
52                 + GEN_TO_STRING_LAST_PART;
53         assertEquals(expected, generateToString);
54     }
55
56     @Test
57     public void builderTemplateGenerateToStringWithoutAnyPropertyTest() throws Exception {
58         final GeneratedType genType = mockGenType(TEST);
59         final String generateToString = genToString(genType).toString();
60         final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_LAST_PART;
61         assertEquals(expected, generateToString);
62     }
63
64     @Test
65     public void builderTemplateGenerateToStringWithMorePropertiesTest() throws Exception {
66         final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
67         final String generateToString = genToString(genType).toString();
68         final String expected = GEN_TO_STRING_FIRST_PART
69                 + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);"
70                 + "\n        " + APPEND_COMMA + "\n    }"
71                 + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
72                 + GEN_TO_STRING_LAST_PART;
73         assertEquals(expected, generateToString);
74     }
75
76     @Test
77     public void builderTemplateGenerateToStringWithoutPropertyWithAugmentTest() throws Exception {
78         final GeneratedType genType = mockGenType(TEST);
79         mockAugment(genType);
80         final String generateToString = genToString(genType).toString();
81         final String expected = GEN_TO_STRING_FIRST_PART + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
82         assertEquals(expected, generateToString);
83     }
84
85     @Test
86     public void builderTemplateGenerateToStringWithPropertyWithAugmentTest() throws Exception {
87         final GeneratedType genType = mockGenType("get" + TEST);
88         mockAugment(genType);
89         final String generateToString = genToString(genType).toString();
90         final String expected = GEN_TO_STRING_FIRST_PART
91                 + "\n    if (_test != null) {\n        builder.append(\"_test=\");\n        builder.append(_test);\n    }"
92                 + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
93         assertEquals(expected, generateToString);
94     }
95
96     @Test
97     public void builderTemplateGenerateToStringWithMorePropertiesWithAugmentTest() throws Exception {
98         final GeneratedType genType = mockGenTypeMoreMeth("get" + TEST);
99         mockAugment(genType);
100         final String generateToString = genToString(genType).toString();
101         final String expected = GEN_TO_STRING_FIRST_PART
102                 + "\n    if (_test1 != null) {\n        builder.append(\"_test1=\");\n        builder.append(_test1);\n        "
103                 + APPEND_COMMA + "\n    }"
104                 + "\n    if (_test2 != null) {\n        builder.append(\"_test2=\");\n        builder.append(_test2);\n    }"
105                 + "\n    " + APPEND_COMMA_AUGMENT + GEN_TO_STRING_AUGMENT_PART + GEN_TO_STRING_LAST_PART;
106         assertEquals(expected, generateToString);
107     }
108
109     private static void mockAugment(final GeneratedType genType) {
110         final List<Type> impls = new ArrayList<>();
111         final Type impl = mock(Type.class);
112         doReturn("org.opendaylight.yangtools.yang.binding.Augmentable").when(impl).getFullyQualifiedName();
113         impls.add(impl);
114         doReturn(impls).when(genType).getImplements();
115     }
116
117     private static GeneratedType mockGenTypeMoreMeth(final String methodeName) {
118         final GeneratedType genType = spy(GeneratedType.class);
119         doReturn(TEST).when(genType).getName();
120         doReturn(TEST).when(genType).getPackageName();
121
122         final List<MethodSignature> listMethodSign = new ArrayList<>();
123         for (int i = 0; i < 2; i++) {
124             final MethodSignature methSign = mockMethSign(methodeName + (i + 1));
125             listMethodSign.add(methSign);
126         }
127         doReturn(listMethodSign).when(genType).getMethodDefinitions();
128
129         final List<Type> impls = new ArrayList<>();
130         doReturn(impls).when(genType).getImplements();
131         return genType;
132     }
133
134     @SuppressWarnings("unchecked")
135     private static CharSequence genToString(final GeneratedType genType)
136             throws NoSuchFieldException, IllegalAccessException {
137         final BuilderTemplate bt = new BuilderTemplate(genType);
138         final Field propertiesField = bt.getClass().getDeclaredField(PROPERTIES_FIELD_NAME);
139         propertiesField.setAccessible(true);
140         return bt.generateToString((Collection<GeneratedProperty>) propertiesField.get(bt));
141     }
142
143     private static GeneratedType mockGenType(final String methodeName) {
144         final GeneratedType genType = spy(GeneratedType.class);
145         doReturn(TEST).when(genType).getName();
146         doReturn(TEST).when(genType).getPackageName();
147
148         final List<MethodSignature> listMethodSign = new ArrayList<>();
149         final MethodSignature methSign = mockMethSign(methodeName);
150         listMethodSign.add(methSign);
151         doReturn(listMethodSign).when(genType).getMethodDefinitions();
152
153         final List<Type> impls = new ArrayList<>();
154         doReturn(impls).when(genType).getImplements();
155         return genType;
156     }
157
158     private static MethodSignature mockMethSign(final String methodeName) {
159         final MethodSignature methSign = mock(MethodSignature.class);
160         doReturn(methodeName).when(methSign).getName();
161         final Type methType = mock(Type.class);
162         doReturn(TEST).when(methType).getName();
163         doReturn(TEST).when(methType).getPackageName();
164         doReturn(methType).when(methSign).getReturnType();
165         return methSign;
166     }
167 }